testability-driver 0.9.2

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 (214) hide show
  1. data/README +1 -0
  2. data/bin/start_app_perf +199 -0
  3. data/bin/tdriver-devtools +3 -0
  4. data/config/sut_parameters.rb +39 -0
  5. data/ext/extconf.rb +67 -0
  6. data/ext/native_extensions.c +70 -0
  7. data/lib/matti.rb +30 -0
  8. data/lib/tdriver-devtools/behaviour/old/xml/example/flick-example.rb +223 -0
  9. data/lib/tdriver-devtools/behaviour/old/xml/example/impl.rb_invalid +194 -0
  10. data/lib/tdriver-devtools/behaviour/old/xml/generate_behaviour_xml.rb +95 -0
  11. data/lib/tdriver-devtools/behaviour/old/xml/lib/tdriver_generator.rb +722 -0
  12. data/lib/tdriver-devtools/behaviour/old/xml/qdoc_generator.rb +321 -0
  13. data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.method.template +43 -0
  14. data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.module.template +54 -0
  15. data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.argument.template +7 -0
  16. data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.argument_type.template +7 -0
  17. data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.exception.template +5 -0
  18. data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.howto.line.template +2 -0
  19. data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.howto.template +5 -0
  20. data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.method.template +23 -0
  21. data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.template +14 -0
  22. data/lib/tdriver-devtools/behaviour/old/xml/update +3 -0
  23. data/lib/tdriver-devtools/behaviour/xml/generate.rb +88 -0
  24. data/lib/tdriver-devtools/behaviour/xml/rdoc_behaviour_xml_generator.rb +1924 -0
  25. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.argument.default.template +1 -0
  26. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.argument.template +3 -0
  27. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.argument_type.template +4 -0
  28. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.exception.template +4 -0
  29. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.arguments.template +4 -0
  30. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.deprecated.template +3 -0
  31. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.exceptions.template +3 -0
  32. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.info.template +1 -0
  33. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.returns.template +3 -0
  34. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.tables.template +3 -0
  35. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.template +12 -0
  36. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.returns.template +5 -0
  37. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.table.item.template +1 -0
  38. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.table.row.template +2 -0
  39. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.table.template +8 -0
  40. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.template +14 -0
  41. data/lib/tdriver-devtools/behaviour/xml_generator/example/flick-example.rb +245 -0
  42. data/lib/tdriver-devtools/behaviour/xml_generator/example/sut.rb +964 -0
  43. data/lib/tdriver-devtools/behaviour/xml_generator/generate.rb +68 -0
  44. data/lib/tdriver-devtools/behaviour/xml_generator/lib/custom_rdoc_generator.rb +1865 -0
  45. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.argument.default.template +1 -0
  46. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.argument.template +3 -0
  47. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.argument_type.template +4 -0
  48. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.exception.template +4 -0
  49. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.method.arguments.template +4 -0
  50. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.method.deprecated.template +3 -0
  51. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.method.exceptions.template +3 -0
  52. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.method.info.template +1 -0
  53. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.method.returns.template +3 -0
  54. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.method.tables.template +3 -0
  55. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.method.template +12 -0
  56. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.returns.template +5 -0
  57. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.table.item.template +1 -0
  58. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.table.row.template +2 -0
  59. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.table.template +7 -0
  60. data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.template +14 -0
  61. data/lib/tdriver-devtools/behaviour/xml_generator/update +3 -0
  62. data/lib/tdriver-devtools/doc/behaviour_xml/QtExampleGestureBehaviour.xml +138 -0
  63. data/lib/tdriver-devtools/doc/behaviour_xml/created.rid +1 -0
  64. data/lib/tdriver-devtools/doc/behaviour_xml/tdriver.hash +1 -0
  65. data/lib/tdriver-devtools/doc/feature_xml/qt_widget_hold.feature.xml +9 -0
  66. data/lib/tdriver-devtools/doc/feature_xml/qt_widget_tap.feature.xml +9 -0
  67. data/lib/tdriver-devtools/doc/generate.rb +892 -0
  68. data/lib/tdriver-devtools/doc/update +1 -0
  69. data/lib/tdriver-devtools/doc/xslt/html.rb +7 -0
  70. data/lib/tdriver-devtools/doc/xslt/template.xsl +1861 -0
  71. data/lib/tdriver-devtools/doc/xslt/update +3 -0
  72. data/lib/tdriver-devtools/plugin/placeholder.txt +1 -0
  73. data/lib/tdriver-devtools/tdriver-devtools.rb +404 -0
  74. data/lib/tdriver-devtools/tests/feature_tests/example/flick-example.rb +233 -0
  75. data/lib/tdriver-devtools/tests/feature_tests/example/impl.rb +194 -0
  76. data/lib/tdriver-devtools/tests/feature_tests/generate.rb +82 -0
  77. data/lib/tdriver-devtools/tests/feature_tests/lib/custom_rdoc_generator.rb +468 -0
  78. data/lib/tdriver-devtools/tests/feature_tests/templates/feature_attribute.template +5 -0
  79. data/lib/tdriver-devtools/tests/feature_tests/templates/feature_method.template +5 -0
  80. data/lib/tdriver-devtools/tests/feature_tests/templates/scenario_attribute.template +5 -0
  81. data/lib/tdriver-devtools/tests/feature_tests/templates/scenario_method.template +5 -0
  82. data/lib/tdriver-devtools/tests/feature_tests/update +3 -0
  83. data/lib/tdriver.rb +26 -0
  84. data/lib/tdriver/base/behaviour/behaviour.rb +32 -0
  85. data/lib/tdriver/base/behaviour/behaviours/object_behaviour_composition.rb +94 -0
  86. data/lib/tdriver/base/behaviour/behaviours/object_behaviour_description.rb +262 -0
  87. data/lib/tdriver/base/behaviour/behaviours/object_composition.rb +111 -0
  88. data/lib/tdriver/base/behaviour/factory.rb +380 -0
  89. data/lib/tdriver/base/behaviour/loader.rb +28 -0
  90. data/lib/tdriver/base/command_data/command_data.rb +51 -0
  91. data/lib/tdriver/base/command_data/loader.rb +25 -0
  92. data/lib/tdriver/base/errors.rb +131 -0
  93. data/lib/tdriver/base/loader.rb +38 -0
  94. data/lib/tdriver/base/state_object.rb +270 -0
  95. data/lib/tdriver/base/sut/adapter.rb +28 -0
  96. data/lib/tdriver/base/sut/controller.rb +119 -0
  97. data/lib/tdriver/base/sut/factory.rb +287 -0
  98. data/lib/tdriver/base/sut/generic/behaviours/application.rb +243 -0
  99. data/lib/tdriver/base/sut/generic/behaviours/controller.rb +67 -0
  100. data/lib/tdriver/base/sut/generic/behaviours/find.rb +96 -0
  101. data/lib/tdriver/base/sut/generic/behaviours/flash_behaviour.rb +346 -0
  102. data/lib/tdriver/base/sut/generic/behaviours/sut.rb +1268 -0
  103. data/lib/tdriver/base/sut/generic/behaviours/switchbox_behaviour.rb +182 -0
  104. data/lib/tdriver/base/sut/generic/behaviours/verification.rb +119 -0
  105. data/lib/tdriver/base/sut/generic/commands/application.rb +219 -0
  106. data/lib/tdriver/base/sut/generic/commands/key_sequence.rb +82 -0
  107. data/lib/tdriver/base/sut/generic/commands/screen_capture.rb +58 -0
  108. data/lib/tdriver/base/sut/generic/plugin.rb +96 -0
  109. data/lib/tdriver/base/sut/loader.rb +35 -0
  110. data/lib/tdriver/base/sut/sut.rb +67 -0
  111. data/lib/tdriver/base/test_object/abstract.rb +179 -0
  112. data/lib/tdriver/base/test_object/behaviours/syncronization.rb +94 -0
  113. data/lib/tdriver/base/test_object/behaviours/test_object.rb +787 -0
  114. data/lib/tdriver/base/test_object/factory.rb +618 -0
  115. data/lib/tdriver/base/test_object/identificator.rb +511 -0
  116. data/lib/tdriver/base/test_object/loader.rb +37 -0
  117. data/lib/tdriver/env.rb +21 -0
  118. data/lib/tdriver/loader.rb +36 -0
  119. data/lib/tdriver/matti.rb +35 -0
  120. data/lib/tdriver/report/error_recovery/tdriver_custom_error_recovery.rb +83 -0
  121. data/lib/tdriver/report/error_recovery/tdriver_error_recovery.rb +158 -0
  122. data/lib/tdriver/report/error_recovery/tdriver_error_recovery_settings.rb +98 -0
  123. data/lib/tdriver/report/report.rb +47 -0
  124. data/lib/tdriver/report/report_api.rb +207 -0
  125. data/lib/tdriver/report/report_combine.rb +86 -0
  126. data/lib/tdriver/report/report_crash_file_capture.rb +167 -0
  127. data/lib/tdriver/report/report_creator.rb +571 -0
  128. data/lib/tdriver/report/report_cucumber.rb +158 -0
  129. data/lib/tdriver/report/report_cucumber_listener.rb +337 -0
  130. data/lib/tdriver/report/report_cucumber_reporter.rb +335 -0
  131. data/lib/tdriver/report/report_data_presentation.rb +152 -0
  132. data/lib/tdriver/report/report_data_table.rb +64 -0
  133. data/lib/tdriver/report/report_execution_statistics.rb +284 -0
  134. data/lib/tdriver/report/report_file_capture.rb +159 -0
  135. data/lib/tdriver/report/report_grouping.rb +539 -0
  136. data/lib/tdriver/report/report_junit_xml.rb +147 -0
  137. data/lib/tdriver/report/report_rspec.rb +108 -0
  138. data/lib/tdriver/report/report_test_case_run.rb +621 -0
  139. data/lib/tdriver/report/report_test_run.rb +1286 -0
  140. data/lib/tdriver/report/report_test_unit.rb +175 -0
  141. data/lib/tdriver/report/report_writer.rb +1405 -0
  142. data/lib/tdriver/tdriver.rb +158 -0
  143. data/lib/tdriver/util/common.rb +24 -0
  144. data/lib/tdriver/util/common/array.rb +39 -0
  145. data/lib/tdriver/util/common/crc16.rb +100 -0
  146. data/lib/tdriver/util/common/environment.rb +153 -0
  147. data/lib/tdriver/util/common/error.rb +39 -0
  148. data/lib/tdriver/util/common/file.rb +315 -0
  149. data/lib/tdriver/util/common/gem.rb +108 -0
  150. data/lib/tdriver/util/common/kernel.rb +189 -0
  151. data/lib/tdriver/util/common/loader.rb +39 -0
  152. data/lib/tdriver/util/common/retryable.rb +98 -0
  153. data/lib/tdriver/util/common/string.rb +77 -0
  154. data/lib/tdriver/util/dbaccess/dbaccess.rb +188 -0
  155. data/lib/tdriver/util/dbaccess/dbconnection.rb +41 -0
  156. data/lib/tdriver/util/dbaccess/error.rb +35 -0
  157. data/lib/tdriver/util/dbaccess/loader.rb +29 -0
  158. data/lib/tdriver/util/dynamic_attribute_filter.rb +182 -0
  159. data/lib/tdriver/util/hooking.rb +434 -0
  160. data/lib/tdriver/util/loader.rb +65 -0
  161. data/lib/tdriver/util/localisation.rb +24 -0
  162. data/lib/tdriver/util/localisation/error.rb +32 -0
  163. data/lib/tdriver/util/localisation/loader.rb +28 -0
  164. data/lib/tdriver/util/localisation/localisation.rb +479 -0
  165. data/lib/tdriver/util/logger.rb +377 -0
  166. data/lib/tdriver/util/operator_data/error.rb +29 -0
  167. data/lib/tdriver/util/operator_data/loader.rb +26 -0
  168. data/lib/tdriver/util/operator_data/operator_data.rb +93 -0
  169. data/lib/tdriver/util/other/config.rb +221 -0
  170. data/lib/tdriver/util/parameter.rb +24 -0
  171. data/lib/tdriver/util/parameter/error.rb +45 -0
  172. data/lib/tdriver/util/parameter/loader.rb +37 -0
  173. data/lib/tdriver/util/parameter/parameter.rb +285 -0
  174. data/lib/tdriver/util/parameter/parameter_hash.rb +101 -0
  175. data/lib/tdriver/util/parameter/parameter_template.rb +120 -0
  176. data/lib/tdriver/util/parameter/parameter_user_api.rb +84 -0
  177. data/lib/tdriver/util/parameter/parameter_xml.rb +247 -0
  178. data/lib/tdriver/util/plugin/abstract.rb +60 -0
  179. data/lib/tdriver/util/plugin/error.rb +25 -0
  180. data/lib/tdriver/util/plugin/loader.rb +28 -0
  181. data/lib/tdriver/util/plugin/service.rb +200 -0
  182. data/lib/tdriver/util/recorder.rb +292 -0
  183. data/lib/tdriver/util/stats.rb +90 -0
  184. data/lib/tdriver/util/user_data/error.rb +29 -0
  185. data/lib/tdriver/util/user_data/loader.rb +26 -0
  186. data/lib/tdriver/util/user_data/user_data.rb +103 -0
  187. data/lib/tdriver/util/video_rec.rb +264 -0
  188. data/lib/tdriver/util/xml/abstraction.rb +47 -0
  189. data/lib/tdriver/util/xml/builder.rb +54 -0
  190. data/lib/tdriver/util/xml/document.rb +32 -0
  191. data/lib/tdriver/util/xml/element.rb +32 -0
  192. data/lib/tdriver/util/xml/error.rb +46 -0
  193. data/lib/tdriver/util/xml/loader.rb +46 -0
  194. data/lib/tdriver/util/xml/nil_element.rb +89 -0
  195. data/lib/tdriver/util/xml/nodeset.rb +32 -0
  196. data/lib/tdriver/util/xml/parsers/libxml/libxml.rb +140 -0
  197. data/lib/tdriver/util/xml/parsers/loader.rb +22 -0
  198. data/lib/tdriver/util/xml/parsers/nokogiri/abstraction.rb +111 -0
  199. data/lib/tdriver/util/xml/parsers/nokogiri/attribute.rb +54 -0
  200. data/lib/tdriver/util/xml/parsers/nokogiri/builder.rb +58 -0
  201. data/lib/tdriver/util/xml/parsers/nokogiri/document.rb +58 -0
  202. data/lib/tdriver/util/xml/parsers/nokogiri/element.rb +147 -0
  203. data/lib/tdriver/util/xml/parsers/nokogiri/loader.rb +42 -0
  204. data/lib/tdriver/util/xml/parsers/nokogiri/nodeset.rb +187 -0
  205. data/lib/tdriver/util/xml/xml.rb +170 -0
  206. data/lib/tdriver/verify/verify.rb +687 -0
  207. data/lib/tdriver/verify/verify.rb_org +630 -0
  208. data/lib/tdriver/version.rb +21 -0
  209. data/xml/behaviours/generic.xml +495 -0
  210. data/xml/defaults/generic.xml +97 -0
  211. data/xml/defaults/sut_generic.xml +36 -0
  212. data/xml/parameters/tdriver_parameters.xml +23 -0
  213. data/xml/templates/generic.xml +227 -0
  214. metadata +327 -0
