testability-driver-qt-sut-plugin 0.9.2 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/application.rb +11 -8
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/configure_behaviour.rb +3 -3
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/events.rb +76 -74
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/find.rb +2 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/fixture.rb +10 -4
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/gesture.rb +49 -42
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/infologger.rb +0 -9
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/locale_db.rb +5 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/record.rb +11 -1
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/sut.rb +441 -324
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/synchronization.rb +32 -11
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/treewidgetitemcolumn.rb +54 -34
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/view_item.rb +26 -26
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/webkit.rb +61 -21
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/widget.rb +528 -344
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/application.rb +16 -138
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/find_object.rb +3 -67
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/fixture.rb +4 -18
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/plugin.rb +1 -1
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/sut/adapter.rb +166 -149
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/sut/communication.rb +80 -75
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/util/find_object_generator.rb +93 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/util/message_composer.rb +161 -0
- data/xml/behaviour/qt.xml +26 -26
- data/xml/template/qt.xml +9 -7
- metadata +7 -6
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/commands/fixture.rb +0 -45
data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/application.rb
CHANGED
@@ -23,6 +23,8 @@ module MobyController
|
|
23
23
|
|
24
24
|
module Application
|
25
25
|
|
26
|
+
include MobyUtil::MessageComposer
|
27
|
+
|
26
28
|
def set_adapter( adapter )
|
27
29
|
|
28
30
|
@sut_adapter = adapter
|
@@ -56,11 +58,11 @@ module MobyController
|
|
56
58
|
# close qttas
|
57
59
|
elsif @_command == :CloseQttas
|
58
60
|
#params = {'uid' => '0'}
|
59
|
-
command_xml =
|
61
|
+
command_xml = make_xml_message({:service => 'closeApplication'},'Close',{'uid' => '0'})
|
60
62
|
|
61
63
|
# kill application
|
62
64
|
elsif @_command == :Kill
|
63
|
-
command_xml =
|
65
|
+
command_xml = make_xml_message({:service => 'closeApplication'},'Kill',{'uid' => @_application_uid})
|
64
66
|
|
65
67
|
# list application -- raises exception??
|
66
68
|
elsif @_command == :List
|
@@ -69,32 +71,32 @@ module MobyController
|
|
69
71
|
# list applications
|
70
72
|
elsif @_command == :ListApps
|
71
73
|
service_details = {:service => 'listApps', :name => @_application_name, :id => @_application_uid}
|
72
|
-
command_xml =
|
74
|
+
command_xml = make_xml_message(service_details, 'listApps', nil )
|
73
75
|
|
74
76
|
# list crashed applications
|
75
77
|
elsif @_command == :ListCrashedApps
|
76
78
|
service_details = {:service => 'listCrashedApps', :name => @_application_name, :id => @_application_uid}
|
77
|
-
command_xml =
|
79
|
+
command_xml = make_xml_message(service_details, 'listCrashedApps', nil )
|
78
80
|
|
79
81
|
# shell command
|
80
82
|
elsif @_command == :Shell
|
81
|
-
command_xml =
|
83
|
+
command_xml = make_xml_message({:service => 'shellCommand'}, 'shellCommand', @_flags, @_application_name)
|
82
84
|
|
83
85
|
# kill all application started by agent_qt
|
84
86
|
elsif @_command == :KillAll
|
85
|
-
command_xml =
|
87
|
+
command_xml = make_xml_message({:service =>'kill'},'Kill', nil)
|
86
88
|
|
87
89
|
# tap screen
|
88
90
|
elsif @_command == :TapScreen
|
89
|
-
command_xml =
|
91
|
+
command_xml = make_xml_message({:service =>'tapScreen'}, 'TapScreen', params)
|
90
92
|
|
91
93
|
# bring application to foreground
|
92
94
|
elsif @_command == :BringToForeground
|
93
|
-
command_xml =
|
95
|
+
command_xml = make_xml_message({:service => 'bringToForeground'},'BringToForeground', {'pid' => @_application_uid})
|
94
96
|
|
95
97
|
# system info
|
96
98
|
elsif @_command == :SystemInfo
|
97
|
-
command_xml =
|
99
|
+
command_xml = make_xml_message({:service => 'systemInfo'}, 'systemInfo', nil)
|
98
100
|
|
99
101
|
# start process memory logging
|
100
102
|
elsif @_command == :ProcessMemLoggingStart
|
@@ -105,7 +107,7 @@ module MobyController
|
|
105
107
|
'timestamp' => @_flags[ :timestamp ],
|
106
108
|
'interval_s' => @_flags[ :interval_s] }
|
107
109
|
|
108
|
-
command_xml =
|
110
|
+
command_xml = make_xml_message({:service => 'resourceLogging'}, 'ProcessMemLoggingStart', parameters)
|
109
111
|
|
110
112
|
|
111
113
|
# stop process memory logging
|
@@ -113,16 +115,16 @@ module MobyController
|
|
113
115
|
parameters = {'thread_name' => @_application_name,
|
114
116
|
'return_data' => @_flags[ :return_data ]}
|
115
117
|
|
116
|
-
command_xml =
|
118
|
+
command_xml = make_xml_message({ :service =>'resourceLogging'}, 'ProcessMemLoggingStop',paremeters)
|
117
119
|
|
118
120
|
# start CPU load generating
|
119
121
|
elsif @_command == :CpuLoadStart
|
120
122
|
parameters = {'cpu_load' => @_flags[ :cpu_load ]}
|
121
|
-
command_xml =
|
123
|
+
command_xml = make_xml_message({:service => 'resourceLogging'},'CpuLoadStart',paremeters)
|
122
124
|
|
123
125
|
# stop CPU load generating
|
124
126
|
elsif @_command == :CpuLoadStop
|
125
|
-
command_xml =
|
127
|
+
command_xml = make_xml_message({:service => 'resourceLogging'},'CpuLoadStop', nil)
|
126
128
|
|
127
129
|
# unknown command
|
128
130
|
else
|
@@ -133,131 +135,7 @@ module MobyController
|
|
133
135
|
@sut_adapter.send_service_request( message, return_response_crc ) if message
|
134
136
|
end
|
135
137
|
|
136
|
-
|
137
|
-
|
138
|
-
def make_parametrized_message( service_details, command_name, params, command_params = {} )
|
139
|
-
|
140
|
-
Nokogiri::XML::Builder.new{
|
141
|
-
TasCommands( service_details ) {
|
142
|
-
Target( :TasId => "Application" ) {
|
143
|
-
Command( ( params || {} ).merge( :name => command_name ) ){
|
144
|
-
command_params.collect{ | name, value |
|
145
|
-
param( :name => name, :value => value )
|
146
|
-
}
|
147
|
-
}
|
148
|
-
}
|
149
|
-
}
|
150
|
-
}.to_xml
|
151
|
-
|
152
|
-
end
|
153
|
-
|
154
|
-
def make_message( service_details, command_name, params, command_value = nil )
|
155
|
-
|
156
|
-
Nokogiri::XML::Builder.new{
|
157
|
-
TasCommands( service_details ) {
|
158
|
-
Target( :TasId => "Application" ) {
|
159
|
-
Command( command_value || "", ( params || {} ).merge( :name => command_name ) )
|
160
|
-
}
|
161
|
-
}
|
162
|
-
}.to_xml
|
163
|
-
|
164
|
-
end
|
165
|
-
|
166
|
-
|
167
|
-
def encode_string( source )
|
168
|
-
source = source.to_s
|
169
|
-
source.gsub!( '&', '&' );
|
170
|
-
source.gsub!( '>', '>' );
|
171
|
-
source.gsub!( '<', '<' );
|
172
|
-
source.gsub!( '"', '"' );
|
173
|
-
source.gsub!( '\'', ''' );
|
174
|
-
source
|
175
|
-
end
|
176
|
-
|
177
|
-
def make_filters
|
178
|
-
|
179
|
-
params = {}
|
180
|
-
|
181
|
-
# get sut paramteres only once, store to local variable
|
182
|
-
sut_parameters = MobyUtil::Parameter[ @_sut.id ]
|
183
|
-
|
184
|
-
params[ 'filterProperties' ] = $last_parameter if sut_parameters[ :filter_properties, nil ]
|
185
|
-
params[ 'pluginBlackList' ] = $last_parameter if sut_parameters[ :plugin_blacklist, nil ]
|
186
|
-
params[ 'pluginWhiteList' ] = $last_parameter if sut_parameters[ :plugin_whitelist, nil ]
|
187
|
-
|
188
|
-
case sut_parameters[ :filter_type, 'none' ]
|
189
|
-
|
190
|
-
when 'dynamic'
|
191
|
-
|
192
|
-
# updates the filter with the current backtrace file list
|
193
|
-
MobyUtil::DynamicAttributeFilter.instance.update_filter( caller( 0 ) )
|
194
|
-
|
195
|
-
white_list = MobyUtil::DynamicAttributeFilter.instance.filter_string
|
196
|
-
params['attributeWhiteList'] = white_list if white_list
|
197
|
-
|
198
|
-
when 'static'
|
199
|
-
|
200
|
-
params['attributeBlackList'] = $last_parameter if sut_parameters[ :attribute_blacklist, nil ]
|
201
|
-
params['attributeWhiteList'] = $last_parameter if sut_parameters[ :attribute_whitelist, nil ]
|
202
|
-
|
203
|
-
end
|
204
|
-
|
205
|
-
params
|
206
|
-
|
207
|
-
end
|
208
|
-
|
209
|
-
def state_message
|
210
|
-
app_details = { :service => 'uiState', :name => @_application_name, :id => @_application_uid }
|
211
|
-
app_details[ :applicationUid ] = @_refresh_args[ :applicationUid ] if @_refresh_args.include?( :applicationUid )
|
212
|
-
|
213
|
-
case MobyUtil::Parameter[ @_sut.id ][ :filter_type, 'none' ]
|
214
|
-
when 'none'
|
215
|
-
command_xml = make_message( app_details, 'UiState', @_flags || {} )
|
216
|
-
when 'dynamic'
|
217
|
-
params = @_flags || {}
|
218
|
-
params[ :filtered ] = 'true'
|
219
|
-
command_xml = make_parametrized_message( app_details, 'UiState', params, make_filters )
|
220
|
-
else
|
221
|
-
command_xml = make_parametrized_message( app_details, 'UiState', @_flags || {}, make_filters )
|
222
|
-
end
|
223
|
-
command_xml
|
224
|
-
end
|
225
|
-
|
226
|
-
def run_message
|
227
|
-
#clone to not make changes permanent
|
228
|
-
arguments = MobyUtil::Parameter[ @_sut.id ][ :application_start_arguments, "" ].clone
|
229
|
-
if @_arguments
|
230
|
-
arguments << "," unless arguments.empty?
|
231
|
-
arguments << @_arguments
|
232
|
-
end
|
233
|
-
|
234
|
-
parameters = {
|
235
|
-
'application_path' => @_application_name,
|
236
|
-
'arguments' => arguments,
|
237
|
-
'environment' => @_environment,
|
238
|
-
'events_to_listen' => @_events_to_listen,
|
239
|
-
'signals_to_listen' => @_signals_to_listen,
|
240
|
-
'start_command' => @_start_command
|
241
|
-
}
|
242
|
-
|
243
|
-
make_message({:service => 'startApplication'}, 'Run', parameters)
|
244
|
-
end
|
245
|
-
|
246
|
-
def close_message
|
247
|
-
sut_id = @_sut.id
|
248
|
-
|
249
|
-
parameters = {
|
250
|
-
'uid' => @_application_uid,
|
251
|
-
'kill' => ( @_flags || {} )[ :force_kill ] || MobyUtil::Parameter[ sut_id ][ :application_close_kill ],
|
252
|
-
'wait_time' => MobyUtil::Parameter[ sut_id ][ :application_close_wait ]
|
253
|
-
}
|
254
|
-
|
255
|
-
make_message({:service => 'closeApplication', :id => @_application_uid }, 'Close', parameters)
|
256
|
-
end
|
257
|
-
|
258
|
-
# enable hooking for performance measurement & debug logging
|
259
|
-
MobyUtil::Hooking.instance.hook_methods( self ) if defined?( MobyUtil::Hooking )
|
260
|
-
end #application
|
138
|
+
end # application
|
261
139
|
|
262
140
|
end # QT
|
263
141
|
|
data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/find_object.rb
CHANGED
@@ -22,6 +22,7 @@ module MobyController
|
|
22
22
|
module QT
|
23
23
|
|
24
24
|
module FindObjectCommand
|
25
|
+
include MobyUtil::FindObjectGenerator
|
25
26
|
|
26
27
|
# Execute the command
|
27
28
|
# Sends the message to the device using the @sut_adapter (see base class)
|
@@ -30,79 +31,14 @@ module MobyController
|
|
30
31
|
# == raises
|
31
32
|
# NotImplementedError: raised if unsupported command type
|
32
33
|
def execute
|
33
|
-
|
34
|
-
|
35
|
-
params = search_parameters
|
36
|
-
|
37
|
-
builder = Nokogiri::XML::Builder.new do |xml|
|
38
|
-
xml.TasCommands( ( application_details || {} ).merge( :service => "findObject") ) {
|
39
|
-
xml.Target{
|
40
|
-
add_objects(xml, params)
|
41
|
-
xml.Command( :name => 'findObject' ){
|
42
|
-
filters.collect{ | name, value |
|
43
|
-
xml.param( :name => name, :value => value )
|
44
|
-
}
|
45
|
-
} if MobyUtil::Parameter[ @_sut.id ][ :filter_type, 'none' ] == 'dynamic'
|
46
|
-
} if params and params.size > 0
|
47
|
-
}
|
48
|
-
end
|
49
|
-
msg = builder.to_xml
|
50
|
-
#puts msg.to_s
|
51
|
-
|
52
|
-
@sut_adapter.send_service_request(Comms::MessageGenerator.generate(msg), true)
|
53
|
-
|
34
|
+
msg = generate_message
|
35
|
+
@sut_adapter.send_service_request(MobyController::QT::Comms::MessageGenerator.generate(msg), true)
|
54
36
|
end
|
55
37
|
|
56
38
|
def set_adapter( adapter )
|
57
39
|
@sut_adapter = adapter
|
58
40
|
end
|
59
41
|
|
60
|
-
private
|
61
|
-
|
62
|
-
def add_objects(builder, params)
|
63
|
-
parent = builder.parent
|
64
|
-
params.each{|objectParams| parent = create_object_node(builder, objectParams, parent)}
|
65
|
-
end
|
66
|
-
|
67
|
-
def create_object_node(builder, params, parent)
|
68
|
-
node = Nokogiri::XML::Node.new('object', builder.doc)
|
69
|
-
params.keys.each{|key| node[key.to_s] = params[key].to_s}
|
70
|
-
parent.add_child(node)
|
71
|
-
end
|
72
|
-
|
73
|
-
|
74
|
-
def make_params
|
75
|
-
params = {}
|
76
|
-
|
77
|
-
# get sut paramteres only once, store to local variable
|
78
|
-
sut_parameters = MobyUtil::Parameter[ @_sut.id ]
|
79
|
-
|
80
|
-
params[ 'filterProperties' ] = $last_parameter if sut_parameters[ :filter_properties, nil ]
|
81
|
-
params[ 'pluginBlackList' ] = $last_parameter if sut_parameters[ :plugin_blacklist, nil ]
|
82
|
-
params[ 'pluginWhiteList' ] = $last_parameter if sut_parameters[ :plugin_whitelist, nil ]
|
83
|
-
|
84
|
-
case sut_parameters[ :filter_type, 'none' ]
|
85
|
-
|
86
|
-
when 'dynamic'
|
87
|
-
|
88
|
-
# updates the filter with the current backtrace file list
|
89
|
-
MobyUtil::DynamicAttributeFilter.instance.update_filter( caller( 0 ) )
|
90
|
-
|
91
|
-
white_list = MobyUtil::DynamicAttributeFilter.instance.filter_string
|
92
|
-
params['attributeWhiteList'] = white_list if white_list
|
93
|
-
|
94
|
-
when 'static'
|
95
|
-
|
96
|
-
params['attributeBlackList'] = $last_parameter if sut_parameters[ :attribute_blacklist, nil ]
|
97
|
-
params['attributeWhiteList'] = $last_parameter if sut_parameters[ :attribute_whitelist, nil ]
|
98
|
-
|
99
|
-
end
|
100
|
-
|
101
|
-
params
|
102
|
-
|
103
|
-
end
|
104
|
-
|
105
|
-
|
106
42
|
# enable hooking for performance measurement & debug logging
|
107
43
|
MobyUtil::Hooking.instance.hook_methods( self ) if defined?( MobyUtil::Hooking )
|
108
44
|
|
@@ -22,6 +22,7 @@ module MobyController
|
|
22
22
|
module QT
|
23
23
|
|
24
24
|
module Fixture
|
25
|
+
include MobyUtil::MessageComposer
|
25
26
|
|
26
27
|
# Execute the command
|
27
28
|
# Sends the message to the device using the @sut_adapter (see base class)
|
@@ -30,25 +31,10 @@ module MobyController
|
|
30
31
|
# == raises
|
31
32
|
# NotImplementedError: raised if unsupported command type
|
32
33
|
def execute
|
33
|
-
|
34
|
-
Kernel::raise ArgumentError.new( "Fixture '%s' not found for sut id '%s'" % [ @name, @sut_adapter.sut_id ] ) if ( fixture_plugin = MobyUtil::Parameter[ @sut_adapter.sut_id.to_sym ][ :fixtures ][ @name.to_sym, nil ] ).nil?
|
34
|
+
Kernel::raise ArgumentError.new( "Fixture '%s' not found for sut id '%s'" % [ @name, @sut_adapter.sut_id ] ) if ( plugin_params = MobyUtil::Parameter[ @sut_adapter.sut_id.to_sym ][ :fixtures ][ @params[:name].to_sym, nil ] ).nil?
|
35
35
|
|
36
|
-
|
37
|
-
@sut_adapter.send_service_request(
|
38
|
-
Comms::MessageGenerator.generate(
|
39
|
-
Nokogiri::XML::Builder.new{
|
40
|
-
TasCommands( :id => @context.application_id, :transitions => @context.transitions, :service => "fixture", :async => @context.asynchronous ) {
|
41
|
-
Target( :TasId => @context.object_id, :type => @context.object_type ) {
|
42
|
-
Command( :name => "Fixture", :plugin => fixture_plugin, :method => @context.command ) {
|
43
|
-
@context.params.collect{ | name, value |
|
44
|
-
param( :name => name, :value => value )
|
45
|
-
}
|
46
|
-
}
|
47
|
-
}
|
48
|
-
}
|
49
|
-
}.to_xml
|
50
|
-
)
|
51
|
-
)
|
36
|
+
fixture_plugin = plugin_params[:plugin]
|
37
|
+
@sut_adapter.send_service_request(Comms::MessageGenerator.generate(make_fixture_message(fixture_plugin, @params)))
|
52
38
|
|
53
39
|
end
|
54
40
|
|
@@ -18,7 +18,7 @@
|
|
18
18
|
############################################################################
|
19
19
|
|
20
20
|
# verify that TDriver is loaded
|
21
|
-
Kernel::raise RuntimeError.new( "SUT plugin requires
|
21
|
+
Kernel::raise RuntimeError.new( "This SUT plugin requires Testability Driver and cannot be launched in standalone mode" ) unless (defined?( MATTI ) || defined?( TDriver ))
|
22
22
|
|
23
23
|
module MobyPlugin
|
24
24
|
|
@@ -20,205 +20,222 @@
|
|
20
20
|
module MobyController
|
21
21
|
|
22
22
|
module QT
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
23
|
+
|
24
|
+
# Sut adapter that used TCP/IP connections to send and receive data from QT side.
|
25
|
+
class SutAdapter < MobyController::SutAdapter
|
26
|
+
|
27
|
+
attr_reader :sut_id
|
28
|
+
|
29
|
+
attr_accessor(
|
30
|
+
|
31
|
+
:socket_read_timeout,
|
32
|
+
:socket_write_timeout,
|
33
|
+
:socket_received_bytes,
|
34
|
+
:socket_sent_bytes
|
35
|
+
|
36
|
+
)
|
37
|
+
|
38
|
+
# TODO: better way to set the host and port parameters
|
39
|
+
# Initialize the tcp adapter for communicating with the device.
|
40
|
+
# Communication is done using two tcp channels one form commanding
|
41
|
+
# the device and one for receiving ui state data.
|
42
|
+
# UI state data receivin is done in a seprate thread so it is good
|
43
|
+
# once usage is complete the shutdown_comms is called
|
44
|
+
# == params
|
45
|
+
# sut_id id for the sut so that client details can be fetched from params
|
46
|
+
def initialize( sut_id, receive_timeout = 25, send_timeout = 25 )
|
47
|
+
|
48
|
+
@socket = nil
|
49
|
+
@connected = false
|
50
50
|
@socket_received_bytes=0
|
51
51
|
@socket_sent_bytes=0
|
52
52
|
|
53
|
-
|
53
|
+
@sut_id = sut_id
|
54
54
|
|
55
|
-
|
56
|
-
|
57
|
-
|
55
|
+
# set timeouts
|
56
|
+
@socket_read_timeout = receive_timeout
|
57
|
+
@socket_write_timeout = send_timeout
|
58
58
|
|
59
|
-
|
59
|
+
@counter = rand( 1000 )
|
60
60
|
|
61
|
-
|
62
|
-
|
61
|
+
# connect socket
|
62
|
+
#connect( @sut_id )
|
63
63
|
|
64
|
-
|
64
|
+
end
|
65
65
|
|
66
|
-
|
66
|
+
def disconnect
|
67
67
|
|
68
|
-
|
68
|
+
@socket.close if @connected
|
69
69
|
|
70
|
-
|
70
|
+
@connected = false
|
71
71
|
|
72
|
-
|
72
|
+
end
|
73
73
|
|
74
|
-
|
74
|
+
def connect( id = nil )
|
75
75
|
|
76
|
-
|
76
|
+
id ||= @sut_id
|
77
77
|
|
78
|
-
|
78
|
+
begin
|
79
79
|
|
80
|
-
|
80
|
+
@socket = TCPSocket.open( MobyUtil::Parameter[ id ][ :qttas_server_ip ], MobyUtil::Parameter[ id ][ :qttas_server_port ].to_i )
|
81
81
|
|
82
|
-
|
82
|
+
rescue => ex
|
83
83
|
|
84
|
-
|
85
|
-
|
84
|
+
ip = "no ip" if ( ip = MobyUtil::Parameter[ id ][ :qttas_server_ip, "" ] ).empty?
|
85
|
+
port = "no port" if ( port = MobyUtil::Parameter[ id ][ :qttas_server_port, "" ] ).empty?
|
86
86
|
|
87
|
-
|
88
|
-
|
87
|
+
Kernel::raise IOError.new("Unable to connect QTTAS server, verify that it is running properly (#{ ip }:#{ port }): .\nException: #{ ex.message }")
|
88
|
+
end
|
89
89
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
90
|
+
@connected = true
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
def group?
|
95
|
+
@_group
|
96
|
+
end
|
97
|
+
|
98
|
+
# Set the document builder for the grouped behaviour message.
|
99
|
+
def set_message_builder(builder)
|
100
|
+
@_group = true
|
101
|
+
@_builder = builder
|
102
|
+
end
|
103
|
+
|
104
|
+
def append_command(node_list)
|
105
|
+
node_list.each {|ch| @_builder.doc.root.add_child(ch)}
|
106
|
+
end
|
107
|
+
|
108
|
+
# Sends a grouped command message to the server. Sets group to false and nils the builder
|
109
|
+
# to prevent future behviours of being grouped (unless so wanted)
|
110
|
+
# == returns
|
111
|
+
# the amout of commands grouped (and send)
|
112
|
+
def send_grouped_request
|
113
|
+
@_group = false
|
114
|
+
size = @_builder.doc.root.children.size
|
115
|
+
send_service_request(Comms::MessageGenerator.generate(@_builder.to_xml))
|
116
|
+
@_builder = nil
|
117
|
+
size
|
118
|
+
end
|
119
|
+
|
120
|
+
# Send the message to the qt server
|
121
|
+
# If there is no exception propagated the send to the device was successful
|
122
|
+
# == params
|
123
|
+
# message:: message in qttas protocol format
|
124
|
+
# == returns
|
125
|
+
# the response body
|
126
|
+
def send_service_request( message, return_crc = false )
|
127
|
+
|
128
|
+
connect if !@connected
|
129
|
+
|
130
|
+
# set request message id
|
131
|
+
message.message_id = ( @counter += 1 )
|
132
|
+
|
133
|
+
# write request message to socket
|
134
|
+
write_socket( message.make_binary_message(@counter) )
|
135
|
+
|
136
|
+
# read response to determine was the message handled properly and parse the header
|
137
|
+
# header[ 0 ] = command_flag
|
138
138
|
# header[ 1 ] = body_size
|
139
139
|
# header[ 2 ] = crc
|
140
140
|
# header[ 3 ] = compression_flag
|
141
141
|
# header[ 4 ] = message_id
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
142
|
+
|
143
|
+
header = nil
|
144
|
+
body = nil
|
145
|
+
|
146
|
+
read_message_id = 0
|
147
|
+
|
148
|
+
until read_message_id == @counter
|
149
|
+
|
150
|
+
header = read_socket( 12 ).unpack( 'CISCI' )
|
151
|
+
|
152
|
+
# read the message body and compare crc checksum
|
153
|
+
Kernel::raise IOError.new( "CRC do not match. Maybe the message is corrupted!" ) if CRC::Crc16.crc16_ibm( body = read_socket( header[ 1 ] ) , 0xffff ) != header[ 2 ]
|
154
|
+
|
155
|
+
# validate response message; check that response message id matches the request
|
156
|
+
# if smaller than expected try to read the next message but if bigger raise error
|
157
|
+
read_message_id = header[ 4 ]
|
158
|
+
|
159
|
+
if read_message_id < @counter
|
160
|
+
|
161
|
+
MobyUtil::Logger.instance.log "warning" , "Response to request did not match: \"#{ header[ 4 ].to_s }\"<\"#{ @counter.to_s }\""
|
162
|
+
|
163
|
+
elsif read_message_id > @counter
|
164
|
+
|
165
|
+
MobyUtil::Logger.instance.log "fatal" , "Response to request did not match: \"#{ header[ 4 ].to_s }\">\"#{ @counter.to_s }\""
|
166
|
+
|
167
|
+
# save to file?
|
168
|
+
MobyUtil::Logger.instance.log "fatal" , body
|
169
|
+
Kernel::raise RuntimeError.new( "Response to request did not match: \"#{ header[ 4 ].to_s }\"!=\"#{ @counter.to_s }\"" )
|
170
|
+
|
171
|
+
end
|
172
|
+
|
173
|
+
end
|
174
|
+
|
165
175
|
# inflate the message body if compressed
|
166
176
|
if ( header[ 3 ] == 2 )
|
167
|
-
|
177
|
+
|
168
178
|
body = Zlib::Inflate.inflate( body ) unless ( body = body[ 4..-1 ] ).empty?
|
169
179
|
|
170
180
|
end
|
171
181
|
|
172
182
|
# raise exception if messages error flag is set
|
173
|
-
|
174
|
-
|
183
|
+
# Flag statuses:
|
184
|
+
# 0 -> ERROR_MSG
|
175
185
|
# 1 -> VALID_MSG
|
176
186
|
# 2 -> OK_MESSAGE
|
177
|
-
|
187
|
+
if header[ 0 ] == 0
|
188
|
+
if body =~ /The application with Id \d+ is no longer available/
|
189
|
+
Kernel::raise MobyBase::ApplicationNotAvailableError.new( body )
|
190
|
+
else
|
191
|
+
Kernel::raise RuntimeError.new( body )
|
192
|
+
end
|
193
|
+
end
|
178
194
|
|
179
|
-
|
180
|
-
|
195
|
+
# return the body ( and crc if required )
|
196
|
+
return_crc ? [ body, header[ 2 ] ] : body
|
181
197
|
|
182
|
-
|
198
|
+
end
|
183
199
|
|
184
|
-
|
200
|
+
private
|
185
201
|
|
186
|
-
|
202
|
+
def read_socket( bytes_count )
|
187
203
|
|
188
|
-
|
189
|
-
|
204
|
+
# store time before start receving data
|
205
|
+
start_time = Time.now
|
190
206
|
|
191
|
-
|
192
|
-
|
207
|
+
# verify that there is data available to be read
|
208
|
+
Kernel::raise IOError.new( "Socket reading timeout (%i) exceeded for %i bytes" % [ @socket_read_timeout, bytes_count ] ) if TCPSocket::select( [ @socket ], nil, nil, @socket_read_timeout ).nil?
|
193
209
|
|
194
|
-
|
195
|
-
|
210
|
+
# read data from socket
|
211
|
+
read_buffer = @socket.read( bytes_count ){
|
196
212
|
|
197
|
-
|
213
|
+
Kernel::raise IOError.new( "Socket reading timeout (%i) exceeded for %i bytes" % [ @socket_read_timeout, bytes_count ] ) if ( Time.now - start_time ) > @socket_read_timeout
|
198
214
|
|
199
|
-
|
215
|
+
}
|
200
216
|
|
201
|
-
|
202
|
-
@socket_received_bytes+=read_buffer.size
|
203
|
-
read_buffer
|
217
|
+
Kernel::raise IOError.new( "Socket reading error for %i bytes - No data retrieved" % [ bytes_count ] ) if read_buffer.nil?
|
204
218
|
|
205
|
-
|
219
|
+
@socket_received_bytes += read_buffer.size
|
220
|
+
read_buffer
|
206
221
|
|
207
|
-
|
208
|
-
@socket_sent_bytes+=data.size
|
222
|
+
end
|
209
223
|
|
210
|
-
|
224
|
+
def write_socket( data )
|
225
|
+
|
226
|
+
@socket_sent_bytes += data.size
|
211
227
|
|
212
|
-
|
213
|
-
Kernel::raise IOError.new( "Socket writing timeout (%i) exceeded for %i bytes" % [ @socket_write_timeout, data.length ] ) if TCPSocket::select( nil, [ @socket ], nil, @socket_write_timeout ).nil?
|
228
|
+
@socket.write( data )
|
214
229
|
|
215
|
-
|
230
|
+
# verify that there is no data in writing buffer
|
231
|
+
Kernel::raise IOError.new( "Socket writing timeout (%i) exceeded for %i bytes" % [ @socket_write_timeout, data.length ] ) if TCPSocket::select( nil, [ @socket ], nil, @socket_write_timeout ).nil?
|
216
232
|
|
217
|
-
|
218
|
-
MobyUtil::Hooking.instance.hook_methods( self ) if defined?( MobyUtil::Hooking )
|
233
|
+
end
|
219
234
|
|
235
|
+
# enable hooking for performance measurement & debug logging
|
236
|
+
MobyUtil::Hooking.instance.hook_methods( self ) if defined?( MobyUtil::Hooking )
|
220
237
|
|
221
|
-
|
238
|
+
end # SutAdapter
|
222
239
|
|
223
240
|
end # QT
|
224
241
|
|