testability-driver 1.3.0 → 1.3.1

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 (60) hide show
  1. data/ext/native_extensions.c +53 -25
  2. data/lib/matti.rb +0 -5
  3. data/lib/tdriver/base/behaviour/behaviours/object_behaviour_description.rb +4 -4
  4. data/lib/tdriver/base/behaviour/factory.rb +120 -7
  5. data/lib/tdriver/base/errors.rb +1 -1
  6. data/lib/tdriver/base/state_object.rb +3 -2
  7. data/lib/tdriver/base/sut/controller.rb +2 -2
  8. data/lib/tdriver/base/sut/factory.rb +207 -201
  9. data/lib/tdriver/base/sut/generic/behaviours/application.rb +3 -6
  10. data/lib/tdriver/base/sut/generic/behaviours/find.rb +1 -1
  11. data/lib/tdriver/base/sut/generic/behaviours/flash_behaviour.rb +14 -14
  12. data/lib/tdriver/base/sut/generic/behaviours/sut.rb +5 -5
  13. data/lib/tdriver/base/sut/generic/behaviours/switchbox_behaviour.rb +14 -14
  14. data/lib/tdriver/base/sut/generic/behaviours/verification.rb +3 -18
  15. data/lib/tdriver/base/sut/generic/commands/key_sequence.rb +6 -6
  16. data/lib/tdriver/base/sut/generic/plugin.rb +4 -9
  17. data/lib/tdriver/base/sut/sut.rb +2 -6
  18. data/lib/tdriver/base/test_object/abstract.rb +1 -1
  19. data/lib/tdriver/base/test_object/adapter.rb +5 -5
  20. data/lib/tdriver/base/test_object/behaviours/syncronization.rb +7 -6
  21. data/lib/tdriver/base/test_object/behaviours/test_object.rb +18 -18
  22. data/lib/tdriver/base/test_object/factory.rb +147 -96
  23. data/lib/tdriver/base/test_object/verification.rb +6 -9
  24. data/lib/tdriver/base/test_object/xml/adapter.rb +5 -5
  25. data/lib/tdriver/matti.rb +1 -1
  26. data/lib/tdriver/report/error_recovery/tdriver_error_recovery.rb +17 -8
  27. data/lib/tdriver/report/error_recovery/tdriver_error_recovery_settings.rb +7 -7
  28. data/lib/tdriver/report/report_api.rb +172 -79
  29. data/lib/tdriver/report/report_crash_file_capture.rb +4 -7
  30. data/lib/tdriver/report/report_creator.rb +16 -20
  31. data/lib/tdriver/report/report_file_capture.rb +3 -3
  32. data/lib/tdriver/report/report_javascript.rb +3 -3
  33. data/lib/tdriver/report/report_test_case_run.rb +20 -10
  34. data/lib/tdriver/report/report_test_run.rb +11 -10
  35. data/lib/tdriver/report/report_writer.rb +13 -11
  36. data/lib/tdriver/tdriver.rb +6 -6
  37. data/lib/tdriver/util/common/array.rb +2 -2
  38. data/lib/tdriver/util/common/file.rb +9 -11
  39. data/lib/tdriver/util/common/gem.rb +1 -1
  40. data/lib/tdriver/util/common/kernel.rb +4 -4
  41. data/lib/tdriver/util/common/retryable.rb +2 -2
  42. data/lib/tdriver/util/common/string.rb +2 -3
  43. data/lib/tdriver/util/hooking/hooking.rb +2 -2
  44. data/lib/tdriver/util/localisation/localisation.rb +12 -12
  45. data/lib/tdriver/util/logger/logger.rb +7 -25
  46. data/lib/tdriver/util/operator_data/operator_data.rb +5 -5
  47. data/lib/tdriver/util/parameter/parameter.rb +2 -2
  48. data/lib/tdriver/util/plugin/abstract.rb +4 -3
  49. data/lib/tdriver/util/plugin/service.rb +31 -4
  50. data/lib/tdriver/util/recorder/recorder.rb +4 -4
  51. data/lib/tdriver/util/user_data/user_data.rb +5 -5
  52. data/lib/tdriver/util/video/camera_windows.rb +1 -1
  53. data/lib/tdriver/util/xml/builder.rb +3 -1
  54. data/lib/tdriver/util/xml/parsers/libxml/libxml.rb +1 -1
  55. data/lib/tdriver/util/xml/xml.rb +5 -5
  56. data/lib/tdriver/verify/verify.rb +26 -26
  57. data/lib/tdriver/version.rb +1 -1
  58. data/xml/behaviours/generic.xml +1 -2
  59. metadata +2 -3
  60. data/lib/tdriver/verify/verify.rb_org +0 -630
@@ -22,6 +22,7 @@
22
22
  #include "ruby.h"
23
23
 