@@ -0,0 +1,111 @@
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
+ # Generic methods for test object and SUT composition
24
+ #
25
+ # == behaviour
26
+ # GenericObjectComposition
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 ObjectComposition
44
+
45
+ include MobyBehaviour::Behaviour
46
+
47
+ # The parent attribute accessor is deprecated, parent_object() should be used instead.
48
+ #def parent
49
+
50
+ # $stderr.puts "#{ caller(0).last.to_s } warning: TestObject#parent is deprecated, please use TestObject#parent_object instead."
51
+ # @parent
52
+
53
+ #end
54
+
55
+ # == nodoc
56
+ # Adds a object as a parent of this object
57
+ # === params
58
+ # parent_object Object to be added
59
+ # === returns
60
+ # ?
61
+ # === raises
62
+ def add_parent( parent_object )
63
+
64
+ @parent = parent_object
65
+
66
+ end
67
+
68
+ # == nodoc
69
+ # removes association to parent object from self
70
+ # === params
71
+ # none
72
+ # === returns
73
+ # ?
74
+ def remove_parent()
75
+
76
+ @parent = nil
77
+
78
+ end
79
+
80
+ # == nodoc
81
+ # Adds a test object as a child of this object
82
+ # === params
83
+ # new_child_object:: Object to be added
84
+ # === returns
85
+ # ?
86
+ # === raises
87
+ def add_child( new_child_object )
88
+
89
+ @_child_object_cache.merge!( new_child_object.hash => new_child_object )
90
+
91
+ end
92
+
93
+ # == nodoc
94
+ # Removes target_child_object from the Set of child objects
95
+ # === params
96
+ # target_test_object:: TestObject to be removed
97
+ # === returns
98
+ # ?
99
+ # === raises
100
+ def remove_child( target_child_object )
101
+
102
+ @_child_object_cache.delete( target_child_object.hash )
103
+
104
+ end
105
+
106
+ # enable hooking for performance measurement & debug logging
107
+ MobyUtil::Hooking.instance.hook_methods( self ) if defined?( MobyUtil::Hooking )
108
+
109
+ end # ObjectComposition
110
+
111
+ end # MobyBehaviour
@@ -0,0 +1,380 @@
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 MobyBase
21
+
22
+ # TODO: document BehaviourFactory class
23
+ class BehaviourFactory
24
+
25
+ include Singleton
26
+
27
+ def initialize
28
+
29
+ @@behaviours = []
30
+ @@behaviours_cache = {}
31
+ @@modules_cache = {}
32
+
33
+ # behaviour xml files path
34
+ @@path = File.join( MobyUtil::FileHelper.tdriver_home, '/behaviours/*.xml' )
35
+
36
+ parse_behaviour_files(
37
+
38
+ load_behaviours( @@path )
39
+
40
+ )
41
+
42
+ end
43
+
44
+ public
45
+
46
+ def to_xml( rules = {} )
47
+
48
+ @_method_index = nil
49
+
50
+ rules.default = [ '*' ]
51
+
52
+ rules.each_pair{ | key, value |
53
+
54
+ rules[ key ] = [ value ] if value.kind_of?( String )
55
+
56
+ }
57
+
58
+ MobyUtil::XML.build{
59
+
60
+ behaviours{
61
+
62
+ @@behaviours.each_index{ | index |
63
+
64
+ @_method_index = index
65
+
66
+ behaviour = @@behaviours[ @_method_index ]
67
+
68
+ if ( ( rules[ :name ] == behaviour[ :name ] ) ||
69
+
70
+ ( rules[ :name ] == [ '*' ] ) &&
71
+
72
+ ( !( rules[ :sut_type ] & behaviour[ :sut_type ] ).empty? ) &&
73
+ ( !( rules[ :input_type ] & behaviour[ :input_type ] ).empty? ) &&
74
+ ( !( rules[ :object_type ] & behaviour[ :object_type ] ).empty? ) &&
75
+ ( !( rules[ :version ] & behaviour[ :version ] ).empty? )
76
+
77
+ )
78
+
79
+ behaviour( :name => @@behaviours[ @_method_index ][ :name ], :object_type => @@behaviours[ @_method_index ][ :object_type ].join(";") ){
80
+ object_methods{
81
+ @@behaviours[ @_method_index ][ :methods ].each { | key, value |
82
+ object_method( :name => key.to_s ) {
83
+ description( value[:description] )
84
+ example( value[:example] )
85
+ }
86
+ }
87
+ }
88
+ }
89
+
90
+ end
91
+
92
+ }
93
+
94
+ }
95
+
96
+ }.to_xml
97
+
98
+ end
99
+
100
+ def get_behaviour_at_index( index )
101
+
102
+ result = @@behaviours[ index ]
103
+
104
+ if result.nil?
105
+
106
+ Kernel::raise RuntimeError.new( "No behaviour at index #{ index }" )
107
+
108
+ else
109
+
110
+ result
111
+
112
+ end
113
+
114
+ end
115
+
116
+ def apply_behaviour!( rules = {} )
117
+
118
+ # merge user-defined rules on top of default rules set
119
+ #rules = { :sut_type => ['*'], :object_type => ['*'], :input_type => ['*'], :version => ['*'] }.merge!( rules )
120
+
121
+ rules.default = ['*']
122
+
123
+ Kernel::raise ArgumentError.new( "No target object defined in rules hash" ) if rules[ :object ].nil?
124
+
125
+ # apply behaviours to target object
126
+ ( get_object_behaviours( rules ) ).each{ | behaviour_index |
127
+
128
+ behaviour_data = @@behaviours[ behaviour_index ]
129
+
130
+ # skip if required plugin is not registered or enabled
131
+ next if behaviour_data[ :requires ].collect{ | plugin |
132
+
133
+ #MobyUtil::PluginService.instance.plugin_registered?( plugin ) && MobyUtil::PluginService.instance.plugin_enabled?( plugin )
134
+
135
+ # verify if plugin is enabled -- exception will be catched if plugin is not registered
136
+ MobyUtil::PluginService.instance.plugin_enabled?( plugin ) rescue false
137
+
138
+ }.include?( false )
139
+
140
+ begin
141
+
142
+ #behaviour_module = MobyUtil::KernelHelper.get_constant( behaviour_data[ :module ][ :name ] )
143
+
144
+ # retrieve behaviour module from cache and extend target object
145
+ rules[ :object ].extend(
146
+
147
+ @@modules_cache.fetch( behaviour_data[ :module ][ :name ] ){ | name |
148
+
149
+ # ... or store to cache for the next time if not found
150
+ @@modules_cache[ name ] = MobyUtil::KernelHelper.get_constant( name )
151
+
152
+ }
153
+
154
+ )
155
+
156
+ rescue NameError => exception
157
+
158
+ Kernel::raise exception.class.new(
159
+ "Implementation for behaviour %s does not exist. (%s)" % [ behaviour_data[ :name ], behaviour_data[ :module ][ :name ] ]
160
+ )
161
+
162
+ rescue Exception => exception
163
+
164
+ Kernel::raise RuntimeError.new(
165
+ "Error while applying %s (%s) behaviour to target object. Reason: %s (%s)" % [
166
+ behaviour_data[ :name ],
167
+ behaviour_data[ :module ][ :name ],
168
+ exception.message,
169
+ exception.class
170
+ ]
171
+ )
172
+
173
+ end
174
+
175
+ # add behaviour information to test object
176
+ rules[ :object ].instance_exec{
177
+
178
+ @object_behaviours.push( behaviour_index ) unless @object_behaviours.include? behaviour_index
179
+
180
+ }
181
+
182
+ }
183
+
184
+ end
185
+
186
+ private
187
+
188
+ def load_behaviours( behaviour_files )
189
+
190
+ behaviours_data = []
191
+
192
+ @file_name = ""
193
+
194
+ begin
195
+
196
+ Dir.glob( behaviour_files ).each { | behaviour |
197
+
198
+ @file_name = behaviour
199
+
200
+ behaviours_data << { :filename => @file_name, :xml => MobyUtil::FileHelper.get_file( @file_name ) }
201
+
202
+ }
203
+
204
+ rescue MobyUtil::EmptyFilenameError
205
+
206
+ Kernel::raise EmptyFilenameError.new( "Unable to load behaviours xml file due to filename is empty or nil" )
207
+
208
+ rescue MobyUtil::FileNotFoundError => ex
209
+
210
+ Kernel::raise ex
211
+
212
+ rescue IOError => ex
213
+
214
+ Kernel::raise IOError.new("Error occured while loading behaviours xml file %s. Reason: %s" % [ @file_name, ex.message ] )
215
+
216
+ rescue => ex
217
+
218
+ Kernel::raise RuntimeError.new( "Error occured while parsing behaviours xml file %s. Reason: %s (%s)" % [ @file_name, ex.message, ex.class ] )
219
+
220
+ end
221
+
222
+ behaviours_data
223
+
224
+ end
225
+
226
+ def parse_behaviour_files( behaviour_files )
227
+
228
+ behaviour_files.each{ | behaviours |
229
+
230
+ begin
231
+
232
+ # parse behaviour xml
233
+ document = MobyUtil::XML.parse_string( behaviours[ :xml ] )
234
+
235
+ rescue => exception
236
+
237
+ Kernel::raise MobyUtil::XML::ParseError.new(
238
+ "Error occured while parsing behaviour XML file %s. Error: %s " % [ behaviours[ :filename ], exception.message ]
239
+ )
240
+
241
+ end
242
+
243
+ # retrieve root attributes
244
+ root_attributes = document.root.xpath( "/behaviours" ).first.attributes
245
+
246
+ # parse retrieve behaviour definitions
247
+ document.root.xpath( "/behaviours/behaviour" ).each{ | node |
248
+
249
+ # retrieve behaviour attributes & module node
250
+ attributes = node.attributes
251
+
252
+ name = attributes[ "name" ].to_s
253
+ object_type = attributes[ "object_type" ].to_s
254
+ input_type = attributes[ "input_type" ].to_s
255
+ sut_type = attributes[ "sut_type" ].to_s
256
+ version = attributes[ "version" ].to_s
257
+
258
+ # verify that all required attributes and nodes are found in behaviour xml node
259
+ Kernel::raise RuntimeError.new("Behaviour does not have a name, please see behaviour XML files") if name.empty?
260
+ Kernel::raise RuntimeError.new("Behaviour target object type not defined for #{ name } in XML") if object_type.empty?
261
+ Kernel::raise RuntimeError.new("Behaviour target object input type not defined for #{ name } in XML") if input_type.empty?
262
+ Kernel::raise RuntimeError.new("Behaviour target object sut type not defined for #{ name } in XML") if sut_type.empty?
263
+ Kernel::raise RuntimeError.new("Behaviour target object sut version not defined for #{ name } in XML") if version.empty?
264
+
265
+ module_node = node.xpath( 'module' ).first
266
+
267
+ Kernel::raise RuntimeError.new("Behaviour implementation module not defined for #{ name } in XML") if module_node.nil?
268
+
269
+ # retrieve module name & implementation filename
270
+ module_attributes = module_node.attributes
271
+
272
+ module_file = module_attributes[ "file" ].to_s # optional
273
+ module_name = module_attributes[ "name" ].to_s
274
+
275
+ Kernel::raise RuntimeError.new( "Behaviour implementation module name not defined for #{ name } in XML") if module_name.empty?
276
+
277
+ methods_hash = {}
278
+
279
+ # create hash of methods
280
+ node.xpath( 'methods/method' ).each{ | method |
281
+
282
+ # retrieve method description & example and store to methods hash
283
+ methods_hash[ method.attribute( "name" ).to_s.to_sym ] = {
284
+
285
+ :description => ( method.xpath( 'description' ).first.content rescue "" ),
286
+ :example => ( method.xpath( 'example' ).first.content rescue "" )
287
+
288
+ }
289
+
290
+ }
291
+
292
+ # create and store beahaviour hash
293
+ @@behaviours << {
294
+
295
+ :name => name,
296
+ :requires => root_attributes[ "plugin" ].to_s.split(";"),
297
+ :object_type => object_type.split(";"),
298
+ :input_type => input_type.split(";"),
299
+ :sut_type => sut_type.split(";"),
300
+ :version => version.split(";"),
301
+
302
+ :module => {
303
+ :file => module_file,
304
+ :name => module_name
305
+ },
306
+
307
+ :methods => methods_hash
308
+
309
+ }
310
+
311
+ }
312
+
313
+ }
314
+
315
+ end
316
+
317
+ def get_object_behaviours( rules )
318
+
319
+ # calculate hash for behaviour rules / hash value will be used to identify similar objects
320
+ behaviour_hash = Hash[ rules.select{ | key, value | key != :object } ].hash
321
+
322
+ if @@behaviours_cache.has_key?( behaviour_hash )
323
+
324
+ # retrieve behaviour module indexes from cache
325
+ @@behaviours_cache[ behaviour_hash ]
326
+
327
+ else
328
+
329
+ rules.default = [ '*' ]
330
+
331
+ extended_modules = []
332
+
333
+ @@behaviours.each_with_index{ | behaviour, index |
334
+
335
+ if ( ( rules[ :name ] == behaviour[ :name ] ) ||
336
+
337
+ ( rules[ :name ] == [ '*' ] &&
338
+
339
+ ( !( rules[ :sut_type ] & behaviour[ :sut_type ] ).empty? ) &&
340
+ ( !( rules[ :object_type ] & behaviour[ :object_type ] ).empty? ) &&
341
+ ( !( rules[ :input_type ] & behaviour[ :input_type ] ).empty? ) &&
342
+ ( !( rules[ :version ] & behaviour[ :version ] ).empty? ) ) )
343
+
344
+ # retrieve list of extended modules
345
+ extended_modules << index
346
+
347
+ end
348
+
349
+ }
350
+
351
+ # store behaviour module indexes to cache
352
+ @@behaviours_cache[ behaviour_hash ] = extended_modules
353
+
354
+ end
355
+
356
+ end
357
+
358
+ def get_behaviour_from_cache( target, sut_type, object_type, sut_version, input_type )
359
+
360
+ if @_behaviour_cache.has_key?( object_type )
361
+
362
+ # apply modules to target object
363
+ @_behaviour_cache[ object_type ].each{ | module_name | target.instance_eval( "self.extend(#{ module_name })" ) }
364
+
365
+ # return true
366
+ true
367
+
368
+ else
369
+ # return false
370
+ false
371
+ end
372
+
373
+ end
374
+
375
+ # enable hooking for performance measurement & debug logging
376
+ MobyUtil::Hooking.instance.hook_methods( self ) if defined?( MobyUtil::Hooking )
377
+
378
+ end # BehaviourGenerator
379
+
380
+ end # MobyBase