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.
- checksums.yaml +7 -0
- data/README.md +16 -0
- data/bin/start_app_perf +200 -0
- data/bin/tdriver-devtools +3 -0
- data/config/sut_parameters.rb +52 -0
- data/config/sut_setup.rb +32 -0
- data/config/sut_teardown.rb +32 -0
- data/config/tdriver_custom_error_recovery.rb +83 -0
- data/ext/extconf.rb +70 -0
- data/ext/native_extensions.c +315 -0
- data/lib/matti.rb +25 -0
- data/lib/tdriver-devtools/behaviour/old/xml/example/flick-example.rb +120 -0
- data/lib/tdriver-devtools/behaviour/old/xml/example/impl.rb_invalid +194 -0
- data/lib/tdriver-devtools/behaviour/old/xml/generate_behaviour_xml.rb +95 -0
- data/lib/tdriver-devtools/behaviour/old/xml/lib/tdriver_generator.rb +722 -0
- data/lib/tdriver-devtools/behaviour/old/xml/qdoc_generator.rb +321 -0
- data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.method.template +43 -0
- data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.module.template +54 -0
- data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.argument.template +7 -0
- data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.argument_type.template +7 -0
- data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.exception.template +5 -0
- data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.howto.line.template +2 -0
- data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.howto.template +5 -0
- data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.method.template +23 -0
- data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.template +14 -0
- data/lib/tdriver-devtools/behaviour/old/xml/update +3 -0
- data/lib/tdriver-devtools/behaviour/xml/generate.rb +88 -0
- data/lib/tdriver-devtools/behaviour/xml/rdoc_behaviour_xml_generator.rb +1945 -0
- data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.argument.default.template +1 -0
- data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.argument.template +3 -0
- data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.argument_type.template +4 -0
- data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.exception.template +4 -0
- data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.arguments.template +4 -0
- data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.deprecated.template +3 -0
- data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.exceptions.template +3 -0
- data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.info.template +1 -0
- data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.returns.template +3 -0
- data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.tables.template +3 -0
- data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.template +12 -0
- data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.returns.template +5 -0
- data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.table.item.template +1 -0
- data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.table.row.template +2 -0
- data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.table.template +8 -0
- data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.template +14 -0
- data/lib/tdriver-devtools/doc/behaviour_xml/QtExampleGestureBehaviour.xml +138 -0
- data/lib/tdriver-devtools/doc/behaviour_xml/created.rid +1 -0
- data/lib/tdriver-devtools/doc/behaviour_xml/tdriver.hash +1 -0
- data/lib/tdriver-devtools/doc/feature_xml/qt_widget_hold.feature.xml +9 -0
- data/lib/tdriver-devtools/doc/feature_xml/qt_widget_tap.feature.xml +9 -0
- data/lib/tdriver-devtools/doc/generate.rb +917 -0
- data/lib/tdriver-devtools/doc/update +1 -0
- data/lib/tdriver-devtools/doc/xslt/html.rb +7 -0
- data/lib/tdriver-devtools/doc/xslt/template.xsl +2170 -0
- data/lib/tdriver-devtools/doc/xslt/update +3 -0
- data/lib/tdriver-devtools/plugin/placeholder.txt +1 -0
- data/lib/tdriver-devtools/tdriver-devtools.rb +404 -0
- data/lib/tdriver-devtools/tests/feature_tests/example/behaviour_example.rb +100 -0
- data/lib/tdriver-devtools/tests/feature_tests/generate.rb +82 -0
- data/lib/tdriver-devtools/tests/feature_tests/lib/custom_rdoc_generator.rb +468 -0
- data/lib/tdriver-devtools/tests/feature_tests/templates/feature_attribute.template +5 -0
- data/lib/tdriver-devtools/tests/feature_tests/templates/feature_method.template +5 -0
- data/lib/tdriver-devtools/tests/feature_tests/templates/scenario_attribute.template +5 -0
- data/lib/tdriver-devtools/tests/feature_tests/templates/scenario_method.template +5 -0
- data/lib/tdriver-devtools/tests/feature_tests/update +3 -0
- data/lib/tdriver.rb +23 -0
- data/lib/tdriver/base/behaviour/abstract.rb +29 -0
- data/lib/tdriver/base/behaviour/behaviours/object_abstract.rb +107 -0
- data/lib/tdriver/base/behaviour/behaviours/object_behaviour_composition.rb +99 -0
- data/lib/tdriver/base/behaviour/behaviours/object_behaviour_description.rb +278 -0
- data/lib/tdriver/base/behaviour/behaviours/object_composition.rb +119 -0
- data/lib/tdriver/base/behaviour/factory.rb +495 -0
- data/lib/tdriver/base/behaviour/loader.rb +46 -0
- data/lib/tdriver/base/command_data/command_data.rb +51 -0
- data/lib/tdriver/base/command_data/loader.rb +29 -0
- data/lib/tdriver/base/controller/abstraction.rb +56 -0
- data/lib/tdriver/base/controller/loader.rb +21 -0
- data/lib/tdriver/base/errors.rb +134 -0
- data/lib/tdriver/base/loader.rb +47 -0
- data/lib/tdriver/base/state_object.rb +373 -0
- data/lib/tdriver/base/sut/adapter.rb +54 -0
- data/lib/tdriver/base/sut/controller.rb +151 -0
- data/lib/tdriver/base/sut/factory.rb +339 -0
- data/lib/tdriver/base/sut/generic/behaviours/agent.rb +77 -0
- data/lib/tdriver/base/sut/generic/behaviours/application.rb +427 -0
- data/lib/tdriver/base/sut/generic/behaviours/controller.rb +67 -0
- data/lib/tdriver/base/sut/generic/behaviours/find.rb +107 -0
- data/lib/tdriver/base/sut/generic/behaviours/flash_behaviour.rb +337 -0
- data/lib/tdriver/base/sut/generic/behaviours/sut.rb +1888 -0
- data/lib/tdriver/base/sut/generic/behaviours/switchbox_behaviour.rb +210 -0
- data/lib/tdriver/base/sut/generic/behaviours/verification.rb +222 -0
- data/lib/tdriver/base/sut/generic/commands/agent.rb +43 -0
- data/lib/tdriver/base/sut/generic/commands/application.rb +274 -0
- data/lib/tdriver/base/sut/generic/commands/fixture.rb +47 -0
- data/lib/tdriver/base/sut/generic/commands/key_sequence.rb +94 -0
- data/lib/tdriver/base/sut/generic/commands/screen_capture.rb +64 -0
- data/lib/tdriver/base/sut/generic/plugin.rb +97 -0
- data/lib/tdriver/base/sut/loader.rb +35 -0
- data/lib/tdriver/base/sut/sut.rb +98 -0
- data/lib/tdriver/base/test_object/abstract.rb +208 -0
- data/lib/tdriver/base/test_object/adapter.rb +740 -0
- data/lib/tdriver/base/test_object/behaviours/syncronization.rb +144 -0
- data/lib/tdriver/base/test_object/behaviours/test_object.rb +1047 -0
- data/lib/tdriver/base/test_object/cache.rb +134 -0
- data/lib/tdriver/base/test_object/factory.rb +684 -0
- data/lib/tdriver/base/test_object/loader.rb +51 -0
- data/lib/tdriver/base/test_object/verification.rb +178 -0
- data/lib/tdriver/base/test_object/xml/abstraction.rb +63 -0
- data/lib/tdriver/base/test_object/xml/adapter.rb +773 -0
- data/lib/tdriver/env.rb +21 -0
- data/lib/tdriver/loader.rb +57 -0
- data/lib/tdriver/matti.rb +35 -0
- data/lib/tdriver/report/error_recovery/tdriver_custom_error_recovery.rb +83 -0
- data/lib/tdriver/report/error_recovery/tdriver_error_recovery.rb +168 -0
- data/lib/tdriver/report/error_recovery/tdriver_error_recovery_settings.rb +106 -0
- data/lib/tdriver/report/report.rb +61 -0
- data/lib/tdriver/report/report_api.rb +348 -0
- data/lib/tdriver/report/report_combine.rb +86 -0
- data/lib/tdriver/report/report_crash_file_capture.rb +178 -0
- data/lib/tdriver/report/report_creator.rb +665 -0
- data/lib/tdriver/report/report_cucumber.rb +158 -0
- data/lib/tdriver/report/report_cucumber_listener.rb +184 -0
- data/lib/tdriver/report/report_cucumber_reporter.rb +181 -0
- data/lib/tdriver/report/report_data_presentation.rb +156 -0
- data/lib/tdriver/report/report_data_table.rb +64 -0
- data/lib/tdriver/report/report_execution_statistics.rb +400 -0
- data/lib/tdriver/report/report_file_capture.rb +159 -0
- data/lib/tdriver/report/report_graph_generator.rb +59 -0
- data/lib/tdriver/report/report_grouping.rb +541 -0
- data/lib/tdriver/report/report_javascript.rb +199 -0
- data/lib/tdriver/report/report_junit_xml.rb +147 -0
- data/lib/tdriver/report/report_rspec.rb +108 -0
- data/lib/tdriver/report/report_test_case_run.rb +725 -0
- data/lib/tdriver/report/report_test_run.rb +1476 -0
- data/lib/tdriver/report/report_test_unit.rb +223 -0
- data/lib/tdriver/report/report_writer.rb +1621 -0
- data/lib/tdriver/tdriver.rb +209 -0
- data/lib/tdriver/util/agent/loader.rb +22 -0
- data/lib/tdriver/util/agent/service.rb +107 -0
- data/lib/tdriver/util/common/array.rb +39 -0
- data/lib/tdriver/util/common/boolean.rb +48 -0
- data/lib/tdriver/util/common/crc16.rb +149 -0
- data/lib/tdriver/util/common/environment.rb +154 -0
- data/lib/tdriver/util/common/error.rb +40 -0
- data/lib/tdriver/util/common/exception.rb +53 -0
- data/lib/tdriver/util/common/exceptions.rb +12 -0
- data/lib/tdriver/util/common/file.rb +328 -0
- data/lib/tdriver/util/common/gem.rb +109 -0
- data/lib/tdriver/util/common/hash.rb +288 -0
- data/lib/tdriver/util/common/kernel.rb +253 -0
- data/lib/tdriver/util/common/loader.rb +47 -0
- data/lib/tdriver/util/common/numeric.rb +159 -0
- data/lib/tdriver/util/common/object.rb +159 -0
- data/lib/tdriver/util/common/retryable.rb +179 -0
- data/lib/tdriver/util/common/stackable.rb +185 -0
- data/lib/tdriver/util/common/string.rb +174 -0
- data/lib/tdriver/util/database/access.rb +240 -0
- data/lib/tdriver/util/database/connection.rb +44 -0
- data/lib/tdriver/util/database/error.rb +34 -0
- data/lib/tdriver/util/database/loader.rb +28 -0
- data/lib/tdriver/util/filters/attribute_filter.rb +121 -0
- data/lib/tdriver/util/filters/loader.rb +29 -0
- data/lib/tdriver/util/fixture/loader.rb +22 -0
- data/lib/tdriver/util/fixture/service.rb +211 -0
- data/lib/tdriver/util/hooking/hooking.rb +477 -0
- data/lib/tdriver/util/keymap/keymap.rb +81 -0
- data/lib/tdriver/util/loader.rb +80 -0
- data/lib/tdriver/util/localisation/error.rb +31 -0
- data/lib/tdriver/util/localisation/loader.rb +25 -0
- data/lib/tdriver/util/localisation/localisation.rb +762 -0
- data/lib/tdriver/util/logger/loader.rb +22 -0
- data/lib/tdriver/util/logger/logger.rb +591 -0
- data/lib/tdriver/util/operator_data/error.rb +29 -0
- data/lib/tdriver/util/operator_data/loader.rb +27 -0
- data/lib/tdriver/util/operator_data/operator_data.rb +93 -0
- data/lib/tdriver/util/other/config.rb +221 -0
- data/lib/tdriver/util/parameter/error.rb +48 -0
- data/lib/tdriver/util/parameter/loader.rb +25 -0
- data/lib/tdriver/util/parameter/parameter.rb +1161 -0
- data/lib/tdriver/util/plugin/abstract.rb +61 -0
- data/lib/tdriver/util/plugin/error.rb +0 -0
- data/lib/tdriver/util/plugin/loader.rb +28 -0
- data/lib/tdriver/util/plugin/service.rb +319 -0
- data/lib/tdriver/util/recorder/loader.rb +25 -0
- data/lib/tdriver/util/recorder/recorder.rb +72 -0
- data/lib/tdriver/util/recorder/scripter.rb +294 -0
- data/lib/tdriver/util/statistics/statistics.rb +89 -0
- data/lib/tdriver/util/user_data/error.rb +28 -0
- data/lib/tdriver/util/user_data/loader.rb +25 -0
- data/lib/tdriver/util/user_data/user_data.rb +104 -0
- data/lib/tdriver/util/video/camera.rb +67 -0
- data/lib/tdriver/util/video/camera_linux.rb +153 -0
- data/lib/tdriver/util/video/camera_windows.rb +174 -0
- data/lib/tdriver/util/video/loader.rb +31 -0
- data/lib/tdriver/util/video/video_utils.rb +139 -0
- data/lib/tdriver/util/xml/abstraction.rb +117 -0
- data/lib/tdriver/util/xml/attribute.rb +32 -0
- data/lib/tdriver/util/xml/builder.rb +53 -0
- data/lib/tdriver/util/xml/comment.rb +32 -0
- data/lib/tdriver/util/xml/document.rb +32 -0
- data/lib/tdriver/util/xml/element.rb +32 -0
- data/lib/tdriver/util/xml/error.rb +46 -0
- data/lib/tdriver/util/xml/loader.rb +62 -0
- data/lib/tdriver/util/xml/nil_node.rb +95 -0
- data/lib/tdriver/util/xml/nodeset.rb +32 -0
- data/lib/tdriver/util/xml/parsers/libxml/libxml.rb +140 -0
- data/lib/tdriver/util/xml/parsers/loader.rb +21 -0
- data/lib/tdriver/util/xml/parsers/nokogiri/abstraction.rb +167 -0
- data/lib/tdriver/util/xml/parsers/nokogiri/attribute.rb +66 -0
- data/lib/tdriver/util/xml/parsers/nokogiri/builder.rb +64 -0
- data/lib/tdriver/util/xml/parsers/nokogiri/comment.rb +39 -0
- data/lib/tdriver/util/xml/parsers/nokogiri/document.rb +66 -0
- data/lib/tdriver/util/xml/parsers/nokogiri/element.rb +39 -0
- data/lib/tdriver/util/xml/parsers/nokogiri/loader.rb +58 -0
- data/lib/tdriver/util/xml/parsers/nokogiri/node.rb +212 -0
- data/lib/tdriver/util/xml/parsers/nokogiri/nodeset.rb +237 -0
- data/lib/tdriver/util/xml/parsers/nokogiri/text.rb +39 -0
- data/lib/tdriver/util/xml/text.rb +32 -0
- data/lib/tdriver/util/xml/xml.rb +332 -0
- data/lib/tdriver/verify/verify.rb +2398 -0
- data/lib/tdriver/version.rb +21 -0
- data/xml/behaviours/generic.xml +530 -0
- data/xml/defaults/generic.xml +11 -0
- data/xml/defaults/sut_generic.xml +8 -0
- data/xml/parameters/tdriver_parameters.xml +23 -0
- data/xml/templates/generic.xml +292 -0
- 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
|