cutedriver-driver 2.0.0.20210120164037

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 (226) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +16 -0
  3. data/bin/start_app_perf +200 -0
  4. data/bin/tdriver-devtools +3 -0
  5. data/config/sut_parameters.rb +52 -0
  6. data/config/sut_setup.rb +32 -0
  7. data/config/sut_teardown.rb +32 -0
  8. data/config/tdriver_custom_error_recovery.rb +83 -0
  9. data/ext/extconf.rb +70 -0
  10. data/ext/native_extensions.c +315 -0
  11. data/lib/matti.rb +25 -0
  12. data/lib/tdriver-devtools/behaviour/old/xml/example/flick-example.rb +120 -0
  13. data/lib/tdriver-devtools/behaviour/old/xml/example/impl.rb_invalid +194 -0
  14. data/lib/tdriver-devtools/behaviour/old/xml/generate_behaviour_xml.rb +95 -0
  15. data/lib/tdriver-devtools/behaviour/old/xml/lib/tdriver_generator.rb +722 -0
  16. data/lib/tdriver-devtools/behaviour/old/xml/qdoc_generator.rb +321 -0
  17. data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.method.template +43 -0
  18. data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.module.template +54 -0
  19. data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.argument.template +7 -0
  20. data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.argument_type.template +7 -0
  21. data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.exception.template +5 -0
  22. data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.howto.line.template +2 -0
  23. data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.howto.template +5 -0
  24. data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.method.template +23 -0
  25. data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.template +14 -0
  26. data/lib/tdriver-devtools/behaviour/old/xml/update +3 -0
  27. data/lib/tdriver-devtools/behaviour/xml/generate.rb +88 -0
  28. data/lib/tdriver-devtools/behaviour/xml/rdoc_behaviour_xml_generator.rb +1945 -0
  29. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.argument.default.template +1 -0
  30. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.argument.template +3 -0
  31. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.argument_type.template +4 -0
  32. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.exception.template +4 -0
  33. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.arguments.template +4 -0
  34. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.deprecated.template +3 -0
  35. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.exceptions.template +3 -0
  36. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.info.template +1 -0
  37. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.returns.template +3 -0
  38. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.tables.template +3 -0
  39. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.template +12 -0
  40. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.returns.template +5 -0
  41. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.table.item.template +1 -0
  42. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.table.row.template +2 -0
  43. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.table.template +8 -0
  44. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.template +14 -0
  45. data/lib/tdriver-devtools/doc/behaviour_xml/QtExampleGestureBehaviour.xml +138 -0
  46. data/lib/tdriver-devtools/doc/behaviour_xml/created.rid +1 -0
  47. data/lib/tdriver-devtools/doc/behaviour_xml/tdriver.hash +1 -0
  48. data/lib/tdriver-devtools/doc/feature_xml/qt_widget_hold.feature.xml +9 -0
  49. data/lib/tdriver-devtools/doc/feature_xml/qt_widget_tap.feature.xml +9 -0
  50. data/lib/tdriver-devtools/doc/generate.rb +917 -0
  51. data/lib/tdriver-devtools/doc/update +1 -0
  52. data/lib/tdriver-devtools/doc/xslt/html.rb +7 -0
  53. data/lib/tdriver-devtools/doc/xslt/template.xsl +2170 -0
  54. data/lib/tdriver-devtools/doc/xslt/update +3 -0
  55. data/lib/tdriver-devtools/plugin/placeholder.txt +1 -0
  56. data/lib/tdriver-devtools/tdriver-devtools.rb +404 -0
  57. data/lib/tdriver-devtools/tests/feature_tests/example/behaviour_example.rb +100 -0
  58. data/lib/tdriver-devtools/tests/feature_tests/generate.rb +82 -0
  59. data/lib/tdriver-devtools/tests/feature_tests/lib/custom_rdoc_generator.rb +468 -0
  60. data/lib/tdriver-devtools/tests/feature_tests/templates/feature_attribute.template +5 -0
  61. data/lib/tdriver-devtools/tests/feature_tests/templates/feature_method.template +5 -0
  62. data/lib/tdriver-devtools/tests/feature_tests/templates/scenario_attribute.template +5 -0
  63. data/lib/tdriver-devtools/tests/feature_tests/templates/scenario_method.template +5 -0
  64. data/lib/tdriver-devtools/tests/feature_tests/update +3 -0
  65. data/lib/tdriver.rb +23 -0
  66. data/lib/tdriver/base/behaviour/abstract.rb +29 -0
  67. data/lib/tdriver/base/behaviour/behaviours/object_abstract.rb +107 -0
  68. data/lib/tdriver/base/behaviour/behaviours/object_behaviour_composition.rb +99 -0
  69. data/lib/tdriver/base/behaviour/behaviours/object_behaviour_description.rb +278 -0
  70. data/lib/tdriver/base/behaviour/behaviours/object_composition.rb +119 -0
  71. data/lib/tdriver/base/behaviour/factory.rb +495 -0
  72. data/lib/tdriver/base/behaviour/loader.rb +46 -0
  73. data/lib/tdriver/base/command_data/command_data.rb +51 -0
  74. data/lib/tdriver/base/command_data/loader.rb +29 -0
  75. data/lib/tdriver/base/controller/abstraction.rb +56 -0
  76. data/lib/tdriver/base/controller/loader.rb +21 -0
  77. data/lib/tdriver/base/errors.rb +134 -0
  78. data/lib/tdriver/base/loader.rb +47 -0
  79. data/lib/tdriver/base/state_object.rb +373 -0
  80. data/lib/tdriver/base/sut/adapter.rb +54 -0
  81. data/lib/tdriver/base/sut/controller.rb +151 -0
  82. data/lib/tdriver/base/sut/factory.rb +339 -0
  83. data/lib/tdriver/base/sut/generic/behaviours/agent.rb +77 -0
  84. data/lib/tdriver/base/sut/generic/behaviours/application.rb +427 -0
  85. data/lib/tdriver/base/sut/generic/behaviours/controller.rb +67 -0
  86. data/lib/tdriver/base/sut/generic/behaviours/find.rb +107 -0
  87. data/lib/tdriver/base/sut/generic/behaviours/flash_behaviour.rb +337 -0
  88. data/lib/tdriver/base/sut/generic/behaviours/sut.rb +1888 -0
  89. data/lib/tdriver/base/sut/generic/behaviours/switchbox_behaviour.rb +210 -0
  90. data/lib/tdriver/base/sut/generic/behaviours/verification.rb +222 -0
  91. data/lib/tdriver/base/sut/generic/commands/agent.rb +43 -0
  92. data/lib/tdriver/base/sut/generic/commands/application.rb +274 -0
  93. data/lib/tdriver/base/sut/generic/commands/fixture.rb +47 -0
  94. data/lib/tdriver/base/sut/generic/commands/key_sequence.rb +94 -0
  95. data/lib/tdriver/base/sut/generic/commands/screen_capture.rb +64 -0
  96. data/lib/tdriver/base/sut/generic/plugin.rb +97 -0
  97. data/lib/tdriver/base/sut/loader.rb +35 -0
  98. data/lib/tdriver/base/sut/sut.rb +98 -0
  99. data/lib/tdriver/base/test_object/abstract.rb +208 -0
  100. data/lib/tdriver/base/test_object/adapter.rb +740 -0
  101. data/lib/tdriver/base/test_object/behaviours/syncronization.rb +144 -0
  102. data/lib/tdriver/base/test_object/behaviours/test_object.rb +1047 -0
  103. data/lib/tdriver/base/test_object/cache.rb +134 -0
  104. data/lib/tdriver/base/test_object/factory.rb +684 -0
  105. data/lib/tdriver/base/test_object/loader.rb +51 -0
  106. data/lib/tdriver/base/test_object/verification.rb +178 -0
  107. data/lib/tdriver/base/test_object/xml/abstraction.rb +63 -0
  108. data/lib/tdriver/base/test_object/xml/adapter.rb +773 -0
  109. data/lib/tdriver/env.rb +21 -0
  110. data/lib/tdriver/loader.rb +57 -0
  111. data/lib/tdriver/matti.rb +35 -0
  112. data/lib/tdriver/report/error_recovery/tdriver_custom_error_recovery.rb +83 -0
  113. data/lib/tdriver/report/error_recovery/tdriver_error_recovery.rb +168 -0
  114. data/lib/tdriver/report/error_recovery/tdriver_error_recovery_settings.rb +106 -0
  115. data/lib/tdriver/report/report.rb +61 -0
  116. data/lib/tdriver/report/report_api.rb +348 -0
  117. data/lib/tdriver/report/report_combine.rb +86 -0
  118. data/lib/tdriver/report/report_crash_file_capture.rb +178 -0
  119. data/lib/tdriver/report/report_creator.rb +665 -0
  120. data/lib/tdriver/report/report_cucumber.rb +158 -0
  121. data/lib/tdriver/report/report_cucumber_listener.rb +184 -0
  122. data/lib/tdriver/report/report_cucumber_reporter.rb +181 -0
  123. data/lib/tdriver/report/report_data_presentation.rb +156 -0
  124. data/lib/tdriver/report/report_data_table.rb +64 -0
  125. data/lib/tdriver/report/report_execution_statistics.rb +400 -0
  126. data/lib/tdriver/report/report_file_capture.rb +159 -0
  127. data/lib/tdriver/report/report_graph_generator.rb +59 -0
  128. data/lib/tdriver/report/report_grouping.rb +541 -0
  129. data/lib/tdriver/report/report_javascript.rb +199 -0
  130. data/lib/tdriver/report/report_junit_xml.rb +147 -0
  131. data/lib/tdriver/report/report_rspec.rb +108 -0
  132. data/lib/tdriver/report/report_test_case_run.rb +725 -0
  133. data/lib/tdriver/report/report_test_run.rb +1476 -0
  134. data/lib/tdriver/report/report_test_unit.rb +223 -0
  135. data/lib/tdriver/report/report_writer.rb +1621 -0
  136. data/lib/tdriver/tdriver.rb +209 -0
  137. data/lib/tdriver/util/agent/loader.rb +22 -0
  138. data/lib/tdriver/util/agent/service.rb +107 -0
  139. data/lib/tdriver/util/common/array.rb +39 -0
  140. data/lib/tdriver/util/common/boolean.rb +48 -0
  141. data/lib/tdriver/util/common/crc16.rb +149 -0
  142. data/lib/tdriver/util/common/environment.rb +154 -0
  143. data/lib/tdriver/util/common/error.rb +40 -0
  144. data/lib/tdriver/util/common/exception.rb +53 -0
  145. data/lib/tdriver/util/common/exceptions.rb +12 -0
  146. data/lib/tdriver/util/common/file.rb +328 -0
  147. data/lib/tdriver/util/common/gem.rb +109 -0
  148. data/lib/tdriver/util/common/hash.rb +288 -0
  149. data/lib/tdriver/util/common/kernel.rb +253 -0
  150. data/lib/tdriver/util/common/loader.rb +47 -0
  151. data/lib/tdriver/util/common/numeric.rb +159 -0
  152. data/lib/tdriver/util/common/object.rb +159 -0
  153. data/lib/tdriver/util/common/retryable.rb +179 -0
  154. data/lib/tdriver/util/common/stackable.rb +185 -0
  155. data/lib/tdriver/util/common/string.rb +174 -0
  156. data/lib/tdriver/util/database/access.rb +240 -0
  157. data/lib/tdriver/util/database/connection.rb +44 -0
  158. data/lib/tdriver/util/database/error.rb +34 -0
  159. data/lib/tdriver/util/database/loader.rb +28 -0
  160. data/lib/tdriver/util/filters/attribute_filter.rb +121 -0
  161. data/lib/tdriver/util/filters/loader.rb +29 -0
  162. data/lib/tdriver/util/fixture/loader.rb +22 -0
  163. data/lib/tdriver/util/fixture/service.rb +211 -0
  164. data/lib/tdriver/util/hooking/hooking.rb +477 -0
  165. data/lib/tdriver/util/keymap/keymap.rb +81 -0
  166. data/lib/tdriver/util/loader.rb +80 -0
  167. data/lib/tdriver/util/localisation/error.rb +31 -0
  168. data/lib/tdriver/util/localisation/loader.rb +25 -0
  169. data/lib/tdriver/util/localisation/localisation.rb +762 -0
  170. data/lib/tdriver/util/logger/loader.rb +22 -0
  171. data/lib/tdriver/util/logger/logger.rb +591 -0
  172. data/lib/tdriver/util/operator_data/error.rb +29 -0
  173. data/lib/tdriver/util/operator_data/loader.rb +27 -0
  174. data/lib/tdriver/util/operator_data/operator_data.rb +93 -0
  175. data/lib/tdriver/util/other/config.rb +221 -0
  176. data/lib/tdriver/util/parameter/error.rb +48 -0
  177. data/lib/tdriver/util/parameter/loader.rb +25 -0
  178. data/lib/tdriver/util/parameter/parameter.rb +1161 -0
  179. data/lib/tdriver/util/plugin/abstract.rb +61 -0
  180. data/lib/tdriver/util/plugin/error.rb +0 -0
  181. data/lib/tdriver/util/plugin/loader.rb +28 -0
  182. data/lib/tdriver/util/plugin/service.rb +319 -0
  183. data/lib/tdriver/util/recorder/loader.rb +25 -0
  184. data/lib/tdriver/util/recorder/recorder.rb +72 -0
  185. data/lib/tdriver/util/recorder/scripter.rb +294 -0
  186. data/lib/tdriver/util/statistics/statistics.rb +89 -0
  187. data/lib/tdriver/util/user_data/error.rb +28 -0
  188. data/lib/tdriver/util/user_data/loader.rb +25 -0
  189. data/lib/tdriver/util/user_data/user_data.rb +104 -0
  190. data/lib/tdriver/util/video/camera.rb +67 -0
  191. data/lib/tdriver/util/video/camera_linux.rb +153 -0
  192. data/lib/tdriver/util/video/camera_windows.rb +174 -0
  193. data/lib/tdriver/util/video/loader.rb +31 -0
  194. data/lib/tdriver/util/video/video_utils.rb +139 -0
  195. data/lib/tdriver/util/xml/abstraction.rb +117 -0
  196. data/lib/tdriver/util/xml/attribute.rb +32 -0
  197. data/lib/tdriver/util/xml/builder.rb +53 -0
  198. data/lib/tdriver/util/xml/comment.rb +32 -0
  199. data/lib/tdriver/util/xml/document.rb +32 -0
  200. data/lib/tdriver/util/xml/element.rb +32 -0
  201. data/lib/tdriver/util/xml/error.rb +46 -0
  202. data/lib/tdriver/util/xml/loader.rb +62 -0
  203. data/lib/tdriver/util/xml/nil_node.rb +95 -0
  204. data/lib/tdriver/util/xml/nodeset.rb +32 -0
  205. data/lib/tdriver/util/xml/parsers/libxml/libxml.rb +140 -0
  206. data/lib/tdriver/util/xml/parsers/loader.rb +21 -0
  207. data/lib/tdriver/util/xml/parsers/nokogiri/abstraction.rb +167 -0
  208. data/lib/tdriver/util/xml/parsers/nokogiri/attribute.rb +66 -0
  209. data/lib/tdriver/util/xml/parsers/nokogiri/builder.rb +64 -0
  210. data/lib/tdriver/util/xml/parsers/nokogiri/comment.rb +39 -0
  211. data/lib/tdriver/util/xml/parsers/nokogiri/document.rb +66 -0
  212. data/lib/tdriver/util/xml/parsers/nokogiri/element.rb +39 -0
  213. data/lib/tdriver/util/xml/parsers/nokogiri/loader.rb +58 -0
  214. data/lib/tdriver/util/xml/parsers/nokogiri/node.rb +212 -0
  215. data/lib/tdriver/util/xml/parsers/nokogiri/nodeset.rb +237 -0
  216. data/lib/tdriver/util/xml/parsers/nokogiri/text.rb +39 -0
  217. data/lib/tdriver/util/xml/text.rb +32 -0
  218. data/lib/tdriver/util/xml/xml.rb +332 -0
  219. data/lib/tdriver/verify/verify.rb +2398 -0
  220. data/lib/tdriver/version.rb +21 -0
  221. data/xml/behaviours/generic.xml +530 -0
  222. data/xml/defaults/generic.xml +11 -0
  223. data/xml/defaults/sut_generic.xml +8 -0
  224. data/xml/parameters/tdriver_parameters.xml +23 -0
  225. data/xml/templates/generic.xml +292 -0
  226. metadata +324 -0