24
24
  static const CCITT_16[ 256 ] = {
25
+
25
26
  0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
26
27
  0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
27
28
  0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
@@ -54,6 +55,7 @@ static const CCITT_16[ 256 ] = {
54
55
  0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
55
56
  0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
56
57
  0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
58
+
57
59
  };
58
60
 
59
61
 
@@ -96,7 +98,21 @@ static VALUE crc16_ibm( VALUE self, VALUE string ) {
96
98
  */
97
99
 
98
100
  static VALUE crc16( int argc, VALUE* argv, VALUE self ) {
99
- //klass VALUE self, VALUE string, VALUE unused_crc ) {
101
+
102
+ /*
103
+
104
+ # CRC-16-CCITT
105
+ def crc16( buf, crc = 0 )
106
+
107
+ # calculate the checksum
108
+ buf.each_byte{ | x | crc = ( ( crc << 8 ) ^ @CCITT_16[ ( crc >> 8 ) ^ x ] ) & 0xffff }
109
+
110
+ # result
111
+ crc
112
+
113
+ end # crc16
114
+
115
+ */
100
116
 
101
117
  // variables for arguments
102
118
  VALUE string, initial_crc;
@@ -104,29 +120,26 @@ static VALUE crc16( int argc, VALUE* argv, VALUE self ) {
104
120
  // retrieve arguments
105
121
  rb_scan_args(argc, argv, "11", &string, &initial_crc);
106
122
 
107
- int crc; // = 0xffff;
108
-
109
- if (NIL_P(initial_crc)){
110
-
111
- crc = 0;
123
+ // verify argument type
124
+ Check_Type( string, T_STRING );
125
+
126
+ // initialize crc
127
+ unsigned int crc = 0;
112
128
 
113
- } else {
129
+ if (!NIL_P(initial_crc)){
114
130
 
115
131
  // verify initial crc value
116
132
  Check_Type( initial_crc, T_FIXNUM );
117
133
 
118
- crc = NUM2INT( initial_crc );
134
+ crc = FIX2INT( initial_crc );
119
135
 
120
136
  }
121
-
122
- // verify argument type
123
- Check_Type( string, T_STRING );
124
137
 
125
- const char* data = RSTRING_PTR( string );
138
+ const unsigned char* data = RSTRING_PTR( string );
126
139
 
127
- int len = RSTRING_LEN( string );
140
+ unsigned int len = RSTRING_LEN( string );
128
141
 
129
- int c = 0;
142
+ unsigned char c = 0;
130
143
 
131
144
  while( len-- ){
132
145
 
@@ -142,7 +155,26 @@ static VALUE crc16( int argc, VALUE* argv, VALUE self ) {
142
155
  }
143
156
 
144
157
  static VALUE crc16_ibm( int argc, VALUE* argv, VALUE self ) {
145
- //klass VALUE self, VALUE string, VALUE unused_crc ) {
158
+
159
+ /*
160
+
161
+ # IBM-CRC-16: fallback when native extensions are not supported (e.g. jruby)
162
+ def crc16_ibm( buf, crc = 0xffff )
163
+
164
+ buf.each_byte do | c |
165
+
166
+ crc = ( ( crc >> 4 ) & 0x0fff ) ^ @IBM_16[ ( ( crc ^ c ) & 15 ) ]
167
+
168
+ crc = ( ( crc >> 4 ) & 0x0fff ) ^ @IBM_16[ ( ( crc ^ ( c >> 4 ) ) & 15 ) ]
169
+
170
+ end
171
+
172
+ # result
173
+ ~crc & 0xffff
174
+
175
+ end # crc16_ibm
176
+
177
+ */
146
178
 
147
179
  // variables for arguments
148
180
  VALUE string, initial_crc;
@@ -150,29 +182,25 @@ static VALUE crc16_ibm( int argc, VALUE* argv, VALUE self ) {
150
182
  // retrieve arguments
151
183
  rb_scan_args(argc, argv, "11", &string, &initial_crc);
152
184
 
153
- int crc; // = 0xffff;
154
-
155
- if (NIL_P(initial_crc)){
185
+ unsigned int crc = 0xffff;
156
186
 
157
- crc = 0xffff;
158
-
159
- } else {
187
+ if (!NIL_P(initial_crc)){
160
188
 
161
189
  // verify initial crc value
162
190
  Check_Type( initial_crc, T_FIXNUM );
163
191
 
164
- crc = NUM2INT( initial_crc );
192
+ crc = FIX2INT( initial_crc );
165
193
 
166
194
  }
167
195
 
168
196
  // verify argument type
169
197
  Check_Type( string, T_STRING );
170
198
 
171
- const char* data = RSTRING_PTR( string );
199
+ const unsigned char* data = RSTRING_PTR( string );
172
200
 
173
- int len = RSTRING_LEN( string );
201
+ unsigned int len = RSTRING_LEN( string );
174
202
 
175
- int c = 0;
203
+ unsigned char c = 0;
176
204
 
177
205
  while( len-- ){
178
206
 
data/lib/matti.rb CHANGED
@@ -17,11 +17,6 @@
17
17
  ##
18
18
  ############################################################################
19
19
 
20
- =begin
21
- file, line = ( caller.first || "%s:%s" % [ __FILE__, __LINE__ ] ).split(":")
22
- $stderr.puts "%s:%s warning: require 'matti' deprecated, use require 'tdriver' instead also 'MATTI' is deprecated, use 'TDriver' instead " % [ file, line]
23
- =end
24
-
25
20
  $stderr.puts "%s:%s warning: require 'matti' deprecated, use require 'tdriver' instead. Please note that class 'MATTI' is also deprecated, use 'TDriver' instead " % ( caller.first || "%s:%s" % [ __FILE__, __LINE__ ] ).split(":")[ 0..1 ]
26
21
 
27
22
  # load matti resources and framework
@@ -73,7 +73,7 @@ module MobyBehaviour
73
73
 
74
74
  else
75
75
 
76
- TDriver::BehaviourFactory.collect_behaviours( :index => @object_behaviours ).collect{ | behaviour | behaviour[ :name ] }.uniq.compact.sort
76
+ TDriver::BehaviourFactory.collect_behaviours( :index => @object_behaviours ).collect{ | behaviour | behaviour[ :name ] }.uniq.compact
77
77
 
78
78
  end
79
79
 
@@ -101,7 +101,7 @@ module MobyBehaviour
101
101
 
102
102
  )
103
103
 
104
- }.uniq.compact.sort
104
+ }.uniq.compact
105
105
 
106
106
  end
107
107
 
@@ -145,10 +145,10 @@ module MobyBehaviour
145
145
  #
146
146
  # == exceptions
147
147
  # TypeError
148
- # description: Wrong argument type %s for method name (expected Symbol or String)
148
+ # description: Wrong argument type <class> for method name (expected Symbol or String)
149
149
  #
150
150
  # ArgumentError
151
- # description: Test object type of %s does not have method %s
151
+ # description: Test object type of <type> does not have method <name>
152
152
  #
153
153
  def describe_method( method_name, print = true, return_result = false )
154
154
 
@@ -48,6 +48,44 @@ module TDriver
48
48
 
49
49
  end
50
50
 
51
+ def remove_behaviours( object )
52
+
53
+ object.check_type [ MobyBase::TestObject, MobyBase::SUT ], 'wrong argument type $1 for target object (expected $2)'
54
+
55
+ # add behaviour information to test object
56
+ behaviour_index = object.instance_variable_get( :@object_behaviours )
57
+
58
+ collect_behaviours( :index => behaviour_index ).collect{ | behaviour |
59
+
60
+ _module = behaviour[ :module ]
61
+
62
+ instance_methods = [
63
+ _module.instance_methods( false ),
64
+ _module.private_instance_methods( false ),
65
+ _module.protected_instance_methods( false )
66
+ ].inject([]){ | result, methods |
67
+
68
+ result.concat( methods )
69
+
70
+ }
71
+
72
+ # remove behaviour instance methods from target object
73
+ instance_methods.each do | method_name |
74
+
75
+ object.instance_eval( "undef :#{ method_name.to_s }") # if respond_to?(:#{ method_name.to_s })" )
76
+
77
+ end
78
+
79
+ behaviour_index.delete( behaviour[ :index ] )
80
+
81
+ }
82
+
83
+ behaviour_index = object.instance_variable_set( :@object_behaviours, behaviour_index )
84
+
85
+ object
86
+
87
+ end
88
+
51
89
  # TODO: document me
52
90
  def apply_behaviour( rule )
53
91
 
@@ -132,12 +170,63 @@ module TDriver
132
170
  rule.default = [ '*' ]
133
171
 
134
172
  # store as local variable for less AST lookups
135
- _index = rule.fetch( :index ){ [] }
173
+ _index = rule.fetch( :index, [] )
136
174
  _object_type = rule[ :object_type ]
137
175
  _input_type = rule[ :input_type ]
138
176
  _env = rule[ :env ]
139
177
  _version = rule[ :version ]
140
178
 
179
+ _name = rule[ :name ]
180
+ _any = [ '*' ]
181
+
182
+ # collect behaviours
183
+ enabled_plugins.inject([]){ | result, plugin |
184
+
185
+ @behaviours_per_plugin.fetch( plugin, [] ).each do | behaviour |
186
+
187
+ # match other rules if no exact index given
188
+ if _index.empty?
189
+
190
+ case _name
191
+
192
+ when behaviour[ :name ]
193
+
194
+ # exact match with name
195
+ result << behaviour
196
+
197
+ when _any
198
+
199
+ # compare rules and behaviour attributes
200
+ if !( _object_type & behaviour[ :object_type ] ).empty? &&
201
+ !( _input_type & behaviour[ :input_type ] ).empty? &&
202
+ !( _env & behaviour[ :env ] ).empty? &&
203
+ !( _version & behaviour[ :version ] ).empty?
204
+
205
+ result << behaviour
206
+
207
+ end
208
+
209
+ else
210
+
211
+ false
212
+
213
+ end
214
+
215
+ else
216
+
217
+ # index given
218
+ result << behaviour if Array( _index ).include?( behaviour[ :index ] )
219
+
220
+ end
221
+
222
+ end
223
+
224
+ result
225
+
226
+ }
227
+
228
+ =begin
229
+
141
230
  @behaviours.select do | behaviour |
142
231
 
143
232
  # skip if required plugin is not registered or enabled; compare requires array and enabled_plugins array
@@ -146,14 +235,14 @@ module TDriver
146
235
  # match other rules if no exact index given
147
236
  if _index.empty?
148
237
 
149
- case rule[ :name ]
238
+ case _name
150
239
 
151
240
  when behaviour[ :name ]
152
241
 
153
242
  # exact match with name
154
243
  true
155
244
 
156
- when ['*']
245
+ when _any
157
246
 
158
247
  # compare rules and behaviour attributes
159
248
  !( _object_type & behaviour[ :object_type ] ).empty? &&
@@ -175,6 +264,7 @@ module TDriver
175
264
  end
176
265
 
177
266
  end # behaviours.select
267
+ =end
178
268
 
179
269
  end
180
270
 
@@ -243,11 +333,30 @@ module TDriver
243
333
  # behaviours container
244
334
  @behaviours = []
245
335
 
336
+ @behaviours_per_plugin = {}
337
+
246
338
  # behaviour cache; re-collecting behaviours is not required for similar target objects
247
339
  @behaviours_cache = {}
248
340
 
249
341
  end
250
342
 
343
+ # TODO: document me
344
+ def store( behaviour_data )
345
+
346
+ behaviour_data[ :requires ].each{ | plugin |
347
+
348
+ # retrieve array of plugin specific behaviours
349
+ behaviours_array = @behaviours_per_plugin[ plugin ] || []
350
+
351
+ # apply empty array unless already exist
352
+ @behaviours_per_plugin[ plugin ] = behaviours_array if behaviours_array.empty?
353
+
354
+ behaviours_array << behaviour_data
355
+
356
+ }
357
+
358
+ end
359
+
251
360
  # load and parse behaviours files
252
361
  def load_behaviours( path )
253
362
 
@@ -295,7 +404,7 @@ module TDriver
295
404
  module_name.not_empty "behaviour #{ attributes[ "name" ].inspect } does not have module name defined or is empty", RuntimeError
296
405
 
297
406
  # store behaviour
298
- @behaviours << {
407
+ behaviour_data = {
299
408
 
300
409
  :index => @behaviours.count,
301
410
 
@@ -325,6 +434,10 @@ module TDriver
325
434
 
326
435
  }
327
436
 
437
+ store behaviour_data
438
+
439
+ @behaviours << behaviour_data
440
+
328
441
  end # behaviour.each
329
442
 
330
443
  end # behaviours.each
@@ -334,8 +447,8 @@ module TDriver
334
447
  raise
335
448
 
336
449
  rescue MobyUtil::XML::ParseError
337
-
338
- raise MobyUtil::XML::ParseError, "Error while parsing behaviours file #{ behaviours[ :filename ] } due to #{ $!.message }"
450
+
451
+ raise MobyUtil::XML::ParseError, "Error while parsing behaviours file #{ filename } due to #{ $!.message }"
339
452
 
340
453
  rescue
341
454
 
@@ -346,7 +459,7 @@ module TDriver
346
459
  } # Dir.glob
347
460
 
348
461
  end # behaviours
349
-
462
+
350
463
  end # self
351
464
 
352
465
  # initialize behaviour factory
@@ -49,7 +49,7 @@ module MobyBase
49
49
  end
50
50
 
51
51
  error = error_type.new( message )
52
- Kernel::raise error
52
+ raise error
53
53
  end
54
54
 
55
55
  # enable hooking for performance measurement & debug logging
@@ -114,7 +114,8 @@ module MobyBase
114
114
 
115
115
  else
116
116
 
117
- @test_object_adapter = TDriver::TestObjectAdapter
117
+ # Load the new xml only, so old is not supported
118
+ @test_object_adapter = TDriver::OptimizedXML::TestObjectAdapter
118
119
 
119
120
  end
120
121
 
@@ -176,7 +177,7 @@ module MobyBase
176
177
  end
177
178
 
178
179
  # raise exception
179
- Kernel::raise MobyBase::TestObjectNotFoundError.new(
180
+ raise MobyBase::TestObjectNotFoundError.new(
180
181
  "The state object (#{ object_attributes.join(", ") }) has no child object with type or behaviour method with name #{ method_id.to_s.inspect }#{ search_attributes_string }"
181
182
  )
182
183
 
@@ -28,7 +28,7 @@ module MobyBase
28
28
  # sut_adapter:: MobyController::SutAdapter descendant, e.g. MobyController::QT::SutAdapter
29
29
  # == raises
30
30
  # TypeError:: Wrong argument type $1 for SUT controller (expected $2)
31
- # NameError:: No SUT controller found for %s (%s)
31
+ # NameError:: No SUT controller found for <type> (<class>)
32
32
  def initialize( sut_controllers, sut_adapter )
33
33
 
34
34
  sut_controllers.check_type String, 'Wrong argument type $1 for SUT controller (expected $2)'
@@ -123,7 +123,7 @@ module MobyBase
123
123
 
124
124
  retries += 1
125
125
 
126
- if MobyBase::SUTFactory.instance.connected_suts.include?( @sut_adapter.sut_id.to_sym )
126
+ if TDriver::SUTFactory.connected_suts.include?( @sut_adapter.sut_id.to_sym )
127
127
 
128
128
  @sut_adapter.disconnect
129
129
 
@@ -17,317 +17,323 @@
17
17
  ##
18
18
  ############################################################################
19
19
 
20
- module MobyBase
20
+ module TDriver
21
21
 
22
- # Class to create SUT objects
23
- # Hides actual SUT object from the clients -> clients should be able to use the instantiated SUT object as if it was any SUT
24
22
  class SUTFactory
25
23
 
26
- include Singleton
27
-
28
- # Initialize the singleton
29
- def initialize()
30
-
31
- reset
32
-
33
- end
24
+ # private methods and variables
25
+ class << self
34
26
 
35
- # Create/reset hash to store sut ids for all current suts
36
- def reset
27
+ private
37
28
 
38
- @_sut_list = {}
29
+ # TODO: document me
30
+ def initialize_class
39
31
 
40
- end
32
+ reset
41
33
 
42
- def mapped_sut?( sut_id )
34
+ end
43
35
 
44
- $parameters[ :mappings, {} ].has_key?( sut_id.to_sym )
36
+ def mapped_sut?( sut_id )
45
37
 
46
- end
38
+ $parameters[ :mappings, {} ].has_key?( sut_id.to_sym )
47
39
 
40
+ end
48
41
 
49
- def get_mapped_sut( sut_id )
42
+ def get_mapped_sut( sut_id )
50
43
 
51
- $parameters[ :mappings ][ sut_id.to_sym ].to_sym
44
+ $parameters[ :mappings ][ sut_id.to_sym ].to_sym
52
45
 
53
- end
46
+ end
54
47
 
55
- # Function to create the actual SUT objects based on the 'sut' attribute.
56
- # === params
57
- # sut_type:: sut_type - sut type, supportes all types defined by SUTFactory constants
58
- # id:: id - unique identifier for identifying particular SUT from each other. Is propagated to proper initializers.
59
- # === returns
60
- # return:: SUT object
61
- # raise::
62
- # ArgumentError:: SUT ID '%s' not found from tdriver_parameters.xml
63
- def make( sut_attributes )
48
+ # gets sut from sut-factorys list - if not connected tries to reconnect first
49
+ def get_sut_from_list( id )
64
50
 
65
- sut_id = retrieve_sut_id_from_hash( sut_attributes )
51
+ unless @_sut_list[ id ][ :is_connected ]
66
52
 
67
- sut_id = get_mapped_sut( sut_id ) if mapped_sut?( sut_id )
53
+ @_sut_list[ id ][ :sut ].connect( id )
54
+ @_sut_list[ id ][ :is_connected ] = true
68
55
 
69
- # if sut is already connected, return existing sut
70
- return get_sut_from_list( sut_id ) if sut_exists?( sut_id )
56
+ end
71
57
 
72
- # retrieve sut from parameters
73
- sut = $parameters[ sut_id, nil ]
58
+ @_sut_list[ id ][ :sut ]
59
+
60
+ end
74
61
 
75
- # raise exception if sut was not found
76
- raise ArgumentError, "#{ sut_id.to_s } not defined in TDriver parameters XML" if sut.nil?
77
-
78
- # retrieve sut type from parameters
79
- sut_type = sut[ :type, nil ]
80
-
81
- # raise exception if sut type was not found
82
- raise RuntimeError, "SUT parameter 'type' not defined for #{ sut_id.to_s } in TDriver parameters/templates XML" if sut_type.nil?
62
+ def sut_exists?( sut_id )
83
63
 
84
- sut_type_symbol = sut_type.downcase.to_sym
64
+ @_sut_list.has_key?( sut_id )
85
65
 
86
- # retrieve plugin name that implements given sut
87
- sut_plugin = sut[ :sut_plugin, nil ]
66
+ end
88
67
 
89
- # retrieve enviroment value from sut, use '*' as default
90
- sut_env = sut[ :env, '*' ]
68
+ def retrieve_sut_id_from_hash( sut_attributes )
91
69
 
92
- # verify that sut plugin is defined in sut configuration
93
- raise RuntimeError, "SUT parameter 'sut_plugin' not defined for #{ sut_id.to_s } (#{ sut_type.to_s })" if sut_plugin.nil?
94
-
95
- # flag to determine that should exception be raised; allow one retry, then set flag to true if error still occures
96
- raise_exception = false
70
+ # usability improvement: threat sut_attribute as SUT id if it is type of Symbol or String
71
+ sut_attributes = { :id => sut_attributes.to_sym } if [ String, Symbol ].include?( sut_attributes.class )
97
72
 
98
- begin
73
+ # verify that sut_attributes is type of Hash
74
+ sut_attributes.check_type( [ Hash, Symbol, String ], "Wrong argument type $1 for 'sut_attributes' (expected $2)" )
99
75
 
100
- # verify that sut plugin is registered
101
- if TDriver::PluginService.plugin_registered?( sut_plugin, :sut )
102
-
103
- # create sut object
104
- created_sut = TDriver::PluginService.call_plugin_method( sut_plugin, :make_sut, sut_id )
76
+ # legacy support: support also :Id
77
+ sut_attributes[ :id ] = sut_attributes.delete( :Id ) if sut_attributes.has_key?( :Id )
105
78
 
106
- else
79
+ sut_attributes.require_key( :id, "Required SUT identification key $1 not defined in 'sut_attributes'" )
107
80
 
108
- # raise error if sut was not registered
109
- raise NotImplementedError, "No plugin implementation found for SUT type: #{ sut_type }"
81
+ sut_attributes[ :id ].to_sym
110
82
 
111
83
  end
112
84
 
113
- rescue Exception => exception
85
+ # Finds the sut definition matching the id, either directly or via a mapping
86
+ #
87
+ # === params
88
+ # sut_id:: Symbol defining the id of the sut to search for
89
+ # === returns
90
+ # Symbol:: Either id if it was found in the parameter file or the id of a sut mapped to this id, or nil if no direct or mapped match was found
91
+ # === raises
92
+ # ArgumentError:: The id argument was not a Symbol
93
+ def find_sut_or_mapping( sut_id )
114
94
 
115
- # if sut was not registered, try to load it
116
- TDriver::PluginService.load_plugin( sut_plugin ) if exception.kind_of?( NotImplementedError )
95
+ sut_id.check_type Symbol, 'Wrong argument type $1 for SUT id (expected $2)'
117
96
 
118
- if !raise_exception
97
+ begin
119
98
 
120
- raise_exception = true
99
+ # check if direct match exists
100
+ return sut_id if $parameters[ sut_id ]
121
101
 
122
- retry
123
-
124
- else
102
+ rescue MobyUtil::ParameterNotFoundError
125
103
 
126
- # still errors, raise original exception
127
- Kernel::raise exception
104
+ # check if a mapping is defined for the id
105
+ begin
128
106
 
129
- end
107
+ # return nil if no mapping exists
108
+ return nil if ( mapped_id = $parameters[ :mappings ][ sut_id ] ).nil?
130
109
 
131
- end
110
+ # check if the mapped to sut id exists
111
+ return mapped_id if $parameters[ ( mapped_id = mapped_id.to_sym ) ]
132
112
 
133
- # store SUT type to sut object
134
- created_sut.instance_variable_set( :@ui_type, sut_type )
113
+ rescue MobyUtil::ParameterNotFoundError
135
114
 
136
- # store SUT UI version to sut object
137
- created_sut.instance_variable_set( :@ui_version, $parameters[ sut_id ][ :version, nil ] )
115
+ # no mappings defined in tdriver_parameters.xml or the mapped to sut was not found
116
+ return nil
138
117
 
139
- # store SUT input type to sut object
140
- created_sut.instance_variable_set( :@input, $parameters[ sut_id ][ :input_type, nil ] )
118
+ end # check if mapping exists
141
119
 
142
- =begin
143
- # sut type version, default: nil
144
- created_sut.instance_eval{
120
+ end # check if direct match exists
145
121
 
146
- @ui_type = sut_type
147
- @ui_version = $parameters[ sut_id ][ :version, nil ]
148
- @input = $parameters[ sut_id ][ :input_type, nil ]
122
+ end # find_sut_or_mapping
149
123
 
150
- }
151
- =end
152
-
153
- # retrieve list of optional extension plugins
154
- @extension_plugins = $parameters[ sut_id ][ :extension_plugins, "" ].split( ";" )
124
+ end # self
155
125
 
156
- # load optional extension plugins
157
- if @extension_plugins.count > 0
126
+ # Create/reset hash to store sut ids for all current suts
127
+ def self.reset
158
128
 
159
- @extension_plugins.each{ | plugin_name |
129
+ @_sut_list = {}
160
130
 
161
- raise_exception = false
131
+ end
162
132
 
163
- begin
133
+ # TODO: document me
134
+ def self.disconnect_sut( sut_attributes )
164
135
 
165
- # verify that extension plugin is registered
166
- unless TDriver::PluginService.plugin_registered?( plugin_name, :extension )
136
+ sut_id = retrieve_sut_id_from_hash( sut_attributes )
167
137
 
168
- # raise error if sut was not registered
169
- raise NotImplementedError, "Extension plugin not found #{ plugin_name }"
138
+ raise RuntimeError, "Unable disconnect SUT due to #{ sut_id.to_s } is not connected" unless sut_exists?( sut_id ) && @_sut_list[ sut_id ][ :is_connected ]
139
+
140
+ @_sut_list[ sut_id ][ :sut ].disconnect
141
+
142
+ @_sut_list[ sut_id ][ :is_connected ] = false
170
143
 
171
- end
144
+ end
172
145
 
173
- rescue Exception => exception
146
+ def self.reboot_sut( sut_attributes )
174
147
 
175
- # if sut was not registered, try to load it
176
- TDriver::PluginService.load_plugin( plugin_name ) if exception.kind_of?( NotImplementedError )
148
+ sut_id = retrieve_sut_id_from_hash( sut_attributes )
177
149
 
178
- if !raise_exception
150
+ raise RuntimeError, "Unable to reboot SUT due to #{ sut_id.to_s } is not connected" unless sut_exists?( sut_id ) && @_sut_list[ sut_id ][ :is_connected ]
179
151
 
180
- raise_exception = true
152
+ @_sut_list[ sut_id ][ :sut ].reboot
181
153
 
182
- retry
154
+ disconnect_sut( sut_id )
183
155
 
184
- else
156
+ end
185
157
 
186
- # still errors, raise original exception
187
- Kernel::raise exception
158
+ # TODO: document me
159
+ def self.connected_suts
188
160
 
189
- end
161
+ @_sut_list
190
162
 
191
- end
163
+ end
192
164
 
193
- }
165
+ # Function to create the actual SUT objects based on the 'sut' attribute.
166
+ # === params
167
+ # sut_type:: sut_type - sut type, supportes all types defined by SUTFactory constants
168
+ # id:: id - unique identifier for identifying particular SUT from each other. Is propagated to proper initializers.
169
+ # === returns
170
+ # return:: SUT object
171
+ # raise::
172
+ # ArgumentError:: <name> not defined in TDriver parameters XML
173
+ def self.make( sut_attributes )
194
174
 
195
- end
175
+ sut_id = retrieve_sut_id_from_hash( sut_attributes )
196
176
 
197
- # apply sut generic behaviours
198
- TDriver::BehaviourFactory.apply_behaviour(
177
+ sut_id = get_mapped_sut( sut_id ) if mapped_sut?( sut_id )
199
178
 
200
- :object => created_sut,
201
- :object_type => [ 'sut' ],
202
- :sut_type => [ '*', created_sut.ui_type ],
203
- :input_type => [ '*', created_sut.input.to_s ],
204
- :env => [ '*', *sut_env.to_s.split(";") ],
205
- :version => [ '*', created_sut.ui_version.to_s ]
179
+ # if sut is already connected, return existing sut
180
+ return get_sut_from_list( sut_id ) if sut_exists?( sut_id )
206
181
 
207
- )
182
+ # retrieve sut from parameters
183
+ sut = $parameters[ sut_id, nil ]
208
184
 
209
- @_sut_list[ sut_id ] = { :sut => created_sut, :is_connected => true }
185
+ # raise exception if sut was not found
186
+ raise ArgumentError, "#{ sut_id.to_s } not defined in TDriver parameters XML" if sut.nil?
187
+
188
+ # retrieve sut type from parameters
189
+ sut_type = sut[ :type, nil ]
190
+
191
+ # raise exception if sut type was not found
192
+ raise RuntimeError, "SUT parameter type not defined for #{ sut_id.to_s } in TDriver parameters/templates XML" if sut_type.nil?
210
193
 
211
- created_sut
194
+ sut_type_symbol = sut_type.downcase.to_sym
212
195
 
213
- end
196
+ # retrieve plugin name that implements given sut
197
+ sut_plugin = sut[ :sut_plugin, nil ]
214
198
 
215
- def disconnect_sut( sut_attributes )
199
+ # retrieve enviroment value from sut, use '*' as default
200
+ sut_env = sut[ :env, '*' ]
216
201
 
217
- sut_id = retrieve_sut_id_from_hash( sut_attributes )
202
+ # verify that sut plugin is defined in sut configuration
203
+ raise RuntimeError, "SUT parameter 'sut_plugin' not defined for #{ sut_id.to_s } (#{ sut_type.to_s })" if sut_plugin.nil?
204
+
205
+ # flag to determine that should exception be raised; allow one retry, then set flag to true if error still occures
206
+ raise_exception = false
218
207
 
219
- Kernel::raise RuntimeError.new( "Unable disconnect SUT due to #{ sut_id.to_s } is not connected" ) unless sut_exists?( sut_id ) && @_sut_list[ sut_id ][ :is_connected ]
220
-
221
- @_sut_list[ sut_id ][ :sut ].disconnect
222
-
223
- @_sut_list[ sut_id ][ :is_connected ] = false
208
+ begin
224
209
 
225
- end
210
+ # verify that sut plugin is registered
211
+ if TDriver::PluginService.plugin_registered?( sut_plugin, :sut )
212
+
213
+ # create sut object
214
+ created_sut = TDriver::PluginService.call_plugin_method( sut_plugin, :make_sut, sut_id )
226
215
 
227
- def reboot_sut( sut_attributes )
216
+ else
228
217
 
229
- sut_id = retrieve_sut_id_from_hash( sut_attributes )
218
+ # raise error if sut was not registered
219
+ raise NotImplementedError, "No plugin implementation found for SUT type: #{ sut_type }"
230
220
 
231
- Kernel::raise RuntimeError.new(
232
-
233
- "Unable to reboot SUT due to %s is not connected" % [ sut_id ]
234
-
235
- ) unless sut_exists?( sut_id ) && @_sut_list[ sut_id ][ :is_connected ]
236
-
237
- @_sut_list[ sut_id ][ :sut ].reboot
221
+ end
238
222
 
239
- disconnect_sut( sut_id )
223
+ rescue Exception => exception
240
224
 
241
- end
225
+ # if sut was not registered, try to load it
226
+ TDriver::PluginService.load_plugin( sut_plugin ) if exception.kind_of?( NotImplementedError )
242
227
 
243
- def connected_suts
228
+ if !raise_exception
244
229
 
245
- @_sut_list
230
+ raise_exception = true
246
231
 
247
- end
232
+ retry
233
+
234
+ else
248
235
 
249
- private
236
+ # still errors, raise original exception
237
+ raise exception
250
238
 
251
- def retrieve_sut_id_from_hash( sut_attributes )
239
+ end
252
240
 
253
- # usability improvement: threat sut_attribute as SUT id if it is type of Symbol or String
254
- sut_attributes = { :id => sut_attributes.to_sym } if [ String, Symbol ].include?( sut_attributes.class )
241
+ end
255
242
 
256
- # verify that sut_attributes is type of Hash
257
- sut_attributes.check_type( [ Hash, Symbol, String ], "Wrong argument type $1 for 'sut_attributes' (expected $2)" )
243
+ # store SUT type to sut object
244
+ created_sut.instance_variable_set( :@ui_type, sut_type )
258
245
 
259
- # legacy support: support also :Id
260
- sut_attributes[ :id ] = sut_attributes.delete( :Id ) if sut_attributes.has_key?( :Id )
246
+ # store SUT UI version to sut object
247
+ created_sut.instance_variable_set( :@ui_version, $parameters[ sut_id ][ :version, nil ] )
261
248
 
262
- sut_attributes.require_key( :id, "Required SUT identification key $1 not defined in 'sut_attributes'" )
249
+ # store SUT input type to sut object
250
+ created_sut.instance_variable_set( :@input, $parameters[ sut_id ][ :input_type, nil ] )
263
251
 
264
- sut_attributes[ :id ].to_sym
252
+ # retrieve list of optional extension plugins
253
+ @extension_plugins = $parameters[ sut_id ][ :extension_plugins, "" ].split( ";" )
265
254
 
266
- end
255
+ # load optional extension plugins
256
+ if @extension_plugins.count > 0
267
257
 
268
- # gets sut from sut-factorys list - if not connected tries to reconnect first
269
- def get_sut_from_list( id )
258
+ @extension_plugins.each{ | plugin_name |
270
259
 
271
- if !@_sut_list[ id ][ :is_connected ]
260
+ raise_exception = false
272
261
 
273
- @_sut_list[ id ][ :sut ].connect( id )
274
- @_sut_list[ id ][ :is_connected ] = true
262
+ begin
275
263
 
276
- end
264
+ # verify that extension plugin is registered
265
+ unless TDriver::PluginService.plugin_registered?( plugin_name, :extension )
277
266
 
278
- @_sut_list[ id ][ :sut ]
279
- end
267
+ # raise error if sut was not registered
268
+ raise NotImplementedError, "Extension plugin not found #{ plugin_name }"
280
269
 
281
- def sut_exists?( sut_id )
270
+ end
282
271
 
283
- @_sut_list.has_key?( sut_id )
272
+ rescue Exception => exception
284
273
 
285
- end
274
+ # if sut was not registered, try to load it
275
+ TDriver::PluginService.load_plugin( plugin_name ) if exception.kind_of?( NotImplementedError )
286
276
 
287
- # Finds the sut definition matching the id, either directly or via a mapping
288
- #
289
- # === params
290
- # sut_id:: Symbol defining the id of the sut to search for
291
- # === returns
292
- # Symbol:: Either id if it was found in the parameter file or the id of a sut mapped to this id, or nil if no direct or mapped match was found
293
- # === raises
294
- # ArgumentError:: The id argument was not a Symbol
295
- def find_sut_or_mapping( sut_id )
277
+ if !raise_exception
296
278
 
297
- sut_id.check_type( Symbol, "Wrong argument type $1 for SUT id (expected $2)" )
298
-
299
- #Kernel::raise ArgumentError.new( "The id argument was not a Symbol." ) unless sut_id.kind_of?( Symbol )
279
+ raise_exception = true
300
280
 
301
- begin
281
+ retry
302
282
 
303
- # check if direct match exists
304
- return sut_id if $parameters[ sut_id ]
283
+ else
305
284
 
306
- rescue MobyUtil::ParameterNotFoundError
285
+ # still errors, raise original exception
286
+ raise exception
307
287
 
308
- # check if a mapping is defined for the id
309
- begin
288
+ end
310
289
 
311
- # return nil if no mapping exists
312
- return nil if ( mapped_id = $parameters[ :mappings ][ sut_id ] ).nil?
290
+ end
291
+
292
+ }
313
293
 
314
- # check if the mapped to sut id exists
315
- return mapped_id if $parameters[ ( mapped_id = mapped_id.to_sym ) ]
294
+ end
316
295
 
317
- rescue MobyUtil::ParameterNotFoundError
296
+ # apply sut generic behaviours
297
+ TDriver::BehaviourFactory.apply_behaviour(
318
298
 
319
- # no mappings defined in tdriver_parameters.xml or the mapped to sut was not found
320
- return nil
299
+ :object => created_sut,
300
+ :object_type => [ 'sut' ],
301
+ :sut_type => [ '*', created_sut.ui_type ],
302
+ :input_type => [ '*', created_sut.input.to_s ],
303
+ :env => [ '*', *sut_env.to_s.split(";") ],
304
+ :version => [ '*', created_sut.ui_version.to_s ]
321
305
 
322
- end # check if mapping exists
306
+ )
323
307
 
324
- end # check if direct match exists
308
+ @_sut_list[ sut_id ] = { :sut => created_sut, :is_connected => true }
325
309
 
326
- end
310
+ created_sut
327
311
 
328
- # enable hooking for performance measurement & debug logging
329
- TDriver::Hooking.hook_methods( self ) if defined?( TDriver::Hooking )
312
+ end
313
+
314
+ # enable hooking for performance measurement & debug logging
315
+ TDriver::Hooking.hook_methods( self ) if defined?( TDriver::Hooking )
330
316
 
317
+ # initialize plugin service
318
+ initialize_class
319
+
331
320
  end # SUTFactory
332
321
 
322
+ end # TDriver
323
+
324
+ # for backwards compatibility
325
+ module MobyBase
326
+
327
+ class SUTFactory
328
+
329
+ def self.instance
330
+
331
+ warn_caller '$1:$2 deprecated class MobyBase::SUTFactory, please use static class TDriver::SUTFactory instead'
332
+
333
+ TDriver::SUTFactory
334
+
335
+ end
336
+
337
+ end # SUTFactory
338
+
333
339
  end # MobyBase