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,477 @@
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
+ module TDriver
20
+
21
+ class Hooking
22
+
23
+ # TODO: document me
24
+ class << self
25
+
26
+ @@non_wrappable_methods = [ 'instance' ]
27
+
28
+ # default values
29
+ @@wrapped_methods = {}
30
+ @@wrappee_count = 0
31
+
32
+ @@benchmark = {}
33
+
34
+ @@logger_instance = nil
35
+
36
+ $tdriver_hooking = TDriver::Hooking
37
+ $tdriver_hooking_elapsed_time_stack = []
38
+
39
+ private
40
+
41
+ # Function to hook a method
42
+ # == params
43
+ # base:: Class or Module
44
+ # method_name:: Name of the method
45
+ # method_type:: public, private or static
46
+ # == returns
47
+ def hook_method( base, method_name, method_type )
48
+
49
+ # create only one wrapper for each method
50
+ unless @@wrapped_methods.has_key?( "#{ base.name }::#{ method_name }" )
51
+
52
+ # evaluate the generated wrapper source code
53
+ eval("base.#{ base.class.name.downcase }_eval( \"#{ make_wrapper( base, method_name.to_s, method_type.to_s )}\" )") if [ Class, Module ].include?( base.class )
54
+
55
+ end
56
+
57
+ nil
58
+
59
+ end
60
+
61
+ # Function to hook static methods for given Class or Module
62
+ # == params
63
+ # base:: Target Class or Module
64
+ # == returns
65
+ def hook_static_methods( _base )
66
+
67
+ if [ Class, Module ].include?( _base.class )
68
+
69
+ _base.singleton_methods( false ).each { | method_name |
70
+
71
+ hook_method( _base, method_name.to_s, "static" ) unless @@non_wrappable_methods.include?( method_name.to_s ) # method_name.to_s for ruby 1.9 compatibility
72
+
73
+ }
74
+
75
+ end
76
+
77
+ nil
78
+
79
+ end
80
+
81
+ # Function to hook instance methods for given Class or Module
82
+ # == params
83
+ # base:: Target Class or Module
84
+ # == returns
85
+ def hook_instance_methods( _base )
86
+
87
+ if [ Class, Module ].include?( _base.class )
88
+
89
+ {
90
+ :public => _base.public_instance_methods( false ),
91
+ :private => _base.private_instance_methods( false ),
92
+ :protected => _base.protected_instance_methods( false )
93
+
94
+ }.each{ | method_type, methods |
95
+
96
+ # method_name.to_s for ruby 1.9 compatibility
97
+ methods.each { | method_name | hook_method( _base, method_name.to_s, method_type.to_s ) unless /__wrappee_\d+/i.match( method_name.to_s ) }
98
+
99
+ }
100
+
101
+ end
102
+
103
+ nil
104
+
105
+ end
106
+
107
+ # Function to retrieve method path (e.g. Module1::Module2::Class1)
108
+ # == params
109
+ # base:: Target Class or Module
110
+ # == returns
111
+ # String:: Method path
112
+ def method_path( _base )
113
+
114
+ [ Class, Module ].include?( _base.class ) ? _base.name : _base.class.name
115
+
116
+ end
117
+
118
+ # Function to generate unique name for wrappee method
119
+ # == params
120
+ # method_name:: Name of the target method
121
+ # == returns
122
+ # String:: Unique name for wrappee method
123
+ def create_wrappee_name( method_name )
124
+
125
+ wrappee_name = "non_pritanble_method_name" if ( wrappee_name = ( /[a-z0-9_]*/i.match( method_name ) ) ).length == 0
126
+
127
+ "__wrappee_#{ @@wrappee_count }__#{ wrappee_name }"
128
+
129
+ end
130
+
131
+ # Function for create source code of wrapper for method
132
+ # == params
133
+ # base:: Class or Module
134
+ # method_name:: Name of the method
135
+ # method_type:: public, private or static
136
+ # == returns
137
+ # String:: source code
138
+ def make_wrapper( base, method_name, method_type = nil )
139
+
140
+ # method name with namespace
141
+ base_and_method_name = "#{ base.name }::#{ method_name }"
142
+
143
+ # add method to benchmark table if enabled
144
+ if ENV[ 'TDRIVER_BENCHMARK' ].to_s.downcase == 'true'
145
+
146
+ @@benchmark[ base_and_method_name ] = {
147
+ :time_elapsed => 0,
148
+ :times_called => 0,
149
+ :time_elapsed_total => 0
150
+ }
151
+
152
+ end
153
+
154
+ # create new name for original method
155
+ original_method_name = create_wrappee_name( method_name )
156
+
157
+ # add method to wrapper methods list
158
+ @@wrapped_methods[ base_and_method_name ] = nil
159
+
160
+ @@wrappee_count += 1
161
+
162
+ case method_type
163
+
164
+ when 'public', 'private', 'static'
165
+
166
+ "#{
167
+ # this is needed if method is static
168
+ "class << self" if method_type == 'static'
169
+
170
+ }
171
+
172
+ # create a copy of original method
173
+ alias_method :#{ original_method_name }, :#{ method_name }
174
+
175
+ #{
176
+
177
+ if method_type == 'static'
178
+
179
+ # undefine original version if static method
180
+ "self.__send__( :undef_method, :#{ method_name } )"
181
+
182
+ else
183
+
184
+ # method visiblity unless method type is static
185
+ "#{ method_type }"
186
+
187
+ end
188
+
189
+ }
190
+
191
+ def #{ method_name }( *args, &block )
192
+
193
+ # log method call
194
+ $tdriver_hooking.log( '#{ method_path( base ) }.#{ method_name }', nil )
195
+
196
+ #{
197
+
198
+ if ENV[ 'TDRIVER_BENCHMARK' ].to_s.downcase == 'true'
199
+
200
+ "# store start time for performance measurement
201
+ start_time = Time.now
202
+
203
+ # Time elapsed in sub calls
204
+ $tdriver_hooking_elapsed_time_stack << 0.0
205
+
206
+ begin
207
+
208
+ # call and return result of original method
209
+ __send__(:#{ original_method_name }, *args, &block )
210
+
211
+ rescue
212
+
213
+ raise $!
214
+
215
+ ensure
216
+
217
+ # calculate actual elapsed time, including time elapsed in sub calls
218
+ elapsed_time = Time.now - start_time
219
+
220
+ # elapsed time in sub calls
221
+ elapsed_time_in_subcalls = $tdriver_hooking_elapsed_time_stack.pop || 0
222
+
223
+ # add elapsed time to caller method
224
+ $tdriver_hooking_elapsed_time_stack[ -1 ] += elapsed_time unless $tdriver_hooking_elapsed_time_stack.empty?
225
+
226
+ # store performance results to benchmark hash
227
+ $tdriver_hooking.update_method_benchmark( '#{ base_and_method_name }', elapsed_time_in_subcalls, elapsed_time )
228
+
229
+ end"
230
+
231
+ else
232
+
233
+ "# call original method
234
+ __send__(:#{ original_method_name }, *args, &block )"
235
+
236
+ end
237
+
238
+ }
239
+
240
+ end
241
+
242
+ private :#{ original_method_name }
243
+
244
+ #{
245
+
246
+ # this is needed if method is static
247
+ "end" if method_type == 'static'
248
+
249
+ }"
250
+
251
+ end # case
252
+
253
+ end # make_wrapper
254
+
255
+ end # self
256
+
257
+ # TODO: document me
258
+ def self.wrappee_count
259
+
260
+ @@wrappee_count
261
+
262
+ end
263
+
264
+ # TODO: document me
265
+ def self.wrappee_count=( value )
266
+
267
+ @@wrappee_count = value
268
+
269
+ end
270
+
271
+ # TODO: document me
272
+ def self.wrappee_methods
273
+
274
+ @@wrappee_methods
275
+
276
+ end
277
+
278
+ # TODO: document me
279
+ def self.wrappee_methods=( value )
280
+
281
+ @@wrappee_methods = value
282
+
283
+ end
284
+
285
+
286
+ # TODO: document me
287
+ def self.benchmark
288
+
289
+ @@benchmark
290
+
291
+ end
292
+
293
+ # TODO: document me
294
+ def self.benchmark=( value )
295
+
296
+ @@benchmark = value
297
+
298
+ end
299
+
300
+ # TODO: document me
301
+ def self.logger_instance
302
+
303
+ @@logger_instance
304
+
305
+ end
306
+
307
+ # Function to set logger instance used by wrapper
308
+ # == params
309
+ # logger_instance:: Instance of TDriver logger
310
+ # == returns
311
+ def self.logger_instance=( logger_instance )
312
+
313
+ @@logger_instance = logger_instance
314
+
315
+ end
316
+
317
+ # Function to create logger event - this method is called from wrapper
318
+ # == params
319
+ # text:: Text sent from wrapper
320
+ # arguments:: Not in use
321
+ # == returns
322
+ def self.log( text, *arguments )
323
+
324
+ @@logger_instance.debug( text.to_s ) if @@logger_instance
325
+
326
+ nil
327
+
328
+ end
329
+
330
+ # Function to hook all instance and static methods of target Class/Module
331
+ # == params
332
+ # base:: Target Class or Module
333
+ # == returns
334
+ def self.hook_methods( _base )
335
+
336
+ hook_static_methods( _base )
337
+
338
+ hook_instance_methods( _base )
339
+
340
+ nil
341
+
342
+ end
343
+
344
+ # Function to update method runtime & calls count for benchmark
345
+ # == params
346
+ # method_name:: Name of the target method
347
+ # time_elapsed_in_subcalls::
348
+ # total_time_elapsed::
349
+ def self.update_method_benchmark( method_name, time_elapsed_in_subcalls, total_time_elapsed )
350
+
351
+ @@benchmark[ method_name ].tap{ | hash |
352
+
353
+ hash[ :time_elapsed ] += total_time_elapsed - time_elapsed_in_subcalls
354
+ hash[ :time_elapsed_total ] += total_time_elapsed
355
+ hash[ :times_called ] += 1
356
+
357
+ }
358
+
359
+ end
360
+
361
+ def self.print_benchmark( rules = {} )
362
+
363
+ total_run_time = 0
364
+
365
+ # :sort => :total_time || :times_called || :average_time
366
+
367
+ rules = { :sort => :total_time, :order => :ascending, :show_uncalled_methods => true }.merge( rules )
368
+
369
+ puts "%-80s %8s %15s %15s %9s %15s" % [ 'Name:', 'Calls:', 'Time total:', 'W/O subcalls:', '%/run', 'Total/call:' ]
370
+ puts "%-80s %8s %15s %15s %9s %15s" % [ '-' * 80, '-' * 8, '-' * 15, '-' * 15, '-' * 8, '-' * 15 ]
371
+
372
+ table = @@benchmark
373
+
374
+ # calculate average time for method
375
+ table.each{ | key, value |
376
+
377
+ table[ key ][ :average_time ] = ( value[ :times_elapsed_total ] == 0 || value[ :times_called ] == 0 ) ? 0 : value[ :time_elapsed_total ] / value[ :times_called ]
378
+
379
+ total_run_time += value[ :time_elapsed ]
380
+
381
+ }
382
+
383
+ table = table.sort{ | method_a, method_b |
384
+
385
+ case rules[ :sort ]
386
+
387
+ when :name
388
+ method_a[ 0 ] <=> method_b[ 0 ]
389
+
390
+ when :times_called
391
+ method_a[ 1 ][ :times_called ] <=> method_b[ 1 ][ :times_called ]
392
+
393
+ when :total_time
394
+ method_a[ 1 ][ :time_elapsed_total ] <=> method_b[ 1 ][ :time_elapsed_total ]
395
+
396
+ when :total_time_no_subs
397
+ method_a[ 1 ][ :time_elapsed ] <=> method_b[ 1 ][ :time_elapsed ]
398
+
399
+ when :percentage
400
+
401
+ ( ( method_a[ 1 ][ :time_elapsed ].to_f / total_run_time.to_f ) * 100 ) <=> ( ( method_b[ 1 ][ :time_elapsed ].to_f / total_run_time.to_f ) * 100 )
402
+
403
+ when :average_time
404
+ method_a[ 1 ][ :average_time ] <=> method_b[ 1 ][ :average_time ]
405
+
406
+ else
407
+
408
+ raise ArgumentError.new("Invalid sorting rule, valid rules are :name, :times_called, :total_time, :total_time_no_subs, :percentage or :average_time")
409
+
410
+ end
411
+
412
+ }
413
+
414
+ case rules[ :order ]
415
+
416
+ # do nothing
417
+ when :ascending
418
+
419
+ when :descending
420
+ table = table.reverse
421
+
422
+ else
423
+
424
+ raise ArgumentError.new("Invalid sort order rule, valid rules are :ascending, :descending")
425
+
426
+ end
427
+
428
+ total_percentage = 0.0
429
+ total_time_elapsed_total = 0.0
430
+ total_average = 0.0
431
+ total_calls = 0
432
+
433
+ table.each{ | method |
434
+
435
+ puts "%-80s %8s %15.8f %15.8f %8.3f%% %15.8f" % [
436
+ method[ 0 ],
437
+ method[ 1 ][ :times_called ],
438
+ method[ 1 ][ :time_elapsed_total ],
439
+ method[ 1 ][ :time_elapsed ],
440
+
441
+ ( ( method[ 1 ][ :time_elapsed ].to_f / total_run_time.to_f ) * 100 ),
442
+
443
+ method[ 1 ][ :average_time ]
444
+ ] unless !rules[ :show_uncalled_methods ] && method[ 1 ][ :times_called ] == 0
445
+
446
+ total_percentage += ( ( method[ 1 ][ :time_elapsed ].to_f / total_run_time.to_f ) * 100 )
447
+
448
+ total_calls += method[ 1 ][ :times_called ]
449
+ total_time_elapsed_total += method[ 1 ][ :time_elapsed_total ]
450
+ total_average += method[ 1 ][ :average_time ]
451
+
452
+ }
453
+
454
+ puts "%-80s %8s %15s %15s %9s %15s" % [ '-' * 80, '-' * 8, '-' * 15, '-' * 15, '-' * 8, '-' * 15 ]
455
+
456
+ puts "%-80s %8s %15.6f %15.6f %8.3f%% %15.8f" % [ 'Total:', total_calls, total_time_elapsed_total, total_run_time, total_percentage, total_average ]
457
+
458
+ end
459
+
460
+ end # Hooking
461
+
462
+ end # TDriver
463
+
464
+ # deprecated
465
+ module MobyUtil
466
+
467
+ class Hooking
468
+
469
+ def self.instance
470
+
471
+ TDriver::Hooking
472
+
473
+ end
474
+
475
+ end # Hooking
476
+
477
+ end # MobyUtil