@@ -0,0 +1,1888 @@
1
+ ############################################################################
2
+ ##
3
+ ## Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
4
+ ## All rights reserved.
5
+ ## Contact: Nokia Corporation (testabilitydriver@nokia.com)
6
+ ##
7
+ ## This file is part of Testability Driver.
8
+ ##
9
+ ## If you have questions regarding the use of this file, please contact
10
+ ## Nokia at testabilitydriver@nokia.com .
11
+ ##
12
+ ## This library is free software; you can redistribute it and/or
13
+ ## modify it under the terms of the GNU Lesser General Public
14
+ ## License version 2.1 as published by the Free Software Foundation
15
+ ## and appearing in the file LICENSE.LGPL included in the packaging
16
+ ## of this file.
17
+ ##
18
+ ############################################################################
19
+
20
+ module MobyBehaviour
21
+
22
+ # == description
23
+ # Describes the behaviour of SUT, aka the methods that can be used to control SUT
24
+ #
25
+ # == behaviour
26
+ # GenericSut
27
+ #
28
+ # == requires
29
+ # *
30
+ #
31
+ # == input_type
32
+ # *
33
+ #
34
+ # == sut_type
35
+ # *
36
+ #
37
+ # == sut_version
38
+ # *
39
+ #
40
+ # == objects
41
+ # sut
42
+ #
43
+ module SUT
44
+
45
+ include MobyBehaviour::Behaviour
46
+
47
+ # == nodoc
48
+ attr_accessor(
49
+
50
+ :dump_count, # number of UI dump requests done to current SUT
51
+ :current_application_id, # id of the current appication if set
52
+ :input, # the input method used for interacting with this sut as a symbol, eg. :key or :touch.
53
+ :refresh_tries, # number of retries for ui dump on error case
54
+ :refresh_timeout # timeout between timeout retry
55
+
56
+ )
57
+
58
+ # == nodoc
59
+ attr_reader(
60
+
61
+ :xml_data, # sut xml_data
62
+ :x_path, # x_path pattern for xml_data
63
+ :ui_type, # type of the UI used on the sut, ie. s60, qt, windows
64
+ :ui_version, # version of the ui used on the sut, ie 3.2.3
65
+ :frozen, # flag that tells if the ui dump getting is disabled
66
+ :xml_data_checksum, # checksum of the previous ui state message
67
+ :verify_blocks, # verify blocks
68
+ :sut
69
+
70
+ )
71
+
72
+ private
73
+
74
+ # this method will be automatically invoked after module is extended to sut object
75
+ def self.extended( target_object )
76
+
77
+ target_object.instance_exec{
78
+
79
+ initialize_settings
80
+
81
+ }
82
+
83
+ end
84
+
85
+ # TODO: document me
86
+ def initialize_settings
87
+
88
+ # default values
89
+ @x_path = '.'
90
+ @xml_data = ""
91
+ @dump_count = 0
92
+
93
+ # determines that should child test objects be updated
94
+ @update_childs = true
95
+
96
+ @last_xml_data = nil
97
+ @frozen = false
98
+
99
+ # initialize cache for sut children
100
+ @child_object_cache = TDriver::TestObjectCache.new
101
+
102
+ @current_application_id = nil
103
+
104
+ # create empty hash for sut parameters if sut id not found from parameters
105
+ $parameters[ @id ] = {} unless $parameters.has_key?( @id )
106
+
107
+ @input = sut_parameters[ :input_type, 'key' ].to_sym
108
+ @refresh_tries = sut_parameters[ :ui_state_refresh_tries, '5' ].to_f
109
+ @refresh_interval = sut_parameters[ :refresh_interval, '0.5' ].to_f
110
+
111
+ # load verify blocks from defined sut configuration file
112
+ @verify_blocks = load_verify_blocks( sut_parameters[ :verify_blocks, nil ] )
113
+
114
+ end
115
+
116
+ public
117
+
118
+ # == description
119
+ # Connects selected SUT according to configuration in tdriver_parameters.xml.
120
+ # == arguments
121
+ # id
122
+ # Symbol
123
+ # description: SUT id
124
+ # example: :sut_qt
125
+ # == returns
126
+ # Boolean
127
+ # description: Determines if SUT is connected
128
+ # example: true
129
+ def connect( id )
130
+
131
+ @sut_controller.connect( id )
132
+
133
+ end
134
+
135
+ # == description
136
+ # Disconnects the current SUT
137
+ # == returns
138
+ # Boolean
139
+ # description: Determines if SUT is connected
140
+ # example: false
141
+ # == examples
142
+ # @sut.disconnect
143
+ def disconnect
144
+
145
+ @sut_controller.disconnect
146
+
147
+ end
148
+
149
+ # == description
150
+ # Retrieves the total amount of data received in bytes
151
+ # == returns
152
+ # Fixnum
153
+ # description: Total amount of data received in bytes
154
+ # example: 65535
155
+ # == examples
156
+ # @sut.disconnect
157
+ def received_data
158
+
159
+ @sut_controller.received_bytes
160
+
161
+ end
162
+
163
+ # == description
164
+ # Retrieves the total amount of data sent in bytes
165
+ # == returns
166
+ # Fixnum
167
+ # description: Total amount of data sent in bytes
168
+ # example: 65535
169
+ # == examples
170
+ # @sut.sent_data
171
+ def sent_data
172
+
173
+ @sut_controller.sent_bytes
174
+
175
+ end
176
+
177
+ # == description
178
+ # Function to disable taking UI dumps from target for a moment. This method might be deprecated in future release.\n
179
+ # \n
180
+ # [b]NOTE:[/b] Remember to enable ui dumps again using unfreeze!
181
+ # == returns
182
+ # NilClass
183
+ # description: -
184
+ # example: -
185
+ def freeze
186
+
187
+ =begin
188
+ if use_find_objects
189
+
190
+ warn("warning: SUT##{ __method__ } is not supported when use_find_objects optimization is enabled")
191
+
192
+ else
193
+
194
+ @frozen = true
195
+
196
+ end
197
+ =end
198
+
199
+ @frozen = true
200
+
201
+
202
+ nil
203
+
204
+ end
205
+
206
+ # == description
207
+ # Function to enable taking ui dumps from target. This method might be deprecated in future release.\n
208
+ # \n
209
+ # == returns
210
+ # NilClass
211
+ # description: -
212
+ # example: -
213
+ def unfreeze
214
+
215
+ =begin
216
+ if use_find_objects
217
+
218
+ warn("warning: SUT##{ __method__ } is not supported when use_find_objects optimization is enabled")
219
+
220
+ else
221
+
222
+ @frozen = false
223
+
224
+ end
225
+ =end
226
+
227
+ @frozen = false
228
+
229
+ nil
230
+
231
+ end
232
+
233
+ # == nodoc
234
+ # == description
235
+ # Force to use user defined ui state (e.g. for debugging purposes). Freezes the SUT xml_data, until unfreezed or set to nil.
236
+ #
237
+ # == arguments
238
+ # xml
239
+ # String
240
+ # description: Freeze SUT XML data with given XML string
241
+ # example: "<tasMessage>.....</tasMessage>"
242
+ # MobyUtil::XML::Element
243
+ # description: Freeze SUT XML data with given XML element
244
+ # example: -
245
+ # NilClass
246
+ # description: Unfreeze SUT XML data
247
+ # example: nil
248
+ #
249
+ # == returns
250
+ # NilClass
251
+ # description: This method doesn't return anything
252
+ # example: -
253
+ #
254
+ # == exception
255
+ # TypeError
256
+ # description: Wrong argument type <class> for XML (expected MobyUtil::XML::Element, String or NilClass)
257
+ def xml_data=( xml )
258
+
259
+ xml.check_type( [ MobyUtil::XML::Element, String, NilClass ], "Wrong argument type $1 for XML (expected $2)" )
260
+
261
+ if xml.kind_of?( MobyUtil::XML::Element )
262
+
263
+ @test_object_adapter = @test_object_adapter.identify_test_object_adapter_from_data( xml )
264
+
265
+ @xml_data = xml
266
+ @frozen = true
267
+ @forced_xml = true
268
+
269
+ elsif xml.kind_of?( String )
270
+
271
+ @test_object_adapter = @test_object_adapter.identify_test_object_adapter_from_data( xml )
272
+
273
+ @xml_data = MobyUtil::XML.parse_string( xml )
274
+ @frozen = true
275
+ @forced_xml = true
276
+
277
+ elsif xml.kind_of?( NilClass )
278
+
279
+ @xml_data = nil
280
+ @frozen = false
281
+ @forced_xml = false
282
+
283
+ end
284
+
285
+ nil
286
+
287
+ end
288
+
289
+
290
+ # TODO: merge TestObject#child and SUT#child
291
+ # == description
292
+ # Creates a child test object from this SUT. SUT object will be associated as child test objects parent.\n
293
+ # \n
294
+ # [b]NOTE:[/b] Subsequent calls to TestObject#child( rule ) always returns reference to same Testobject:\n
295
+ # [code]a = sut.child( :type => 'Button', :text => '1' )
296
+ # b = sut.child( :type => 'Button', :text => '1' )
297
+ # a.eql?( b ) # => true[/code]
298
+ # \n
299
+ # [b]NOTE:[/b] If the parameter 'use_find_object' in tdriver_parameters.xml is true (default), objects with visibleOnScreen value 'false' might be
300
+ # optimized out and not appear in the results.
301
+ # \n
302
+ # == arguments
303
+ # attributes
304
+ # Hash
305
+ # description: Hash object holding information for identifying which child to create
306
+ # example: { :type => "application" }
307
+ #
308
+ # == returns
309
+ # TestObject
310
+ # description: New child test object or reference to existing child
311
+ # example: -
312
+ def child( attributes )
313
+
314
+ ###############################################################################################################
315
+ #
316
+ # NOTICE: Please do not add anything unnessecery to this method, it might cause a major performance impact
317
+ #
318
+
319
+ # verify attributes argument format
320
+ attributes.check_type( Hash, "Wrong argument type $1 for attributes (expected $2)" )
321
+
322
+ # store original hash
323
+ creation_hash = attributes.clone
324
+
325
+ identification_directives = creation_hash.strip_dynamic_attributes!
326
+
327
+ # raise exception if wrong value type given for ;__logging
328
+ identification_directives[ :__logging ].check_type(
329
+
330
+ [ TrueClass, FalseClass ],
331
+
332
+ "Wrong value type $1 for :__logging test object creation directive (expected $2)"
333
+
334
+ ) if identification_directives.has_key?( :__logging )
335
+
336
+ # disable logging if requested, remove pair from creation_hash
337
+ $logger.push_enabled( identification_directives[ :__logging ] || $logger.enabled )
338
+
339
+ begin
340
+
341
+ # TODO: refactor me
342
+ child_test_object = @test_object_factory.get_test_objects(
343
+
344
+ # current object as parent, can be either TestObject or SUT
345
+ :parent => self,
346
+
347
+ # test object identification hash
348
+ :object_attributes_hash => creation_hash,
349
+
350
+ :identification_directives => identification_directives
351
+
352
+ )
353
+
354
+ rescue MobyBase::MultipleTestObjectsIdentifiedError
355
+
356
+ $logger.behaviour "FAIL;Multiple child objects matched criteria.;#{ id };sut;{};child;#{ attributes.inspect }"
357
+
358
+ raise
359
+
360
+ rescue MobyBase::TestObjectNotFoundError
361
+
362
+ $logger.behaviour "FAIL;The child object could not be found.;#{ id };sut;{};child;#{ attributes.inspect }"
363
+
364
+ raise
365
+
366
+ rescue Exception
367
+
368
+ $logger.behaviour "FAIL;Failed when trying to find child object.;#{ id };sut;{};child;#{ attributes.inspect }"
369
+
370
+ raise
371
+
372
+ ensure
373
+
374
+ # restore original logger state
375
+ $logger.pop_enabled
376
+
377
+ end
378
+
379
+ # return child test object
380
+ child_test_object
381
+
382
+ end
383
+
384
+
385
+ # == description
386
+ # Method for executing sut specific setup method
387
+ # https://projects.forum.nokia.com/Testabilitydriver/wiki/FeatureSutSetupTeardown
388
+ # == returns
389
+ # Result
390
+ # description: -
391
+ # example: -
392
+ # == exceptions
393
+ # BehaviourError
394
+ # description: If the implementation is missing for the method
395
+ def setup
396
+
397
+ if sut_parameters[ :sut_setup, nil ] || sut_parameters[ :setup, nil ]
398
+
399
+ if sut_parameters[ :sut_setup, nil ]
400
+
401
+ require MobyUtil::FileHelper.expand_path( sut_parameters[ :sut_setup ] )
402
+
403
+ $logger.behaviour "PASS;sut.setup method found"
404
+
405
+ setup
406
+
407
+ $logger.behaviour "PASS;sut.setup executed"
408
+
409
+ end
410
+
411
+ if sut_parameters[ :setup, nil ]
412
+
413
+ $logger.behaviour "PASS;sut.setup parameters found"
414
+
415
+ methods = sut_parameters[ :setup ]
416
+
417
+ methods.each do | method |
418
+
419
+ m = method[0].to_s
420
+
421
+ args = method[1]
422
+
423
+ if args.to_s == ""
424
+
425
+ eval("self.#{m}")
426
+
427
+ else
428
+
429
+ eval("self.#{m}(:#{args.to_sym})")
430
+
431
+ end
432
+
433
+ end
434
+
435
+ $logger.behaviour "PASS;sut.setup parameter methods executed"
436
+
437
+ end
438
+
439
+ else
440
+
441
+ $logger.behaviour "FAIL;No methods or parameters found for sut.setup"
442
+ raise MobyBase::BehaviourError.new("Setup", "Failed to load sut.setup method check the :sut_setup parameter")
443
+
444
+ end
445
+
446
+ end
447
+
448
+ # == description
449
+ # Method for executing sut specific teardown method
450
+ # https://projects.forum.nokia.com/Testabilitydriver/wiki/FeatureSutSetupTeardown
451
+ # == returns
452
+ # Result
453
+ # description: -
454
+ # example: -
455
+ # == exceptions
456
+ # BehaviourError
457
+ # description: If the implementation is missing for the method
458
+ def teardown
459
+
460
+ if sut_parameters[ :sut_teardown, nil ] || sut_parameters[ :teardown, nil ]
461
+
462
+ if sut_parameters[ :sut_teardown, nil ]
463
+
464
+ require MobyUtil::FileHelper.expand_path(sut_parameters[ :sut_teardown ])
465
+
466
+ $logger.behaviour "PASS;sut.teardown method found"
467
+
468
+ teardown
469
+
470
+ $logger.behaviour "PASS;sut.teardown executed"
471
+
472
+ end
473
+
474
+ if sut_parameters[ :teardown, nil ]
475
+
476
+ $logger.behaviour "PASS;sut.teardown parameters found"
477
+
478
+ methods = sut_parameters[ :teardown ]
479
+
480
+ methods.each do | method |
481
+
482
+ m = method[0].to_s
483
+
484
+ args = method[1]
485
+
486
+ if args.to_s == ""
487
+
488
+ eval("self.#{m}")
489
+
490
+ else
491
+
492
+ eval("self.#{m}(:#{args.to_sym})")
493
+
494
+ end
495
+
496
+ end
497
+
498
+ $logger.behaviour "PASS;sut.teardown parameter methods executed"
499
+
500
+ end
501
+
502
+ else
503
+
504
+ $logger.behaviour "FAIL;No method or parameters found for sut.teardown"
505
+
506
+ raise MobyBase::BehaviourError.new("Teardown", "Failed to load sut.teardown method check the :sut_teardown parameter")
507
+
508
+ end
509
+
510
+ end
511
+
512
+ # == description
513
+ # Creates a state object of current test object or given XML as argument. The state object is static and thus is not refreshed or synchronized.
514
+ #
515
+ # == arguments
516
+ # source_data
517
+ # String
518
+ # description: Object state as XML string
519
+ # example: -
520
+ # MobyBase::XML::Element
521
+ # description: Object state as XML element
522
+ # example: -
523
+ #
524
+ # parent_object
525
+ # MobyBase::TestObject
526
+ # description: Parent object
527
+ # example: -
528
+ # MobyBase::SUT
529
+ # description: Parent object
530
+ # example: -
531
+ # NilClass
532
+ # description: No parent object defined
533
+ # example: nil
534
+ #
535
+ # == returns
536
+ # MobyBase::StateObject
537
+ # description: State of this SUT, test object or given XML
538
+ # example: -
539
+ #
540
+ # == exceptions
541
+ # ArgumentError
542
+ # description: Wrong argmument type given
543
+ # RuntimeError
544
+ # description: If the XML source for the object is not in initialized
545
+ def state_object( source_data = nil, parent_object = nil )
546
+
547
+ if source_data.nil?
548
+
549
+ # refresh if xml data is empty
550
+ refresh if @xml_data.empty?
551
+
552
+ raise RuntimeError, "Can not create state object of SUT with id #{ @id.inspect }, no XML content or SUT not initialized properly." if @xml_data.empty?
553
+
554
+ source_data = @test_object_adapter.state_object_xml( @xml_data, @id )
555
+
556
+ parent_object = self
557
+
558
+ end
559
+
560
+ # verify that type of xml_source argument is correct
561
+ source_data.check_type [ String, MobyUtil::XML::Element ], 'wrong argument type $1 for state object source data (expected $2)'
562
+
563
+ parent_object.check_type [ MobyBase::SUT, MobyBase::TestObject, MobyBase::StateObject, NilClass ], 'wrong argument type $1 for parent object (expected $2)'
564
+
565
+ MobyBase::StateObject.new(
566
+
567
+ :source_data => source_data,
568
+ :parent => parent_object,
569
+ :test_object_adapter => @test_object_adapter
570
+
571
+ )
572
+
573
+ end
574
+
575
+ # == description
576
+ # Returns the current foreground application or one which matches with given attributes rules.
577
+ #
578
+ # == arguments
579
+ # target
580
+ # Hash
581
+ # description: Hash defining required expected attributes of the application
582
+ # example: { :name => "testapp" }
583
+ # String
584
+ # description: Name of application
585
+ # example: "testapp"
586
+ #
587
+ # == returns
588
+ # MobyBase::TestObject
589
+ # description: Current foreground application or one that meets hash rules
590
+ # example: -
591
+ #
592
+ # == exceptions
593
+ # TypeError
594
+ # description: Wrong argument type <class> for attributes (expected Hash)
595
+ #
596
+ def application( target = {} )
597
+
598
+ begin
599
+
600
+ # raise exception if argument type other than hash
601
+ target.check_type( [ String, Hash ], "Wrong argument type $1 for application identification rules (expected $2)" )
602
+
603
+ # if target application is given as string, interpret it as application name
604
+ target = { :name => target.to_s } if target.kind_of?( String )
605
+
606
+ target[ :type ] = 'application'
607
+
608
+ target[ :__parent_application ] = nil
609
+
610
+ @current_application_id = nil if target[ :id ].nil?
611
+
612
+ # create test object and return it as result
613
+ test_object = child( target )
614
+
615
+ # store parent application to test object
616
+ test_object.instance_variable_set( :@parent_application, test_object )
617
+
618
+ test_object
619
+
620
+ rescue
621
+
622
+ $logger.behaviour(
623
+ "FAIL;Failed to find application.;#{ id.to_s };sut;{};application;#{ target.kind_of?( Hash ) ? target.inspect : target.class.to_s }"
624
+ )
625
+
626
+ # raise same exception
627
+ raise
628
+
629
+ ensure
630
+
631
+ $logger.behaviour "PASS;Application found.;#{ id.to_s };sut;{};application;#{ target.inspect }" if $!.nil?
632
+
633
+ end
634
+
635
+ end
636
+
637
+ # == description
638
+ # Screen capture function to take snapshot of SUTs current display view
639
+ #
640
+ # == arguments
641
+ # arguments
642
+ # Hash
643
+ # description:
644
+ # Options to be used for screen capture. See [link="#capture_options_table"]Options table[/link] for valid keys
645
+ # example: ( :filename => "output.png" )
646
+ #
647
+ # == tables
648
+ # capture_options_table
649
+ # title: Options table
650
+ # |Key|Type|Description|Example|Required|
651
+ # |:filename|String|Store output binary to this file. Absolute or relative path supported.|:filename => "screen_shots/output.png"|Yes|
652
+ #
653
+ # == returns
654
+ # NilClass
655
+ # description: -
656
+ # example: -
657
+ #
658
+ # == exceptions
659
+ # TypeError
660
+ # description: Wrong argument type <class> (expected Hash)
661
+ #
662
+ # ArgumentError
663
+ # description: Output filename (:filename) not defined in argument hash
664
+ #
665
+ # ArgumentError
666
+ # description: Wrong argument type <class> for output filename (expected String)
667
+ #
668
+ # ArgumentError
669
+ # description: Output filename must not be empty string
670
+ #
671
+ def capture_screen( arguments )
672
+
673
+ begin
674
+
675
+ # raise exception with default message if wrong argument type given
676
+ arguments.check_type( Hash, "Wrong argument type $1 (expected $2)" )
677
+
678
+ # legacy support: support also :Filename
679
+ arguments[ :filename ] = arguments.delete( :Filename ) if arguments.has_key?( :Filename )
680
+
681
+ # raise exception with default message if hash doesn't contain required key
682
+ arguments.require_key( :filename, "Output filename ($1) not defined in argument hash" )
683
+
684
+ # verify that filename is type of String
685
+ arguments[ :filename ].check_type( String, "Wrong argument type $1 for output filename (expected $2)" )
686
+
687
+ # verify that filename is not empty string
688
+ arguments[ :filename ].not_empty( "Output filename must not be empty string" )
689
+
690
+ # create screen capture command object
691
+ command = MobyCommand::ScreenCapture.new()
692
+
693
+ command.redraw = arguments[ :Redraw ] if arguments[ :Redraw ]
694
+
695
+ # execute command and write binary to file
696
+ File.open( File.expand_path( arguments[ :filename ] ), 'wb:binary' ){ | file |
697
+
698
+ file << execute_command( command )
699
+
700
+ }
701
+
702
+ rescue
703
+
704
+ $logger.behaviour "FAIL;Failed to capture screen.;#{ id.to_s };sut;{};capture_screen;#{ arguments.kind_of?( Hash ) ? arguments.inspect : arguments.class.to_s }"
705
+
706
+ raise
707
+
708
+ end
709
+
710
+ $logger.behaviour "PASS;Screen was captured successfully.;#{ id.to_s };sut;{};capture_screen;#{ arguments.inspect }"
711
+
712
+ nil
713
+
714
+ end
715
+
716
+ # == description
717
+ # Instructs the SUT to start the specified application if it is not currenly being executed
718
+ # The application will also be brought to the foregound.
719
+ #
720
+ # == arguments
721
+ # target
722
+ # Hash
723
+ # description: Used to indetify the application to be executed. All symbols defined in the hash must match with the launched application. See application [link="#run_hash_arguments"]run argument hash keys[/link] table.
724
+ # example: { :name => "calculator" }
725
+ # String
726
+ # description: If target application is given in String format it is interpreted as application name. String "calculator"' is equivalent to {:name => "calculator"} hash.
727
+ # example: "calculator"
728
+ #
729
+ # == tables
730
+ # run_hash_arguments
731
+ # title: Run argument hash keys
732
+ # description: The following symbols can be defined in the hash, at least one them must be defined.
733
+ # |Key|Type|Description|Example|
734
+ # |:uid|String or Integer|Unique ID of the application|{ :uid => 268458181 }|
735
+ # |:name|String|Executable name of the application|{ :name => 'calculator' }|
736
+ # |:restart_if_running|Boolean|Restart application if already running|{ :restart_if_running => true }|
737
+ # |:arguments|String|Comma separated list of arguments passed to the application when it is started|{ :arguments => '--nogui,-v' }|
738
+ # |:check_pid|Boolean|Overrides default value of SUT parameter :application_check_pid; When set to true, process id is used to test object identification|false|
739
+ # |:sleep_time|Integer|Number of seconds to sleep immediately after launching the process|{ :sleep_time => 10 }|
740
+ # |:start_command|String|When set, the run method will execute this command and expect the application provided by the :name key to be launched. Note that applications launched this way can't be sent a Kill message and its start up events and signals may not be recorded.|{ :start_command => 'start_app_batch',:name => 'calculator' }|
741
+ # |:try_attach|Boolean|If set to true, run will attempt to attach to an existing application with the given name or id. If not found the application will be launched as normal. If more than 1 are found then an exception is thrown|{:try_attach => true, :name => 'calculator'}|
742
+ # |:environment|String|Environment variables you want to pass to started process, passed as key value pairs separated by '=' and pairs separated by spaces |{ :environment => 'LC_ALL=en SPECIAL_VAR=value' }|
743
+ # |:events_to_listen|String|List of events you want to start listening to when application starts, passed as comma separated string. You can retrieve a list of events fired by a test object by first enabling event listening and then using the get_events method. See methods enable_events, get_events and disable_events |{ :events_to_listen => 'Paint,Show' }|
744
+ # |:signals_to_listen|String|List of signals you want to start listening to when application starts, passed as comma separated string. Check your application class what signals it can emit, or you can use the 'signal' fixture's 'list_signal' method to retrieve an xml string listing all the signals the object can emit. E.g. xml = @object.fixture('signal', 'list_signals')|{ :signals_to_listen => 'applicationReady()' }|
745
+ #
746
+ # == returns
747
+ # TestObject
748
+ # description: Test object of the started application
749
+ # example: -
750
+ #
751
+ # == exceptions
752
+ # TypeError
753
+ # description: Wrong argument type <class> for run method (expected Hash)
754
+ #
755
+ # ArgumentError
756
+ # description: Required key :uid or :name not found from argument hash
757
+ #
758
+ # VerificationError
759
+ # description: If no application test object can be found after starting the application, or the found object does not match the launched application
760
+ #
761
+ def run( target )
762
+
763
+ begin
764
+
765
+ # set the refresh interval to zero while the application is launched
766
+ #orig_interval = sut_parameters[ :refresh_interval ]
767
+ #sut_parameters[ :refresh_interval ] = '0'
768
+
769
+ # raise exception if argument type other than hash
770
+ target.check_type( [ String, Hash ], "Wrong argument type $1 for run method (expected $2)" )
771
+
772
+ # if target application is given as string, interpret it as application name
773
+ target = { :name => target.to_s } if target.kind_of?( String )
774
+
775
+ # default value for missing keys
776
+ target.default = nil
777
+
778
+ # raise exception if :uid or :name not found from hash
779
+ target.require_one( [ :uid, :name ], "Required key :uid or :name not found from argument hash" )
780
+
781
+ # due to bug #1488
782
+ sleep_time = ( target[ :sleep_after_launch ] || target[ :sleep_time ] ).to_i
783
+
784
+ timeout_time = sut_parameters[ :application_synchronization_timeout, '5' ].to_f
785
+
786
+ retry_interval = sut_parameters[ :application_synchronization_retry_interval, '0.5' ].to_f
787
+
788
+ if target.has_key?( :check_pid )
789
+
790
+ check_pid = target[ :check_pid ].check_type [ TrueClass, FalseClass ], 'wrong argument type $1 for SUT#run :check_pid (expected $2)'
791
+
792
+ else
793
+
794
+ # due to bug #1710; pid checking must be configurable
795
+ check_pid = sut_parameters[ :application_check_pid, false ].to_s.to_boolean( false )
796
+
797
+ end
798
+
799
+ raise ArgumentError, "Sleep time need to be >= 0" unless sleep_time >= 0
800
+
801
+ # try to find an existing app with the current arguments
802
+ if target[ :try_attach ] || target[:restart_if_running]
803
+
804
+ app_list = MobyBase::StateObject.new(
805
+
806
+ :source_data => list_apps,
807
+ :parent => nil,
808
+ :test_object_adapter => @test_object_adapter
809
+
810
+ )
811
+
812
+ # either ID or NAME have been passed to identify the application
813
+ # raise exception if more than one app has been found for this id/name
814
+ # otherwhise attempt to get the application test object
815
+
816
+ app_info = find_app(app_list, {:id => target[ :uid ]}) if target[ :uid ] != nil
817
+ app_info = find_app(app_list, {:name => target[ :name ]}) unless app_info
818
+
819
+ app = application(:id => app_info.id) if app_info
820
+
821
+ if target[:restart_if_running] && app
822
+
823
+ # Close the application,
824
+ app.close # (:force_kill => true)
825
+
826
+ elsif app
827
+
828
+ begin
829
+
830
+ app.bring_to_foreground
831
+
832
+ rescue Exception => e
833
+
834
+ $logger.warning "Could not bring app to foreground"
835
+
836
+ end
837
+
838
+ return app
839
+
840
+ end
841
+
842
+ end
843
+
844
+ if ( target[ :start_command ] != nil )
845
+
846
+ raise MobyBase::BehaviourError.new("Run", "Failed to load execute_shell_method") unless respond_to?("execute_shell_command")
847
+
848
+ execute_shell_command( target[ :start_command ], :detached => "true" )
849
+
850
+ else
851
+
852
+ # execute the application control service request
853
+ # the run request will return the pid if all goes well
854
+ app_pid = nil
855
+
856
+ app_pid = execute_command(
857
+ MobyCommand::Application.new(
858
+ :Run,
859
+ {
860
+ :application_name => target[ :name ],
861
+ :application_uid => target[ :uid ],
862
+ :sut => self,
863
+ :arguments => target[ :arguments ],
864
+ :environment => target[ :environment ],
865
+ :working_directory => target[ :working_directory ],
866
+ :events_to_listen => target[ :events_to_listen ],
867
+ :signals_to_listen => target[ :signals_to_listen ]
868
+ }
869
+ )
870
+ )
871
+
872
+ end
873
+
874
+ # do not remove this, unless qttas server & plugin handles the syncronization between plugin registration & first ui state request
875
+ # first ui dump is requested too early and target/server seems not be ready...
876
+ sleep sleep_time if sleep_time > 0
877
+
878
+ # Now the application id is its PID that we get from the execute_command response
879
+ expected_attributes = { :type => 'application' }
880
+
881
+ # fix to bug #1710; pid checking must be configurable
882
+ if check_pid == true
883
+
884
+ expected_attributes[ :id ] = app_pid unless app_pid.nil?
885
+
886
+ end
887
+
888
+ expected_attributes[ :FullName ] = target[ :name ] unless target[ :name ].nil?
889
+
890
+ # For error reporting
891
+ error_details = target[ :name ].nil? ? "" : "name: " << target[ :name ].to_s
892
+ error_details << ( error_details.empty? ? "" : ", ") << "id: " << target[ :uid ].to_s if !target[ :uid ].nil?
893
+
894
+ # Calculate the application name from :FullName ( used later )
895
+ app_name = target[ :name ].nil? ? "" : "name: " << target[ :name ].to_s
896
+
897
+ if( !expected_attributes[ :FullName ].nil? )
898
+ if( expected_attributes[ :FullName ].include?('/') )
899
+ app_name = expected_attributes[ :FullName ].split('/')[ expected_attributes[ :FullName ].split( '/' ).size-1 ]
900
+ app_name.slice!( ".exe" )
901
+ expected_attributes[ :name ] = app_name
902
+
903
+ elsif( expected_attributes[ :FullName ].include?("\\") )
904
+ app_name = expected_attributes[ :FullName ].split("\\")[ expected_attributes[ :FullName ].split( "\\" ).size-1 ]
905
+ app_name.slice!( ".exe" )
906
+ expected_attributes[:name] = app_name
907
+
908
+ else
909
+ app_name = expected_attributes[ :FullName ]
910
+ app_name.slice!( ".exe" )
911
+ expected_attributes[ :name ] = app_name
912
+
913
+ end
914
+
915
+ expected_attributes.delete( :FullName )
916
+ expected_attributes.delete( :name )
917
+ end
918
+
919
+ # Wait for application to register and then create the application test object
920
+ begin
921
+
922
+ MobyUtil::Retryable.until(
923
+ :timeout => timeout_time,
924
+ :interval => retry_interval,
925
+ :exception => MobyBase::ApplicationNotAvailableError) {
926
+
927
+ # verify that application is launched and application test object is found from xml
928
+ expected_attributes.delete( :name )
929
+
930
+ wait_child(
931
+
932
+ # attributes to identify application object
933
+ expected_attributes,
934
+
935
+ # timeout to for application synchronization
936
+ timeout_time,
937
+
938
+ # wait retry interval and try again if application was not found
939
+ retry_interval
940
+
941
+ )
942
+
943
+ expected_attributes[ :name ] = app_name
944
+ # retrieve application object element from sut.xml_data
945
+
946
+ @matches, unused_rule = @test_object_adapter.get_objects( xml_data, expected_attributes, true )
947
+
948
+ # raise exception if application element was not found; this shouldn't ever happen?
949
+ raise MobyBase::ApplicationNotAvailableError if @matches.count == 0
950
+
951
+ }
952
+
953
+ # create application test object
954
+ foreground_app = @test_object_factory.make_test_object(
955
+
956
+ :parent => self,
957
+
958
+ :parent_application => nil,
959
+
960
+ :object_attributes_hash => expected_attributes,
961
+
962
+ :xml_object => @matches.first
963
+
964
+ )
965
+
966
+ # store application reference to test application; this will be passed to it's child test object(s)
967
+ foreground_app.instance_variable_set( :@parent_application, foreground_app )
968
+
969
+ # application was not found; this scenario shouldn't ever happen?
970
+ #raise MobyBase::TestObjectNotFoundError unless foreground_app.kind_of?( MobyBehaviour::Application )
971
+
972
+ rescue MobyBase::TestObjectNotFoundError
973
+
974
+ raise MobyBase::VerificationError, "No application type test object was found on the device after starting the application."
975
+
976
+ rescue MobyBase::SyncTimeoutError
977
+
978
+ raise MobyBase::VerificationError, "The application (#{ error_details }) was not found on the sut after being launched."
979
+
980
+ end
981
+
982
+ # raise behaviour error if any exception is raised
983
+ rescue
984
+
985
+ $logger.behaviour "FAIL;Failed to launch application.;#{ id.to_s };sut;{};run;#{ target.kind_of?( Hash ) ? target.inspect : target.class.to_s }"
986
+
987
+ raise MobyBase::BehaviourError.new("Run", "Failed to launch application")
988
+
989
+ end
990
+
991
+ $logger.behaviour "PASS;The application was launched successfully.;#{ id.to_s };sut;{};run;#{ target.inspect }"
992
+
993
+ foreground_app
994
+
995
+ end
996
+
997
+ # == description
998
+ # Performs a key press or key press sequence to SUT. Key press sequence can contain more complex operations such as holding multiple keys down at the same. Key map file is provided by SUT plugin and is configured in TDriver parameters and/or SUT template XML file (tdriver_parameters.xml).\n
999
+ # \n
1000
+ # [b]Note for Qt users:[/b]\n
1001
+ # If the focus is not currently on target object you need to use the it's own press_key method or tap it before sending any key press events.
1002
+ #
1003
+ # == tables
1004
+ # press_key_sequences
1005
+ # title: Keypress sequence types
1006
+ # description: Describes different types of keypresses. All types are symbols. The amount of time each key are held and time between presses can be specified in tdriver_parameters.xml: short_press are for "normal" keypresses, while long_press are for keypresses of type :LongPress
1007
+ # |Type|Description|Example|
1008
+ # |:KeyDown|Holds key down on SUT until it is released|MobyCommand::KeySequence.new(:kShift, :KeyDown)|
1009
+ # |:KeyUp|Releases a key that was held down on SUT|MobyCommand::KeySequence.new(:kShift, :KeyUp)|
1010
+ # |:LongPress|Holds a key as long_press_timeout specifies in tdriver_parameters.xml. Please note also long_press_interval (Only for S60)|MobyCommand::KeySequence.new( :kApp, :LongPress )|
1011
+ #
1012
+ # == tables
1013
+ # press_key_sequences_methods
1014
+ # title: Keypress sequence methods
1015
+ # description: Specifies possible altering methods for keysequnces. All keysequences are created with MobyCommand::KeySequence.new
1016
+ # |Type|Description|Example|
1017
+ # |:KeyDown|Holds key down on SUT until it is released|MobyCommand::KeySequence.new(:kShift, :KeyDown)|
1018
+ # |:KeyUp|Releases a key that was held down on SUT|MobyCommand::KeySequence.new(:kShift, :KeyUp)|
1019
+ # |:LongPress|Holds a key as long_press_timeout specifies in tdriver_parameters.xml. Please note also long_press_interval (Only for S60)|MobyCommand::KeySequence.new( :kApp, :LongPress )|
1020
+ #
1021
+ # == arguments
1022
+ # value
1023
+ # Symbol
1024
+ # description: one of the key symbols defined in /tdriver/keymaps/
1025
+ # example: @sut.press_key(:kDown)
1026
+ # MobyCommand::KeySequence
1027
+ # description: a KeySequence object of key symbols
1028
+ # example: @sut.press_key( MobyCommand::KeySequence.new(:kDown).times!(3).append!(:kLeft) )
1029
+ #
1030
+ # == returns
1031
+ # NilClass
1032
+ # description: -
1033
+ # example: -
1034
+ #
1035
+ # == exceptions
1036
+ # TypeError
1037
+ # description: Wrong argument type $1 for press_key (expected $2)
1038
+ #
1039
+ def press_key( value )
1040
+
1041
+ begin
1042
+
1043
+ value.check_type( [ Symbol, MobyCommand::KeySequence ], "Wrong argument type $1 for press_key (expected $2)" )
1044
+
1045
+ if value.kind_of?( Symbol )
1046
+
1047
+ sequence = MobyCommand::KeySequence.new( value )
1048
+
1049
+ else
1050
+
1051
+ sequence = value
1052
+
1053
+ end
1054
+
1055
+ sequence.set_sut( self )
1056
+
1057
+ execute_command( sequence )
1058
+
1059
+ rescue
1060
+
1061
+ $logger.behaviour "FAIL;Failed to press key(s).;#{id.to_s};sut;{};press_key;#{ value }"
1062
+
1063
+ raise
1064
+
1065
+ end
1066
+
1067
+ $logger.behaviour "PASS;Successfully pressed key(s).;#{ id.to_s };sut;{};press_key;#{ value }"
1068
+
1069
+ nil
1070
+
1071
+ end
1072
+
1073
+ # == description
1074
+ # Wrapper function to access sut specific parameters.
1075
+ # Parameters for each sut are stored in the parameters xml file under group tag with name attribute matching the SUT id
1076
+ #
1077
+ # == arguments
1078
+ # *arguments
1079
+ # String
1080
+ # description: Optional argument which is the name of parameter.
1081
+ # example: 'new_parameter'
1082
+ # Symbol
1083
+ # description: Optional argument which is the name of parameter.
1084
+ # example: :product
1085
+ #
1086
+ # == returns
1087
+ # String
1088
+ # description: Value matching the parameter name given as argument
1089
+ # example: 'testability-driver-qt-sut-plugin'
1090
+ #
1091
+ # TDriver::ParameterHash
1092
+ # description: Hash of values, if no arguments is specified
1093
+ # example: { :value => '1', :inner_hash => { :another_value => 100 } }
1094
+ #
1095
+ # == exceptions
1096
+ # ParameterNotFoundError
1097
+ # description: If the parameter with the given name does not exist
1098
+ #
1099
+ # == example
1100
+ # parameter_hash = @sut.parameter #returns the hash of all sut parameters
1101
+ # value = @sut.parameter[:product] #returns the value for parameter 'product' for this particular sut
1102
+ # value = @sut.parameter['non_existing_parameter'] #raises exception that 'non_existing_parameter' was not found
1103
+ # value = sut.parameter['non_existing_parameter', 'default'] #returns default value if given parameter is not found
1104
+ # sut.parameter[:new_parameter] ='new_value' # set the value of parameter 'product' for this particular sut
1105
+ def parameter( *arguments )
1106
+
1107
+ if ( arguments.count == 0 )
1108
+
1109
+ $parameters[ @id ]
1110
+
1111
+ else
1112
+
1113
+ $parameters[ @id ][ *arguments ]
1114
+
1115
+ end
1116
+
1117
+ end
1118
+
1119
+ # == description
1120
+ # Wrapper function to return translated string for this SUT to read the values from localisation database.
1121
+ #
1122
+ # == arguments
1123
+ # logical_name
1124
+ # String
1125
+ # description: Logical name (LNAME) of the item to be translated. If prefix for User Information or Operator Data are used then the appropiate retrieve methods will be called
1126
+ # example: "txt_button_ok"
1127
+ # Symbol
1128
+ # description: Symbol form of the logical name (LNAME) of the item to be translated.
1129
+ # example: :txt_button_ok
1130
+ #
1131
+ # file_name
1132
+ # String
1133
+ # description: Optional FNAME search argument for the translation
1134
+ # example: "agenda"
1135
+ # default: nil
1136
+ #
1137
+ # plurality
1138
+ # String
1139
+ # description: Optional PLURALITY search argument for the translation
1140
+ # example: "a" or "singular"
1141
+ # default: nil
1142
+ #
1143
+ # numerus
1144
+ # String
1145
+ # description: Optional numeral replacement of an '%Ln | %1' tag on the translated string
1146
+ # example: "1"
1147
+ # default: nil
1148
+ # Integer
1149
+ # description: Optional numeral replacement of an '%Ln | %1 | %D | %U | %N' tag on the translated string
1150
+ # example: 1
1151
+ # Array
1152
+ # description: Optional numeral replacements for multiple '%L1 | %1, %L2 | %2, ...' tags on the translated string
1153
+ # example: [ 3, 2]
1154
+ #
1155
+ # lengthvariant
1156
+ # String
1157
+ # description: Optional argument to specify a length variant with its priority number (1-9). Translations with no length variants are considered a variant of priority "1". The default 'nil' value will retrieve all variants available.
1158
+ # example: "1"
1159
+ # default: nil
1160
+ #
1161
+ # == returns
1162
+ # String
1163
+ # description: Translation matching the logical_name
1164
+ # example: "Ok"
1165
+ # Array
1166
+ # description: If multiple translations have been found for the search conditions an Array with all Strings be returned
1167
+ # example: ["Ok", "OK"]
1168
+ #
1169
+ # == exceptions
1170
+ # LanguageNotFoundError
1171
+ # description: In case language is not found
1172
+ #
1173
+ # LogicalNameNotFoundError
1174
+ # description: In case no logical name is not found for current language
1175
+ #
1176
+ # SqlError
1177
+ # description: In case there are problems with the database connectivity
1178
+ #
1179
+ def translate( logical_name, file_name = nil, plurality = nil, numerus = nil, lengthvariant = nil )
1180
+
1181
+ raise LogicalNameNotFoundError, "Logical name is nil" if logical_name.nil?
1182
+
1183
+ translation_type = "localisation"
1184
+
1185
+ # Check for User Information prefix( "uif_...")
1186
+ $parameters[ :user_data_logical_string_identifier, 'uif_' ].split('|').each do |identifier|
1187
+
1188
+ if logical_name.to_s.index(identifier)==0
1189
+
1190
+ translation_type="user_data"
1191
+
1192
+ end
1193
+
1194
+ end
1195
+
1196
+ # Check for Operator Data prefix( "operator_...")
1197
+ $parameters[ :operator_data_logical_string_identifier, 'operator_' ].split('|').each do |identifier|
1198
+
1199
+ if logical_name.to_s.index(identifier)==0
1200
+
1201
+ translation_type="operator_data"
1202
+
1203
+ end
1204
+
1205
+ end
1206
+
1207
+ case translation_type
1208
+
1209
+ when "user_data"
1210
+
1211
+ get_user_information( logical_name )
1212
+
1213
+ when "operator_data"
1214
+
1215
+ get_operator_data( logical_name )
1216
+
1217
+ when "localisation"
1218
+
1219
+ language = nil
1220
+
1221
+ if ( sut_parameters[ :read_lang_from_app ]=='true')
1222
+
1223
+ #read localeName app
1224
+ language = application.attribute("localeName")
1225
+
1226
+ #determine the language from the locale
1227
+ language = language.split('_')[0].to_s if (language!=nil && !language.empty?)
1228
+
1229
+ else
1230
+
1231
+ language = sut_parameters[ :language ]
1232
+
1233
+ end
1234
+
1235
+ raise LanguageNotFoundError, "Language cannot be determind to perform translation" if ( language.nil? || language.empty? )
1236
+
1237
+ translation = MobyUtil::Localisation.translation(
1238
+ logical_name,
1239
+ language,
1240
+ sut_parameters[ :localisation_server_database_tablename ],
1241
+ file_name,
1242
+ plurality,
1243
+ lengthvariant
1244
+ )
1245
+
1246
+ if translation.kind_of? String and !numerus.nil?
1247
+
1248
+ if numerus.kind_of? Array
1249
+
1250
+ translation.gsub!(/%[L]?(\d)/){|s| numerus[($1.to_i) -1] }
1251
+
1252
+ elsif numerus.kind_of? String or numerus.kind_of? Integer
1253
+
1254
+ translation.gsub!(/%(Ln|1|U|D|N)/){|s| numerus.to_s}
1255
+
1256
+ end
1257
+
1258
+ elsif translation.kind_of? Array and !numerus.nil?
1259
+
1260
+ translation.each do |trans|
1261
+
1262
+ if numerus.kind_of? Array
1263
+
1264
+ trans.gsub!(/%[L]?(\d)/){|s| numerus[($1.to_i) -1] }
1265
+
1266
+ elsif numerus.kind_of? String or numerus.kind_of? Integer
1267
+
1268
+ trans.gsub!(/%(Ln|1|U|D|N)/){|s| numerus.to_s}
1269
+
1270
+ end
1271
+
1272
+ end
1273
+
1274
+ end
1275
+
1276
+ translation
1277
+
1278
+ end
1279
+
1280
+ end
1281
+
1282
+ # == nodoc
1283
+ # == description
1284
+ # Translates all symbol values in hash using SUT's translate method.
1285
+ #
1286
+ # == arguments
1287
+ # hash
1288
+ # Hash
1289
+ # description: containing key and value pairs. The hash will get modified if symbols are found from values
1290
+ # example: {:text=>:translate_me}
1291
+ #
1292
+ # == returns
1293
+ # Hash
1294
+ # description: Translated hash
1295
+ # example: {:text=>'translated_text'}
1296
+ # == exceptions
1297
+ # LanguageNotFoundError
1298
+ # description: In case of language is not found
1299
+ #
1300
+ # LogicalNameNotFoundError
1301
+ # description: In case of logical name is not found for current language
1302
+ #
1303
+ # MySqlConnectError
1304
+ # description: In case problems with the db connectivity
1305
+ #
1306
+ def translate_values!( hash, file_name = nil, plurality = nil, numerus = nil, lengthvariant = nil )
1307
+
1308
+ hash.each_pair do | _key, _value |
1309
+
1310
+ next if [ :name, :type, :id ].include?( _key )
1311
+
1312
+ hash[ _key ] = translate( _value, file_name, plurality, numerus, lengthvariant ) if _value.kind_of?( Symbol )
1313
+
1314
+ end unless hash.nil?
1315
+
1316
+ end
1317
+
1318
+ # == description
1319
+ # Wrapper function to retrieve user information for this SUT from the user information database.
1320
+ #
1321
+ # == arguments
1322
+ # user_data_lname
1323
+ # String
1324
+ # description: Logical name (LNAME) of the user information item to be retrieved.
1325
+ # example: "uif_first_name"
1326
+ # Symbol
1327
+ # description: Symbol form of the logical name (LNAME) of the user information item to be retrieved.
1328
+ # example: :uif_first_name
1329
+ #
1330
+ # == returns
1331
+ # String
1332
+ # description: User data string
1333
+ # example: "Ivan"
1334
+ # Array
1335
+ # description: Array of Strings when multiple user data strings found.
1336
+ # example: ["Ivan", "Manolo"]
1337
+ #
1338
+ # == exceptions
1339
+ # UserDataNotFoundError
1340
+ # description: In case the desired user data is not found
1341
+ #
1342
+ # UserDataColumnNotFoundError
1343
+ # description: In case the desired data column name to be used for the output is not found
1344
+ #
1345
+ # SqlError
1346
+ # description: In case there are problems with the database connectivity
1347
+ #
1348
+ def get_user_information( user_data_lname )
1349
+
1350
+ MobyUtil::UserData.retrieve(
1351
+
1352
+ user_data_lname,
1353
+
1354
+ # language
1355
+ sut_parameters[ :language ],
1356
+
1357
+ # table name
1358
+ sut_parameters[ :user_data_server_database_tablename ]
1359
+
1360
+ )
1361
+
1362
+ end
1363
+
1364
+ # == description
1365
+ # Wrapper function to retrieve operator data for this SUT from the operator data database.
1366
+ #
1367
+ # == arguments
1368
+ # operator_data_lname
1369
+ # String
1370
+ # description: Logical name (LNAME) of the operator data item to be retrieved.
1371
+ # example: "operator_welcome_message"
1372
+ # Symbol
1373
+ # description: Symbol form of the logical name (LNAME) of the operator data item to be retrieved.
1374
+ # example: :operator_welcome_message
1375
+ #
1376
+ # == returns
1377
+ # String
1378
+ # description: User data string
1379
+ # example: "Welcome to Orange"
1380
+ #
1381
+ # == exceptions
1382
+ # OperatorDataNotFoundError
1383
+ # description: In case the desired operator data is not found
1384
+ #
1385
+ # OperatorDataColumnNotFoundError
1386
+ # description: In case the desired data column name to be used for the output is not found
1387
+ #
1388
+ # SqlError
1389
+ # description: In case there are problems with the database connectivity
1390
+ #
1391
+ def get_operator_data( operator_data_lname )
1392
+
1393
+ MobyUtil::OperatorData.retrieve(
1394
+
1395
+ operator_data_lname,
1396
+
1397
+ # operator
1398
+ sut_parameters[ :operator_selected ],
1399
+
1400
+ # table name
1401
+ sut_parameters[ :operator_data_server_database_tablename ]
1402
+
1403
+ )
1404
+
1405
+ end
1406
+
1407
+ # == nodoc
1408
+ # Function to update all children of current SUT
1409
+ # Iterates on all children of the SUT and calls TestObject#update on all children
1410
+ # === params
1411
+ # === returns
1412
+ # ?
1413
+ # === raises
1414
+ def update
1415
+
1416
+ if @update_childs
1417
+
1418
+ @child_object_cache.each_object{ | test_object |
1419
+
1420
+ test_object.send( :update, @xml_data )
1421
+
1422
+ #test_object.update( @xml_data )
1423
+
1424
+ }
1425
+
1426
+ @update_childs = false
1427
+
1428
+ # childs were updated
1429
+ true
1430
+
1431
+ else
1432
+
1433
+ # nothing was updated
1434
+ false
1435
+
1436
+ end
1437
+
1438
+ end
1439
+
1440
+ # == nodoc
1441
+ def refresh( refresh_args = {}, creation_attributes = {} )
1442
+
1443
+ refresh_ui_dump( refresh_args, creation_attributes )
1444
+
1445
+ # update childs if required, returns true or false
1446
+ update_childs
1447
+
1448
+ end
1449
+
1450
+ # == description
1451
+ # Verify always is a method for sut that allows constant verifications for the UI state.
1452
+ #
1453
+ # == arguments
1454
+ # expected
1455
+ # Object
1456
+ # description: Ruby object that equals to the return value of the block
1457
+ # example: true
1458
+ #
1459
+ # message
1460
+ # String
1461
+ # description: Message if an error occurs
1462
+ # example: 'Required element was not found'
1463
+ #
1464
+ # &block
1465
+ # Proc
1466
+ # description: Code block to execute.
1467
+ # example: { @sut.xml_data.empty? == false }
1468
+ #
1469
+ # &block#sut
1470
+ # MobyBase::SUT
1471
+ # description:
1472
+ # Current SUT object is passed as block parameter. If the verify block is defined outside the scope of
1473
+ # the current SUT (e.g. the SUT configuration file), this can be used to get a handle to the current SUT.
1474
+ # example: -
1475
+ #
1476
+ # == returns
1477
+ # NilClass
1478
+ # description: This method doesn't pass return value
1479
+ # example: -
1480
+ #
1481
+ # == exceptions
1482
+ # MobyBase::VerificationError
1483
+ # description: If verification failed
1484
+ def verify_always( expected, message = nil, &block )
1485
+
1486
+ @verify_blocks << MobyUtil::VerifyBlock.new( block,expected, message, 0, MobyUtil::KernelHelper.find_source( caller( 3 ).first.to_s ) )
1487
+
1488
+ nil
1489
+
1490
+ end
1491
+
1492
+ # == description
1493
+ # Clears all verification blocks added to the sut through verify_always() method and
1494
+ # verify_blocks configuration parameter in the tdriver parameters file
1495
+ #
1496
+ # == returns
1497
+ # Array
1498
+ # description: Empty array
1499
+ # example: []
1500
+ def clear_verify_blocks
1501
+
1502
+ @verify_blocks = []
1503
+
1504
+ end
1505
+
1506
+ # == nodoc
1507
+ def get_application_id
1508
+
1509
+ # retrieve application object from sut.xml_data
1510
+ matches, unused_rule = @test_object_adapter.get_objects( xml_data, { :type => 'application' }, true )
1511
+
1512
+ # retrieve id attribute if application test object found
1513
+ if matches.count > 0
1514
+
1515
+ # return id attribute value
1516
+ @test_object_adapter.test_object_element_attribute( matches.first, 'id' )
1517
+
1518
+ else
1519
+
1520
+ # application not found
1521
+ '-1'
1522
+
1523
+ end
1524
+
1525
+ end
1526
+
1527
+ # == nodoc
1528
+ # == description
1529
+ # == returns
1530
+ def agent
1531
+
1532
+ # pass agent command service object
1533
+ TDriver::AgentService.new( :sut => self )
1534
+
1535
+ end
1536
+
1537
+ # == nodoc
1538
+ # == description
1539
+ # == returns
1540
+ def use_find_objects=( value )
1541
+
1542
+ value.check_type [ TrueClass, FalseClass ], 'wrong argument type $1 for use_find_objects (expected $2)'
1543
+
1544
+ sut_parameters[ :use_find_object ] = value
1545
+
1546
+ end
1547
+
1548
+ # == nodoc
1549
+ # == description
1550
+ # == returns
1551
+ def use_find_objects
1552
+
1553
+ sut_parameters[ :use_find_object, false ].true? && respond_to?( 'find_object' ).true?
1554
+
1555
+ end
1556
+
1557
+ private
1558
+
1559
+ # TODO: document me
1560
+ def update_childs
1561
+
1562
+ # update childs only if ui state is new
1563
+ update if @update_childs
1564
+
1565
+ end
1566
+
1567
+ # == nodoc
1568
+ # Function asks for fresh xml ui data from the device and stores the result
1569
+ # == returns
1570
+ # MobyUtil::XML::Element:: xml document containing valid xml fragment describing the current state of the device
1571
+ def refresh_ui_dump( refresh_args = {}, creation_attributes = [] )
1572
+
1573
+ current_time = Time.now
1574
+
1575
+ unless @frozen
1576
+
1577
+ # duplicate refresh arguments hash
1578
+ refresh_arguments = refresh_args.clone
1579
+
1580
+ MobyUtil::Retryable.while(
1581
+
1582
+ :tries => @refresh_tries, :interval => @refresh_interval, :unless => [ MobyBase::ControllerNotFoundError, MobyBase::CommandNotFoundError, MobyBase::ApplicationNotAvailableError ]
1583
+
1584
+ ){
1585
+
1586
+ # store as local variable for less AST lookups
1587
+ xml_data_checksum = @xml_data_checksum
1588
+
1589
+ # use find_object if set on and the method exists
1590
+ if use_find_objects
1591
+
1592
+ # retrieve new ui dump xml and checksum
1593
+ new_xml_data, new_checksum = find_object( refresh_arguments, creation_attributes, xml_data_checksum )
1594
+
1595
+ new_checksum = xml_data_checksum if new_xml_data.empty?
1596
+
1597
+ else
1598
+
1599
+ # retrieve new ui dump xml and checksum
1600
+ new_xml_data, new_checksum = execute_command(
1601
+
1602
+ MobyCommand::Application.new(
1603
+ :State,
1604
+ {
1605
+ :application_name => refresh_args[ :FullName ] || refresh_args[ :name ],
1606
+ :application_uid => refresh_args[ :id ],
1607
+ :sut => self,
1608
+ :refresh_arguments => refresh_args,
1609
+ :checksum => xml_data_checksum,
1610
+ :flags => {:useViewCrop=>sut_parameters[ :use_view_crop, 'false' ]}
1611
+ }
1612
+ )
1613
+
1614
+ )
1615
+
1616
+ new_checksum = xml_data_checksum if new_xml_data.empty?
1617
+
1618
+ end
1619
+
1620
+ # parse the xml if checksum does not match with previously retrieved checksum
1621
+ if ( xml_data_checksum == 0 || new_checksum != xml_data_checksum || new_checksum.blank? )
1622
+
1623
+ # parse new xml string, return cached object if one is found; checksum is used for caching and identifying the duplicate xml strings
1624
+ xml_data, from_cache = MobyUtil::XML.parse_string( new_xml_data, new_checksum )
1625
+
1626
+ # store new xml data object
1627
+ @xml_data = xml_data
1628
+
1629
+ # store xml checksum to be compared while next ui dump request; do not reparse xml if checksum values are equal
1630
+ @xml_data_checksum = new_checksum
1631
+
1632
+ # mark that child objects needs to be updated
1633
+ @update_childs = true #unless from_cache
1634
+
1635
+ end
1636
+
1637
+ # increase number of sent ui dump requests by one
1638
+ @dump_count += 1
1639
+
1640
+ # store timestamp of last performed ui dump request
1641
+ @_previous_refresh = Time.now
1642
+
1643
+ }
1644
+
1645
+ end
1646
+
1647
+ @xml_data
1648
+
1649
+ end
1650
+
1651
+ # TODO: document me
1652
+ # Usage disable for now.
1653
+ def fetch_references( xml )
1654
+
1655
+ pids = []
1656
+
1657
+ x_prev = ''
1658
+ y_prev = ''
1659
+
1660
+ while true
1661
+
1662
+ nodes = xml.xpath( '//object[@type = "TDriverRef"]' )
1663
+
1664
+ idx = 1
1665
+
1666
+ nodes.each { | element |
1667
+
1668
+ pid = element.at_xpath('//attribute[@name = "uri"]/value/text()').content #[ 0 ].to_s
1669
+
1670
+ if pid.nil? or pid.empty? or pid.to_i <= 0 # invalid reference
1671
+
1672
+ element.remove
1673
+ next
1674
+
1675
+ end
1676
+
1677
+ # Element parent not supported, so query the parent coords
1678
+ x_abs = xml.xpath( '//object[@type = "TDriverRef"]/../../attributes/attribute[@name ="x_absolute"]/value/text()' )[ idx - 1 ]
1679
+ y_abs = xml.xpath( '//object[@type = "TDriverRef"]/../../attributes/attribute[@name ="y_absolute"]/value/text()' )[ idx - 1 ]
1680
+
1681
+ # window size
1682
+ winSize = xml.at_xpath( "//objects/object[@type = 'MainWindow']/attributes/attribute[@name ='size']/value/text()" ).content #[ 0 ].to_s
1683
+
1684
+ # ref-ref parent does not know x coordinate, use the grandparent xys
1685
+ x_prev = x_abs.to_s unless x_abs.nil?
1686
+ y_prev = y_abs.to_s unless y_abs.nil?
1687
+
1688
+ idx += 1
1689
+
1690
+ if !pid.empty?
1691
+
1692
+ begin
1693
+
1694
+ =begin
1695
+ subdata =
1696
+ MobyUtil::XML.parse_string(
1697
+ execute_command(
1698
+ MobyCommand::Application.new(
1699
+ :State,
1700
+ nil,
1701
+ pid,
1702
+ self,
1703
+ nil,
1704
+ nil,
1705
+ nil,
1706
+ nil,
1707
+ nil,
1708
+ {
1709
+ 'x_parent_absolute' => x_prev,
1710
+ 'y_parent_absolute' => y_prev,
1711
+ 'embedded' => 'true',
1712
+ 'parent_size' => winSize
1713
+ }
1714
+ )
1715
+ )[ 0 ]
1716
+ )
1717
+ =end
1718
+
1719
+ subdata =
1720
+ MobyUtil::XML.parse_string(
1721
+ execute_command(
1722
+ MobyCommand::Application.new(
1723
+ :State,
1724
+ {
1725
+ :application_uid => pid,
1726
+ :sut => self,
1727
+ :flags => {
1728
+ 'x_parent_absolute' => x_prev,
1729
+ 'y_parent_absolute' => y_prev,
1730
+ 'embedded' => 'true',
1731
+ 'parent_size' => winSize
1732
+ }
1733
+ }
1734
+ )
1735
+ )[ 0 ]
1736
+ )
1737
+
1738
+ child = subdata.root.xpath('//object')[0]
1739
+
1740
+ # Remove the attribute with the pid retrieval was not successful.
1741
+ # (server returns the previous hit if not found)
1742
+ if child.attribute('id' ) != pid
1743
+
1744
+ element.remove
1745
+
1746
+ else
1747
+
1748
+ # Remove the application layer
1749
+ objs = child.xpath( '/tasMessage/tasInfo/object/objects/*' )
1750
+
1751
+ if !objs.nil?
1752
+
1753
+ objs.each { | el | element.add_previous_sibling( el ) }
1754
+
1755
+ element.remove
1756
+
1757
+ end
1758
+
1759
+ end
1760
+
1761
+ rescue MobyBase::ApplicationNotAvailableError => e
1762
+
1763
+ # Ignore the application not available error
1764
+ return xml
1765
+
1766
+ end
1767
+
1768
+ else
1769
+
1770
+ return xml
1771
+
1772
+ end
1773
+
1774
+ }
1775
+
1776
+ return xml if nodes.empty?
1777
+
1778
+ end
1779
+
1780
+ end
1781
+
1782
+ def find_app( app_list, search_params )
1783
+
1784
+ app_info = nil
1785
+
1786
+ begin
1787
+
1788
+ app_info = app_list.application( search_params )
1789
+
1790
+ rescue MobyBase::TestObjectNotFoundError
1791
+
1792
+ app_info = nil
1793
+
1794
+ end
1795
+
1796
+ app_info
1797
+ end
1798
+
1799
+ def load_verify_blocks( filename )
1800
+
1801
+ # load verify blocks if filename not empty
1802
+ unless filename.blank?
1803
+
1804
+ # verify that file exists
1805
+ if File.exists?( filename )
1806
+
1807
+ # load verify blocks configuration file
1808
+ load filename
1809
+
1810
+ # return collection of verify blocks; reference directly to VERIFY_BLOCKS must not be used, due to it may get cleared by user
1811
+ SutParameters::VERIFY_BLOCKS.collect{ | block | block }
1812
+
1813
+ else
1814
+
1815
+ # return empty array due to file didn't exist
1816
+ []
1817
+
1818
+ end
1819
+
1820
+ else
1821
+
1822
+ # return empty array due to no filename was given
1823
+ []
1824
+
1825
+ end
1826
+
1827
+ end
1828
+
1829
+ # accessor for sut parameters
1830
+ def sut_parameters
1831
+
1832
+ $parameters[ @id ]
1833
+
1834
+ end
1835
+
1836
+ public # deprecated
1837
+
1838
+ # == nodoc
1839
+ # function to get TestObject
1840
+ # TODO: Still under construction. Should be able to create single descendant of the SUT
1841
+ # Then is Should create path (parent-child-child-child...) until reaching the particular TestObject
1842
+ # TODO: Document me when I'm ready
1843
+ def get_object( object_id )
1844
+
1845
+ warn "warning: deprecated method SUT#get_object; please use SUT#child instead"
1846
+
1847
+ child( object_id )
1848
+
1849
+ end
1850
+
1851
+ # == nodoc
1852
+ #TODO: Update documentation
1853
+ #TODO: Is this function deprecated? (see SUT#refresh_ui_dump)
1854
+ #TODO: rethink get_ui_dump and refresh --> functions!
1855
+ # function to query for UIDump.
1856
+ # == returns
1857
+ # xmlDocument:: REXML::Document object containing valid xml fragment
1858
+ # == raises
1859
+ # someException:: If Dump does not conform to the tasMessage schema error is raised
1860
+ def get_ui_dump( refresh_args = {} )
1861
+
1862
+ #$stderr.puts "warning: SUT#get_ui_dump is deprecated, please use SUT#refresh_ui_dump instead."
1863
+
1864
+ refresh_ui_dump( refresh_args, {} )
1865
+
1866
+ end
1867
+
1868
+ # This method is deprecated, please use [link="#GenericSut:state_object"]SUT#state_object[/link] instead.
1869
+ # == deprecated
1870
+ # 1.1.1
1871
+ #
1872
+ # == description
1873
+ # This method is deprecated, please use SUT#state_object
1874
+ #
1875
+ def state
1876
+
1877
+ warn "warning: deprecated method SUT#state; please use SUT#state_object instead"
1878
+
1879
+ state_object
1880
+
1881
+ end
1882
+
1883
+ # enable hooking for performance measurement & debug logging
1884
+ TDriver::Hooking.hook_methods( self ) if defined?( TDriver::Hooking )
1885
+
1886
+ end # SUT
1887
+
1888
+ end # MobyBehaviour