testability-driver-qt-sut-plugin 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.
- data/env.rb +26 -0
- data/installer/extconf.rb +62 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin.rb +23 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/action.rb +156 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/application.rb +318 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/attribute.rb +227 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/behaviour.rb +140 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/configure_behaviour.rb +317 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/events.rb +165 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/file_transfer.rb +333 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/find.rb +80 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/fixture.rb +178 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/gesture.rb +906 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/infologger.rb +604 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/key_press.rb +152 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/locale_db.rb +151 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/method.rb +85 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/multitouch.rb +455 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/os.rb +100 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/qt_api_method.rb +148 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/record.rb +124 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/screen_capture.rb +283 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/sut.rb +492 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/synchronization.rb +113 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/treewidgetitemcolumn.rb +93 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/type_text.rb +97 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/view_item.rb +97 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/webkit.rb +230 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/widget.rb +663 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/commands/action.rb +30 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/commands/configure_command.rb +38 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/commands/drag.rb +44 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/commands/find_object.rb +50 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/commands/fixture.rb +45 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/commands/group.rb +48 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/commands/infologger_command.rb +38 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/commands/qt.rb +170 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/commands/tap.rb +54 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/commands/widget.rb +226 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/application.rb +264 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/configure_command.rb +60 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/find_object.rb +114 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/fixture.rb +67 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/group.rb +52 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/infologger_command.rb +62 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/key_sequence.rb +99 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/screen_capture.rb +54 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/tap.rb +51 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/widget.rb +72 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/plugin.rb +119 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/sut/adapter.rb +225 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/sut/communication.rb +154 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/sut/controller.rb +58 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/util/fixture_parameter.rb +77 -0
- data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/util/widget.rb +82 -0
- data/lib/testability-driver-qt-sut-plugin.rb +24 -0
- data/xml/behaviour/qt.xml +717 -0
- data/xml/defaults/sut_qt.xml +9 -0
- data/xml/keymap/qt.xml +321 -0
- data/xml/template/qt.xml +124 -0
- metadata +141 -0
data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/screen_capture.rb
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
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 TDriver.
|
|
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 MobyController
|
|
21
|
+
|
|
22
|
+
module QT
|
|
23
|
+
|
|
24
|
+
module ScreenCapture
|
|
25
|
+
|
|
26
|
+
def set_adapter( adapter )
|
|
27
|
+
@sut_adapter = adapter
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def execute
|
|
31
|
+
|
|
32
|
+
@sut_adapter.send_service_request(
|
|
33
|
+
Comms::MessageGenerator.generate(
|
|
34
|
+
Nokogiri::XML::Builder.new{
|
|
35
|
+
TasCommands( :id=> 1, :service => "screenShot" ) {
|
|
36
|
+
Target( :TasId => 1, :type => "Application" ) {
|
|
37
|
+
Command( :name => "Screenshot", :format => @context.image_mime_type, :draw => @context.redraw.to_s )
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}.to_xml
|
|
41
|
+
)
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# enable hooking for performance measurement & debug logging
|
|
47
|
+
MobyUtil::Hooking.instance.hook_methods( self ) if defined?( MobyUtil::Hooking )
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
end # ScreenCapture
|
|
51
|
+
|
|
52
|
+
end # QT
|
|
53
|
+
|
|
54
|
+
end # MobyController
|
|
@@ -0,0 +1,51 @@
|
|
|
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 TDriver.
|
|
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 MobyController
|
|
21
|
+
|
|
22
|
+
module QT
|
|
23
|
+
|
|
24
|
+
module Tap
|
|
25
|
+
|
|
26
|
+
def set_adapter( adapter )
|
|
27
|
+
@sut_adapter = adapter
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def execute
|
|
31
|
+
|
|
32
|
+
command_xml = Nokogiri::XML::Builder.new{
|
|
33
|
+
TasCommands( :service => "uiCommand" ) {
|
|
34
|
+
Target( :TasId => 1, :type => "Application" ) {
|
|
35
|
+
Command( :name => "TapScreen", :x => get_x, :y => get_y, :button => 1, :count => 1, :mouseMove => true, :useCoordinates => true, :time_to_hold => get_hold )
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}.to_xml
|
|
39
|
+
|
|
40
|
+
@sut_adapter.send_service_request(Comms::MessageGenerator.generate(command_xml))
|
|
41
|
+
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# enable hooking for performance measurement & debug logging
|
|
45
|
+
MobyUtil::Hooking.instance.hook_methods( self ) if defined?( MobyUtil::Hooking )
|
|
46
|
+
|
|
47
|
+
end # Tap
|
|
48
|
+
|
|
49
|
+
end # QT
|
|
50
|
+
|
|
51
|
+
end # MobyController
|
|
@@ -0,0 +1,72 @@
|
|
|
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 TDriver.
|
|
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
|
+
|
|
21
|
+
|
|
22
|
+
module MobyController
|
|
23
|
+
|
|
24
|
+
module QT
|
|
25
|
+
|
|
26
|
+
module WidgetCommand
|
|
27
|
+
|
|
28
|
+
# Execute the command).
|
|
29
|
+
# Sends the message to the device using the @sut_adapter (see base class)
|
|
30
|
+
# == params
|
|
31
|
+
# == returns
|
|
32
|
+
# == raises
|
|
33
|
+
# NotImplementedError: raised if unsupported command type
|
|
34
|
+
def execute
|
|
35
|
+
command_params = {:eventType => get_event_type, :name => get_command_name}
|
|
36
|
+
command_params.merge!(get_command_params) if get_command_params
|
|
37
|
+
|
|
38
|
+
builder = Nokogiri::XML::Builder.new{
|
|
39
|
+
TasCommands( :id=> get_application_id, :transitions => get_transitions, :service => get_service || 'uiCommand' ) {
|
|
40
|
+
Target( :TasId => get_object_id, :type => get_object_type ) {
|
|
41
|
+
if get_command_value.kind_of? Array
|
|
42
|
+
get_command_value.each do | command_part |
|
|
43
|
+
Command( command_part[ :value ], command_part[ :params ] )
|
|
44
|
+
end
|
|
45
|
+
else
|
|
46
|
+
Command( get_command_value || "", command_params )
|
|
47
|
+
end
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if @sut_adapter.group?
|
|
53
|
+
@sut_adapter.append_command(builder.doc.root.children)
|
|
54
|
+
else
|
|
55
|
+
@sut_adapter.send_service_request(Comms::MessageGenerator.generate(builder.to_xml))
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def set_adapter( adapter )
|
|
61
|
+
@sut_adapter = adapter
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# enable hooking for performance measurement & debug logging
|
|
65
|
+
MobyUtil::Hooking.instance.hook_methods( self ) if defined?( MobyUtil::Hooking )
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
end #module Action
|
|
69
|
+
|
|
70
|
+
end #module QT
|
|
71
|
+
|
|
72
|
+
end #module MobyController
|
|
@@ -0,0 +1,119 @@
|
|
|
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 TDriver.
|
|
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
|
+
# verify that TDriver is loaded
|
|
21
|
+
Kernel::raise RuntimeError.new( "SUT plugin requires TDriver" ) unless (defined?( MATTI ) || defined?( TDriver ))
|
|
22
|
+
|
|
23
|
+
module MobyPlugin
|
|
24
|
+
|
|
25
|
+
module QT
|
|
26
|
+
|
|
27
|
+
class SUT < MobyUtil::Plugin
|
|
28
|
+
|
|
29
|
+
## plugin configuration, constructor and deconstructor methods
|
|
30
|
+
def self.plugin_name
|
|
31
|
+
|
|
32
|
+
# return plugin name as string
|
|
33
|
+
"testability-driver-qt-sut-plugin"
|
|
34
|
+
#File.basename( __FILE__, '.rb' ).downcase # => "tdriver-qt-sut-plugin"
|
|
35
|
+
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def self.plugin_type
|
|
39
|
+
|
|
40
|
+
# return plugin type as symbol
|
|
41
|
+
:sut
|
|
42
|
+
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def self.register_plugin
|
|
46
|
+
|
|
47
|
+
# load plugin specific implementation or other initialization etc.
|
|
48
|
+
MobyUtil::FileHelper.load_modules(
|
|
49
|
+
|
|
50
|
+
# load utility module(s)
|
|
51
|
+
'util/*.rb',
|
|
52
|
+
|
|
53
|
+
# sut adapter
|
|
54
|
+
'sut/communication.rb',
|
|
55
|
+
|
|
56
|
+
# sut adapter
|
|
57
|
+
'sut/adapter.rb',
|
|
58
|
+
|
|
59
|
+
# sut controller
|
|
60
|
+
'sut/controller.rb',
|
|
61
|
+
|
|
62
|
+
# qt behaviour abstract
|
|
63
|
+
'behaviours/behaviour.rb',
|
|
64
|
+
|
|
65
|
+
# load behaviour(s)
|
|
66
|
+
'behaviours/*.rb',
|
|
67
|
+
|
|
68
|
+
# load command(s)
|
|
69
|
+
'commands/*.rb',
|
|
70
|
+
|
|
71
|
+
# load command controller(s)
|
|
72
|
+
'controllers/*.rb'
|
|
73
|
+
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def self.unregister_plugin
|
|
79
|
+
|
|
80
|
+
# unregister plugin
|
|
81
|
+
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
## plugin specific methods
|
|
85
|
+
|
|
86
|
+
# return sut type that plugin implements
|
|
87
|
+
def self.sut_type
|
|
88
|
+
|
|
89
|
+
# return sut type as string
|
|
90
|
+
"QT"
|
|
91
|
+
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# returns SUT object - this method will be called from MobyBase::SUTFactory
|
|
95
|
+
def self.make_sut( sut_id )
|
|
96
|
+
|
|
97
|
+
# tcp/ip read/write timeouts, default: 15 (seconds)
|
|
98
|
+
socket_read_timeout = MobyUtil::Parameter[ sut_id ][ :socket_read_timeout, "15" ].to_i
|
|
99
|
+
socket_write_timeout = MobyUtil::Parameter[ sut_id ][ :socket_write_timeout, "15" ].to_i
|
|
100
|
+
|
|
101
|
+
MobyBase::SUT.new(
|
|
102
|
+
MobyBase::SutController.new( "QT", MobyController::QT::SutAdapter.new( sut_id, socket_read_timeout, socket_write_timeout ) ),
|
|
103
|
+
MobyBase::TestObjectFactory.instance,
|
|
104
|
+
sut_id
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# enable hooking for performance measurement & debug logging
|
|
110
|
+
MobyUtil::Hooking.instance.hook_methods( self ) if defined?( MobyUtil::Hooking )
|
|
111
|
+
|
|
112
|
+
# register plugin
|
|
113
|
+
MobyUtil::PluginService.instance.register_plugin( self ) # Note: self is MobyPlugin::QT::SUT
|
|
114
|
+
|
|
115
|
+
end # SUT
|
|
116
|
+
|
|
117
|
+
end # QT
|
|
118
|
+
|
|
119
|
+
end # MobyPlugin
|
|
@@ -0,0 +1,225 @@
|
|
|
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 TDriver.
|
|
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 MobyController
|
|
21
|
+
|
|
22
|
+
module QT
|
|
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
|
+
@socket_received_bytes=0
|
|
51
|
+
@socket_sent_bytes=0
|
|
52
|
+
|
|
53
|
+
@sut_id = sut_id
|
|
54
|
+
|
|
55
|
+
# set timeouts
|
|
56
|
+
@socket_read_timeout = receive_timeout
|
|
57
|
+
@socket_write_timeout = send_timeout
|
|
58
|
+
|
|
59
|
+
@counter = rand( 1000 )
|
|
60
|
+
|
|
61
|
+
# connect socket
|
|
62
|
+
#connect( @sut_id )
|
|
63
|
+
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def disconnect
|
|
67
|
+
|
|
68
|
+
@socket.close if @connected
|
|
69
|
+
|
|
70
|
+
@connected = false
|
|
71
|
+
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def connect( id = nil )
|
|
75
|
+
|
|
76
|
+
id ||= @sut_id
|
|
77
|
+
|
|
78
|
+
begin
|
|
79
|
+
|
|
80
|
+
@socket = TCPSocket.open( MobyUtil::Parameter[ id ][ :qttas_server_ip ], MobyUtil::Parameter[ id ][ :qttas_server_port ].to_i )
|
|
81
|
+
|
|
82
|
+
rescue => ex
|
|
83
|
+
|
|
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
|
+
|
|
87
|
+
Kernel::raise IOError.new("Unable to connect QTTAS server, verify that it is running properly (#{ ip }:#{ port }): .\nException: #{ ex.message }")
|
|
88
|
+
end
|
|
89
|
+
|
|
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
|
+
# header[ 1 ] = body_size
|
|
139
|
+
# header[ 2 ] = crc
|
|
140
|
+
# header[ 3 ] = compression_flag
|
|
141
|
+
# header[ 4 ] = message_id
|
|
142
|
+
header = nil
|
|
143
|
+
body = nil
|
|
144
|
+
|
|
145
|
+
read_message_id = 0
|
|
146
|
+
until read_message_id == @counter
|
|
147
|
+
header = read_socket( 12 ).unpack( 'CISCI' )
|
|
148
|
+
|
|
149
|
+
# read the message body and compare crc checksum
|
|
150
|
+
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 ]
|
|
151
|
+
|
|
152
|
+
# validate response message; check that response message id matches the request
|
|
153
|
+
# if smaller than expected try to read the next message but if bigger raise error
|
|
154
|
+
read_message_id = header[ 4 ]
|
|
155
|
+
if read_message_id < @counter
|
|
156
|
+
MobyUtil::Logger.instance.log "warning" , "Response to request did not match: \"#{ header[ 4 ].to_s }\"<\"#{ @counter.to_s }\""
|
|
157
|
+
elsif read_message_id > @counter
|
|
158
|
+
MobyUtil::Logger.instance.log "fatal" , "Response to request did not match: \"#{ header[ 4 ].to_s }\">\"#{ @counter.to_s }\""
|
|
159
|
+
# save to file?
|
|
160
|
+
MobyUtil::Logger.instance.log "fatal" , body
|
|
161
|
+
Kernel::raise RuntimeError.new( "Response to request did not match: \"#{ header[ 4 ].to_s }\"!=\"#{ @counter.to_s }\"" )
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
# inflate the message body if compressed
|
|
166
|
+
if ( header[ 3 ] == 2 )
|
|
167
|
+
|
|
168
|
+
body = Zlib::Inflate.inflate( body ) unless ( body = body[ 4..-1 ] ).empty?
|
|
169
|
+
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
# raise exception if messages error flag is set
|
|
173
|
+
# Flag statuses:
|
|
174
|
+
# 0 -> ERROR_MSG
|
|
175
|
+
# 1 -> VALID_MSG
|
|
176
|
+
# 2 -> OK_MESSAGE
|
|
177
|
+
Kernel::raise RuntimeError.new( body ) if header[ 0 ] == 0
|
|
178
|
+
|
|
179
|
+
# return the body ( and crc if required )
|
|
180
|
+
return_crc ? [ body, header[ 2 ] ] : body
|
|
181
|
+
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
private
|
|
185
|
+
|
|
186
|
+
def read_socket( bytes_count )
|
|
187
|
+
|
|
188
|
+
# store time before start receving data
|
|
189
|
+
start_time = Time.now
|
|
190
|
+
|
|
191
|
+
# verify that there is data available to be read
|
|
192
|
+
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
|
+
|
|
194
|
+
# read data from socket
|
|
195
|
+
read_buffer = @socket.read( bytes_count ){
|
|
196
|
+
|
|
197
|
+
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
|
+
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
Kernel::raise IOError.new( "Socket reading error for %i bytes - No data retrieved" % [ bytes_count ] ) if read_buffer.nil?
|
|
202
|
+
@socket_received_bytes+=read_buffer.size
|
|
203
|
+
read_buffer
|
|
204
|
+
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
def write_socket( data )
|
|
208
|
+
@socket_sent_bytes+=data.size
|
|
209
|
+
|
|
210
|
+
@socket.write( data )
|
|
211
|
+
|
|
212
|
+
# verify that there is no data in writing buffer
|
|
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?
|
|
214
|
+
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
# enable hooking for performance measurement & debug logging
|
|
218
|
+
MobyUtil::Hooking.instance.hook_methods( self ) if defined?( MobyUtil::Hooking )
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
end # SutAdapter
|
|
222
|
+
|
|
223
|
+
end # QT
|
|
224
|
+
|
|
225
|
+
end # MobyController
|