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.
- data/README +1 -0
- data/bin/start_app_perf +199 -0
- data/bin/tdriver-devtools +3 -0
- data/config/sut_parameters.rb +39 -0
- data/ext/extconf.rb +67 -0
- data/ext/native_extensions.c +70 -0
- data/lib/matti.rb +30 -0
- data/lib/tdriver-devtools/behaviour/old/xml/example/flick-example.rb +223 -0
- data/lib/tdriver-devtools/behaviour/old/xml/example/impl.rb_invalid +194 -0
- data/lib/tdriver-devtools/behaviour/old/xml/generate_behaviour_xml.rb +95 -0
- data/lib/tdriver-devtools/behaviour/old/xml/lib/tdriver_generator.rb +722 -0
- data/lib/tdriver-devtools/behaviour/old/xml/qdoc_generator.rb +321 -0
- data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.method.template +43 -0
- data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.module.template +54 -0
- data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.argument.template +7 -0
- data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.argument_type.template +7 -0
- data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.exception.template +5 -0
- data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.howto.line.template +2 -0
- data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.howto.template +5 -0
- data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.method.template +23 -0
- data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.template +14 -0
- data/lib/tdriver-devtools/behaviour/old/xml/update +3 -0
- data/lib/tdriver-devtools/behaviour/xml/generate.rb +88 -0
- data/lib/tdriver-devtools/behaviour/xml/rdoc_behaviour_xml_generator.rb +1924 -0
- data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.argument.default.template +1 -0
- data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.argument.template +3 -0
- data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.argument_type.template +4 -0
- data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.exception.template +4 -0
- data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.arguments.template +4 -0
- data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.deprecated.template +3 -0
- data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.exceptions.template +3 -0
- data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.info.template +1 -0
- data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.returns.template +3 -0
- data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.tables.template +3 -0
- data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.template +12 -0
- data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.returns.template +5 -0
- data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.table.item.template +1 -0
- data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.table.row.template +2 -0
- data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.table.template +8 -0
- data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.template +14 -0
- data/lib/tdriver-devtools/behaviour/xml_generator/example/flick-example.rb +245 -0
- data/lib/tdriver-devtools/behaviour/xml_generator/example/sut.rb +964 -0
- data/lib/tdriver-devtools/behaviour/xml_generator/generate.rb +68 -0
- data/lib/tdriver-devtools/behaviour/xml_generator/lib/custom_rdoc_generator.rb +1865 -0
- data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.argument.default.template +1 -0
- data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.argument.template +3 -0
- data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.argument_type.template +4 -0
- data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.exception.template +4 -0
- data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.method.arguments.template +4 -0
- data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.method.deprecated.template +3 -0
- data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.method.exceptions.template +3 -0
- data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.method.info.template +1 -0
- data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.method.returns.template +3 -0
- data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.method.tables.template +3 -0
- data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.method.template +12 -0
- data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.returns.template +5 -0
- data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.table.item.template +1 -0
- data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.table.row.template +2 -0
- data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.table.template +7 -0
- data/lib/tdriver-devtools/behaviour/xml_generator/templates/behaviour.xml.template +14 -0
- data/lib/tdriver-devtools/behaviour/xml_generator/update +3 -0
- data/lib/tdriver-devtools/doc/behaviour_xml/QtExampleGestureBehaviour.xml +138 -0
- data/lib/tdriver-devtools/doc/behaviour_xml/created.rid +1 -0
- data/lib/tdriver-devtools/doc/behaviour_xml/tdriver.hash +1 -0
- data/lib/tdriver-devtools/doc/feature_xml/qt_widget_hold.feature.xml +9 -0
- data/lib/tdriver-devtools/doc/feature_xml/qt_widget_tap.feature.xml +9 -0
- data/lib/tdriver-devtools/doc/generate.rb +892 -0
- data/lib/tdriver-devtools/doc/update +1 -0
- data/lib/tdriver-devtools/doc/xslt/html.rb +7 -0
- data/lib/tdriver-devtools/doc/xslt/template.xsl +1861 -0
- data/lib/tdriver-devtools/doc/xslt/update +3 -0
- data/lib/tdriver-devtools/plugin/placeholder.txt +1 -0
- data/lib/tdriver-devtools/tdriver-devtools.rb +404 -0
- data/lib/tdriver-devtools/tests/feature_tests/example/flick-example.rb +233 -0
- data/lib/tdriver-devtools/tests/feature_tests/example/impl.rb +194 -0
- data/lib/tdriver-devtools/tests/feature_tests/generate.rb +82 -0
- data/lib/tdriver-devtools/tests/feature_tests/lib/custom_rdoc_generator.rb +468 -0
- data/lib/tdriver-devtools/tests/feature_tests/templates/feature_attribute.template +5 -0
- data/lib/tdriver-devtools/tests/feature_tests/templates/feature_method.template +5 -0
- data/lib/tdriver-devtools/tests/feature_tests/templates/scenario_attribute.template +5 -0
- data/lib/tdriver-devtools/tests/feature_tests/templates/scenario_method.template +5 -0
- data/lib/tdriver-devtools/tests/feature_tests/update +3 -0
- data/lib/tdriver.rb +26 -0
- data/lib/tdriver/base/behaviour/behaviour.rb +32 -0
- data/lib/tdriver/base/behaviour/behaviours/object_behaviour_composition.rb +94 -0
- data/lib/tdriver/base/behaviour/behaviours/object_behaviour_description.rb +262 -0
- data/lib/tdriver/base/behaviour/behaviours/object_composition.rb +111 -0
- data/lib/tdriver/base/behaviour/factory.rb +380 -0
- data/lib/tdriver/base/behaviour/loader.rb +28 -0
- data/lib/tdriver/base/command_data/command_data.rb +51 -0
- data/lib/tdriver/base/command_data/loader.rb +25 -0
- data/lib/tdriver/base/errors.rb +131 -0
- data/lib/tdriver/base/loader.rb +38 -0
- data/lib/tdriver/base/state_object.rb +270 -0
- data/lib/tdriver/base/sut/adapter.rb +28 -0
- data/lib/tdriver/base/sut/controller.rb +119 -0
- data/lib/tdriver/base/sut/factory.rb +287 -0
- data/lib/tdriver/base/sut/generic/behaviours/application.rb +243 -0
- data/lib/tdriver/base/sut/generic/behaviours/controller.rb +67 -0
- data/lib/tdriver/base/sut/generic/behaviours/find.rb +96 -0
- data/lib/tdriver/base/sut/generic/behaviours/flash_behaviour.rb +346 -0
- data/lib/tdriver/base/sut/generic/behaviours/sut.rb +1268 -0
- data/lib/tdriver/base/sut/generic/behaviours/switchbox_behaviour.rb +182 -0
- data/lib/tdriver/base/sut/generic/behaviours/verification.rb +119 -0
- data/lib/tdriver/base/sut/generic/commands/application.rb +219 -0
- data/lib/tdriver/base/sut/generic/commands/key_sequence.rb +82 -0
- data/lib/tdriver/base/sut/generic/commands/screen_capture.rb +58 -0
- data/lib/tdriver/base/sut/generic/plugin.rb +96 -0
- data/lib/tdriver/base/sut/loader.rb +35 -0
- data/lib/tdriver/base/sut/sut.rb +67 -0
- data/lib/tdriver/base/test_object/abstract.rb +179 -0
- data/lib/tdriver/base/test_object/behaviours/syncronization.rb +94 -0
- data/lib/tdriver/base/test_object/behaviours/test_object.rb +787 -0
- data/lib/tdriver/base/test_object/factory.rb +618 -0
- data/lib/tdriver/base/test_object/identificator.rb +511 -0
- data/lib/tdriver/base/test_object/loader.rb +37 -0
- data/lib/tdriver/env.rb +21 -0
- data/lib/tdriver/loader.rb +36 -0
- data/lib/tdriver/matti.rb +35 -0
- data/lib/tdriver/report/error_recovery/tdriver_custom_error_recovery.rb +83 -0
- data/lib/tdriver/report/error_recovery/tdriver_error_recovery.rb +158 -0
- data/lib/tdriver/report/error_recovery/tdriver_error_recovery_settings.rb +98 -0
- data/lib/tdriver/report/report.rb +47 -0
- data/lib/tdriver/report/report_api.rb +207 -0
- data/lib/tdriver/report/report_combine.rb +86 -0
- data/lib/tdriver/report/report_crash_file_capture.rb +167 -0
- data/lib/tdriver/report/report_creator.rb +571 -0
- data/lib/tdriver/report/report_cucumber.rb +158 -0
- data/lib/tdriver/report/report_cucumber_listener.rb +337 -0
- data/lib/tdriver/report/report_cucumber_reporter.rb +335 -0
- data/lib/tdriver/report/report_data_presentation.rb +152 -0
- data/lib/tdriver/report/report_data_table.rb +64 -0
- data/lib/tdriver/report/report_execution_statistics.rb +284 -0
- data/lib/tdriver/report/report_file_capture.rb +159 -0
- data/lib/tdriver/report/report_grouping.rb +539 -0
- data/lib/tdriver/report/report_junit_xml.rb +147 -0
- data/lib/tdriver/report/report_rspec.rb +108 -0
- data/lib/tdriver/report/report_test_case_run.rb +621 -0
- data/lib/tdriver/report/report_test_run.rb +1286 -0
- data/lib/tdriver/report/report_test_unit.rb +175 -0
- data/lib/tdriver/report/report_writer.rb +1405 -0
- data/lib/tdriver/tdriver.rb +158 -0
- data/lib/tdriver/util/common.rb +24 -0
- data/lib/tdriver/util/common/array.rb +39 -0
- data/lib/tdriver/util/common/crc16.rb +100 -0
- data/lib/tdriver/util/common/environment.rb +153 -0
- data/lib/tdriver/util/common/error.rb +39 -0
- data/lib/tdriver/util/common/file.rb +315 -0
- data/lib/tdriver/util/common/gem.rb +108 -0
- data/lib/tdriver/util/common/kernel.rb +189 -0
- data/lib/tdriver/util/common/loader.rb +39 -0
- data/lib/tdriver/util/common/retryable.rb +98 -0
- data/lib/tdriver/util/common/string.rb +77 -0
- data/lib/tdriver/util/dbaccess/dbaccess.rb +188 -0
- data/lib/tdriver/util/dbaccess/dbconnection.rb +41 -0
- data/lib/tdriver/util/dbaccess/error.rb +35 -0
- data/lib/tdriver/util/dbaccess/loader.rb +29 -0
- data/lib/tdriver/util/dynamic_attribute_filter.rb +182 -0
- data/lib/tdriver/util/hooking.rb +434 -0
- data/lib/tdriver/util/loader.rb +65 -0
- data/lib/tdriver/util/localisation.rb +24 -0
- data/lib/tdriver/util/localisation/error.rb +32 -0
- data/lib/tdriver/util/localisation/loader.rb +28 -0
- data/lib/tdriver/util/localisation/localisation.rb +479 -0
- data/lib/tdriver/util/logger.rb +377 -0
- data/lib/tdriver/util/operator_data/error.rb +29 -0
- data/lib/tdriver/util/operator_data/loader.rb +26 -0
- data/lib/tdriver/util/operator_data/operator_data.rb +93 -0
- data/lib/tdriver/util/other/config.rb +221 -0
- data/lib/tdriver/util/parameter.rb +24 -0
- data/lib/tdriver/util/parameter/error.rb +45 -0
- data/lib/tdriver/util/parameter/loader.rb +37 -0
- data/lib/tdriver/util/parameter/parameter.rb +285 -0
- data/lib/tdriver/util/parameter/parameter_hash.rb +101 -0
- data/lib/tdriver/util/parameter/parameter_template.rb +120 -0
- data/lib/tdriver/util/parameter/parameter_user_api.rb +84 -0
- data/lib/tdriver/util/parameter/parameter_xml.rb +247 -0
- data/lib/tdriver/util/plugin/abstract.rb +60 -0
- data/lib/tdriver/util/plugin/error.rb +25 -0
- data/lib/tdriver/util/plugin/loader.rb +28 -0
- data/lib/tdriver/util/plugin/service.rb +200 -0
- data/lib/tdriver/util/recorder.rb +292 -0
- data/lib/tdriver/util/stats.rb +90 -0
- data/lib/tdriver/util/user_data/error.rb +29 -0
- data/lib/tdriver/util/user_data/loader.rb +26 -0
- data/lib/tdriver/util/user_data/user_data.rb +103 -0
- data/lib/tdriver/util/video_rec.rb +264 -0
- data/lib/tdriver/util/xml/abstraction.rb +47 -0
- data/lib/tdriver/util/xml/builder.rb +54 -0
- data/lib/tdriver/util/xml/document.rb +32 -0
- data/lib/tdriver/util/xml/element.rb +32 -0
- data/lib/tdriver/util/xml/error.rb +46 -0
- data/lib/tdriver/util/xml/loader.rb +46 -0
- data/lib/tdriver/util/xml/nil_element.rb +89 -0
- data/lib/tdriver/util/xml/nodeset.rb +32 -0
- data/lib/tdriver/util/xml/parsers/libxml/libxml.rb +140 -0
- data/lib/tdriver/util/xml/parsers/loader.rb +22 -0
- data/lib/tdriver/util/xml/parsers/nokogiri/abstraction.rb +111 -0
- data/lib/tdriver/util/xml/parsers/nokogiri/attribute.rb +54 -0
- data/lib/tdriver/util/xml/parsers/nokogiri/builder.rb +58 -0
- data/lib/tdriver/util/xml/parsers/nokogiri/document.rb +58 -0
- data/lib/tdriver/util/xml/parsers/nokogiri/element.rb +147 -0
- data/lib/tdriver/util/xml/parsers/nokogiri/loader.rb +42 -0
- data/lib/tdriver/util/xml/parsers/nokogiri/nodeset.rb +187 -0
- data/lib/tdriver/util/xml/xml.rb +170 -0
- data/lib/tdriver/verify/verify.rb +687 -0
- data/lib/tdriver/verify/verify.rb_org +630 -0
- data/lib/tdriver/version.rb +21 -0
- data/xml/behaviours/generic.xml +495 -0
- data/xml/defaults/generic.xml +97 -0
- data/xml/defaults/sut_generic.xml +36 -0
- data/xml/parameters/tdriver_parameters.xml +23 -0
- data/xml/templates/generic.xml +227 -0
- metadata +327 -0
|
@@ -0,0 +1,94 @@
|
|
|
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
|
+
# TDriver synchronization functionality. These methods make it possible to wait until the SUT is in some user defined state
|
|
24
|
+
#
|
|
25
|
+
# == behaviour
|
|
26
|
+
# GenericTestObjectSynchronization
|
|
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 TestObjectSynchronization
|
|
44
|
+
|
|
45
|
+
include MobyBehaviour::Behaviour
|
|
46
|
+
|
|
47
|
+
# Wait until this test object has a child test object of the specified type and matching the given attributes.
|
|
48
|
+
# The child being waited for must be identifiable by the provided constraints. The call terminates
|
|
49
|
+
# only when exactly a single child matches the criteria.
|
|
50
|
+
#
|
|
51
|
+
# === params
|
|
52
|
+
# type:: String defining the type of the child test object, eg. "list", "softkey"
|
|
53
|
+
# attributes:: (optional) Hash defining the set of attributes that the child test object must possess.
|
|
54
|
+
# timeout:: (optional) Integer overriding the default synchronization timeout.
|
|
55
|
+
# === raises
|
|
56
|
+
# ArgumentError:: One of the arguments was not of a valid format.
|
|
57
|
+
# SyncTimeoutError:: The timeout has passed without synchronization success.
|
|
58
|
+
def wait_child( attributes = {}, timeout_secs = 10, retry_interval = 0.5 )
|
|
59
|
+
|
|
60
|
+
Kernel::raise ArgumentError.new( "Argument type was not a valid. Expected: String" ) unless attributes[ :type ].kind_of?( String ) && attributes[ :type ].length > 0
|
|
61
|
+
|
|
62
|
+
Kernel::raise ArgumentError.new( "Argument attributes was not a valid. Expected: Hash" ) unless attributes.kind_of?( Hash )
|
|
63
|
+
|
|
64
|
+
Kernel::raise ArgumentError.new( "Argument timeout_secs was not a valid. Expected: Integer, Fixnum or Float" ) unless [ Integer, Fixnum, Float ].include? timeout_secs.class
|
|
65
|
+
|
|
66
|
+
Kernel::raise ArgumentError.new( "Argument retry_interval was not a valid. Expected: Integer, Fixnum or Float" ) unless [ Integer, Fixnum, Float ].include? retry_interval.class
|
|
67
|
+
|
|
68
|
+
begin
|
|
69
|
+
|
|
70
|
+
MobyUtil::Retryable.until( :timeout => timeout_secs, :interval => retry_interval ) {
|
|
71
|
+
|
|
72
|
+
#self.refresh( attributes )
|
|
73
|
+
|
|
74
|
+
self.refresh( self.kind_of?( MobyBase::SUT ) ? attributes : { :id => self.get_application_id } )
|
|
75
|
+
|
|
76
|
+
MobyBase::TestObjectIdentificator.new( attributes ).find_object_data( self.xml_data )
|
|
77
|
+
|
|
78
|
+
}
|
|
79
|
+
rescue
|
|
80
|
+
|
|
81
|
+
# the child object was not found in the specified timeout
|
|
82
|
+
Kernel::raise MobyBase::SyncTimeoutError.new( "Synchronization timed out (%i) before the defined child object could be found." % timeout_secs )
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
self
|
|
86
|
+
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# enable hooking for performance measurement & debug logging
|
|
90
|
+
MobyUtil::Hooking.instance.hook_methods( self ) if defined?( MobyUtil::Hooking )
|
|
91
|
+
|
|
92
|
+
end # TDriverSyncronization
|
|
93
|
+
|
|
94
|
+
end # MobyBehaviour
|
|
@@ -0,0 +1,787 @@
|
|
|
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
|
+
# Describes the generic behaviour of TestObject, common methods that can be used to control TestObject
|
|
24
|
+
#
|
|
25
|
+
# == behaviour
|
|
26
|
+
# GenericTestObject
|
|
27
|
+
#
|
|
28
|
+
# == requires
|
|
29
|
+
# *
|
|
30
|
+
#
|
|
31
|
+
# == input_type
|
|
32
|
+
# *
|
|
33
|
+
#
|
|
34
|
+
# == sut_type
|
|
35
|
+
# *
|
|
36
|
+
#
|
|
37
|
+
# == sut_version
|
|
38
|
+
# *
|
|
39
|
+
#
|
|
40
|
+
# == objects
|
|
41
|
+
# *
|
|
42
|
+
#
|
|
43
|
+
module TestObject
|
|
44
|
+
|
|
45
|
+
# == nodoc
|
|
46
|
+
# == description
|
|
47
|
+
# attr_accessor
|
|
48
|
+
# == returns
|
|
49
|
+
# Hash
|
|
50
|
+
# description: Hash containing the identification attributes that were used when the test object was created.
|
|
51
|
+
# example: { :name => 'Triangle1', :type => :Triangle }
|
|
52
|
+
attr_accessor :creation_attributes
|
|
53
|
+
|
|
54
|
+
# === description
|
|
55
|
+
# Determines if the current test object is of type 'application'
|
|
56
|
+
# === returns
|
|
57
|
+
# TrueClass::
|
|
58
|
+
# FalseClass::
|
|
59
|
+
# == example
|
|
60
|
+
# @test_app = @sut.run(:name => 'testapp') # launches testapp
|
|
61
|
+
# isApplication = @test_app.application?
|
|
62
|
+
def application?
|
|
63
|
+
|
|
64
|
+
@type == 'application'
|
|
65
|
+
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# == description
|
|
69
|
+
# Return all test object attributes
|
|
70
|
+
# === returns
|
|
71
|
+
# Hash:: Test object attributes
|
|
72
|
+
# == example
|
|
73
|
+
# @test_app = @sut.run(:name => 'testapp') # launches testapp
|
|
74
|
+
# attributes_hash = @test_app.Triangle( :name => 'Triangle1' ).attributes # retrieve all attribute for triangle object
|
|
75
|
+
def attributes
|
|
76
|
+
|
|
77
|
+
# return hash of test object attributes
|
|
78
|
+
Hash[ xml_data.xpath( 'attributes/attribute' ).collect{ | test_object | [ test_object.attribute( 'name' ), test_object.content ] } ]
|
|
79
|
+
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# == nodoc
|
|
83
|
+
# == description
|
|
84
|
+
# Changes the status of the test object to active
|
|
85
|
+
# == returns
|
|
86
|
+
# TrueClass::
|
|
87
|
+
# == example
|
|
88
|
+
# @app = @sut.run(:name => 'testapp') # launches testapp
|
|
89
|
+
# @app.Node( :name => 'Node1' ).activate() # activate given object
|
|
90
|
+
def activate
|
|
91
|
+
|
|
92
|
+
@_active = true
|
|
93
|
+
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# == nodoc
|
|
97
|
+
# Changes the status of the test object to inactive, also deactivating all children
|
|
98
|
+
# Removes reference from @parent TestObject or SUT to this TestObject so that
|
|
99
|
+
# @parent.refresh does not refresh currrent TestObject
|
|
100
|
+
#
|
|
101
|
+
# Does nothing if TestObject is already deactivated
|
|
102
|
+
# == returns
|
|
103
|
+
# ?
|
|
104
|
+
def deactivate
|
|
105
|
+
|
|
106
|
+
return if !@_active
|
|
107
|
+
|
|
108
|
+
@_active = false
|
|
109
|
+
|
|
110
|
+
@_child_object_cache.each_value{ | test_object |
|
|
111
|
+
|
|
112
|
+
# deactivate test object
|
|
113
|
+
test_object.deactivate
|
|
114
|
+
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
@_child_object_cache.clear
|
|
118
|
+
|
|
119
|
+
@parent.remove_child( self )
|
|
120
|
+
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# == description
|
|
124
|
+
# Function returns a attribute of test object
|
|
125
|
+
# == params
|
|
126
|
+
# name:: String definig the name of the attribute to get
|
|
127
|
+
# == returns
|
|
128
|
+
# String:: Value of the attribute as a string
|
|
129
|
+
# == exceptions
|
|
130
|
+
# TestObjectNotInitializedError:: if the test object xml data has not been initialized
|
|
131
|
+
# AttributeNotFoundError:: if the requested attribute can not be found in the xml data of the object
|
|
132
|
+
# == example
|
|
133
|
+
# @test_app = @sut.run(:name => 'testapp') # launches testapp
|
|
134
|
+
# puts @test_app.Triangle( :name => 'Triangle1' ).attribute('color') # prints color of triangle object
|
|
135
|
+
def attribute( name )
|
|
136
|
+
|
|
137
|
+
# note: count of tries represents total number of tries
|
|
138
|
+
MobyUtil::Retryable.while( :tries => 2, :interval => 0 ) { | attempt |
|
|
139
|
+
|
|
140
|
+
begin
|
|
141
|
+
|
|
142
|
+
# find attribute from xml
|
|
143
|
+
find_attribute( name )
|
|
144
|
+
|
|
145
|
+
rescue MobyBase::AttributeNotFoundError
|
|
146
|
+
|
|
147
|
+
# do following actions only once
|
|
148
|
+
if ( attempt == 1 )
|
|
149
|
+
|
|
150
|
+
# add to dynamic attribute filter once
|
|
151
|
+
MobyUtil::DynamicAttributeFilter.instance.add_attribute( name )
|
|
152
|
+
|
|
153
|
+
# refresh ui state
|
|
154
|
+
refresh( :id => get_application_id )
|
|
155
|
+
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
# raise exception and retry if attempts left
|
|
159
|
+
raise
|
|
160
|
+
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
# == description
|
|
168
|
+
# Returns the parent test object for the current object in question, according to the UI object hierarchy. For getting the test object that was actually used
|
|
169
|
+
# as the parent when the test object instance was created, see parent_object.
|
|
170
|
+
# == returns
|
|
171
|
+
# TestObject:: test object that is parent of this test object, self if no parent (ie. application objects)
|
|
172
|
+
# == example
|
|
173
|
+
# @app = @sut.run(:name => 'testapp') # launches testapp
|
|
174
|
+
# parent_test_object = @app.Node( :name => 'Node1' ).get_parent() #get parent for some test object
|
|
175
|
+
def get_parent()
|
|
176
|
+
|
|
177
|
+
return self if application?
|
|
178
|
+
|
|
179
|
+
@sut.refresh if disable_optimizer
|
|
180
|
+
|
|
181
|
+
#find parent id
|
|
182
|
+
#element_set = @sut.xml_data.xpath( "//object/objects/object[@id='%s']/../.." % @id )
|
|
183
|
+
element_set = @sut.xml_data.xpath( "//object/objects/object[@id='#{ @id }']/../.." )
|
|
184
|
+
|
|
185
|
+
kid = nil
|
|
186
|
+
if( element_set == nil or element_set.size == 0 )
|
|
187
|
+
kid = self
|
|
188
|
+
else
|
|
189
|
+
element = element_set.first
|
|
190
|
+
|
|
191
|
+
#if app set look for the item under the app to make sure app id is available
|
|
192
|
+
|
|
193
|
+
if self.get_application_id && element.attribute( "type" ) != 'application'
|
|
194
|
+
|
|
195
|
+
kid = @sut.child(
|
|
196
|
+
|
|
197
|
+
:id => get_application_id,
|
|
198
|
+
:type => 'application'
|
|
199
|
+
|
|
200
|
+
).child(
|
|
201
|
+
|
|
202
|
+
:id => element.attribute( "id" ),
|
|
203
|
+
:name => element.attribute( "name" ),
|
|
204
|
+
:type => element.attribute( "type" ),
|
|
205
|
+
:__index => 0 # there was a case when the same parent was included twice in the ui dump
|
|
206
|
+
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
else
|
|
210
|
+
|
|
211
|
+
kid = @sut.child(
|
|
212
|
+
:id => element.attribute( "id" ),
|
|
213
|
+
:name => element.attribute( "name" ),
|
|
214
|
+
:type => element.attribute( "type" )
|
|
215
|
+
)
|
|
216
|
+
|
|
217
|
+
end
|
|
218
|
+
end
|
|
219
|
+
enable_optimizer
|
|
220
|
+
kid
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
# == nodoc
|
|
224
|
+
# Updates this test object to match the data in the provided xml document
|
|
225
|
+
# Propagates updating to all child TestObjects
|
|
226
|
+
# If TestObject is not identified, then current TO is deactivated, as is all the Child objects, as defined in TestObject#deactivate.
|
|
227
|
+
# === params
|
|
228
|
+
# xml_document:: LibXML::XML::Node describing the new state of this test object
|
|
229
|
+
# === returns
|
|
230
|
+
# ?
|
|
231
|
+
# === raises
|
|
232
|
+
# nothing
|
|
233
|
+
def update( xml_document )
|
|
234
|
+
|
|
235
|
+
begin
|
|
236
|
+
|
|
237
|
+
if !( _xml_data = MobyBase::TestObjectIdentificator.new( :type => @type, :id => @id, :name => @name ).find_object_data( xml_document ) ).eql?( xml_data )
|
|
238
|
+
|
|
239
|
+
@_child_objects.each { | test_object | test_object.update( ( xml_data = _xml_data ) ) }
|
|
240
|
+
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
rescue MobyBase::TestObjectNotFoundError, MobyBase::MultipleTestObjectsIdentifiedError
|
|
244
|
+
|
|
245
|
+
deactivate
|
|
246
|
+
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
# == nodoc
|
|
252
|
+
# Function refreshes test objects to correspond with the current state of the device.
|
|
253
|
+
#
|
|
254
|
+
# NOTE:
|
|
255
|
+
#
|
|
256
|
+
# @sut#refresh will call update method for this TestObject, if state has changed. Thus, calling
|
|
257
|
+
# @sut.refresh might have a side effect that changes the @_active instance variable.
|
|
258
|
+
# === raises
|
|
259
|
+
# TestObjectNotFoundError:: if TestObject is not identified within synch timeout.
|
|
260
|
+
def refresh( refresh_args = {} )
|
|
261
|
+
|
|
262
|
+
object_search_params = @test_object_factory.make_object_search_params(@creation_attributes)
|
|
263
|
+
search_params = @test_object_factory.get_parent_params(parent)
|
|
264
|
+
search_params.push(object_search_params)
|
|
265
|
+
@sut.refresh( refresh_args, search_params )
|
|
266
|
+
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
# == nodoc
|
|
270
|
+
# Function refreshes test objects to correspond with the current state of the device, forcing
|
|
271
|
+
# the sut to request a new XML dump from the device.
|
|
272
|
+
#
|
|
273
|
+
# NOTE:
|
|
274
|
+
#
|
|
275
|
+
# @sut#force_refresh will call update method for this TestObject, if state has changed. Thus, calling
|
|
276
|
+
# @sut.force_refresh might have a side effect that changes the @_active instance variable.
|
|
277
|
+
# === raises
|
|
278
|
+
# TestObjectNotFoundError:: if TestObject is not identified within synch timeout.
|
|
279
|
+
def force_refresh( refresh_args = {} )
|
|
280
|
+
|
|
281
|
+
refresh(refresh_args)
|
|
282
|
+
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
# == description
|
|
286
|
+
# Function for finding out the application this test ojbect
|
|
287
|
+
# == returns
|
|
288
|
+
# MobyBase::TestObject
|
|
289
|
+
# description: Application test object that the test object belongs to, or nil, if no parent of type application can be found.
|
|
290
|
+
# example: -
|
|
291
|
+
# == example
|
|
292
|
+
# parent_app = @app.Node( :name => 'Node1' ).get_application() #get application for some test object, this should return @app.
|
|
293
|
+
def get_application
|
|
294
|
+
|
|
295
|
+
return self if application?
|
|
296
|
+
|
|
297
|
+
test_object = @parent
|
|
298
|
+
|
|
299
|
+
while test_object
|
|
300
|
+
|
|
301
|
+
return test_object if ( test_object.type == 'application' )
|
|
302
|
+
|
|
303
|
+
test_object = test_object.parent
|
|
304
|
+
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
# return application object or nil if no parent found
|
|
308
|
+
# Does is make sense to return nil - should n't all test objects belong to an application? Maybe throw exception if application not found
|
|
309
|
+
|
|
310
|
+
return @sut.child( :type => 'application' ) rescue nil
|
|
311
|
+
|
|
312
|
+
end
|
|
313
|
+
|
|
314
|
+
# == description
|
|
315
|
+
# Function for finding out the application id for this test object
|
|
316
|
+
# == returns
|
|
317
|
+
# String:: representing the id of the application test object that this test object belongs to.
|
|
318
|
+
# == example
|
|
319
|
+
# puts @app.Node( :name => 'Node1' ).get_application_id() #print the application id, this should print @app.id
|
|
320
|
+
def get_application_id
|
|
321
|
+
|
|
322
|
+
return @_application_id if @_application_id
|
|
323
|
+
#What about the case when get_application returns nil? This line will throw an exception in that case.
|
|
324
|
+
get_application.id
|
|
325
|
+
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
# == nodoc
|
|
329
|
+
def set_application_id( application_id )
|
|
330
|
+
|
|
331
|
+
@_application_id = application_id
|
|
332
|
+
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
# == description
|
|
336
|
+
# Returns a StateObject containing the current state of this test object as XML.
|
|
337
|
+
# The state object is static and thus is not refreshed or synchronized etc.
|
|
338
|
+
# == returns
|
|
339
|
+
# StateObject:: State of this test object
|
|
340
|
+
# == exceptions
|
|
341
|
+
# ArgumentError
|
|
342
|
+
# description: If the xml source for the object cannot be read
|
|
343
|
+
# == example
|
|
344
|
+
# app_state = @sut.application( :name => "calculator" ).state #get the state object for the app
|
|
345
|
+
# button_state = app_state.Button( :text => "Backspace" ) #get the state for test object button
|
|
346
|
+
# button_text = button_state.attribute( "text" ) #get attribute text from the button state object
|
|
347
|
+
def state
|
|
348
|
+
|
|
349
|
+
MobyBase::StateObject.new( xml_data, self )
|
|
350
|
+
|
|
351
|
+
end
|
|
352
|
+
|
|
353
|
+
# Function for translating all symbol values into strings using sut's translate method
|
|
354
|
+
# Goes through all items in a hash and if a value is symbol then uses that symbol as a logical
|
|
355
|
+
# name and tries to find a translation for that.
|
|
356
|
+
# === params
|
|
357
|
+
# hash:: Hash containing key, value pairs. The parameter will get modified if symbols are found from values
|
|
358
|
+
# === raises
|
|
359
|
+
# LanguageNotFoundError:: In case of language is not found
|
|
360
|
+
# LogicalNameNotFoundError:: In case of logical name is not found for current language
|
|
361
|
+
# MySqlConnectError:: In case problems with the db connectivity
|
|
362
|
+
def translate!( hash, file_name = nil, plurality = nil, numerus = nil, lengthvariant = nil )
|
|
363
|
+
|
|
364
|
+
hash.each_pair do | _key, _value |
|
|
365
|
+
|
|
366
|
+
next if [ :name, :type, :id ].include?( _key )
|
|
367
|
+
|
|
368
|
+
hash[ _key ] = sut.translate( _value, file_name, plurality, numerus, lengthvariant ) if _value.kind_of?( Symbol )
|
|
369
|
+
|
|
370
|
+
end if !hash.nil?
|
|
371
|
+
|
|
372
|
+
end
|
|
373
|
+
|
|
374
|
+
# == description
|
|
375
|
+
# Creates a test object for a child object of this test object. Caller test object will be result (child) object's parent object.\n
|
|
376
|
+
# \n
|
|
377
|
+
# [b]NOTE:[/b] Subsequent calls to TestObject#child( rule ) always returns reference to same Testobject:\n
|
|
378
|
+
# [code]a = to.child( :type => 'Button', :text => '1' )
|
|
379
|
+
# b = to.child( :type => 'Button', :text => '1' )
|
|
380
|
+
# a.eql?( b ) # => true[/code]
|
|
381
|
+
# == arguments
|
|
382
|
+
# attributes
|
|
383
|
+
# Hash
|
|
384
|
+
# description: Hash object holding information for identifying which child to create
|
|
385
|
+
# example: { :type => :slider }
|
|
386
|
+
#
|
|
387
|
+
# == returns
|
|
388
|
+
# MobyBase::TestObject
|
|
389
|
+
# description: new child test object or reference to existing child
|
|
390
|
+
# example: -
|
|
391
|
+
#
|
|
392
|
+
# == exceptions
|
|
393
|
+
# TypeError
|
|
394
|
+
# description: raised if agument is not a Hash
|
|
395
|
+
#
|
|
396
|
+
# MultipleTestObjectsIdentifiedError
|
|
397
|
+
# description: raised if multiple objects found that match the given attributes
|
|
398
|
+
#
|
|
399
|
+
# TestObjectNotFoundError
|
|
400
|
+
# description: raised if the child object could not be found
|
|
401
|
+
#
|
|
402
|
+
# TestObjectNotVisibleError
|
|
403
|
+
# description: rasied if the parent test object is no longer visible
|
|
404
|
+
def child( attributes )
|
|
405
|
+
|
|
406
|
+
# verify attributes argument format
|
|
407
|
+
raise TypeError.new( 'Unexpected argument type (%s) for attributes, expecting %s' % [ attributes.class, "Hash" ] ) unless attributes.kind_of?( Hash )
|
|
408
|
+
|
|
409
|
+
# retrieve child object
|
|
410
|
+
get_child_objects( attributes )
|
|
411
|
+
|
|
412
|
+
end
|
|
413
|
+
|
|
414
|
+
# == description
|
|
415
|
+
# Function similar to child, but returns an array of children test objects that meet the given criteria
|
|
416
|
+
#
|
|
417
|
+
# == arguments
|
|
418
|
+
# attributes
|
|
419
|
+
# Hash
|
|
420
|
+
# description: object holding information for identifying which child to create
|
|
421
|
+
# example: { :type => :slider }
|
|
422
|
+
#
|
|
423
|
+
# find_all_children
|
|
424
|
+
# TrueClass
|
|
425
|
+
# description: Boolean specifying whether all children under the test node or just immediate children should be retreived
|
|
426
|
+
# example: true
|
|
427
|
+
# FalseClass
|
|
428
|
+
# description: Boolean specifying whether all children under the test node or just immediate children should be retreived
|
|
429
|
+
# example: false
|
|
430
|
+
#
|
|
431
|
+
# == returns
|
|
432
|
+
# Array
|
|
433
|
+
# description: An array of test objects
|
|
434
|
+
# example: [ MobyBase::TestObject, MobyBase::TestObject, MobyBase::TestObject, ... ]
|
|
435
|
+
#
|
|
436
|
+
# == exceptions
|
|
437
|
+
# TypeError
|
|
438
|
+
# description: raised if agument is not a Hash
|
|
439
|
+
#
|
|
440
|
+
# TestObjectNotFoundError
|
|
441
|
+
# description: raised if the child object could not be found
|
|
442
|
+
#
|
|
443
|
+
# TestObjectNotVisibleError
|
|
444
|
+
# description: rasied if the parent test object is no longer visible
|
|
445
|
+
def children( attributes, find_all_children = true )
|
|
446
|
+
|
|
447
|
+
# verify attributes argument format
|
|
448
|
+
raise TypeError.new( 'Unexpected argument type (%s) for attributes, expecting %s' % [ attributes.class, "Hash" ] ) unless attributes.kind_of?( Hash )
|
|
449
|
+
|
|
450
|
+
# respect the original attributes variable value
|
|
451
|
+
creation_attributes = attributes.clone
|
|
452
|
+
|
|
453
|
+
# If empty or only special attributes then add :type => "any" to search all
|
|
454
|
+
creation_attributes.merge!( :type => "any" ) if creation_attributes.select{ | key, value | key.to_s !~ /^__/ ? true : false }.empty?
|
|
455
|
+
|
|
456
|
+
# children method specific settings
|
|
457
|
+
creation_attributes.merge!( :__multiple_objects => true, :__find_all_children => find_all_children )
|
|
458
|
+
|
|
459
|
+
|
|
460
|
+
disable_optimizer
|
|
461
|
+
# retrieve child objects
|
|
462
|
+
kids = get_child_objects( creation_attributes )
|
|
463
|
+
enable_optimizer
|
|
464
|
+
|
|
465
|
+
|
|
466
|
+
kids
|
|
467
|
+
|
|
468
|
+
end
|
|
469
|
+
|
|
470
|
+
private
|
|
471
|
+
|
|
472
|
+
def disable_optimizer
|
|
473
|
+
#disable optimizer for this call since it will not work
|
|
474
|
+
@_enable_optimizer = false
|
|
475
|
+
if MobyUtil::Parameter[ @sut.id ][ :use_find_object, 'false' ] == 'true' and @sut.methods.include?('find_object')
|
|
476
|
+
MobyUtil::Parameter[ @sut.id ][ :use_find_object] = 'false'
|
|
477
|
+
@_enable_optimizer = true
|
|
478
|
+
end
|
|
479
|
+
@_enable_optimizer
|
|
480
|
+
end
|
|
481
|
+
|
|
482
|
+
def enable_optimizer
|
|
483
|
+
MobyUtil::Parameter[ @sut.id ][ :use_find_object] = 'true' if @_enable_optimizer
|
|
484
|
+
@_enable_optimizer = false
|
|
485
|
+
end
|
|
486
|
+
|
|
487
|
+
# Tries to use the missing method id as a child object type and find an object based on it
|
|
488
|
+
def method_missing( method_id, *method_arguments )
|
|
489
|
+
|
|
490
|
+
# method mapping/aliases - this should be configured in xml file
|
|
491
|
+
#case method_id
|
|
492
|
+
# when :Button; method_id = [ :Button, :QToolButton, :DuiButton, :HbPushButton, :softkey ]
|
|
493
|
+
# when :List; method_id = [ :QList, :HbListWidgetView, :DuiList ]
|
|
494
|
+
#end
|
|
495
|
+
|
|
496
|
+
hash_rule = ( method_arguments.first.kind_of?( Hash ) ? method_arguments.first : {} ).merge( :type => method_id )
|
|
497
|
+
|
|
498
|
+
begin
|
|
499
|
+
|
|
500
|
+
child( hash_rule )
|
|
501
|
+
|
|
502
|
+
rescue MobyBase::TestObjectNotFoundError, MobyBase::TestObjectNotVisibleError
|
|
503
|
+
|
|
504
|
+
#hash_rule.delete( :type )
|
|
505
|
+
|
|
506
|
+
Kernel::raise MobyBase::TestObjectNotFoundError.new(
|
|
507
|
+
'The test object (id: "%s", type: "%s", name: "%s") has no child object with type or behaviour method with name "%s" (%s) on sut "%s".' %
|
|
508
|
+
[ @id, @type, @name, method_id.inspect, ( hash_rule.empty? ? "" : "attributes: #{ hash_rule.inspect }" ), @sut.id ]
|
|
509
|
+
)
|
|
510
|
+
|
|
511
|
+
end
|
|
512
|
+
|
|
513
|
+
end
|
|
514
|
+
|
|
515
|
+
# TODO: refactor logging_enabled
|
|
516
|
+
# try to reactivate test object if currently not active
|
|
517
|
+
def reactivate_test_object( attributes )
|
|
518
|
+
|
|
519
|
+
refresh_args = ( attributes[ :type ] == 'application' ? { :name => attributes[ :name ], :id => attributes[ :id ] } : { :id => get_application_id } )
|
|
520
|
+
|
|
521
|
+
refresh( refresh_args)
|
|
522
|
+
|
|
523
|
+
begin
|
|
524
|
+
|
|
525
|
+
@parent.child( :type => @type, :id => @id )
|
|
526
|
+
|
|
527
|
+
rescue MobyBase::TestObjectNotFoundError => exception
|
|
528
|
+
|
|
529
|
+
Kernel::raise MobyBase::TestObjectNotVisibleError
|
|
530
|
+
|
|
531
|
+
end
|
|
532
|
+
|
|
533
|
+
end
|
|
534
|
+
|
|
535
|
+
# Strip dynamic attributes (such as :__timeout, :__logging) from hash and return those as hash
|
|
536
|
+
# == returns
|
|
537
|
+
# Hash:: Hash of dynamic attributes
|
|
538
|
+
def strip_dynamic_attributes!( attributes, exceptions = [] )
|
|
539
|
+
|
|
540
|
+
Hash[ attributes.select{ | key, value |
|
|
541
|
+
|
|
542
|
+
if /^__/.match( key.to_s ) and !exceptions.include?( key )
|
|
543
|
+
|
|
544
|
+
attributes.delete( key )
|
|
545
|
+
|
|
546
|
+
true
|
|
547
|
+
|
|
548
|
+
else
|
|
549
|
+
|
|
550
|
+
false
|
|
551
|
+
|
|
552
|
+
end
|
|
553
|
+
|
|
554
|
+
}]
|
|
555
|
+
|
|
556
|
+
end
|
|
557
|
+
|
|
558
|
+
def get_cached_test_object!( object )
|
|
559
|
+
|
|
560
|
+
object_hash = object.hash
|
|
561
|
+
|
|
562
|
+
if @_child_object_cache.has_key?( object_hash )
|
|
563
|
+
|
|
564
|
+
object = @_child_object_cache[ object_hash ]
|
|
565
|
+
|
|
566
|
+
true
|
|
567
|
+
|
|
568
|
+
else
|
|
569
|
+
|
|
570
|
+
false
|
|
571
|
+
|
|
572
|
+
end
|
|
573
|
+
|
|
574
|
+
end
|
|
575
|
+
|
|
576
|
+
def get_child_objects( attributes )
|
|
577
|
+
|
|
578
|
+
# create copy of attributes hash
|
|
579
|
+
creation_data = attributes.clone
|
|
580
|
+
|
|
581
|
+
# strip all dynamic attributes such as :__timeout, :__logging etc.
|
|
582
|
+
dynamic_attributes = strip_dynamic_attributes!( creation_data )
|
|
583
|
+
|
|
584
|
+
# store and set logger state if given, use default value if none given
|
|
585
|
+
TDriver.logger.push_enabled( MobyUtil::KernelHelper.to_boolean( dynamic_attributes[ :__logging ], TDriver.logger.enabled ) )
|
|
586
|
+
|
|
587
|
+
# determine if multiple matches is allowed, default value is false
|
|
588
|
+
multiple_objects = MobyUtil::KernelHelper.to_boolean( dynamic_attributes[ :__multiple_objects ], false )
|
|
589
|
+
|
|
590
|
+
find_all_children = MobyUtil::KernelHelper.to_boolean( dynamic_attributes[ :__find_all_children ], true )
|
|
591
|
+
|
|
592
|
+
# check if the hash contains symbols as values and translate those into strings
|
|
593
|
+
file_name = dynamic_attributes[ :__fname ]
|
|
594
|
+
plurality = dynamic_attributes[ :__plurality ]
|
|
595
|
+
numerus = dynamic_attributes[ :__numerus ]
|
|
596
|
+
lengthvariant = dynamic_attributes[ :__lengthvariant ]
|
|
597
|
+
translate!( creation_data, file_name, plurality, numerus, lengthvariant )
|
|
598
|
+
|
|
599
|
+
# use custom timeout if defined
|
|
600
|
+
timeout = ( dynamic_attributes[ :__timeout ] || @test_object_factory.timeout ).to_i
|
|
601
|
+
|
|
602
|
+
# determine which application to refresh
|
|
603
|
+
application_id_hash = ( creation_data[ :type ] == 'application' ? { :name => creation_data[ :name ], :id => creation_data[ :id ] } : { :id => get_application_id } )
|
|
604
|
+
|
|
605
|
+
# add symbols to dynamic attributes list -- to avoid IRB bug
|
|
606
|
+
MobyUtil::DynamicAttributeFilter.instance.add_attributes( creation_data.keys )
|
|
607
|
+
|
|
608
|
+
begin
|
|
609
|
+
|
|
610
|
+
# try to reactivate test object if currently not active
|
|
611
|
+
reactivate_test_object( creation_data ) unless @_active
|
|
612
|
+
|
|
613
|
+
# retrieve test objects from xml
|
|
614
|
+
child_objects = @test_object_factory.make_child_objects(
|
|
615
|
+
|
|
616
|
+
:attributes => creation_data,
|
|
617
|
+
:dynamic_attributes => dynamic_attributes,
|
|
618
|
+
|
|
619
|
+
:parent => self,
|
|
620
|
+
:sut => @sut,
|
|
621
|
+
:application => application_id_hash,
|
|
622
|
+
|
|
623
|
+
:timeout => timeout,
|
|
624
|
+
:multiple_objects => multiple_objects,
|
|
625
|
+
:find_all_children => find_all_children
|
|
626
|
+
|
|
627
|
+
)
|
|
628
|
+
|
|
629
|
+
# Type information is stored in a separate member, not in the Hash
|
|
630
|
+
#creation_data.delete( :type )
|
|
631
|
+
|
|
632
|
+
child_objects.each do | child_object |
|
|
633
|
+
|
|
634
|
+
# use cached test object if once already retrieved
|
|
635
|
+
get_cached_test_object!( child_object ).tap{ | found_in_cache |
|
|
636
|
+
|
|
637
|
+
# Store/update the attributes that were used to create the child object.
|
|
638
|
+
child_object.creation_attributes = creation_data
|
|
639
|
+
|
|
640
|
+
# add child to objects cache
|
|
641
|
+
add_child( child_object ) unless found_in_cache
|
|
642
|
+
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
end
|
|
646
|
+
|
|
647
|
+
# return test object(s)
|
|
648
|
+
multiple_objects ? child_objects : child_objects.first
|
|
649
|
+
|
|
650
|
+
rescue Exception => exception
|
|
651
|
+
|
|
652
|
+
if exception.kind_of?( MobyBase::MultipleTestObjectsIdentifiedError )
|
|
653
|
+
|
|
654
|
+
description = "Multiple child objects matched criteria."
|
|
655
|
+
|
|
656
|
+
elsif exception.kind_of?( MobyBase::TestObjectNotFoundError )
|
|
657
|
+
|
|
658
|
+
description = "The child object(s) could not be found."
|
|
659
|
+
|
|
660
|
+
elsif exception.kind_of?( MobyBase::TestObjectNotVisibleError )
|
|
661
|
+
|
|
662
|
+
description = "Parent test object no longer visible."
|
|
663
|
+
|
|
664
|
+
else
|
|
665
|
+
|
|
666
|
+
description = "Failed when trying to find child object(s)."
|
|
667
|
+
|
|
668
|
+
end
|
|
669
|
+
|
|
670
|
+
TDriver.logger.behaviour(
|
|
671
|
+
|
|
672
|
+
"%s;%s;%s;%s;%s" % [ "FAIL", description, identity, multiple_objects ? "children" : "child", creation_data.inspect ]
|
|
673
|
+
|
|
674
|
+
)
|
|
675
|
+
|
|
676
|
+
Kernel::raise exception
|
|
677
|
+
|
|
678
|
+
ensure
|
|
679
|
+
|
|
680
|
+
# restore logger state
|
|
681
|
+
MobyUtil::Logger.instance.pop_enabled
|
|
682
|
+
|
|
683
|
+
end
|
|
684
|
+
|
|
685
|
+
end
|
|
686
|
+
|
|
687
|
+
# Creates a string identifying this test object: sut, type, attributes used when created
|
|
688
|
+
#
|
|
689
|
+
# === returns
|
|
690
|
+
# String:: String identifying this test object
|
|
691
|
+
def identity
|
|
692
|
+
|
|
693
|
+
#"%s;%s;%s" % [ @sut.id, @type, @creation_attributes.inspect ]
|
|
694
|
+
"#{ @sut.id };#{ @type };#{ @creation_attributes.inspect }"
|
|
695
|
+
|
|
696
|
+
end
|
|
697
|
+
|
|
698
|
+
def find_attribute( name )
|
|
699
|
+
|
|
700
|
+
# store xml data to variable, due to xml_data is a function that returns result of xpath to sut.xml_data
|
|
701
|
+
_xml_data = nil
|
|
702
|
+
begin
|
|
703
|
+
_xml_data = xml_data
|
|
704
|
+
rescue MobyBase::TestObjectNotFoundError
|
|
705
|
+
#lets refresh if not found initially
|
|
706
|
+
refresh_args = ( @creation_attributes[ :type ] == 'application' ? { :name => @creation_attributes[ :name ], :id => @creation_attributes[ :id ] } : { :id => get_application_id } )
|
|
707
|
+
|
|
708
|
+
refresh( refresh_args)
|
|
709
|
+
_xml_data = xml_data
|
|
710
|
+
end
|
|
711
|
+
|
|
712
|
+
# convert name to string if variable type is symbol
|
|
713
|
+
name = name.to_s if name.kind_of?( Symbol )
|
|
714
|
+
|
|
715
|
+
# raise exception if attribute name variable type is other than string
|
|
716
|
+
Kernel::raise ArgumentError.new( "Wrong argument type %s for attribute argument (expected String)" % name.class ) unless name.kind_of?( String )
|
|
717
|
+
|
|
718
|
+
# raise eception if xml data is empty or nil
|
|
719
|
+
Kernel::raise MobyBase::TestObjectNotInitializedError.new if _xml_data.nil? || _xml_data.to_s.empty?
|
|
720
|
+
|
|
721
|
+
# retrieve attribute(s) from xml
|
|
722
|
+
#nodeset = _xml_data.xpath( "attributes/attribute[translate(@name,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='%s']" % name.downcase )
|
|
723
|
+
nodeset = _xml_data.xpath( "attributes/attribute[translate(@name,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='#{ name.downcase }']" )
|
|
724
|
+
|
|
725
|
+
# raise exception if no such attribute found
|
|
726
|
+
Kernel::raise MobyBase::AttributeNotFoundError.new( "Could not find attribute '%s' for test object of type '%s'." % [ name, type ] ) if nodeset.empty?
|
|
727
|
+
|
|
728
|
+
# Need to disable this for now #Kernel::raise MobyBase::MultipleAttributesFoundError.new( "Multiple attributes found with name '%s'" % name ) if nodeset.count > 1
|
|
729
|
+
|
|
730
|
+
# return found attribute
|
|
731
|
+
nodeset.first.content.strip
|
|
732
|
+
|
|
733
|
+
end
|
|
734
|
+
|
|
735
|
+
# this method will be automatically invoked after module is extended to sut object
|
|
736
|
+
def self.extended( target_object )
|
|
737
|
+
|
|
738
|
+
target_object.instance_exec{
|
|
739
|
+
|
|
740
|
+
initialize_settings
|
|
741
|
+
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
end
|
|
745
|
+
|
|
746
|
+
def initialize_settings
|
|
747
|
+
|
|
748
|
+
# defaults
|
|
749
|
+
@_application_id = nil
|
|
750
|
+
@creation_attributes = nil
|
|
751
|
+
|
|
752
|
+
@_child_object_cache = {}
|
|
753
|
+
|
|
754
|
+
activate
|
|
755
|
+
|
|
756
|
+
end
|
|
757
|
+
|
|
758
|
+
# == description
|
|
759
|
+
# Returns the actual test object that was used as the parent when this object instance was created. For getting the parent object in the UI object hierarchy,
|
|
760
|
+
# see get_parent.
|
|
761
|
+
#
|
|
762
|
+
# == returns
|
|
763
|
+
# TestObject:: test object that was used as parent when this object was created. Can also be of type SUT if sut was the parent (ie. application objects)
|
|
764
|
+
|
|
765
|
+
public
|
|
766
|
+
|
|
767
|
+
# This method is deprecated, please use [link="#GenericTestObject:parent"]TestObject#parent[/link] instead.
|
|
768
|
+
# == deprecated
|
|
769
|
+
# 0.8.x
|
|
770
|
+
#
|
|
771
|
+
# == description
|
|
772
|
+
# This method is deprecated, please use TestObject#parent
|
|
773
|
+
#
|
|
774
|
+
def parent_object()
|
|
775
|
+
|
|
776
|
+
$stderr.puts "warning: TestObject#parent_object is deprecated, please use TestObject#parent instead."
|
|
777
|
+
|
|
778
|
+
@parent
|
|
779
|
+
|
|
780
|
+
end
|
|
781
|
+
|
|
782
|
+
# enable hooking for performance measurement & debug logging
|
|
783
|
+
MobyUtil::Hooking.instance.hook_methods( self ) if defined?( MobyUtil::Hooking )
|
|
784
|
+
|
|
785
|
+
end # TestObject
|
|
786
|
+
|
|
787
|
+
end # MobyBehaviour
|