summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAGaliuzov <AGaliuzov@luxoft.com>2015-10-21 16:35:54 +0300
committerAGaliuzov <AGaliuzov@luxoft.com>2015-10-21 16:35:54 +0300
commit9e3d29cf1b73256ee7deb7d642619032c9aa5d40 (patch)
tree7a3cd084f2312f37aea84a0914570f1583037dd2
parent14117eacf4fb89d6572f2634dbd861a61321993c (diff)
parent790208669af77d4da040922283c2644dfab4f457 (diff)
downloadsmartdevicelink-9e3d29cf1b73256ee7deb7d642619032c9aa5d40.tar.gz
Merge pull request #249 from LuxoftSDL/unit_tests_integration
Unit tests integration
-rw-r--r--src/components/application_manager/test/CMakeLists.txt4
-rw-r--r--src/components/application_manager/test/resumption/include/application_mock.h266
-rw-r--r--src/components/application_manager/test/resumption/include/resumption_data_mock.h86
-rw-r--r--src/components/application_manager/test/resumption/include/resumption_data_test.h133
-rw-r--r--src/components/application_manager/test/resumption/resume_ctrl_test.cc937
-rw-r--r--src/components/application_manager/test/resumption/resumption_data_db_test.cc837
-rw-r--r--src/components/application_manager/test/resumption/resumption_data_json_test.cc394
-rw-r--r--src/components/application_manager/test/resumption/resumption_data_test.cc549
-rw-r--r--src/components/application_manager/test/resumption/smartDeviceLink_test.ini37
-rw-r--r--src/components/application_manager/test/state_controller/CMakeLists.txt51
-rw-r--r--src/components/application_manager/test/state_controller/include/application_manager_mock.h80
-rw-r--r--src/components/application_manager/test/state_controller/include/application_mock.h252
-rw-r--r--src/components/application_manager/test/state_controller/include/state_controller_mock.h60
-rw-r--r--src/components/application_manager/test/state_controller/include/statistics_manager_mock.h52
-rw-r--r--src/components/application_manager/test/state_controller/state_controller_test.cc1483
-rw-r--r--src/components/config_profile/CMakeLists.txt4
-rw-r--r--src/components/config_profile/test/CMakeLists.txt59
-rw-r--r--src/components/config_profile/test/ini_file_test.cc335
-rw-r--r--src/components/config_profile/test/profile_test.cc789
-rw-r--r--src/components/config_profile/test/smartDeviceLink.ini185
-rw-r--r--src/components/config_profile/test/smartDeviceLink_invalid_boolean.ini185
-rw-r--r--src/components/config_profile/test/smartDeviceLink_invalid_int.ini187
-rw-r--r--src/components/config_profile/test/smartDeviceLink_invalid_pairs.ini187
-rw-r--r--src/components/config_profile/test/smartDeviceLink_invalid_string.ini190
-rw-r--r--src/components/config_profile/test/smartDeviceLink_test.ini192
-rw-r--r--src/components/connection_handler/test/CMakeLists.txt10
-rw-r--r--src/components/connection_handler/test/connection_handler_impl_test.cc550
-rw-r--r--src/components/connection_handler/test/connection_test.cc331
-rw-r--r--src/components/connection_handler/test/device_test.cc80
-rw-r--r--src/components/connection_handler/test/heart_beat_monitor_test.cc51
-rw-r--r--src/components/connection_handler/test/include/connection_handler_observer_mock.h70
-rw-r--r--src/components/connection_handler/test/smartDeviceLink.ini2
-rw-r--r--src/components/formatters/test/CFormatterJsonBase_test.cc337
-rw-r--r--src/components/formatters/test/CMakeLists.txt28
-rw-r--r--src/components/formatters/test/CSmartFactory_test.cc397
-rw-r--r--src/components/formatters/test/cFormatterJsonSDLRPCv1_test.cc502
-rw-r--r--src/components/formatters/test/cFormatterJsonSDLRPCv2_test.cc392
-rw-r--r--src/components/formatters/test/formatter_json_rpc_test.cc199
-rw-r--r--src/components/formatters/test/include/SmartFactoryTestHelper.h167
-rw-r--r--src/components/formatters/test/include/create_smartSchema.h92
-rw-r--r--src/components/formatters/test/include/meta_formatter_test_helper.h83
-rw-r--r--src/components/formatters/test/meta_formatter_test.cc351
-rw-r--r--src/components/formatters/test/src/SmartFactoryTestHelper.cc501
-rw-r--r--src/components/formatters/test/src/create_smartSchema.cc379
-rw-r--r--src/components/formatters/test/src/meta_formatter_test_helper.cc222
-rw-r--r--src/components/policy/test/CMakeLists.txt11
-rw-r--r--src/components/policy/test/sql_pt_representation_test.cc229
-rw-r--r--src/components/protocol_handler/test/CMakeLists.txt7
-rw-r--r--src/components/protocol_handler/test/include/protocol_handler_mock.h7
-rw-r--r--src/components/protocol_handler/test/include/protocol_observer_mock.h17
-rw-r--r--src/components/protocol_handler/test/include/session_observer_mock.h3
-rw-r--r--src/components/protocol_handler/test/incoming_data_handler_test.cc323
-rw-r--r--src/components/protocol_handler/test/protocol_handler_tm_test.cc25
-rw-r--r--src/components/protocol_handler/test/protocol_header_validator_test.cc66
-rw-r--r--src/components/protocol_handler/test/protocol_packet_test.cc201
-rw-r--r--src/components/protocol_handler/test/protocol_payload_test.cc270
-rw-r--r--src/components/resumption/CMakeLists.txt6
-rw-r--r--src/components/resumption/test/CMakeLists.txt61
-rw-r--r--src/components/resumption/test/last_state_test.cc102
-rw-r--r--src/components/rpc_base/test/CMakeLists.txt19
-rw-r--r--src/components/rpc_base/test/rpc_base_json_test.cc4
-rw-r--r--src/components/rpc_base/test/validation_report_test.cc156
-rw-r--r--src/components/security_manager/test/CMakeLists.txt6
-rw-r--r--src/components/smart_objects/test/CMakeLists.txt1
-rw-r--r--src/components/smart_objects/test/NumberSchemaItem_test.cc33
-rw-r--r--src/components/smart_objects/test/TSharedPtr_test.cc203
-rw-r--r--src/components/time_tester/CMakeLists.txt8
-rw-r--r--src/components/time_tester/test/CMakeLists.txt93
-rw-r--r--src/components/time_tester/test/application_manager_metric_test.cc118
-rw-r--r--src/components/time_tester/test/application_manager_observer_test.cc59
-rw-r--r--src/components/time_tester/test/include/time_manager_mock.h57
-rw-r--r--src/components/time_tester/test/log4cxx.properties19
-rw-r--r--src/components/time_tester/test/metric_wrapper_test.cc82
-rw-r--r--src/components/time_tester/test/protocol_handler_metric_test.cc119
-rw-r--r--src/components/time_tester/test/protocol_handler_observer_test.cc81
-rw-r--r--src/components/time_tester/test/time_manager_test.cc72
-rw-r--r--src/components/time_tester/test/transport_manager_metric_test.cc110
-rw-r--r--src/components/time_tester/test/transport_manager_observer_test.cc58
-rw-r--r--src/components/transport_manager/test/CMakeLists.txt42
-rw-r--r--src/components/transport_manager/test/dnssd_service_browser_test.cc151
-rw-r--r--src/components/transport_manager/test/include/client_connection_listener_mock.h62
-rw-r--r--src/components/transport_manager/test/include/connection_mock.h56
-rw-r--r--src/components/transport_manager/test/include/device_mock.h70
-rw-r--r--src/components/transport_manager/test/include/device_scanner_mock.h58
-rw-r--r--src/components/transport_manager/test/include/mock_transport_adapter_listener.h1
-rw-r--r--src/components/transport_manager/test/include/server_connection_factory_mock.h57
-rw-r--r--src/components/transport_manager/test/include/time_metric_observer_mock.h55
-rw-r--r--src/components/transport_manager/test/include/transport_adapter_controller_mock.h92
-rw-r--r--src/components/transport_manager/test/include/transport_adapter_listener_mock.h123
-rw-r--r--src/components/transport_manager/test/include/transport_adapter_mock.h104
-rw-r--r--src/components/transport_manager/test/include/transport_manager_impl_mock.h54
-rw-r--r--src/components/transport_manager/test/include/transport_manager_listener_mock.h89
-rw-r--r--src/components/transport_manager/test/smartDeviceLink_test.ini55
-rw-r--r--src/components/transport_manager/test/tcp_client_listener_test.cc101
-rw-r--r--src/components/transport_manager/test/tcp_device_test.cc105
-rw-r--r--src/components/transport_manager/test/tcp_transport_adapter_test.cc641
-rw-r--r--src/components/transport_manager/test/transport_adapter_listener_test.cc224
-rw-r--r--src/components/transport_manager/test/transport_adapter_test.cc743
-rw-r--r--src/components/transport_manager/test/transport_manager_default_test.cc46
-rw-r--r--src/components/transport_manager/test/transport_manager_impl_test.cc717
-rw-r--r--src/components/utils/test/CMakeLists.txt52
-rw-r--r--src/components/utils/test/async_runner_test.cc3
-rw-r--r--src/components/utils/test/atomic_object_test.cc55
-rw-r--r--src/components/utils/test/auto_trace_test.cc3
-rw-r--r--src/components/utils/test/date_time_test.cc98
-rw-r--r--src/components/utils/test/file_system_test.cc21
-rw-r--r--src/components/utils/test/message_queue_test.cc2
-rw-r--r--src/components/utils/test/policy.sql295
-rw-r--r--src/components/utils/test/prioritized_queue_test.cc205
-rwxr-xr-xsrc/components/utils/test/qdbserver.sh6
-rw-r--r--src/components/utils/test/resource_usage_test.cc8
-rw-r--r--src/components/utils/test/scope_guard_test.cc121
-rw-r--r--src/components/utils/test/shared_ptr_test.cc544
-rw-r--r--src/components/utils/test/stl_utils_test.cc18
-rw-r--r--src/components/utils/test/test-qdb.ini11
-rw-r--r--src/components/utils/test/timer_thread_test.cc31
116 files changed, 18771 insertions, 1252 deletions
diff --git a/src/components/application_manager/test/CMakeLists.txt b/src/components/application_manager/test/CMakeLists.txt
index c55aa7ef6..473ae6765 100644
--- a/src/components/application_manager/test/CMakeLists.txt
+++ b/src/components/application_manager/test/CMakeLists.txt
@@ -48,9 +48,9 @@ include_directories(
)
set(testSources
- ${AM_TEST_DIR}/command_impl_test.cc
+ #${AM_TEST_DIR}/command_impl_test.cc
${COMPONENTS_DIR}/application_manager/test/mobile_message_handler_test.cc
- ${AM_TEST_DIR}/request_info_test.cc
+ #${AM_TEST_DIR}/request_info_test.cc
)
set(mockedSources
diff --git a/src/components/application_manager/test/resumption/include/application_mock.h b/src/components/application_manager/test/resumption/include/application_mock.h
new file mode 100644
index 000000000..39c4b3353
--- /dev/null
+++ b/src/components/application_manager/test/resumption/include/application_mock.h
@@ -0,0 +1,266 @@
+/*
+* Copyright (c) 2015, Ford Motor Company
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are met:
+*
+* Redistributions of source code must retain the above copyright notice, this
+* list of conditions and the following disclaimer.
+*
+* Redistributions in binary form must reproduce the above copyright notice,
+* this list of conditions and the following
+* disclaimer in the documentation and/or other materials provided with the
+* distribution.
+*
+* Neither the name of the Ford Motor Company nor the names of its contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+* POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef SRC_COMPONENTS_APPLICATION_MANAGER_TEST_RESUMPTION_INCLUDE_APPLICATION_MOCK_H_
+#define SRC_COMPONENTS_APPLICATION_MANAGER_TEST_RESUMPTION_INCLUDE_APPLICATION_MOCK_H_
+#include <string>
+#include "gmock/gmock.h"
+#include "application_manager/application.h"
+
+namespace test {
+namespace components {
+namespace resumption_test {
+
+class ApplicationMock : public ::application_manager::Application {
+ public:
+ MOCK_CONST_METHOD0(active_message, const smart_objects::SmartObject*());
+ MOCK_CONST_METHOD0(curHash, const std::string&());
+ MOCK_METHOD0(UpdateHash, void());
+ MOCK_CONST_METHOD0(flag_sending_hash_change_after_awake, bool());
+ MOCK_METHOD1(set_flag_sending_hash_change_after_awake, void(bool flag));
+ MOCK_CONST_METHOD0(is_application_data_changed, bool());
+ MOCK_METHOD1(set_is_application_data_changed,
+ void(bool state_application_data));
+ MOCK_METHOD0(CloseActiveMessage, void());
+ MOCK_CONST_METHOD0(IsFullscreen, bool());
+ MOCK_METHOD0(ChangeSupportingAppHMIType, void());
+ MOCK_CONST_METHOD0(is_navi, bool());
+ MOCK_METHOD1(set_is_navi, void(bool allow));
+ MOCK_CONST_METHOD0(video_streaming_approved, bool());
+ MOCK_METHOD1(set_video_streaming_approved, void(bool state));
+ MOCK_CONST_METHOD0(audio_streaming_approved, bool());
+ MOCK_METHOD1(set_audio_streaming_approved, void(bool state));
+ MOCK_CONST_METHOD0(video_streaming_allowed, bool());
+ MOCK_METHOD1(set_video_streaming_allowed, void(bool state));
+ MOCK_CONST_METHOD0(audio_streaming_allowed, bool());
+ MOCK_METHOD1(set_audio_streaming_allowed, void(bool state));
+ MOCK_METHOD1(StartStreaming,
+ void(protocol_handler::ServiceType service_type));
+ MOCK_METHOD1(StopStreaming, void(protocol_handler::ServiceType service_type));
+ MOCK_METHOD1(SuspendStreaming,
+ void(protocol_handler::ServiceType service_type));
+ MOCK_METHOD1(WakeUpStreaming,
+ void(protocol_handler::ServiceType service_type));
+ MOCK_CONST_METHOD0(is_voice_communication_supported, bool());
+ MOCK_METHOD1(set_voice_communication_supported,
+ void(bool is_voice_communication_supported));
+ MOCK_CONST_METHOD0(app_allowed, bool());
+ MOCK_CONST_METHOD0(has_been_activated, bool());
+ MOCK_METHOD1(set_activated, bool(bool is_active));
+ MOCK_CONST_METHOD0(version, const ::application_manager::Version&());
+ MOCK_METHOD1(set_hmi_application_id, void(uint32_t hmi_app_id));
+ MOCK_CONST_METHOD0(hmi_app_id, uint32_t());
+ MOCK_CONST_METHOD0(name, const std::string&());
+ MOCK_METHOD1(set_folder_name, void(const std::string& folder_name));
+ MOCK_CONST_METHOD0(folder_name, const std::string());
+ MOCK_CONST_METHOD0(is_media_application, bool());
+ MOCK_CONST_METHOD0(hmi_level, const mobile_apis::HMILevel::eType());
+ MOCK_CONST_METHOD0(put_file_in_none_count, const uint32_t());
+ MOCK_CONST_METHOD0(delete_file_in_none_count, const uint32_t());
+ MOCK_CONST_METHOD0(list_files_in_none_count, const uint32_t());
+ MOCK_CONST_METHOD0(system_context, const mobile_apis::SystemContext::eType());
+ MOCK_CONST_METHOD0(audio_streaming_state,
+ const mobile_apis::AudioStreamingState::eType());
+ MOCK_CONST_METHOD0(app_icon_path, const std::string&());
+ MOCK_CONST_METHOD0(device, connection_handler::DeviceHandle());
+ MOCK_METHOD0(tts_speak_state, bool());
+ MOCK_CONST_METHOD0(CurrentHmiState,
+ ::application_manager::HmiStatePtr());
+ MOCK_CONST_METHOD0(RegularHmiState,
+ ::application_manager::HmiStatePtr());
+ MOCK_CONST_METHOD0(PostponedHmiState,
+ ::application_manager::HmiStatePtr());
+ MOCK_METHOD1(set_tts_properties_in_none, void(bool active));
+ MOCK_METHOD0(tts_properties_in_none, bool());
+ MOCK_METHOD1(set_tts_properties_in_full, void(bool active));
+ MOCK_METHOD0(tts_properties_in_full, bool());
+ MOCK_METHOD1(set_version,
+ void(const ::application_manager::Version& version));
+ MOCK_METHOD1(set_name, void(const std::string& name));
+ MOCK_METHOD1(set_is_media_application, void(bool is_media));
+ MOCK_METHOD0(increment_put_file_in_none_count, void());
+ MOCK_METHOD0(increment_delete_file_in_none_count, void());
+ MOCK_METHOD0(increment_list_files_in_none_count, void());
+ MOCK_METHOD1(set_app_icon_path, bool(const std::string& file_name));
+ MOCK_METHOD1(set_app_allowed, void(const bool& allowed));
+ MOCK_METHOD1(set_device, void(connection_handler::DeviceHandle device));
+ MOCK_CONST_METHOD0(get_grammar_id, uint32_t());
+ MOCK_METHOD1(set_grammar_id, void(uint32_t value));
+ MOCK_METHOD1(
+ set_protocol_version,
+ void(const ::application_manager::ProtocolVersion& protocol_version));
+ MOCK_CONST_METHOD0(protocol_version,
+ ::application_manager::ProtocolVersion());
+ MOCK_METHOD1(set_is_resuming, void(bool));
+ MOCK_CONST_METHOD0(is_resuming, bool());
+ MOCK_METHOD1(AddFile, bool(const ::application_manager::AppFile& file));
+ MOCK_CONST_METHOD0(getAppFiles, const ::application_manager::AppFilesMap&());
+ MOCK_METHOD1(UpdateFile, bool(const ::application_manager::AppFile& file));
+ MOCK_METHOD1(DeleteFile, bool(const std::string& file_name));
+ MOCK_METHOD1(GetFile, const ::application_manager::AppFile*(
+ const std::string& file_name));
+ MOCK_METHOD1(SubscribeToButton,
+ bool(mobile_apis::ButtonName::eType btn_name));
+ MOCK_METHOD1(IsSubscribedToButton,
+ bool(mobile_apis::ButtonName::eType btn_name));
+ MOCK_METHOD1(UnsubscribeFromButton,
+ bool(mobile_apis::ButtonName::eType btn_name));
+ MOCK_METHOD1(SubscribeToIVI, bool(uint32_t vehicle_info_type));
+ MOCK_CONST_METHOD1(IsSubscribedToIVI, bool(uint32_t vehicle_info_type));
+ MOCK_METHOD1(UnsubscribeFromIVI, bool(uint32_t vehicle_info_type));
+ MOCK_METHOD0(ResetDataInNone, void());
+ MOCK_METHOD2(IsCommandLimitsExceeded,
+ bool(mobile_apis::FunctionID::eType cmd_id,
+ ::application_manager::TLimitSource source));
+ MOCK_METHOD0(usage_report, ::application_manager::UsageStatistics&());
+ MOCK_METHOD1(SetRegularState, void(::application_manager::HmiStatePtr state));
+ MOCK_METHOD1(SetPostponedState, void(::application_manager::HmiStatePtr state));
+ MOCK_METHOD1(AddHMIState, void(::application_manager::HmiStatePtr state));
+ MOCK_METHOD1(RemoveHMIState,
+ void(::application_manager::HmiState::StateID state_id));
+ MOCK_METHOD2(SubscribeToSoftButtons,
+ void(int32_t cmd_id,
+ const ::application_manager::SoftButtonID& softbuttons_id));
+ MOCK_METHOD1(IsSubscribedToSoftButton, bool(const uint32_t softbutton_id));
+ MOCK_METHOD1(UnsubscribeFromSoftButtons, void(int32_t cmd_id));
+ MOCK_CONST_METHOD0(IsAudioApplication, bool());
+ MOCK_METHOD0(LoadPersistentFiles, void());
+ // InitialApplicationData methods
+ MOCK_CONST_METHOD0(app_types, const smart_objects::SmartObject*());
+ MOCK_CONST_METHOD0(vr_synonyms, const smart_objects::SmartObject*());
+ MOCK_CONST_METHOD0(policy_app_id, std::string());
+ MOCK_CONST_METHOD0(tts_name, const smart_objects::SmartObject*());
+ MOCK_CONST_METHOD0(ngn_media_screen_name,
+ const smart_objects::SmartObject*());
+ MOCK_CONST_METHOD0(language, const mobile_apis::Language::eType&());
+ MOCK_CONST_METHOD0(ui_language, const mobile_apis::Language::eType&());
+ MOCK_METHOD1(set_app_types,
+ void(const smart_objects::SmartObject& app_types));
+ MOCK_METHOD1(set_vr_synonyms,
+ void(const smart_objects::SmartObject& vr_synonyms));
+ MOCK_METHOD1(set_policy_app_id, void(const std::string& policy_app_id));
+ MOCK_METHOD1(set_tts_name, void(const smart_objects::SmartObject& tts_name));
+ MOCK_METHOD1(set_ngn_media_screen_name,
+ void(const smart_objects::SmartObject& ngn_name));
+ MOCK_METHOD1(set_language,
+ void(const mobile_apis::Language::eType& language));
+ MOCK_METHOD1(set_ui_language,
+ void(const mobile_apis::Language::eType& ui_language));
+ // DynamicApplicationData methods
+ MOCK_CONST_METHOD0(help_prompt, const smart_objects::SmartObject*());
+ MOCK_CONST_METHOD0(timeout_prompt, const smart_objects::SmartObject*());
+ MOCK_CONST_METHOD0(vr_help_title, const smart_objects::SmartObject*());
+ MOCK_CONST_METHOD0(vr_help, const smart_objects::SmartObject*());
+ MOCK_CONST_METHOD0(tbt_state, const mobile_apis::TBTState::eType&());
+ MOCK_CONST_METHOD0(show_command, const smart_objects::SmartObject*());
+ MOCK_CONST_METHOD0(tbt_show_command, const smart_objects::SmartObject*());
+ MOCK_CONST_METHOD0(
+ SubscribedButtons,
+ DataAccessor< ::application_manager::ButtonSubscriptions >());
+ MOCK_CONST_METHOD0(
+ SubscribedIVI,
+ DataAccessor< ::application_manager::VehicleInfoSubscriptions >());
+ MOCK_CONST_METHOD0(keyboard_props, const smart_objects::SmartObject*());
+ MOCK_CONST_METHOD0(menu_title, const smart_objects::SmartObject*());
+ MOCK_CONST_METHOD0(menu_icon, const smart_objects::SmartObject*());
+ MOCK_METHOD1(load_global_properties,
+ void(const smart_objects::SmartObject& so));
+ MOCK_METHOD1(set_help_prompt,
+ void(const smart_objects::SmartObject& help_prompt));
+ MOCK_METHOD1(set_timeout_prompt,
+ void(const smart_objects::SmartObject& timeout_prompt));
+ MOCK_METHOD1(set_vr_help_title,
+ void(const smart_objects::SmartObject& vr_help_title));
+ MOCK_METHOD0(reset_vr_help_title, void());
+ MOCK_METHOD1(set_vr_help, void(const smart_objects::SmartObject& vr_help));
+ MOCK_METHOD0(reset_vr_help, void());
+ MOCK_METHOD1(set_tbt_state,
+ void(const mobile_apis::TBTState::eType& tbt_state));
+ MOCK_METHOD1(set_show_command,
+ void(const smart_objects::SmartObject& show_command));
+ MOCK_METHOD1(set_tbt_show_command,
+ void(const smart_objects::SmartObject& tbt_show));
+ MOCK_METHOD1(set_keyboard_props,
+ void(const smart_objects::SmartObject& keyboard_props));
+ MOCK_METHOD1(set_menu_title,
+ void(const smart_objects::SmartObject& menu_title));
+ MOCK_METHOD1(set_menu_icon,
+ void(const smart_objects::SmartObject& menu_icon));
+ MOCK_CONST_METHOD0(audio_stream_retry_number, uint32_t());
+ MOCK_METHOD1(set_audio_stream_retry_number,
+ void(const uint32_t& audio_stream_retry_number));
+ MOCK_CONST_METHOD0(video_stream_retry_number, uint32_t());
+ MOCK_METHOD1(set_video_stream_retry_number,
+ void(const uint32_t& video_stream_retry_number));
+ MOCK_METHOD2(AddCommand, void(uint32_t cmd_id,
+ const smart_objects::SmartObject& command));
+ MOCK_METHOD1(RemoveCommand, void(uint32_t cmd_id));
+ MOCK_METHOD1(FindCommand, smart_objects::SmartObject*(uint32_t cmd_id));
+ MOCK_METHOD2(AddSubMenu,
+ void(uint32_t menu_id, const smart_objects::SmartObject& menu));
+ MOCK_METHOD1(RemoveSubMenu, void(uint32_t menu_id));
+ MOCK_CONST_METHOD1(FindSubMenu,
+ smart_objects::SmartObject*(uint32_t menu_id));
+ MOCK_METHOD1(IsSubMenuNameAlreadyExist, bool(const std::string& name));
+ MOCK_METHOD2(AddChoiceSet,
+ void(uint32_t choice_set_id,
+ const smart_objects::SmartObject& choice_set));
+ MOCK_METHOD1(RemoveChoiceSet, void(uint32_t choice_set_id));
+ MOCK_METHOD1(FindChoiceSet,
+ smart_objects::SmartObject*(uint32_t choice_set_id));
+ MOCK_METHOD3(AddPerformInteractionChoiceSet,
+ void(uint32_t correlation_id, uint32_t choice_set_id,
+ const smart_objects::SmartObject& choice_set));
+ MOCK_METHOD1(DeletePerformInteractionChoiceSet,
+ void(uint32_t correlation_id));
+ MOCK_CONST_METHOD0(
+ performinteraction_choice_set_map,
+ DataAccessor< ::application_manager::PerformChoiceSetMap >());
+ MOCK_CONST_METHOD0(commands_map,
+ DataAccessor< ::application_manager::CommandsMap >());
+ MOCK_CONST_METHOD0(sub_menu_map,
+ DataAccessor< ::application_manager::SubMenuMap >());
+ MOCK_CONST_METHOD0(choice_set_map,
+ DataAccessor< ::application_manager::ChoiceSetMap >());
+ MOCK_METHOD1(set_perform_interaction_active, void(uint32_t active));
+ MOCK_CONST_METHOD0(is_perform_interaction_active, uint32_t());
+ MOCK_METHOD1(set_perform_interaction_mode, void(int32_t mode));
+ MOCK_CONST_METHOD0(perform_interaction_mode, int32_t());
+ MOCK_METHOD1(set_reset_global_properties_active, void(bool active));
+ MOCK_CONST_METHOD0(is_reset_global_properties_active, bool());
+ MOCK_CONST_METHOD0(app_id, uint32_t());
+};
+
+} // namespace resumption_test
+} // namespace components
+} // namespace test
+
+#endif // SRC_COMPONENTS_APPLICATION_MANAGER_TEST_RESUMPTION_INCLUDE_APPLICATION_MOCK_H_
diff --git a/src/components/application_manager/test/resumption/include/resumption_data_mock.h b/src/components/application_manager/test/resumption/include/resumption_data_mock.h
new file mode 100644
index 000000000..2c9285b02
--- /dev/null
+++ b/src/components/application_manager/test/resumption/include/resumption_data_mock.h
@@ -0,0 +1,86 @@
+/*
+* Copyright (c) 2015, Ford Motor Company
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are met:
+*
+* Redistributions of source code must retain the above copyright notice, this
+* list of conditions and the following disclaimer.
+*
+* Redistributions in binary form must reproduce the above copyright notice,
+* this list of conditions and the following
+* disclaimer in the documentation and/or other materials provided with the
+* distribution.
+*
+* Neither the name of the Ford Motor Company nor the names of its contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+* POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef SRC_COMPONENTS_APPLICATION_MANAGER_TEST_RESUMPTION_INCLUDE_RESUMPTION_DATA_MOCK_H_
+#define SRC_COMPONENTS_APPLICATION_MANAGER_TEST_RESUMPTION_INCLUDE_RESUMPTION_DATA_MOCK_H_
+#include <string>
+#include "gmock/gmock.h"
+#include "application_manager/resumption/resumption_data.h"
+#include "application_manager/application.h"
+
+namespace test {
+namespace components {
+namespace resumption_test {
+namespace app_mngr = application_manager;
+namespace smart_objects = NsSmartDeviceLink::NsSmartObjects;
+
+class ResumptionDataMock : public ::resumption::ResumptionData {
+ public:
+ MOCK_METHOD1(SaveApplication,
+ void(app_mngr::ApplicationSharedPtr application));
+ MOCK_CONST_METHOD2(GetStoredHMILevel,
+ int32_t(const std::string& policy_app_id,
+ const std::string& device_id));
+ MOCK_CONST_METHOD1(IsHMIApplicationIdExist, bool(uint32_t hmi_app_id));
+ MOCK_METHOD2(CheckSavedApplication, bool(const std::string& policy_app_id,
+ const std::string& device_id));
+ MOCK_CONST_METHOD2(GetHMIApplicationID,
+ uint32_t(const std::string& policy_app_id,
+ const std::string& device_id));
+ MOCK_METHOD0(OnSuspend, void());
+ MOCK_CONST_METHOD3(GetHashId,
+ bool(const std::string& policy_app_id,
+ const std::string& device_id, std::string& hash_id));
+ MOCK_METHOD0(OnAwake, void());
+ MOCK_CONST_METHOD3(GetSavedApplication,
+ bool(const std::string& policy_app_id,
+ const std::string& device_id,
+ smart_objects::SmartObject& saved_app));
+ MOCK_METHOD2(RemoveApplicationFromSaved,
+ bool(const std::string& policy_app_id,
+ const std::string& device_id));
+ MOCK_CONST_METHOD0(GetIgnOffTime, uint32_t());
+ MOCK_CONST_METHOD2(IsApplicationSaved,
+ ssize_t(const std::string& policy_app_id,
+ const std::string& device_id));
+ MOCK_CONST_METHOD1(GetDataForLoadResumeData,
+ void(smart_objects::SmartObject& saved_data));
+ MOCK_METHOD3(UpdateHmiLevel, void(const std::string& policy_app_id,
+ const std::string& device_id,
+ mobile_apis::HMILevel::eType hmi_level));
+ MOCK_METHOD0(Init, bool());
+};
+
+} // namespace resumption_test
+} // namespace components
+} // namespace test
+
+#endif // SRC_COMPONENTS_APPLICATION_MANAGER_TEST_RESUMPTION_INCLUDE_RESUMPTION_DATA_MOCK_H_
diff --git a/src/components/application_manager/test/resumption/include/resumption_data_test.h b/src/components/application_manager/test/resumption/include/resumption_data_test.h
new file mode 100644
index 000000000..55767225b
--- /dev/null
+++ b/src/components/application_manager/test/resumption/include/resumption_data_test.h
@@ -0,0 +1,133 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <string>
+#include <algorithm>
+#include "gtest/gtest.h"
+#include "application_manager/usage_statistics.h"
+#include "application_mock.h"
+#include "application_manager/application_manager_impl.h"
+#include "utils/data_accessor.h"
+
+namespace test {
+namespace components {
+namespace resumption_test {
+
+using ::testing::NiceMock;
+namespace am = application_manager;
+namespace sm = smart_objects;
+using namespace Json;
+
+using namespace resumption;
+using namespace mobile_apis;
+
+class ResumptionDataTest : public ::testing::Test {
+ protected:
+ // Check structure in saved application
+ void CheckSavedApp(sm::SmartObject& saved_data);
+
+ // Set data for resumption
+ virtual void PrepareData();
+ utils::SharedPtr<NiceMock<ApplicationMock>> app_mock;
+
+ HMILevel::eType hmi_level_;
+ size_t app_id_;
+ size_t hmi_app_id_;
+ std::string policy_app_id_;
+ size_t ign_off_count_;
+ const size_t tts_chunks_count = 4;
+
+ size_t grammar_id_;
+ std::string hash_;
+ bool is_audio_;
+ const connection_handler::DeviceHandle device_handle_ = 10;
+
+ sm::SmartObject* help_prompt_;
+ sm::SmartObject* timeout_prompt_;
+ sm::SmartObject* vr_help_;
+ sm::SmartObject* vr_help_title_;
+ sm::SmartObject* vr_synonyms_;
+ sm::SmartObject* keyboard_props_;
+ sm::SmartObject* menu_title_;
+ sm::SmartObject* menu_icon_;
+
+ void SetCommands();
+ void SetSubmenues();
+ void SetChoiceSet();
+ void SetAppFiles();
+ void SetGlobalProporties();
+ void SetKeyboardProperties();
+ void SetMenuTitleAndIcon();
+ void SetHelpAndTimeoutPrompt();
+ void SetVRHelpTitle();
+ void SetSubscriptions();
+
+ void CheckCommands(sm::SmartObject& res_list);
+ void CheckGlobalProporties(sm::SmartObject& res_list);
+ void CheckSubmenues(sm::SmartObject& res_list);
+ void CheckChoiceSet(sm::SmartObject& res_list);
+ void CheckAppFiles(sm::SmartObject& res_list);
+ void CheckKeyboardProperties(sm::SmartObject& res_list);
+ void CheckMenuTitle(sm::SmartObject& res_list);
+ void CheckMenuIcon(sm::SmartObject& res_list);
+ void CheckHelpPrompt(sm::SmartObject& res_list);
+ void CheckTimeoutPrompt(sm::SmartObject& res_list);
+ void CheckVRHelp(NsSmartDeviceLink::NsSmartObjects::SmartObject& res_list);
+ void CheckVRTitle(sm::SmartObject& res_list);
+ void CheckSubscriptions(sm::SmartObject& res_list);
+
+ const size_t count_of_commands = 5;
+ const size_t count_of_choice = 2;
+ const size_t count_of_choice_sets = 4;
+ const size_t count_of_submenues = 3;
+ const size_t count_of_files = 8;
+ const size_t count_of_vrhelptitle = 2;
+ const std::string device_id_ = "12345";
+
+ am::CommandsMap test_commands_map;
+ am::SubMenuMap test_submenu_map;
+ am::ChoiceSetMap test_choiceset_map;
+ am::AppFilesMap app_files_map_;
+
+ am::ButtonSubscriptions btn_subscr;
+ am::VehicleInfoSubscriptions ivi;
+
+ sync_primitives::Lock sublock_;
+ sync_primitives::Lock comlock_;
+ sync_primitives::Lock setlock_;
+ sync_primitives::Lock btnlock_;
+ sync_primitives::Lock ivilock_;
+};
+
+} // namespace resumption_test
+} // namespace components
+} // namespace test
diff --git a/src/components/application_manager/test/resumption/resume_ctrl_test.cc b/src/components/application_manager/test/resumption/resume_ctrl_test.cc
new file mode 100644
index 000000000..bfd41b0f0
--- /dev/null
+++ b/src/components/application_manager/test/resumption/resume_ctrl_test.cc
@@ -0,0 +1,937 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "application_manager/resumption/resume_ctrl.h"
+#include <string>
+#include <algorithm>
+#include "gtest/gtest.h"
+#include "application_manager/usage_statistics.h"
+#include "include/application_mock.h"
+#include "include/resumption_data_mock.h"
+#include "interfaces/MOBILE_API.h"
+#include "application_manager/application_manager_impl.h"
+#include "application_manager/application.h"
+#include "config_profile/profile.h"
+#include "utils/data_accessor.h"
+#include "application_manager/test/mock_message_helper.h"
+
+namespace test {
+namespace components {
+namespace resumption_test {
+
+using ::testing::_;
+using ::testing::Return;
+using ::testing::DoAll;
+using ::testing::SetArgReferee;
+using ::testing::Mock;
+using ::testing::NiceMock;
+using ::testing::AtLeast;
+
+using namespace resumption;
+using namespace mobile_apis::HMILevel;
+
+class ResumeCtrlTest : public ::testing::Test {
+ public:
+ virtual void SetUp() OVERRIDE {
+ app_mngr = application_manager::ApplicationManagerImpl::instance();
+ // Singleton should not be destroyed
+ Mock::AllowLeak(app_mngr);
+ mock_storage = new NiceMock<ResumptionDataMock>();
+ app_mock = new NiceMock<ApplicationMock>();
+ res_ctrl.set_resumption_storage(mock_storage);
+ test_audio_state = mobile_apis::AudioStreamingState::NOT_AUDIBLE;
+ test_app_id = 10;
+ default_testType = eType::HMI_NONE;
+ test_dev_id = 5;
+ test_policy_app_id = "test_policy_app_id";
+ test_grammar_id = 10;
+ hash = "saved_hash";
+ }
+
+ protected:
+ application_manager::ApplicationManagerImpl* app_mngr;
+ ResumeCtrl res_ctrl;
+ NiceMock<ResumptionDataMock>* mock_storage;
+ NiceMock<ApplicationMock>* app_mock;
+ mobile_apis::AudioStreamingState::eType test_audio_state;
+ // app_mock.app_id() will return this value
+ uint32_t test_app_id;
+ std::string test_policy_app_id;
+ mobile_apis::HMILevel::eType default_testType;
+
+ // app_mock.Device() will return this value
+ uint32_t test_dev_id;
+ uint32_t test_grammar_id;
+ std::string hash;
+};
+
+/**
+ * @brief Group of tests which check starting resumption with different data
+ */
+
+TEST_F(ResumeCtrlTest, StartResumption_AppWithGrammarId) {
+ smart_objects::SmartObject saved_app;
+ saved_app[application_manager::strings::hash_id] = hash;
+ saved_app[application_manager::strings::grammar_id] = test_grammar_id;
+
+ // Check RestoreApplicationData
+ EXPECT_CALL(*mock_storage, GetSavedApplication(_, _, _))
+ .Times(3)
+ .WillRepeatedly(DoAll(SetArgReferee<2>(saved_app), Return(true)));
+ EXPECT_CALL(*app_mock, UpdateHash());
+ EXPECT_CALL(*app_mock, set_grammar_id(test_grammar_id));
+
+ bool res = res_ctrl.StartResumption(app_mock, hash);
+ EXPECT_TRUE(res);
+}
+
+MATCHER_P4(CheckAppFile, is_persistent, is_download, file_name, file_type, "") {
+ application_manager::AppFile app_file = arg;
+ return app_file.is_persistent == is_persistent &&
+ app_file.is_download_complete == is_download &&
+ app_file.file_name == file_name && app_file.file_type == file_type;
+}
+
+TEST_F(ResumeCtrlTest, StartResumption_WithoutGrammarId) {
+ smart_objects::SmartObject saved_app;
+ saved_app[application_manager::strings::hash_id] = hash;
+
+ // Check RestoreApplicationData
+ EXPECT_CALL(*mock_storage, GetSavedApplication(_, _, _))
+ .Times(3)
+ .WillRepeatedly(DoAll(SetArgReferee<2>(saved_app), Return(true)));
+ EXPECT_CALL(*app_mock, UpdateHash());
+ EXPECT_CALL(*app_mock, set_grammar_id(test_grammar_id)).Times(0);
+
+ bool res = res_ctrl.StartResumption(app_mock, hash);
+ EXPECT_FALSE(res);
+}
+
+TEST_F(ResumeCtrlTest, StartResumption_AppWithFiles) {
+ smart_objects::SmartObject test_application_files;
+ smart_objects::SmartObject test_file;
+ const uint32_t count_of_files = 8;
+
+ int file_types[count_of_files];
+ std::string file_names[count_of_files];
+ const size_t max_size = 12;
+ char numb[max_size];
+ for (uint32_t i = 0; i < count_of_files; i++) {
+ file_types[i] = i;
+ std::snprintf(numb, max_size, "%d", i);
+ file_names[i] = "test_file" + std::string(numb);
+ }
+
+ // Should not been added
+ test_file[application_manager::strings::persistent_file] = false;
+ test_application_files[0] = test_file;
+
+ for (uint32_t i = 0; i < count_of_files; ++i) {
+ test_file[application_manager::strings::persistent_file] = true;
+ test_file[application_manager::strings::is_download_complete] = true;
+ test_file[application_manager::strings::file_type] = file_types[i];
+ test_file[application_manager::strings::sync_file_name] = file_names[i];
+ test_application_files[i + 1] = test_file;
+ }
+
+ smart_objects::SmartObject saved_app;
+ saved_app[application_manager::strings::hash_id] = hash;
+ saved_app[application_manager::strings::grammar_id] = test_grammar_id;
+ saved_app[application_manager::strings::application_files] =
+ test_application_files;
+
+ // Check RestoreApplicationData
+ EXPECT_CALL(*mock_storage, GetSavedApplication(_, _, _))
+ .Times(3)
+ .WillRepeatedly(DoAll(SetArgReferee<2>(saved_app), Return(true)));
+ EXPECT_CALL(*app_mock, UpdateHash());
+ EXPECT_CALL(*app_mock, set_grammar_id(test_grammar_id));
+ for (uint32_t i = 0; i < count_of_files; ++i) {
+ EXPECT_CALL(*app_mock,
+ AddFile(CheckAppFile(
+ true, true, file_names[i],
+ static_cast<mobile_apis::FileType::eType>(file_types[i]))));
+ }
+
+ bool res = res_ctrl.StartResumption(app_mock, hash);
+ EXPECT_TRUE(res);
+}
+
+TEST_F(ResumeCtrlTest, StartResumption_AppWithSubmenues) {
+ smart_objects::SmartObject test_application_submenues;
+ smart_objects::SmartObject test_submenu;
+
+ const uint32_t count_of_submenues = 20;
+ for (uint32_t i = 0; i < count_of_submenues; ++i) {
+ test_submenu[application_manager::strings::menu_id] = i;
+ test_application_submenues[i] = test_submenu;
+ }
+
+ smart_objects::SmartObject saved_app;
+ saved_app[application_manager::strings::hash_id] = hash;
+ saved_app[application_manager::strings::grammar_id] = test_grammar_id;
+ saved_app[application_manager::strings::application_submenus] =
+ test_application_submenues;
+
+ // Check RestoreApplicationData
+ EXPECT_CALL(*mock_storage, GetSavedApplication(_, _, _))
+ .Times(3)
+ .WillRepeatedly(DoAll(SetArgReferee<2>(saved_app), Return(true)));
+
+ EXPECT_CALL(*app_mock, set_grammar_id(test_grammar_id));
+
+ for (uint32_t i = 0; i < count_of_submenues; ++i) {
+ EXPECT_CALL(*app_mock, AddSubMenu(i, test_application_submenues[i]));
+ }
+ smart_objects::SmartObjectList requests;
+ EXPECT_CALL(*application_manager::MockMessageHelper::message_helper_mock(),
+ CreateAddSubMenuRequestToHMI(_)).WillRepeatedly(Return(requests));
+
+ EXPECT_CALL(*app_mock, UpdateHash());
+ bool res = res_ctrl.StartResumption(app_mock, hash);
+ EXPECT_TRUE(res);
+}
+
+TEST_F(ResumeCtrlTest, StartResumption_AppWithCommands) {
+ smart_objects::SmartObject test_application_commands;
+ smart_objects::SmartObject test_commands;
+ const uint32_t count_of_commands = 20;
+
+ for (uint32_t i = 0; i < count_of_commands; ++i) {
+ test_commands[application_manager::strings::cmd_id] = i;
+ test_application_commands[i] = test_commands;
+ }
+
+ smart_objects::SmartObject saved_app;
+ saved_app[application_manager::strings::hash_id] = hash;
+ saved_app[application_manager::strings::grammar_id] = test_grammar_id;
+ saved_app[application_manager::strings::application_commands] =
+ test_application_commands;
+
+ // Check RestoreApplicationData
+ EXPECT_CALL(*mock_storage, GetSavedApplication(_, _, _))
+ .Times(3)
+ .WillRepeatedly(DoAll(SetArgReferee<2>(saved_app), Return(true)));
+ EXPECT_CALL(*app_mock, UpdateHash());
+ EXPECT_CALL(*app_mock, set_grammar_id(test_grammar_id));
+
+ for (uint32_t i = 0; i < count_of_commands; ++i) {
+ EXPECT_CALL(*app_mock, AddCommand(i, test_application_commands[i]));
+ }
+
+ smart_objects::SmartObjectList requests;
+ EXPECT_CALL(*application_manager::MockMessageHelper::message_helper_mock(),
+ CreateAddCommandRequestToHMI(_)).WillRepeatedly(Return(requests));
+
+ bool res = res_ctrl.StartResumption(app_mock, hash);
+ EXPECT_TRUE(res);
+}
+
+TEST_F(ResumeCtrlTest, StartResumption_AppWithChoiceSet) {
+ smart_objects::SmartObject application_choice_sets;
+ smart_objects::SmartObject app_choice_set;
+
+ const uint32_t count_of_choice = 10;
+ smart_objects::SmartObject choice_vector;
+ smart_objects::SmartObject choice;
+ const size_t max_size = 12;
+ char numb[max_size];
+ for (uint32_t i = 0; i < count_of_choice; ++i) {
+ std::snprintf(numb, max_size, "%d", i);
+ choice[application_manager::strings::vr_commands] =
+ "VrCommand" + std::string(numb);
+ choice[application_manager::strings::choice_id] = i;
+ choice_vector[i] = choice;
+ }
+ const uint32_t count_of_choice_sets = 5;
+ for (uint32_t i = 0; i < count_of_choice_sets; ++i) {
+ app_choice_set[application_manager::strings::interaction_choice_set_id] = i;
+ app_choice_set[application_manager::strings::choice_set] = choice_vector;
+ application_choice_sets[i] = app_choice_set;
+ }
+
+ smart_objects::SmartObject saved_app;
+ saved_app[application_manager::strings::hash_id] = hash;
+ saved_app[application_manager::strings::grammar_id] = test_grammar_id;
+ saved_app[application_manager::strings::application_choice_sets] =
+ application_choice_sets;
+
+ // Check RestoreApplicationData
+ EXPECT_CALL(*mock_storage, GetSavedApplication(_, _, _))
+ .Times(3)
+ .WillRepeatedly(DoAll(SetArgReferee<2>(saved_app), Return(true)));
+ EXPECT_CALL(*app_mock, UpdateHash());
+ EXPECT_CALL(*app_mock, set_grammar_id(test_grammar_id));
+
+ for (uint32_t i = 0; i < count_of_choice_sets; ++i) {
+ EXPECT_CALL(*app_mock, AddChoiceSet(i, application_choice_sets[i]));
+ }
+
+ smart_objects::SmartObjectList requests;
+ EXPECT_CALL(*application_manager::MockMessageHelper::message_helper_mock(),
+ CreateAddVRCommandRequestFromChoiceToHMI(_))
+ .WillRepeatedly(Return(requests));
+
+ bool res = res_ctrl.StartResumption(app_mock, hash);
+ EXPECT_TRUE(res);
+}
+
+TEST_F(ResumeCtrlTest, StartResumption_AppWithGlobalProperties) {
+ // Prepare Data
+ smart_objects::SmartObject test_global_properties;
+ smart_objects::SmartObject saved_app;
+ saved_app[application_manager::strings::hash_id] = hash;
+ saved_app[application_manager::strings::grammar_id] = test_grammar_id;
+ saved_app[application_manager::strings::application_global_properties] =
+ test_global_properties;
+
+ // Check RestoreApplicationData
+ EXPECT_CALL(*mock_storage, GetSavedApplication(_, _, _))
+ .Times(3)
+ .WillRepeatedly(DoAll(SetArgReferee<2>(saved_app), Return(true)));
+
+ EXPECT_CALL(*app_mock, set_grammar_id(test_grammar_id));
+
+ EXPECT_CALL(*application_manager::MockMessageHelper::message_helper_mock(),
+ SendGlobalPropertiesToHMI(_));
+
+ EXPECT_CALL(*app_mock, load_global_properties(test_global_properties));
+
+ EXPECT_CALL(*app_mock, UpdateHash());
+ bool res = res_ctrl.StartResumption(app_mock, hash);
+ EXPECT_TRUE(res);
+}
+
+TEST_F(ResumeCtrlTest, StartResumption_AppWithSubscribeOnButtons) {
+ // Prepare Data
+ smart_objects::SmartObject test_subscriptions;
+ smart_objects::SmartObject app_buttons;
+
+ uint32_t count_of_buttons = 17;
+ for (uint32_t i = 0; i < count_of_buttons; ++i) {
+ app_buttons[i] = i;
+ }
+
+ test_subscriptions[application_manager::strings::application_buttons] =
+ app_buttons;
+
+ smart_objects::SmartObject saved_app;
+ saved_app[application_manager::strings::hash_id] = hash;
+ saved_app[application_manager::strings::grammar_id] = test_grammar_id;
+ saved_app[application_manager::strings::application_subscribtions] =
+ test_subscriptions;
+
+ // Check RestoreApplicationData
+ EXPECT_CALL(*mock_storage, GetSavedApplication(_, _, _))
+ .Times(3)
+ .WillRepeatedly(DoAll(SetArgReferee<2>(saved_app), Return(true)));
+
+ EXPECT_CALL(*app_mock, set_grammar_id(test_grammar_id));
+
+ for (uint32_t i = 0; i < count_of_buttons; ++i) {
+ EXPECT_CALL(*app_mock, SubscribeToButton(
+ static_cast<mobile_apis::ButtonName::eType>(i)));
+ }
+ EXPECT_CALL(*app_mock, UpdateHash());
+
+ EXPECT_CALL(*application_manager::MockMessageHelper::message_helper_mock(),
+ SendAllOnButtonSubscriptionNotificationsForApp(_)).Times(2);
+
+ bool res = res_ctrl.StartResumption(app_mock, hash);
+ EXPECT_TRUE(res);
+}
+
+TEST_F(ResumeCtrlTest, StartResumption_AppWithSubscriptionToIVI) {
+ // Prepare Data
+ smart_objects::SmartObject test_subscriptions;
+ smart_objects::SmartObject app_vi;
+
+ int vtype = application_manager::VehicleDataType::GPS;
+ uint i = 0;
+ for (; vtype < application_manager::VehicleDataType::STEERINGWHEEL;
+ ++i, ++vtype) {
+ app_vi[i] = vtype;
+ }
+
+ test_subscriptions[application_manager::strings::application_vehicle_info] =
+ app_vi;
+
+ smart_objects::SmartObject saved_app;
+ saved_app[application_manager::strings::hash_id] = hash;
+ saved_app[application_manager::strings::grammar_id] = test_grammar_id;
+ saved_app[application_manager::strings::application_subscribtions] =
+ test_subscriptions;
+
+ // Check RestoreApplicationData
+ EXPECT_CALL(*mock_storage, GetSavedApplication(_, _, _))
+ .Times(3)
+ .WillRepeatedly(DoAll(SetArgReferee<2>(saved_app), Return(true)));
+
+ EXPECT_CALL(*app_mock, set_grammar_id(test_grammar_id));
+
+ for (size_t i = 0; i < app_vi.length(); ++i) {
+ EXPECT_CALL(
+ *app_mock,
+ SubscribeToIVI(static_cast<application_manager::VehicleDataType>(i)));
+ }
+
+ ON_CALL(*app_mock, app_id()).WillByDefault(Return(test_app_id));
+
+ smart_objects::SmartObjectList requests;
+ EXPECT_CALL(*application_manager::MockMessageHelper::message_helper_mock(),
+ GetIVISubscriptionRequests(_)).WillRepeatedly(Return(requests));
+
+ EXPECT_CALL(*app_mock, UpdateHash());
+ bool res = res_ctrl.StartResumption(app_mock, hash);
+ EXPECT_TRUE(res);
+}
+
+TEST_F(ResumeCtrlTest, StartResumptionOnlyHMILevel) {
+ smart_objects::SmartObject saved_app;
+ ON_CALL(*app_mock, is_media_application()).WillByDefault(Return(false));
+
+ ON_CALL(*app_mock, device()).WillByDefault(Return(test_dev_id));
+ EXPECT_CALL(*app_mngr, active_application()).WillOnce(Return(app_mock));
+ ON_CALL(*app_mock, policy_app_id()).WillByDefault(Return(test_policy_app_id));
+ EXPECT_CALL(*mock_storage, GetSavedApplication(test_policy_app_id, _, _))
+ .WillOnce(DoAll(SetArgReferee<2>(saved_app), Return(true)));
+
+ EXPECT_CALL(*app_mngr, GetDefaultHmiLevel(_))
+ .Times(3)
+ .WillRepeatedly(Return(default_testType));
+ ON_CALL(*app_mock, app_id()).WillByDefault(Return(test_app_id));
+ EXPECT_CALL(*app_mngr, SetState(test_app_id, default_testType,
+ test_audio_state)).Times(2);
+ bool res = res_ctrl.StartResumptionOnlyHMILevel(app_mock);
+ EXPECT_TRUE(res);
+}
+
+TEST_F(ResumeCtrlTest, StartAppHmiStateResumption_AppInFull) {
+ mobile_apis::HMILevel::eType restored_testType = eType::HMI_FULL;
+ uint32_t ign_off_count = 0;
+ smart_objects::SmartObject saved_app;
+ saved_app[application_manager::strings::ign_off_count] = ign_off_count;
+ saved_app[application_manager::strings::hmi_level] = restored_testType;
+
+ ON_CALL(*app_mock, is_media_application()).WillByDefault(Return(true));
+
+ ON_CALL(*app_mock, policy_app_id()).WillByDefault(Return(test_policy_app_id));
+ ON_CALL(*app_mock, device()).WillByDefault(Return(test_dev_id));
+ EXPECT_CALL(*app_mngr,
+ SetHmiState(test_app_id, restored_testType)).Times(AtLeast(1));
+ ON_CALL(*app_mock, app_id()).WillByDefault(Return(test_app_id));
+ EXPECT_CALL(*mock_storage, GetSavedApplication(test_policy_app_id, _, _))
+ .Times(2)
+ .WillRepeatedly(DoAll(SetArgReferee<2>(saved_app), Return(true)));
+
+ EXPECT_CALL(*app_mngr, GetDefaultHmiLevel(_))
+ .WillOnce(Return(default_testType));
+
+ EXPECT_CALL(*mock_storage, RemoveApplicationFromSaved(_, _))
+ .WillOnce(Return(true));
+
+ EXPECT_CALL(*app_mngr, GetUserConsentForDevice("12345"))
+ .WillRepeatedly(Return(policy::kDeviceAllowed));
+ EXPECT_CALL(*app_mngr, active_application()).WillOnce(Return(app_mock));
+ EXPECT_CALL(*app_mngr,
+ SetState(test_app_id, default_testType, test_audio_state));
+ EXPECT_CALL(*app_mngr, IsAppTypeExistsInFullOrLimited(_))
+ .WillOnce(Return(true));
+
+ res_ctrl.StartAppHmiStateResumption(app_mock);
+}
+
+TEST_F(ResumeCtrlTest, StartAppHmiStateResumption_AppInBackground) {
+ uint32_t ign_off_count = 0;
+ smart_objects::SmartObject saved_app;
+
+ mobile_apis::HMILevel::eType restored_testType = eType::HMI_BACKGROUND;
+ saved_app[application_manager::strings::ign_off_count] = ign_off_count;
+ saved_app[application_manager::strings::hmi_level] = restored_testType;
+
+ ON_CALL(*app_mock, policy_app_id()).WillByDefault(Return(test_policy_app_id));
+ ON_CALL(*app_mock, device()).WillByDefault(Return(test_dev_id));
+ EXPECT_CALL(*mock_storage, GetSavedApplication(test_policy_app_id, _, _))
+ .WillRepeatedly(DoAll(SetArgReferee<2>(saved_app), Return(true)));
+
+ EXPECT_CALL(*app_mngr, GetDefaultHmiLevel(_))
+ .WillOnce(Return(default_testType));
+
+ EXPECT_CALL(*app_mngr, GetUserConsentForDevice("12345"))
+ .WillOnce(Return(policy::kDeviceAllowed));
+ EXPECT_CALL(*app_mngr, active_application()).WillOnce(Return(app_mock));
+ EXPECT_CALL(*app_mngr,
+ SetState(test_app_id, default_testType, test_audio_state));
+ EXPECT_CALL(*app_mngr, IsAppTypeExistsInFullOrLimited(_))
+ .WillOnce(Return(true));
+
+ res_ctrl.StartAppHmiStateResumption(app_mock);
+}
+
+/**
+ * @brief Group of tests which check restoring resumption with different data
+ */
+
+TEST_F(ResumeCtrlTest, RestoreAppHMIState_RestoreHMILevelFull) {
+ mobile_apis::HMILevel::eType restored_testType = eType::HMI_FULL;
+
+ smart_objects::SmartObject saved_app;
+ saved_app[application_manager::strings::hash_id] = hash;
+ saved_app[application_manager::strings::grammar_id] = test_grammar_id;
+ saved_app[application_manager::strings::hmi_level] = restored_testType;
+
+ ON_CALL(*app_mock, device()).WillByDefault(Return(test_dev_id));
+ ON_CALL(*app_mock, policy_app_id()).WillByDefault(Return(test_policy_app_id));
+ EXPECT_CALL(*mock_storage, GetSavedApplication(_, _, _))
+ .WillOnce(DoAll(SetArgReferee<2>(saved_app), Return(true)));
+ ON_CALL(*app_mock, device()).WillByDefault(Return(test_dev_id));
+
+ EXPECT_CALL(*app_mngr, GetUserConsentForDevice(""))
+ .WillOnce(Return(policy::kDeviceAllowed));
+ EXPECT_CALL(*app_mngr, IsAppTypeExistsInFullOrLimited(_))
+ .WillRepeatedly(Return(false));
+
+ utils::SharedPtr<application_manager::Application> null_app;
+ EXPECT_CALL(*app_mngr, active_application()).WillOnce(Return(null_app));
+
+ ON_CALL(*app_mock, is_media_application()).WillByDefault(Return(false));
+ ON_CALL(*app_mock, app_id()).WillByDefault(Return(test_app_id));
+
+ EXPECT_CALL(*app_mngr,
+ SetState(test_app_id, restored_testType, test_audio_state));
+
+ bool res = res_ctrl.RestoreAppHMIState(app_mock);
+ EXPECT_TRUE(res);
+}
+
+TEST_F(ResumeCtrlTest, SetupDefaultHMILevel) {
+ smart_objects::SmartObject saved_app;
+
+ saved_app[application_manager::strings::hmi_level] = default_testType;
+
+ EXPECT_CALL(*app_mngr, GetDefaultHmiLevel(_))
+ .WillRepeatedly(Return(default_testType));
+
+ ON_CALL(*app_mock, device()).WillByDefault(Return(test_dev_id));
+ EXPECT_CALL(*app_mngr, GetUserConsentForDevice("")).Times(0);
+ EXPECT_CALL(*app_mngr, IsAppTypeExistsInFullOrLimited(_))
+ .WillOnce(Return(true));
+ EXPECT_CALL(*app_mngr, active_application()).WillOnce(Return(app_mock));
+ EXPECT_CALL(*app_mngr, GetDefaultHmiLevel(_))
+ .WillOnce(Return(default_testType));
+ EXPECT_CALL(*app_mngr,
+ SetHmiState(test_app_id, default_testType)).Times(AtLeast(1));
+
+ ON_CALL(*app_mock, is_media_application()).WillByDefault(Return(false));
+
+ ON_CALL(*app_mock, app_id()).WillByDefault(Return(test_app_id));
+ EXPECT_CALL(*app_mngr, SetState(test_app_id, default_testType,
+ test_audio_state)).Times(2);
+
+ res_ctrl.SetupDefaultHMILevel(app_mock);
+}
+
+/**
+ * @brief group of tests which check correct SetAppHMIState
+*/
+
+TEST_F(ResumeCtrlTest, SetAppHMIState_HMINone_NotMedia_WithoutCheckPolicy) {
+ ON_CALL(*app_mock, device()).WillByDefault(Return(test_dev_id));
+ EXPECT_CALL(*app_mngr, GetUserConsentForDevice("")).Times(0);
+ EXPECT_CALL(*app_mngr, IsAppTypeExistsInFullOrLimited(_))
+ .WillOnce(Return(true));
+ EXPECT_CALL(*app_mngr, active_application()).WillOnce(Return(app_mock));
+ EXPECT_CALL(*app_mngr, GetDefaultHmiLevel(_))
+ .WillOnce(Return(default_testType));
+
+ ON_CALL(*app_mock, is_media_application()).WillByDefault(Return(false));
+
+ ON_CALL(*app_mock, app_id()).WillByDefault(Return(test_app_id));
+ EXPECT_CALL(*app_mngr, SetState(test_app_id, default_testType,
+ test_audio_state)).Times(2);
+
+ bool res = res_ctrl.SetAppHMIState(app_mock, default_testType, false);
+ EXPECT_TRUE(res);
+}
+
+// TODO(VVeremjova) APPLINK-16718
+TEST_F(ResumeCtrlTest,
+ DISABLED_SetAppHMIState_HMILimited_NotMedia_WithoutCheckPolicy) {
+ mobile_apis::HMILevel::eType testType = eType::HMI_LIMITED;
+
+ ON_CALL(*app_mock, device()).WillByDefault(Return(test_dev_id));
+
+ ON_CALL(*app_mock, app_id()).WillByDefault(Return(test_app_id));
+ ON_CALL(*app_mock, is_media_application()).WillByDefault(Return(false));
+ ON_CALL(*app_mock, app_id()).WillByDefault(Return(test_app_id));
+
+ EXPECT_CALL(*app_mngr, GetUserConsentForDevice(""))
+ .WillRepeatedly(Return(policy::DeviceConsent::kDeviceAllowed));
+ EXPECT_CALL(*app_mngr, SetState(test_app_id, testType, test_audio_state));
+
+ bool res = res_ctrl.SetAppHMIState(app_mock, testType, false);
+ EXPECT_TRUE(res);
+}
+
+TEST_F(ResumeCtrlTest, SetAppHMIState_HMIFull_NotMedia_WithoutCheckPolicy) {
+ mobile_apis::HMILevel::eType testType = eType::HMI_FULL;
+ ::testing::InSequence seq;
+ ON_CALL(*app_mock, device()).WillByDefault(Return(test_dev_id));
+ EXPECT_CALL(*app_mngr, IsAppTypeExistsInFullOrLimited(_))
+ .WillOnce(Return(false));
+
+ // Only mocked application is exist
+ utils::SharedPtr<application_manager::Application> null_app;
+ EXPECT_CALL(*app_mngr, active_application()).WillOnce(Return(null_app));
+
+ ON_CALL(*app_mock, is_media_application()).WillByDefault(Return(false));
+
+ // GetDefaultHmiLevel should not be called
+ EXPECT_CALL(*app_mngr, GetDefaultHmiLevel(_)).Times(0);
+ ON_CALL(*app_mock, app_id()).WillByDefault(Return(test_app_id));
+
+ EXPECT_CALL(*app_mngr, SetState(test_app_id, testType, test_audio_state));
+
+ EXPECT_CALL(*app_mngr, GetUserConsentForDevice("")).Times(0);
+ bool res = res_ctrl.SetAppHMIState(app_mock, testType, false);
+ EXPECT_TRUE(res);
+}
+
+TEST_F(ResumeCtrlTest,
+ SetAppHMIState_HMIFull_NotMedia_WithoutPolicy_AnotherFullActiveExists) {
+ mobile_apis::HMILevel::eType testType = eType::HMI_FULL;
+ ::testing::InSequence seq;
+ ON_CALL(*app_mock, device()).WillByDefault(Return(test_dev_id));
+ EXPECT_CALL(*app_mngr, IsAppTypeExistsInFullOrLimited(_))
+ .WillOnce(Return(false));
+
+ EXPECT_CALL(*app_mngr, active_application()).WillOnce(Return(app_mock));
+ EXPECT_CALL(*app_mngr, GetDefaultHmiLevel(_))
+ .WillOnce(Return(default_testType));
+
+ ON_CALL(*app_mock, is_media_application()).WillByDefault(Return(false));
+
+ ON_CALL(*app_mock, app_id()).WillByDefault(Return(test_app_id));
+
+ // Expect set default HMI state
+ EXPECT_CALL(*app_mngr,
+ SetState(test_app_id, default_testType, test_audio_state));
+
+ EXPECT_CALL(*app_mngr, GetUserConsentForDevice("")).Times(0);
+ bool res = res_ctrl.SetAppHMIState(app_mock, testType, false);
+ EXPECT_TRUE(res);
+}
+
+TEST_F(ResumeCtrlTest,
+ SetAppHMIState_HMIFull_MediaAudio_WithoutPolicy_AnotherActiveAppExists) {
+ mobile_apis::HMILevel::eType testType = eType::HMI_FULL;
+
+ // In case application is media, audio state will be AUDIBLE
+ test_audio_state = mobile_apis::AudioStreamingState::AUDIBLE;
+ ON_CALL(*app_mock, device()).WillByDefault(Return(test_dev_id));
+
+ // Only our app in FULL
+ EXPECT_CALL(*app_mngr, IsAppTypeExistsInFullOrLimited(_))
+ .WillOnce(Return(false));
+
+ // Active app exists
+ EXPECT_CALL(*app_mngr, active_application()).WillOnce(Return(app_mock));
+
+ EXPECT_CALL(*app_mngr, GetDefaultHmiLevel(_)).Times(0);
+ ON_CALL(*app_mock, app_id()).WillByDefault(Return(test_app_id));
+
+ ON_CALL(*app_mock, is_media_application()).WillByDefault(Return(true));
+ ON_CALL(*app_mock, app_id()).WillByDefault(Return(test_app_id));
+
+ mobile_apis::HMILevel::eType expected_testType = eType::HMI_LIMITED;
+ EXPECT_CALL(*app_mngr,
+ SetState(test_app_id, expected_testType, test_audio_state));
+
+ EXPECT_CALL(*app_mngr, GetUserConsentForDevice("")).Times(0);
+ bool res = res_ctrl.SetAppHMIState(app_mock, testType, false);
+ EXPECT_TRUE(res);
+}
+
+TEST_F(ResumeCtrlTest, SetAppHMIState_HMIFull_Media_WithoutPolicy_FullExists) {
+ default_testType = eType::HMI_FULL;
+
+ // In case application is media, audio state will be AUDIBLE
+ test_audio_state = mobile_apis::AudioStreamingState::AUDIBLE;
+ ::testing::InSequence seq;
+ ON_CALL(*app_mock, device()).WillByDefault(Return(test_dev_id));
+ EXPECT_CALL(*app_mngr, IsAppTypeExistsInFullOrLimited(_))
+ .WillOnce(Return(true));
+ EXPECT_CALL(*app_mngr, active_application()).WillOnce(Return(app_mock));
+ EXPECT_CALL(*app_mngr, GetDefaultHmiLevel(_))
+ .WillOnce(Return(default_testType));
+
+ ON_CALL(*app_mock, is_media_application()).WillByDefault(Return(true));
+
+ ON_CALL(*app_mock, app_id()).WillByDefault(Return(test_app_id));
+ EXPECT_CALL(*app_mngr,
+ SetState(test_app_id, default_testType, test_audio_state));
+
+ EXPECT_CALL(*app_mngr, GetUserConsentForDevice("")).Times(0);
+ bool res = res_ctrl.SetAppHMIState(app_mock, default_testType, false);
+ EXPECT_TRUE(res);
+}
+
+TEST_F(ResumeCtrlTest, SetAppHMIState_HMIFull_NotMedia_WithPolicy_DevAllowed) {
+ mobile_apis::HMILevel::eType testType = eType::HMI_FULL;
+
+ ON_CALL(*app_mock, device()).WillByDefault(Return(test_dev_id));
+
+ EXPECT_CALL(*app_mngr, GetUserConsentForDevice("12345"))
+ .WillOnce(Return(policy::kDeviceAllowed));
+
+ EXPECT_CALL(*app_mngr, IsAppTypeExistsInFullOrLimited(_))
+ .WillOnce(Return(true));
+ EXPECT_CALL(*app_mngr, active_application()).WillOnce(Return(app_mock));
+ EXPECT_CALL(*app_mngr, GetDefaultHmiLevel(_))
+ .WillOnce(Return(default_testType));
+
+ ON_CALL(*app_mock, is_media_application()).WillByDefault(Return(false));
+
+ ON_CALL(*app_mock, app_id()).WillByDefault(Return(test_app_id));
+ EXPECT_CALL(*app_mngr,
+ SetState(test_app_id, default_testType, test_audio_state));
+
+ bool res = res_ctrl.SetAppHMIState(app_mock, testType, true);
+ EXPECT_TRUE(res);
+}
+
+TEST_F(ResumeCtrlTest, SetAppHMIState_HMIFull_Media_WithCheckPolicy) {
+ mobile_apis::HMILevel::eType testType = eType::HMI_FULL;
+
+ // In case application is media, audio state will be AUDIBLE
+ test_audio_state = mobile_apis::AudioStreamingState::AUDIBLE;
+ ::testing::InSequence seq;
+ ON_CALL(*app_mock, device()).WillByDefault(Return(test_dev_id));
+
+ // App is allowed
+ EXPECT_CALL(*app_mngr, GetUserConsentForDevice("12345"))
+ .WillOnce(Return(policy::kDeviceAllowed));
+ EXPECT_CALL(*app_mngr, IsAppTypeExistsInFullOrLimited(_))
+ .WillOnce(Return(false));
+ EXPECT_CALL(*app_mngr, active_application()).WillOnce(Return(app_mock));
+ EXPECT_CALL(*app_mngr, GetDefaultHmiLevel(_)).Times(0);
+ ON_CALL(*app_mock, app_id()).WillByDefault(Return(test_app_id));
+
+ ON_CALL(*app_mock, is_media_application()).WillByDefault(Return(true));
+
+ ON_CALL(*app_mock, app_id()).WillByDefault(Return(test_app_id));
+
+ mobile_apis::HMILevel::eType expected_testType = eType::HMI_LIMITED;
+ EXPECT_CALL(*app_mngr,
+ SetState(test_app_id, expected_testType, test_audio_state));
+
+ bool res = res_ctrl.SetAppHMIState(app_mock, testType, true);
+ EXPECT_TRUE(res);
+}
+
+TEST_F(ResumeCtrlTest, SetAppHMIState_HMIFull_Media_WithPolicy_DevDisallowed) {
+ mobile_apis::HMILevel::eType testType = eType::HMI_FULL;
+
+ ::testing::InSequence seq;
+ ON_CALL(*app_mock, device()).WillByDefault(Return(test_dev_id));
+ EXPECT_CALL(*app_mngr, GetUserConsentForDevice("12345"))
+ .WillOnce(Return(policy::kDeviceDisallowed));
+
+ EXPECT_CALL(*app_mngr, GetDefaultHmiLevel(_))
+ .WillOnce(Return(default_testType));
+ ON_CALL(*app_mock, device()).WillByDefault(Return(test_dev_id));
+ ON_CALL(*app_mock, is_media_application()).WillByDefault(Return(true));
+ ON_CALL(*app_mock, app_id()).WillByDefault(Return(test_app_id));
+ EXPECT_CALL(*app_mngr,
+ SetState(test_app_id, default_testType, test_audio_state));
+
+ bool res = res_ctrl.SetAppHMIState(app_mock, testType, true);
+ EXPECT_FALSE(res);
+}
+
+TEST_F(ResumeCtrlTest, SaveApplication) {
+ utils::SharedPtr<application_manager::Application> app_sh_mock =
+ new ApplicationMock();
+
+ EXPECT_CALL(*mock_storage, SaveApplication(app_sh_mock));
+ res_ctrl.SaveApplication(app_sh_mock);
+}
+
+TEST_F(ResumeCtrlTest, OnAppActivated_ResumptionHasStarted) {
+ ::profile::Profile::instance()->config_file_name("smartDeviceLink_test.ini");
+
+ smart_objects::SmartObject saved_app;
+ EXPECT_CALL(*app_mngr, GetDefaultHmiLevel(_))
+ .WillOnce(Return(default_testType));
+ ON_CALL(*app_mock, device()).WillByDefault(Return(test_dev_id));
+ ON_CALL(*app_mock, is_media_application()).WillByDefault(Return(false));
+ ON_CALL(*app_mock, app_id()).WillByDefault(Return(test_app_id));
+ EXPECT_CALL(*app_mngr,
+ SetState(test_app_id, default_testType, test_audio_state));
+ ON_CALL(*app_mock, device()).WillByDefault(Return(test_dev_id));
+ ON_CALL(*app_mock, policy_app_id()).WillByDefault(Return(test_policy_app_id));
+ EXPECT_CALL(*mock_storage, GetSavedApplication(test_policy_app_id, _, _))
+ .WillOnce(DoAll(SetArgReferee<2>(saved_app), Return(true)));
+ ON_CALL(*app_mock, app_id()).WillByDefault(Return(test_app_id));
+
+ bool res = res_ctrl.StartResumptionOnlyHMILevel(app_mock);
+ EXPECT_TRUE(res);
+
+ utils::SharedPtr<ApplicationMock> app_sh_mock = new ApplicationMock();
+
+ EXPECT_CALL(*app_sh_mock, app_id()).WillOnce(Return(test_app_id));
+ res_ctrl.OnAppActivated(app_sh_mock);
+}
+
+TEST_F(ResumeCtrlTest, OnAppActivated_ResumptionNotActive) {
+ utils::SharedPtr<ApplicationMock> app_sh_mock = new ApplicationMock();
+ EXPECT_CALL(*app_sh_mock, app_id()).Times(0);
+ res_ctrl.OnAppActivated(app_sh_mock);
+}
+
+TEST_F(ResumeCtrlTest, IsHMIApplicationIdExist) {
+ uint32_t hmi_app_id = 10;
+
+ EXPECT_CALL(*mock_storage, IsHMIApplicationIdExist(hmi_app_id))
+ .WillOnce(Return(true));
+ EXPECT_TRUE(res_ctrl.IsHMIApplicationIdExist(hmi_app_id));
+}
+
+TEST_F(ResumeCtrlTest, GetHMIApplicationID) {
+ uint32_t hmi_app_id = 10;
+ std::string device_id = "test_device_id";
+
+ EXPECT_CALL(*mock_storage, GetHMIApplicationID(test_policy_app_id, device_id))
+ .WillOnce(Return(hmi_app_id));
+ EXPECT_EQ(hmi_app_id,
+ res_ctrl.GetHMIApplicationID(test_policy_app_id, device_id));
+}
+
+TEST_F(ResumeCtrlTest, IsApplicationSaved) {
+ std::string policy_app_id = "policy_app_id";
+ std::string device_id = "device_id";
+
+ EXPECT_CALL(*mock_storage, IsApplicationSaved(policy_app_id, device_id))
+ .WillOnce(Return(true));
+ EXPECT_TRUE(res_ctrl.IsApplicationSaved(policy_app_id, device_id));
+}
+
+TEST_F(ResumeCtrlTest, CheckPersistenceFiles_WithoutCommandAndChoiceSets) {
+ uint32_t ign_off_count = 0;
+ smart_objects::SmartObject saved_app;
+ saved_app[application_manager::strings::ign_off_count] = ign_off_count;
+ saved_app[application_manager::strings::hmi_level] = HMI_FULL;
+
+ ON_CALL(*app_mock, policy_app_id()).WillByDefault(Return(test_policy_app_id));
+ ON_CALL(*app_mock, device()).WillByDefault(Return(test_dev_id));
+
+ EXPECT_CALL(*mock_storage, GetSavedApplication(_, _, _))
+ .WillOnce(DoAll(SetArgReferee<2>(saved_app), Return(true)));
+
+ EXPECT_TRUE(res_ctrl.CheckPersistenceFilesForResumption(app_mock));
+}
+
+TEST_F(ResumeCtrlTest, CheckPersistenceFilesForResumption_WithCommands) {
+ smart_objects::SmartObject test_application_commands;
+ uint32_t ign_off_count = 0;
+ smart_objects::SmartObject saved_app;
+ saved_app[application_manager::strings::ign_off_count] = ign_off_count;
+ saved_app[application_manager::strings::hmi_level] = HMI_FULL;
+ saved_app[application_manager::strings::application_commands] =
+ test_application_commands;
+
+ ON_CALL(*app_mock, policy_app_id()).WillByDefault(Return(test_policy_app_id));
+ ON_CALL(*app_mock, device()).WillByDefault(Return(test_dev_id));
+
+ EXPECT_CALL(*mock_storage, GetSavedApplication(_, _, _))
+ .WillOnce(DoAll(SetArgReferee<2>(saved_app), Return(true)));
+
+ EXPECT_CALL(*application_manager::MockMessageHelper::message_helper_mock(),
+ VerifyImageFiles(_, _))
+ .WillRepeatedly(Return(mobile_apis::Result::SUCCESS));
+
+ EXPECT_TRUE(res_ctrl.CheckPersistenceFilesForResumption(app_mock));
+}
+
+TEST_F(ResumeCtrlTest, CheckPersistenceFilesForResumption_WithChoiceSet) {
+ smart_objects::SmartObject test_choice_sets;
+ uint32_t ign_off_count = 0;
+ smart_objects::SmartObject saved_app;
+ saved_app[application_manager::strings::ign_off_count] = ign_off_count;
+ saved_app[application_manager::strings::hmi_level] = HMI_FULL;
+ saved_app[application_manager::strings::application_choice_sets] =
+ test_choice_sets;
+
+ ON_CALL(*app_mock, policy_app_id()).WillByDefault(Return(test_policy_app_id));
+ ON_CALL(*app_mock, device()).WillByDefault(Return(test_dev_id));
+
+ EXPECT_CALL(*mock_storage, GetSavedApplication(_, _, _))
+ .WillOnce(DoAll(SetArgReferee<2>(saved_app), Return(true)));
+
+ EXPECT_TRUE(res_ctrl.CheckPersistenceFilesForResumption(app_mock));
+}
+
+// TODO (VVeremjova) APPLINK-16718
+TEST_F(ResumeCtrlTest, DISABLED_OnSuspend) {
+ EXPECT_CALL(*mock_storage, OnSuspend());
+ res_ctrl.OnSuspend();
+}
+
+TEST_F(ResumeCtrlTest, OnAwake) {
+ EXPECT_CALL(*mock_storage, OnAwake());
+ res_ctrl.OnAwake();
+}
+
+TEST_F(ResumeCtrlTest, RemoveApplicationFromSaved) {
+ ON_CALL(*app_mock, device()).WillByDefault(Return(test_dev_id));
+ ON_CALL(*app_mock, policy_app_id()).WillByDefault(Return(test_policy_app_id));
+ EXPECT_CALL(*mock_storage, RemoveApplicationFromSaved(_, _))
+ .WillOnce(Return(true));
+ EXPECT_TRUE(res_ctrl.RemoveApplicationFromSaved(app_mock));
+}
+
+TEST_F(ResumeCtrlTest, CheckApplicationHash) {
+ smart_objects::SmartObject saved_app;
+
+ std::string test_hash = "saved_hash";
+ saved_app[application_manager::strings::hash_id] = test_hash;
+
+ ON_CALL(*app_mock, device()).WillByDefault(Return(test_dev_id));
+ ON_CALL(*app_mock, policy_app_id()).WillByDefault(Return(test_policy_app_id));
+ EXPECT_CALL(*mock_storage, GetSavedApplication(test_policy_app_id, _, _))
+ .WillRepeatedly(DoAll(SetArgReferee<2>(saved_app), Return(true)));
+ EXPECT_TRUE(res_ctrl.CheckApplicationHash(app_mock, test_hash));
+}
+
+} // namespace resumption_test
+} // namespace components
+} // namespace test
diff --git a/src/components/application_manager/test/resumption/resumption_data_db_test.cc b/src/components/application_manager/test/resumption/resumption_data_db_test.cc
new file mode 100644
index 000000000..a6ced1434
--- /dev/null
+++ b/src/components/application_manager/test/resumption/resumption_data_db_test.cc
@@ -0,0 +1,837 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <string>
+#include <algorithm>
+#include "gtest/gtest.h"
+#include "include/application_mock.h"
+#include "interfaces/MOBILE_API.h"
+#include "sql_database.h"
+#include "sql_query.h"
+
+#include "application_manager/application_manager_impl.h"
+#include "config_profile/profile.h"
+#include "utils/file_system.h"
+#include "include/resumption_data_test.h"
+
+#include "application_manager/resumption/resumption_sql_queries.h"
+#include "application_manager/resumption/resumption_data_db.h"
+
+namespace test {
+namespace components {
+namespace resumption_test {
+
+using ::testing::NiceMock;
+
+namespace am = application_manager;
+using namespace file_system;
+
+using namespace resumption;
+using namespace mobile_apis;
+
+class TestResumptionDataDB : public ResumptionDataDB {
+ public:
+ utils::dbms::SQLDatabase* get_db_handle() { return db(); }
+
+ TestResumptionDataDB(DbStorage db_storage) : ResumptionDataDB(db_storage) {}
+};
+
+class ResumptionDataDBTest : public ResumptionDataTest {
+ protected:
+ virtual void SetUp() {
+ app_mock = new NiceMock<ApplicationMock>();
+ policy_app_id_ = "test_policy_app_id";
+ app_id_ = 10;
+ is_audio_ = true;
+ hash_ = "saved_hash";
+ hmi_level_ = HMILevel::eType::HMI_FULL;
+ hmi_app_id_ = 8;
+ ign_off_count_ = 0;
+ grammar_id_ = 16;
+ }
+ virtual void TearDown() {
+ utils::dbms::SQLQuery query(test_db());
+ EXPECT_TRUE(query.Prepare(remove_all_tables));
+ EXPECT_TRUE(query.Exec());
+ }
+
+ static void SetUpTestCase() {
+ kDatabaseName = "resumption";
+ if (is_in_file) {
+ ::profile::Profile::instance()->config_file_name(
+ "smartDeviceLink_test.ini");
+ path_ = profile::Profile::instance()->app_storage_folder();
+ CreateDirectory("./" + path_);
+ test_db_ = new utils::dbms::SQLDatabase(kDatabaseName);
+ test_db_->set_path(path_ + "/");
+ res_db_ = new TestResumptionDataDB(In_File_Storage);
+ } else {
+ res_db_ = new TestResumptionDataDB(In_Memory_Storage);
+ test_db_ = res_db_->get_db_handle();
+ }
+
+ EXPECT_TRUE(test_db_->Open());
+ EXPECT_TRUE(test_db_->IsReadWrite());
+ }
+
+ static utils::dbms::SQLDatabase* test_db_;
+ static std::string kDatabaseName;
+ static std::string path_;
+
+ static void TearDownTestCase() {
+ test_db_->Close();
+ if (is_in_file) {
+ ::profile::Profile::instance()->config_file_name("smartDeviceLink.ini");
+ RemoveDirectory("./" + path_, true);
+ }
+ delete res_db_;
+ }
+
+ utils::dbms::SQLDatabase* test_db() { return test_db_; }
+ std::string path() { return path_; }
+
+ void SetZeroIgnOffTime() {
+ utils::dbms::SQLQuery query(test_db());
+ EXPECT_TRUE(query.Prepare(KUpdateLastIgnOffTime));
+ query.Bind(0, 0);
+ EXPECT_TRUE(query.Exec());
+ }
+
+ static TestResumptionDataDB* res_db_;
+
+ TestResumptionDataDB* res_db() { return res_db_; }
+
+ // Check that db includes tables with given elements
+ void CheckSavedDB();
+
+ static const bool is_in_file = false;
+ const std::string tables_exist =
+ "SELECT COUNT(*) FROM sqlite_master WHERE `type` = 'table';";
+ const std::string init_last_ign_count =
+ "SELECT `last_ign_off_time` FROM resumption;";
+ const std::string internal_data = "SELECT COUNT(*) FROM _internal_data;";
+
+ const std::string remove_all_tables =
+ "DELETE FROM `resumption`; "
+ "DELETE FROM `image`; "
+ "DELETE FROM `applicationChoiceSet`; "
+ "DELETE FROM `file`; "
+ "DELETE FROM `subMenu`; "
+ "DELETE FROM `TTSChunk`; "
+ "DELETE FROM `vrHelpItem`; "
+ "DELETE FROM `tableLimitedCharacterList`; "
+ "DELETE FROM `characterArray`; "
+ "DELETE FROM `choice`; "
+ "DELETE FROM `command`; "
+ "DELETE FROM `globalProperties`; "
+ "DELETE FROM `choiceArray`; "
+ "DELETE FROM `vrCommandsArray`; "
+ "DELETE FROM `helpTimeoutPromptArray`; "
+ "DELETE FROM `vrHelpItemArray`; "
+ "DELETE FROM `application`; "
+ "DELETE FROM `applicationChoiceSetArray`; "
+ "DELETE FROM `applicationCommandsArray`; "
+ "DELETE FROM `applicationFilesArray`; "
+ "DELETE FROM `applicationSubMenuArray`; "
+ "DELETE FROM `applicationSubscribtionsArray`; "
+ "DELETE FROM `_internal_data`; ";
+
+ private:
+ void CheckExistenceApplication();
+ void CheckAppData();
+ void CheckAppFilesData();
+ void CheckSubmenuData();
+ void CheckCommandsData();
+ void CheckChoiceSetData();
+
+ void CheckGlobalProportiesData();
+ void CheckCharacters(int64_t global_properties_key);
+ void CheckVRHelpItem(int64_t global_properties_key);
+
+ void BindId(utils::dbms::SQLQuery& query);
+};
+
+utils::dbms::SQLDatabase* ResumptionDataDBTest::test_db_ = NULL;
+TestResumptionDataDB* ResumptionDataDBTest::res_db_ = NULL;
+std::string ResumptionDataDBTest::kDatabaseName = "";
+std::string ResumptionDataDBTest::path_ = "";
+
+void ResumptionDataDBTest::CheckSavedDB() {
+ utils::dbms::SQLQuery query_checks(test_db());
+ EXPECT_TRUE(query_checks.Prepare(kChecksResumptionData));
+ EXPECT_TRUE(query_checks.Exec());
+ EXPECT_EQ(1, query_checks.GetInteger(0));
+
+ CheckExistenceApplication();
+ CheckAppData();
+
+ CheckAppFilesData();
+ CheckSubmenuData();
+ CheckCommandsData();
+
+ CheckChoiceSetData();
+ CheckGlobalProportiesData();
+}
+
+void ResumptionDataDBTest::CheckExistenceApplication() {
+ utils::dbms::SQLQuery query(test_db());
+ EXPECT_TRUE(query.Prepare(kCheckApplication));
+ query.Bind(0, device_id_);
+ query.Bind(1, policy_app_id_);
+ EXPECT_TRUE(query.Exec());
+ EXPECT_EQ(1, query.GetInteger(0));
+}
+
+void ResumptionDataDBTest::CheckAppData() {
+ utils::dbms::SQLQuery query(test_db());
+ EXPECT_TRUE(query.Prepare(kSelectAppTable));
+ BindId(query);
+ EXPECT_TRUE(query.Exec());
+ EXPECT_EQ(policy_app_id_, query.GetString(0));
+ EXPECT_EQ(app_id_, query.GetUInteger(1));
+ EXPECT_EQ(grammar_id_, query.GetUInteger(2));
+ EXPECT_EQ(hash_, query.GetString(3));
+ EXPECT_EQ(hmi_app_id_, query.GetUInteger(4));
+ EXPECT_EQ(hmi_level_, query.GetInteger(5));
+
+ EXPECT_EQ(ign_off_count_, query.GetUInteger(6));
+
+ EXPECT_EQ(device_id_, query.GetString(8));
+ EXPECT_EQ(is_audio_, query.GetBoolean(9));
+}
+
+void ResumptionDataDBTest::CheckGlobalProportiesData() {
+ utils::dbms::SQLQuery select_globalproperties(test_db());
+
+ EXPECT_TRUE(select_globalproperties.Prepare(kSelectCountGlobalProperties));
+ BindId(select_globalproperties);
+ EXPECT_TRUE(select_globalproperties.Exec());
+ EXPECT_EQ(1, select_globalproperties.GetInteger(0));
+
+ EXPECT_TRUE(select_globalproperties.Prepare(kSelectGlobalProperties));
+ BindId(select_globalproperties);
+
+ size_t help_prompt_idx = 0;
+ size_t timeout_prompt_idx = 0;
+ int64_t global_properties_key = 0;
+ while (select_globalproperties.Next()) {
+ if (global_properties_key != select_globalproperties.GetLongInt(0)) {
+ global_properties_key = select_globalproperties.GetLongInt(0);
+ EXPECT_EQ((*vr_help_title_).asString(),
+ select_globalproperties.GetString(1));
+ EXPECT_EQ((*menu_title_).asString(),
+ select_globalproperties.GetString(2));
+ EXPECT_EQ((*keyboard_props_)[am::strings::language].asInt(),
+ select_globalproperties.GetInteger(4));
+ EXPECT_EQ((*keyboard_props_)[am::hmi_request::keyboard_layout].asInt(),
+ select_globalproperties.GetInteger(5));
+ EXPECT_EQ((*keyboard_props_)[am::strings::key_press_mode].asInt(),
+ select_globalproperties.GetInteger(6));
+ EXPECT_EQ((*keyboard_props_)[am::strings::auto_complete_text].asString(),
+ select_globalproperties.GetString(7));
+
+ EXPECT_FALSE(select_globalproperties.IsNull(3));
+ utils::dbms::SQLQuery select_image(test_db());
+ EXPECT_TRUE(select_image.Prepare(kSelectImage));
+ select_image.Bind(0, select_globalproperties.GetLongInt(3));
+ EXPECT_TRUE(select_image.Exec());
+ EXPECT_EQ((*menu_icon_)[am::strings::image_type].asInt(),
+ select_image.GetInteger(0));
+ EXPECT_EQ((*menu_icon_)[am::strings::value].asString(),
+ select_image.GetString(1));
+ }
+ if (!select_globalproperties.IsNull(8)) {
+ utils::dbms::SQLQuery select_tts_chunk(test_db());
+ EXPECT_TRUE(select_tts_chunk.Prepare(kSelectTTSChunk));
+ select_tts_chunk.Bind(0, select_globalproperties.GetLongInt(8));
+ EXPECT_TRUE(select_tts_chunk.Exec());
+
+ std::string text =
+ (*help_prompt_)[help_prompt_idx][am::strings::text].asString();
+ int type = (*help_prompt_)[help_prompt_idx][am::strings::type].asInt();
+ EXPECT_EQ(text, select_tts_chunk.GetString(0));
+ EXPECT_EQ(type, select_tts_chunk.GetInteger(1));
+ help_prompt_idx++;
+ }
+ if (!select_globalproperties.IsNull(9)) {
+ utils::dbms::SQLQuery select_tts_chunk(test_db());
+ EXPECT_TRUE(select_tts_chunk.Prepare(kSelectTTSChunk));
+ select_tts_chunk.Bind(0, select_globalproperties.GetLongInt(9));
+ EXPECT_TRUE(select_tts_chunk.Exec());
+
+ std::string text =
+ (*timeout_prompt_)[timeout_prompt_idx][am::strings::text].asString();
+ int type =
+ (*timeout_prompt_)[timeout_prompt_idx][am::strings::type].asInt();
+ EXPECT_EQ(text, select_tts_chunk.GetString(0));
+ EXPECT_EQ(type, select_tts_chunk.GetInteger(1));
+ timeout_prompt_idx++;
+ }
+ CheckCharacters(global_properties_key);
+ CheckVRHelpItem(global_properties_key);
+ }
+}
+void ResumptionDataDBTest::CheckVRHelpItem(int64_t global_properties_key) {
+ utils::dbms::SQLQuery checks_vrhelp_item(test_db());
+ EXPECT_TRUE(checks_vrhelp_item.Prepare(kChecksVrHelpItem));
+ checks_vrhelp_item.Bind(0, global_properties_key);
+ EXPECT_TRUE(checks_vrhelp_item.Exec());
+ EXPECT_NE(0, checks_vrhelp_item.GetInteger(0));
+ if (!checks_vrhelp_item.GetInteger(0)) {
+ utils::dbms::SQLQuery select_vrhelp_item(test_db());
+ EXPECT_TRUE(select_vrhelp_item.Prepare(kSelectVrHelpItem));
+ select_vrhelp_item.Bind(0, global_properties_key);
+ size_t vr_help_item_idx = 0;
+ while (select_vrhelp_item.Next()) {
+ std::string vr_text =
+ (*vr_help_)[vr_help_item_idx][am::strings::text].asString();
+ std::string vr_position =
+ (*vr_help_)[vr_help_item_idx++][am::strings::position].asString();
+ EXPECT_EQ(vr_text, select_vrhelp_item.GetString(0));
+ EXPECT_EQ(vr_position, select_vrhelp_item.GetString(1));
+ }
+ }
+}
+
+void ResumptionDataDBTest::CheckCharacters(int64_t global_properties_key) {
+ utils::dbms::SQLQuery checks_characters(test_db());
+ EXPECT_TRUE(checks_characters.Prepare(kChecksCharacter));
+ checks_characters.Bind(0, global_properties_key);
+ EXPECT_TRUE(checks_characters.Exec());
+ EXPECT_NE(0, checks_characters.GetInteger(0));
+ if (!checks_characters.GetInteger(0)) {
+ utils::dbms::SQLQuery select_characters(test_db());
+ EXPECT_TRUE(select_characters.Prepare(kSelectCharacter));
+ select_characters.Bind(0, global_properties_key);
+ size_t characters_idx = 0;
+ while (select_characters.Next()) {
+ std::string character =
+ (*keyboard_props_)[am::strings::limited_character_list]
+ [characters_idx++].asString();
+ EXPECT_EQ(character, select_characters.GetString(0));
+ }
+ }
+}
+
+void ResumptionDataDBTest::CheckSubmenuData() {
+ utils::dbms::SQLQuery select_submenu(test_db());
+
+ EXPECT_TRUE(select_submenu.Prepare(kSelectCountSubMenu));
+ BindId(select_submenu);
+ EXPECT_TRUE(select_submenu.Exec());
+ EXPECT_EQ(count_of_submenues, select_submenu.GetUInteger(0));
+
+ EXPECT_TRUE(select_submenu.Prepare(kSelectSubMenu));
+ BindId(select_submenu);
+ int i = 10;
+ while (select_submenu.Next()) {
+ uint32_t test_id = (*test_submenu_map[i])[am::strings::menu_id].asUInt();
+ std::string name =
+ (*test_submenu_map[i])[am::strings::menu_name].asString();
+ int position = (*test_submenu_map[i])[am::strings::position].asInt();
+ EXPECT_EQ(test_id, select_submenu.GetUInteger(0));
+ EXPECT_EQ(name, select_submenu.GetString(1));
+ EXPECT_EQ(position, select_submenu.GetInteger(2));
+ i++;
+ }
+}
+
+void ResumptionDataDBTest::CheckCommandsData() {
+ utils::dbms::SQLQuery select_commands(test_db());
+
+ EXPECT_TRUE(select_commands.Prepare(kSelectCountCommands));
+ BindId(select_commands);
+ EXPECT_TRUE(select_commands.Exec());
+ EXPECT_EQ(count_of_commands, select_commands.GetUInteger(0));
+
+ EXPECT_TRUE(select_commands.Prepare(kSelectCommands));
+ BindId(select_commands);
+
+ int32_t i = -1;
+ int64_t command_key = 0;
+ int j = 0;
+ while (select_commands.Next()) {
+ if (command_key != select_commands.GetLongInt(0)) {
+ ++i;
+ uint cmd = (*test_commands_map[i])[am::strings::cmd_id].asUInt();
+ EXPECT_EQ(cmd, select_commands.GetUInteger(1));
+ std::string name =
+ (*test_commands_map[i])[am::strings::menu_params]
+ [am::strings::menu_name].asString();
+ EXPECT_EQ(name, select_commands.GetString(2));
+ int position = (*test_commands_map[i])[am::strings::menu_params]
+ [am::strings::position].asInt();
+ EXPECT_EQ(position, select_commands.GetInteger(4));
+ int parent_id =
+ (*test_commands_map[i])[am::strings::menu_params]
+ [am::hmi_request::parent_id].asInt();
+ EXPECT_EQ(parent_id, select_commands.GetInteger(3));
+ std::string icon_name =
+ (*test_commands_map[i])[am::strings::cmd_icon][am::strings::value]
+ .asString();
+ EXPECT_EQ(icon_name, select_commands.GetString(5));
+
+ int icon_type = (*test_commands_map[i])[am::strings::cmd_icon]
+ [am::strings::image_type].asInt();
+ EXPECT_EQ(icon_type, select_commands.GetInteger(6));
+
+ j = 0;
+ command_key = select_commands.GetLongInt(0);
+ }
+ std::string vr =
+ (*test_commands_map[i])[am::strings::vr_commands][j].asString();
+ EXPECT_EQ(vr, select_commands.GetString(7));
+ j++;
+ }
+}
+
+void ResumptionDataDBTest::CheckChoiceSetData() {
+ utils::dbms::SQLQuery select_choice_set(test_db());
+ EXPECT_TRUE(select_choice_set.Prepare(kSelectCountChoiceSet));
+ BindId(select_choice_set);
+ EXPECT_TRUE(select_choice_set.Exec());
+ EXPECT_EQ(count_of_choice_sets, select_choice_set.GetUInteger(0));
+
+ EXPECT_TRUE(select_choice_set.Prepare(kSelectChoiceSets));
+ int64_t app_set_key = 0;
+ int64_t choice_key = 0;
+ int32_t choice_set_idx = -1;
+ int32_t choice_idx = -1;
+ size_t vr_cmd_idx = 0;
+ sm::SmartObject command;
+ while (select_choice_set.Next()) {
+ if (app_set_key != select_choice_set.GetLongInt(0)) {
+ command = (*test_choiceset_map[app_set_key]);
+ ++choice_set_idx;
+
+ int choice_set_id =
+ command[am::strings::interaction_choice_set_id].asUInt();
+ int grammar_id = command[am::strings::grammar_id].asUInt();
+
+ EXPECT_EQ(grammar_id, select_choice_set.GetInteger(1));
+ EXPECT_EQ(choice_set_id, select_choice_set.GetInteger(2));
+
+ app_set_key = select_choice_set.GetLongInt(0);
+ choice_idx = -1;
+ }
+
+ if (choice_key != select_choice_set.GetLongInt(3)) {
+ ++choice_idx;
+ choice_key = select_choice_set.GetLongInt(3);
+ int choice_id =
+ command[am::strings::choice_set][choice_idx][am::strings::choice_id]
+ .asUInt();
+ std::string menu_name =
+ command[am::strings::choice_set][choice_idx][am::strings::menu_name]
+ .asString();
+ std::string secondary_text =
+ command[am::strings::choice_set][choice_idx]
+ [am::strings::secondary_text].asString();
+ std::string tertiary_text =
+ command[am::strings::choice_set][choice_idx]
+ [am::strings::tertiary_text].asString();
+
+ EXPECT_EQ(choice_id, select_choice_set.GetInteger(4));
+ EXPECT_EQ(menu_name, select_choice_set.GetString(5));
+ EXPECT_EQ(secondary_text, select_choice_set.GetString(6));
+ EXPECT_EQ(tertiary_text, select_choice_set.GetString(7));
+
+ EXPECT_FALSE(select_choice_set.IsNull(8));
+ utils::dbms::SQLQuery select_image(test_db());
+ EXPECT_TRUE(select_image.Prepare(kSelectImage));
+ select_image.Bind(0, select_choice_set.GetLongInt(8));
+ EXPECT_TRUE(select_image.Exec());
+ std::string image_value =
+ command[am::strings::choice_set][choice_idx][am::strings::image]
+ [am::strings::value].asString();
+ int image_type =
+ command[am::strings::choice_set][choice_idx][am::strings::image]
+ [am::strings::image_type].asInt();
+ EXPECT_EQ(image_value, select_image.GetString(1));
+ EXPECT_EQ(image_type, select_image.GetInteger(0));
+
+ EXPECT_FALSE(select_choice_set.IsNull(9));
+ EXPECT_TRUE(select_image.Prepare(kSelectImage));
+ select_image.Bind(0, select_choice_set.GetLongInt(9));
+ EXPECT_TRUE(select_image.Exec());
+ image_value =
+ command[am::strings::choice_set][choice_idx]
+ [am::strings::secondary_image][am::strings::value].asString();
+ image_type =
+ command[am::strings::choice_set][choice_idx]
+ [am::strings::secondary_image][am::strings::image_type]
+ .asInt();
+ EXPECT_EQ(image_value, select_image.GetString(1));
+ EXPECT_EQ(image_type, select_image.GetInteger(0));
+
+ vr_cmd_idx = 0;
+ }
+ std::string vr_comm =
+ command[am::strings::choice_set][choice_idx][am::strings::vr_commands]
+ [vr_cmd_idx++].asString();
+ EXPECT_EQ(vr_comm, select_choice_set.GetString(10));
+ }
+}
+
+void ResumptionDataDBTest::CheckAppFilesData() {
+ utils::dbms::SQLQuery query(test_db());
+ EXPECT_TRUE(query.Prepare(kSelectCountFiles));
+ BindId(query);
+ EXPECT_TRUE(query.Exec());
+ EXPECT_EQ(count_of_files, query.GetUInteger(0));
+
+ EXPECT_TRUE(query.Prepare(kSelectFiles));
+ BindId(query);
+ am::AppFile check_file;
+ int i = 0;
+ while (query.Next()) {
+ char numb[12];
+ std::snprintf(numb, 12, "%d", i);
+ check_file = app_files_map_["test_file " + std::string(numb)];
+
+ EXPECT_EQ(check_file.file_type, query.GetInteger(0));
+ EXPECT_EQ(check_file.is_download_complete, query.GetBoolean(1));
+ EXPECT_EQ(check_file.is_persistent, query.GetBoolean(2));
+ EXPECT_EQ(check_file.file_name, query.GetString(3));
+ i++;
+ }
+}
+
+void ResumptionDataDBTest::BindId(utils::dbms::SQLQuery& query) {
+ query.Bind(0, policy_app_id_);
+ query.Bind(1, device_id_);
+}
+
+TEST_F(ResumptionDataDBTest, Init) {
+ utils::dbms::SQLQuery query_checks(test_db());
+
+ EXPECT_TRUE(res_db()->Init());
+
+ EXPECT_TRUE(query_checks.Prepare(tables_exist));
+ EXPECT_TRUE(query_checks.Exec());
+ EXPECT_NE(0, query_checks.GetInteger(0));
+
+ EXPECT_TRUE(query_checks.Prepare(kChecksResumptionData));
+ EXPECT_TRUE(query_checks.Exec());
+ EXPECT_NE(0, query_checks.GetInteger(0));
+
+ EXPECT_TRUE(query_checks.Prepare(init_last_ign_count));
+ EXPECT_TRUE(query_checks.Exec());
+ EXPECT_EQ(0, query_checks.GetInteger(0));
+
+ EXPECT_TRUE(query_checks.Prepare(internal_data));
+ EXPECT_TRUE(query_checks.Exec());
+ EXPECT_LE(0, query_checks.GetInteger(0));
+}
+
+TEST_F(ResumptionDataDBTest, SaveApplication) {
+ PrepareData();
+ EXPECT_TRUE(res_db()->Init());
+ res_db()->SaveApplication(app_mock);
+ CheckSavedDB();
+}
+
+TEST_F(ResumptionDataDBTest, RemoveApplicationFromSaved) {
+ PrepareData();
+ EXPECT_TRUE(res_db()->Init());
+ res_db()->SaveApplication(app_mock);
+ CheckSavedDB();
+ EXPECT_TRUE(res_db()->RemoveApplicationFromSaved(policy_app_id_, device_id_));
+
+ sm::SmartObject remove_app;
+ EXPECT_FALSE(
+ res_db()->GetSavedApplication(policy_app_id_, device_id_, remove_app));
+ EXPECT_TRUE(remove_app.empty());
+}
+
+TEST_F(ResumptionDataDBTest, RemoveApplicationFromSaved_AppNotSaved) {
+ PrepareData();
+ EXPECT_TRUE(res_db()->Init());
+ res_db()->SaveApplication(app_mock);
+
+ sm::SmartObject saved_app;
+ EXPECT_FALSE(
+ res_db()->GetSavedApplication(policy_app_id_, "54321", saved_app));
+ EXPECT_TRUE(saved_app.empty());
+}
+
+TEST_F(ResumptionDataDBTest, SavedApplicationTwice) {
+ PrepareData();
+ EXPECT_TRUE(res_db()->Init());
+ res_db()->SaveApplication(app_mock);
+ CheckSavedDB();
+ res_db()->SaveApplication(app_mock);
+ CheckSavedDB();
+}
+
+TEST_F(ResumptionDataDBTest, SavedApplicationTwice_UpdateApp) {
+ PrepareData();
+ EXPECT_TRUE(res_db()->Init());
+ res_db()->SaveApplication(app_mock);
+ CheckSavedDB();
+ (*vr_help_)[0][am::strings::position] = 2;
+
+ res_db()->SaveApplication(app_mock);
+ CheckSavedDB();
+}
+
+TEST_F(ResumptionDataDBTest, IsApplicationSaved_ApplicationSaved) {
+ PrepareData();
+ EXPECT_TRUE(res_db()->Init());
+ res_db()->SaveApplication(app_mock);
+ ssize_t result = res_db()->IsApplicationSaved(policy_app_id_, device_id_);
+ EXPECT_EQ(0, result);
+}
+
+TEST_F(ResumptionDataDBTest, IsApplicationSaved_ApplicationRemoved) {
+ PrepareData();
+ EXPECT_TRUE(res_db()->Init());
+ res_db()->SaveApplication(app_mock);
+ EXPECT_TRUE(res_db()->RemoveApplicationFromSaved(policy_app_id_, device_id_));
+ ssize_t result = res_db()->IsApplicationSaved(policy_app_id_, device_id_);
+ EXPECT_EQ(-1, result);
+}
+
+TEST_F(ResumptionDataDBTest, GetSavedApplication) {
+ PrepareData();
+ EXPECT_TRUE(res_db()->Init());
+ res_db()->SaveApplication(app_mock);
+ CheckSavedDB();
+
+ sm::SmartObject saved_app;
+ EXPECT_TRUE(
+ res_db()->GetSavedApplication(policy_app_id_, device_id_, saved_app));
+ CheckSavedApp(saved_app);
+}
+
+TEST_F(ResumptionDataDBTest, GetSavedApplication_AppNotSaved) {
+ PrepareData();
+ EXPECT_TRUE(res_db()->Init());
+ sm::SmartObject saved_app;
+ EXPECT_FALSE(
+ res_db()->GetSavedApplication(policy_app_id_, "54321", saved_app));
+ EXPECT_TRUE(saved_app.empty());
+}
+
+TEST_F(ResumptionDataDBTest, GetDataForLoadResumeData) {
+ PrepareData();
+ EXPECT_TRUE(res_db()->Init());
+ res_db()->SaveApplication(app_mock);
+ CheckSavedDB();
+ sm::SmartObject saved_app;
+ res_db()->GetDataForLoadResumeData(saved_app);
+
+ EXPECT_EQ(policy_app_id_, saved_app[0][am::strings::app_id].asString());
+ EXPECT_EQ(device_id_, saved_app[0][am::strings::device_id].asString());
+ EXPECT_EQ(hmi_level_, static_cast<HMILevel::eType>(
+ saved_app[0][am::strings::hmi_level].asInt()));
+ EXPECT_EQ(ign_off_count_, saved_app[0][am::strings::ign_off_count].asUInt());
+}
+
+TEST_F(ResumptionDataDBTest, GetDataForLoadResumeData_AppRemove) {
+ sm::SmartObject saved_app;
+
+ PrepareData();
+ EXPECT_TRUE(res_db()->Init());
+ res_db()->SaveApplication(app_mock);
+ CheckSavedDB();
+ EXPECT_TRUE(res_db()->RemoveApplicationFromSaved(policy_app_id_, device_id_));
+ res_db()->GetDataForLoadResumeData(saved_app);
+ EXPECT_TRUE(saved_app.empty());
+}
+
+TEST_F(ResumptionDataDBTest, UpdateHmiLevel) {
+ PrepareData();
+ EXPECT_TRUE(res_db()->Init());
+ res_db()->SaveApplication(app_mock);
+ CheckSavedDB();
+ HMILevel::eType new_hmi_level = HMILevel::HMI_LIMITED;
+ res_db()->UpdateHmiLevel(policy_app_id_, device_id_, new_hmi_level);
+ hmi_level_ = new_hmi_level;
+ CheckSavedDB();
+}
+
+TEST_F(ResumptionDataDBTest, IsHMIApplicationIdExist_AppIsSaved) {
+ PrepareData();
+ EXPECT_TRUE(res_db()->Init());
+ res_db()->SaveApplication(app_mock);
+ CheckSavedDB();
+ EXPECT_TRUE(res_db()->IsHMIApplicationIdExist(hmi_app_id_));
+}
+
+TEST_F(ResumptionDataDBTest, IsHMIApplicationIdExist_AppNotSaved) {
+ PrepareData();
+ EXPECT_TRUE(res_db()->Init());
+ res_db()->SaveApplication(app_mock);
+ CheckSavedDB();
+ uint32_t new_hmi_app_id_ = hmi_app_id_ + 10;
+ EXPECT_FALSE(res_db()->IsHMIApplicationIdExist(new_hmi_app_id_));
+}
+
+TEST_F(ResumptionDataDBTest, GetHMIApplicationID) {
+ PrepareData();
+ EXPECT_TRUE(res_db()->Init());
+ res_db()->SaveApplication(app_mock);
+ CheckSavedDB();
+ EXPECT_EQ(hmi_app_id_,
+ res_db()->GetHMIApplicationID(policy_app_id_, device_id_));
+}
+
+TEST_F(ResumptionDataDBTest, GetHMIApplicationID_AppNotSaved) {
+ PrepareData();
+ EXPECT_TRUE(res_db()->Init());
+ res_db()->SaveApplication(app_mock);
+ CheckSavedDB();
+ EXPECT_EQ(0u, res_db()->GetHMIApplicationID(policy_app_id_, "other_dev_id"));
+}
+
+TEST_F(ResumptionDataDBTest, OnSuspend) {
+ PrepareData();
+ EXPECT_TRUE(res_db()->Init());
+ SetZeroIgnOffTime();
+ res_db()->SaveApplication(app_mock);
+ CheckSavedDB();
+
+ res_db()->OnSuspend();
+ ign_off_count_++;
+ CheckSavedDB();
+}
+
+TEST_F(ResumptionDataDBTest, OnSuspendFourTimes) {
+ PrepareData();
+ EXPECT_TRUE(res_db()->Init());
+ SetZeroIgnOffTime();
+ res_db()->SaveApplication(app_mock);
+ CheckSavedDB();
+
+ res_db()->OnSuspend();
+ ign_off_count_++;
+ CheckSavedDB();
+
+ res_db()->OnSuspend();
+ ign_off_count_++;
+ CheckSavedDB();
+ res_db()->OnSuspend();
+ ign_off_count_++;
+ CheckSavedDB();
+
+ res_db()->OnSuspend();
+
+ ssize_t result = res_db()->IsApplicationSaved(policy_app_id_, device_id_);
+ EXPECT_EQ(-1, result);
+}
+
+TEST_F(ResumptionDataDBTest, OnSuspendOnAwake) {
+ PrepareData();
+ EXPECT_TRUE(res_db()->Init());
+ SetZeroIgnOffTime();
+
+ res_db()->SaveApplication(app_mock);
+ CheckSavedDB();
+
+ res_db()->OnSuspend();
+
+ ign_off_count_++;
+ CheckSavedDB();
+ res_db()->OnAwake();
+ ign_off_count_ = 0;
+ CheckSavedDB();
+}
+
+TEST_F(ResumptionDataDBTest, Awake_AppNotSuspended) {
+ PrepareData();
+ EXPECT_TRUE(res_db()->Init());
+ SetZeroIgnOffTime();
+
+ res_db()->SaveApplication(app_mock);
+ CheckSavedDB();
+
+ res_db()->OnAwake();
+ ign_off_count_ = 0;
+ CheckSavedDB();
+}
+
+TEST_F(ResumptionDataDBTest, TwiceAwake_AppNotSuspended) {
+ PrepareData();
+ EXPECT_TRUE(res_db()->Init());
+ SetZeroIgnOffTime();
+
+ res_db()->SaveApplication(app_mock);
+ CheckSavedDB();
+
+ res_db()->OnSuspend();
+ res_db()->OnAwake();
+ ign_off_count_ = 0;
+ CheckSavedDB();
+
+ res_db()->OnAwake();
+ CheckSavedDB();
+}
+
+TEST_F(ResumptionDataDBTest, GetHashId) {
+ PrepareData();
+ EXPECT_TRUE(res_db()->Init());
+
+ res_db()->SaveApplication(app_mock);
+
+ std::string test_hash;
+ EXPECT_TRUE(res_db()->GetHashId(policy_app_id_, device_id_, test_hash));
+ EXPECT_EQ(hash_, test_hash);
+}
+
+TEST_F(ResumptionDataDBTest, GetIgnOffTime_AfterSuspendAndAwake) {
+ PrepareData();
+ EXPECT_TRUE(res_db()->Init());
+ SetZeroIgnOffTime();
+ uint32_t last_ign_off_time;
+
+ res_db()->SaveApplication(app_mock);
+
+ last_ign_off_time = res_db()->GetIgnOffTime();
+ EXPECT_EQ(0u, last_ign_off_time);
+
+ res_db()->OnSuspend();
+
+ uint32_t after_suspend;
+ after_suspend = res_db()->GetIgnOffTime();
+ EXPECT_LE(last_ign_off_time, after_suspend);
+
+ uint32_t after_awake;
+ res_db()->OnAwake();
+
+ after_awake = res_db()->GetIgnOffTime();
+ EXPECT_LE(after_suspend, after_awake);
+}
+
+} // namespace resumption_test
+} // namespace components
+} // namespace test
diff --git a/src/components/application_manager/test/resumption/resumption_data_json_test.cc b/src/components/application_manager/test/resumption/resumption_data_json_test.cc
new file mode 100644
index 000000000..24a16596e
--- /dev/null
+++ b/src/components/application_manager/test/resumption/resumption_data_json_test.cc
@@ -0,0 +1,394 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <string>
+#include <algorithm>
+#include "gtest/gtest.h"
+
+#include "application_manager/usage_statistics.h"
+#include "include/application_mock.h"
+#include "include/resumption_data_mock.h"
+#include "interfaces/MOBILE_API.h"
+#include "resumption/last_state.h"
+
+#include "include/resumption_data_test.h"
+#include "formatters/CFormatterJsonBase.hpp"
+#include "config_profile/profile.h"
+#include "utils/file_system.h"
+
+#include "application_manager/resumption/resumption_data_json.h"
+namespace test {
+namespace components {
+namespace resumption_test {
+
+using ::testing::_;
+using ::testing::Return;
+using ::testing::NiceMock;
+
+namespace am = application_manager;
+using namespace Json;
+using namespace file_system;
+
+using namespace resumption;
+using namespace mobile_apis;
+namespace Formatters = NsSmartDeviceLink::NsJSONHandler::Formatters;
+
+class ResumptionDataJsonTest : public ResumptionDataTest {
+ protected:
+ virtual void SetUp() {
+ app_mock = new NiceMock<ApplicationMock>();
+
+ policy_app_id_ = "test_policy_app_id";
+ app_id_ = 10;
+ is_audio_ = true;
+ grammar_id_ = 20;
+ hash_ = "saved_hash";
+ hmi_level_ = HMILevel::eType::HMI_FULL;
+ hmi_app_id_ = 8;
+ ign_off_count_ = 0;
+ }
+
+ void CheckSavedJson() {
+ Value& dictionary = LastState::instance()->dictionary;
+ ASSERT_TRUE(dictionary[am::strings::resumption].isObject());
+ ASSERT_TRUE(
+ dictionary[am::strings::resumption][am::strings::resume_app_list]
+ .isArray());
+ Value& resume_app_list =
+ dictionary[am::strings::resumption][am::strings::resume_app_list];
+ sm::SmartObject res_app_list;
+ for (uint32_t i = 0; i < resume_app_list.size(); i++) {
+ Formatters::CFormatterJsonBase::jsonValueToObj(resume_app_list[i],
+ res_app_list);
+ CheckSavedApp(res_app_list);
+ }
+ }
+
+ void SetZeroIgnOff() {
+ Value& dictionary = LastState::instance()->dictionary;
+ Value& res = dictionary[am::strings::resumption];
+ res[am::strings::last_ign_off_time] = 0;
+ LastState::instance()->SaveToFileSystem();
+ }
+};
+
+TEST_F(ResumptionDataJsonTest, SaveApplication) {
+ ResumptionDataJson res_json;
+ PrepareData();
+ res_json.SaveApplication(app_mock);
+ CheckSavedJson();
+}
+
+TEST_F(ResumptionDataJsonTest, SavedApplicationTwice) {
+ ResumptionDataJson res_json;
+ PrepareData();
+ res_json.SaveApplication(app_mock);
+ CheckSavedJson();
+ res_json.SaveApplication(app_mock);
+ CheckSavedJson();
+}
+
+TEST_F(ResumptionDataJsonTest, SavedApplicationTwice_UpdateApp) {
+ ResumptionDataJson res_json;
+ PrepareData();
+ res_json.SaveApplication(app_mock);
+ CheckSavedJson();
+ (*vr_help_)[0][am::strings::position] = 2;
+
+ res_json.SaveApplication(app_mock);
+ CheckSavedJson();
+}
+
+TEST_F(ResumptionDataJsonTest, RemoveApplicationFromSaved) {
+ ResumptionDataJson res_json;
+ PrepareData();
+ res_json.SaveApplication(app_mock);
+ EXPECT_TRUE(res_json.RemoveApplicationFromSaved(policy_app_id_, device_id_));
+
+ // Check that application was deleted
+ smart_objects::SmartObject remove_app;
+ EXPECT_FALSE(
+ res_json.GetSavedApplication(policy_app_id_, device_id_, remove_app));
+ EXPECT_TRUE(remove_app.empty());
+}
+
+TEST_F(ResumptionDataJsonTest, RemoveApplicationFromSaved_AppNotSaved) {
+ ResumptionDataJson res_json;
+ EXPECT_FALSE(res_json.RemoveApplicationFromSaved(policy_app_id_, "54321"));
+}
+
+TEST_F(ResumptionDataJsonTest, IsApplicationSaved_ApplicationSaved) {
+ ResumptionDataJson res_json;
+ PrepareData();
+ res_json.SaveApplication(app_mock);
+ CheckSavedJson();
+ ssize_t result = res_json.IsApplicationSaved(policy_app_id_, device_id_);
+ EXPECT_EQ(0, result);
+}
+
+TEST_F(ResumptionDataJsonTest, IsApplicationSaved_ApplicationRemoved) {
+ ResumptionDataJson res_json;
+ PrepareData();
+ res_json.SaveApplication(app_mock);
+ CheckSavedJson();
+ EXPECT_TRUE(res_json.RemoveApplicationFromSaved(policy_app_id_, device_id_));
+ ssize_t result = res_json.IsApplicationSaved(policy_app_id_, device_id_);
+ EXPECT_EQ(-1, result);
+}
+
+TEST_F(ResumptionDataJsonTest, GetSavedApplication) {
+ ResumptionDataJson res_json;
+ PrepareData();
+ res_json.SaveApplication(app_mock);
+ smart_objects::SmartObject saved_app;
+ EXPECT_TRUE(
+ res_json.GetSavedApplication(policy_app_id_, device_id_, saved_app));
+ CheckSavedApp(saved_app);
+}
+
+TEST_F(ResumptionDataJsonTest, GetSavedApplication_AppNotSaved) {
+ ResumptionDataJson res_json;
+ smart_objects::SmartObject saved_app;
+ EXPECT_FALSE(
+ res_json.GetSavedApplication(policy_app_id_, "54321", saved_app));
+ EXPECT_TRUE(saved_app.empty());
+}
+
+TEST_F(ResumptionDataJsonTest, GetDataForLoadResumeData) {
+ ResumptionDataJson res_json;
+ PrepareData();
+ res_json.SaveApplication(app_mock);
+ CheckSavedJson();
+ smart_objects::SmartObject saved_app;
+ res_json.GetDataForLoadResumeData(saved_app);
+
+ EXPECT_EQ(policy_app_id_, saved_app[0][am::strings::app_id].asString());
+ EXPECT_EQ(device_id_, saved_app[0][am::strings::device_id].asString());
+ EXPECT_EQ(hmi_level_, static_cast<HMILevel::eType>(
+ saved_app[0][am::strings::hmi_level].asInt()));
+ EXPECT_EQ(ign_off_count_, saved_app[0][am::strings::ign_off_count].asUInt());
+}
+
+TEST_F(ResumptionDataJsonTest, GetDataForLoadResumeData_AppRemove) {
+ ResumptionDataJson res_json;
+ smart_objects::SmartObject saved_app;
+
+ PrepareData();
+ res_json.SaveApplication(app_mock);
+ CheckSavedJson();
+ EXPECT_TRUE(res_json.RemoveApplicationFromSaved(policy_app_id_, device_id_));
+ res_json.GetDataForLoadResumeData(saved_app);
+ EXPECT_TRUE(saved_app.empty());
+}
+
+TEST_F(ResumptionDataJsonTest, UpdateHmiLevel) {
+ ResumptionDataJson res_json;
+ PrepareData();
+ res_json.SaveApplication(app_mock);
+ CheckSavedJson();
+ HMILevel::eType new_hmi_level = HMILevel::HMI_LIMITED;
+ res_json.UpdateHmiLevel(policy_app_id_, device_id_, new_hmi_level);
+ hmi_level_ = new_hmi_level;
+
+ CheckSavedJson();
+}
+
+TEST_F(ResumptionDataJsonTest, IsHMIApplicationIdExist_AppIsSaved) {
+ ResumptionDataJson res_json;
+ PrepareData();
+ res_json.SaveApplication(app_mock);
+ CheckSavedJson();
+ EXPECT_TRUE(res_json.IsHMIApplicationIdExist(hmi_app_id_));
+}
+
+TEST_F(ResumptionDataJsonTest, IsHMIApplicationIdExist_AppNotSaved) {
+ ResumptionDataJson res_json;
+ PrepareData();
+ res_json.SaveApplication(app_mock);
+
+ CheckSavedJson();
+ uint32_t new_hmi_app_id_ = hmi_app_id_ + 10;
+ EXPECT_FALSE(res_json.IsHMIApplicationIdExist(new_hmi_app_id_));
+}
+
+TEST_F(ResumptionDataJsonTest, GetHMIApplicationID) {
+ ResumptionDataJson res_json;
+ PrepareData();
+ res_json.SaveApplication(app_mock);
+ CheckSavedJson();
+ EXPECT_EQ(hmi_app_id_,
+ res_json.GetHMIApplicationID(policy_app_id_, device_id_));
+}
+
+TEST_F(ResumptionDataJsonTest, GetHMIApplicationID_AppNotSaved) {
+ ResumptionDataJson res_json;
+ PrepareData();
+ res_json.SaveApplication(app_mock);
+ EXPECT_EQ(0u, res_json.GetHMIApplicationID(policy_app_id_, "other_dev_id"));
+}
+
+TEST_F(ResumptionDataJsonTest, OnSuspend) {
+ ResumptionDataJson res_json;
+ ::profile::Profile::instance()->config_file_name("smartDeviceLink_test.ini");
+ SetZeroIgnOff();
+ PrepareData();
+
+ res_json.SaveApplication(app_mock);
+ CheckSavedJson();
+
+ res_json.OnSuspend();
+ ign_off_count_++;
+ CheckSavedJson();
+
+ EXPECT_TRUE(FileExists("./test_app_info.dat"));
+ EXPECT_TRUE(DirectoryExists("./test_storage"));
+ EXPECT_TRUE(RemoveDirectory("./test_storage", true));
+ EXPECT_TRUE(DeleteFile("./test_app_info.dat"));
+ ::profile::Profile::instance()->config_file_name("smartDeviceLink.ini");
+}
+
+TEST_F(ResumptionDataJsonTest, OnSuspendFourTimes) {
+ ResumptionDataJson res_json;
+ PrepareData();
+ ::profile::Profile::instance()->config_file_name("smartDeviceLink_test.ini");
+ SetZeroIgnOff();
+ res_json.SaveApplication(app_mock);
+ CheckSavedJson();
+
+ res_json.OnSuspend();
+ ign_off_count_++;
+ CheckSavedJson();
+
+ res_json.OnSuspend();
+ res_json.OnSuspend();
+ res_json.OnSuspend();
+
+ ssize_t result = res_json.IsApplicationSaved(policy_app_id_, device_id_);
+ EXPECT_EQ(-1, result);
+
+ EXPECT_TRUE(FileExists("./test_app_info.dat"));
+ EXPECT_TRUE(DirectoryExists("./test_storage"));
+ EXPECT_TRUE(RemoveDirectory("./test_storage", true));
+ EXPECT_TRUE(DeleteFile("./test_app_info.dat"));
+ ::profile::Profile::instance()->config_file_name("smartDeviceLink.ini");
+}
+
+TEST_F(ResumptionDataJsonTest, OnSuspendOnAwake) {
+ ResumptionDataJson res_json;
+ PrepareData();
+ ::profile::Profile::instance()->config_file_name("smartDeviceLink_test.ini");
+ SetZeroIgnOff();
+ res_json.SaveApplication(app_mock);
+ CheckSavedJson();
+
+ res_json.OnSuspend();
+ ign_off_count_++;
+ CheckSavedJson();
+
+ res_json.OnAwake();
+ ign_off_count_ = 0;
+ CheckSavedJson();
+ EXPECT_TRUE(RemoveDirectory("./test_storage", true));
+ EXPECT_TRUE(DeleteFile("./test_app_info.dat"));
+ ::profile::Profile::instance()->config_file_name("smartDeviceLink.ini");
+}
+
+TEST_F(ResumptionDataJsonTest, Awake_AppNotSuspended) {
+ ResumptionDataJson res_json;
+ SetZeroIgnOff();
+ PrepareData();
+ res_json.SaveApplication(app_mock);
+ CheckSavedJson();
+
+ res_json.OnAwake();
+ ign_off_count_ = 0;
+ CheckSavedJson();
+}
+
+TEST_F(ResumptionDataJsonTest, TwiceAwake_AppNotSuspended) {
+ ResumptionDataJson res_json;
+ SetZeroIgnOff();
+ PrepareData();
+ res_json.SaveApplication(app_mock);
+ CheckSavedJson();
+
+ res_json.OnSuspend();
+ res_json.OnAwake();
+ ign_off_count_ = 0;
+ CheckSavedJson();
+
+ res_json.OnAwake();
+ CheckSavedJson();
+}
+
+TEST_F(ResumptionDataJsonTest, GetHashId) {
+ ResumptionDataJson res_json;
+ PrepareData();
+ res_json.SaveApplication(app_mock);
+ CheckSavedJson();
+
+ std::string test_hash;
+ EXPECT_TRUE(res_json.GetHashId(policy_app_id_, device_id_, test_hash));
+ EXPECT_EQ(hash_, test_hash);
+}
+
+TEST_F(ResumptionDataJsonTest, GetIgnOffTime_AfterSuspendAndAwake) {
+ ResumptionDataJson res_json;
+ uint32_t last_ign_off_time;
+ PrepareData();
+ ::profile::Profile::instance()->config_file_name("smartDeviceLink_test.ini");
+ SetZeroIgnOff();
+ res_json.SaveApplication(app_mock);
+ CheckSavedJson();
+ last_ign_off_time = res_json.GetIgnOffTime();
+ EXPECT_EQ(0u, last_ign_off_time);
+
+ res_json.OnSuspend();
+
+ uint32_t after_suspend;
+ after_suspend = res_json.GetIgnOffTime();
+ EXPECT_LE(last_ign_off_time, after_suspend);
+
+ uint32_t after_awake;
+ res_json.OnAwake();
+
+ after_awake = res_json.GetIgnOffTime();
+ EXPECT_LE(after_suspend, after_awake);
+
+ EXPECT_TRUE(RemoveDirectory("./test_storage", true));
+ EXPECT_TRUE(DeleteFile("./test_app_info.dat"));
+ ::profile::Profile::instance()->config_file_name("smartDeviceLink.ini");
+}
+
+} // namespace resumption_test
+} // namespace components
+} // namespace test
diff --git a/src/components/application_manager/test/resumption/resumption_data_test.cc b/src/components/application_manager/test/resumption/resumption_data_test.cc
new file mode 100644
index 000000000..b8054b0d8
--- /dev/null
+++ b/src/components/application_manager/test/resumption/resumption_data_test.cc
@@ -0,0 +1,549 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <string>
+#include <algorithm>
+#include "gtest/gtest.h"
+
+#include "application_manager/usage_statistics.h"
+#include "include/application_mock.h"
+#include "include/resumption_data_mock.h"
+
+#include "application_manager/application_manager_impl.h"
+#include "application_manager/application.h"
+#include "utils/data_accessor.h"
+#include "application_manager/message_helper.h"
+
+#include "include/resumption_data_test.h"
+
+std::string application_manager::MessageHelper::GetDeviceMacAddressForHandle(
+ const uint32_t device_handle) {
+ std::string device_mac_address = "12345";
+ return device_mac_address;
+}
+
+namespace test {
+namespace components {
+namespace resumption_test {
+
+using ::testing::Return;
+using ::testing::ReturnRef;
+using ::testing::ReturnPointee;
+
+void ResumptionDataTest::CheckSavedApp(sm::SmartObject& resume_app_list) {
+ EXPECT_EQ(policy_app_id_, resume_app_list[am::strings::app_id].asString());
+ EXPECT_EQ(grammar_id_, resume_app_list[am::strings::grammar_id].asUInt());
+ EXPECT_EQ(app_id_, resume_app_list[am::strings::connection_key].asUInt());
+ EXPECT_EQ(hmi_app_id_, resume_app_list[am::strings::hmi_app_id].asUInt());
+ EXPECT_EQ(ign_off_count_,
+ resume_app_list[am::strings::ign_off_count].asUInt());
+ EXPECT_EQ(hmi_level_, static_cast<HMILevel::eType>(
+ resume_app_list[am::strings::hmi_level].asInt()));
+ EXPECT_EQ(is_audio_,
+ resume_app_list[am::strings::is_media_application].asBool());
+ EXPECT_EQ("12345", resume_app_list[am::strings::device_id].asString());
+
+ CheckCommands(resume_app_list[am::strings::application_commands]);
+ CheckSubmenues(resume_app_list[am::strings::application_submenus]);
+ CheckChoiceSet(resume_app_list[am::strings::application_choice_sets]);
+ CheckAppFiles(resume_app_list[am::strings::application_files]);
+
+ CheckGlobalProporties(
+ resume_app_list[am::strings::application_global_properties]);
+ CheckSubscriptions(resume_app_list[am::strings::application_subscribtions]);
+}
+
+void ResumptionDataTest::CheckCommands(sm::SmartObject& res_list) {
+ for (uint32_t i = 0; i < count_of_commands; ++i) {
+ EXPECT_EQ(i, res_list[i][am::strings::cmd_id].asUInt());
+ std::string name =
+ (*test_commands_map[i])[am::strings::menu_params]
+ [am::strings::menu_name].asString();
+ EXPECT_EQ(name,
+ res_list[i][am::strings::menu_params][am::strings::menu_name]
+ .asString());
+ int position =
+ (*test_commands_map[i])[am::strings::menu_params][am::strings::position]
+ .asInt();
+ EXPECT_EQ(
+ position,
+ res_list[i][am::strings::menu_params][am::strings::position].asInt());
+
+ int parent_id = (*test_commands_map[i])[am::strings::menu_params]
+ [am::hmi_request::parent_id].asInt();
+ EXPECT_EQ(parent_id,
+ res_list[i][am::strings::menu_params][am::hmi_request::parent_id]
+ .asInt());
+
+ std::string icon_name =
+ (*test_commands_map[i])[am::strings::cmd_icon][am::strings::value]
+ .asString();
+ EXPECT_EQ(
+ icon_name,
+ res_list[i][am::strings::cmd_icon][am::strings::value].asString());
+
+ int icon_type =
+ (*test_commands_map[i])[am::strings::cmd_icon][am::strings::image_type]
+ .asInt();
+ EXPECT_EQ(
+ icon_type,
+ res_list[i][am::strings::cmd_icon][am::strings::image_type].asInt());
+
+ for (uint32_t j = 0; j < count_of_choice; ++j) {
+ std::string vr =
+ (*test_commands_map[i])[am::strings::vr_commands][j].asString();
+ EXPECT_EQ(vr, res_list[i][am::strings::vr_commands][j].asString());
+ }
+ }
+}
+
+void ResumptionDataTest::CheckSubmenues(sm::SmartObject& res_list) {
+ for (uint32_t i = 0; i < count_of_submenues; ++i) {
+ uint32_t test_id =
+ (*test_submenu_map[i + 10])[am::strings::menu_id].asUInt();
+ std::string name =
+ (*test_submenu_map[i + 10])[am::strings::menu_name].asString();
+ int position = (*test_submenu_map[i + 10])[am::strings::position].asInt();
+ EXPECT_EQ(position, res_list[i][am::strings::position].asInt());
+ EXPECT_EQ(test_id, res_list[i][am::strings::menu_id].asUInt());
+ EXPECT_EQ(name, res_list[i][am::strings::menu_name].asString());
+ }
+}
+
+void ResumptionDataTest::CheckSubscriptions(sm::SmartObject& res_list) {
+ EXPECT_EQ(static_cast<uint32_t>(ButtonName::eType::OK),
+ res_list[am::strings::application_buttons][0].asUInt());
+ EXPECT_EQ(static_cast<uint32_t>(ButtonName::eType::CUSTOM_BUTTON),
+ res_list[am::strings::application_buttons][1].asUInt());
+ EXPECT_EQ(0u, res_list[am::strings::application_vehicle_info][0].asUInt());
+ EXPECT_EQ(5u, res_list[am::strings::application_vehicle_info][1].asUInt());
+}
+
+void ResumptionDataTest::CheckChoiceSet(sm::SmartObject& res_list) {
+ for (uint32_t i = 0; i < res_list.length(); ++i) {
+ for (uint32_t j = 0; j < res_list[i][am::strings::choice_set].length();
+ ++j) {
+ sm::SmartObject command = res_list[i][am::strings::choice_set][j];
+ EXPECT_EQ(i + j, command[am::strings::choice_id].asUInt());
+ char numb[12];
+ std::snprintf(numb, 12, "%d", i + j);
+ std::string test_choice =
+ (*test_choiceset_map[i])[am::strings::choice_set][j]
+ [am::strings::vr_commands][0].asString();
+ EXPECT_EQ(test_choice, command[am::strings::vr_commands][0].asString());
+ std::string menu_name =
+ (*test_choiceset_map[i])[am::strings::choice_set][j]
+ [am::strings::menu_name].asString();
+ EXPECT_EQ(menu_name, command[am::strings::menu_name].asString());
+ std::string secondary_text =
+ (*test_choiceset_map[i])[am::strings::choice_set][j]
+ [am::strings::secondary_text].asString();
+ EXPECT_EQ(secondary_text,
+ command[am::strings::secondary_text].asString());
+ std::string tertiary_text =
+ (*test_choiceset_map[i])[am::strings::choice_set][j]
+ [am::strings::tertiary_text].asString();
+ EXPECT_EQ(tertiary_text, command[am::strings::tertiary_text].asString());
+
+ std::string image_value =
+ (*test_choiceset_map[i])[am::strings::choice_set][j]
+ [am::strings::image][am::strings::value]
+ .asString();
+ EXPECT_EQ(image_value,
+ command[am::strings::image][am::strings::value].asString());
+ int image_type =
+ (*test_choiceset_map[i])[am::strings::choice_set][j]
+ [am::strings::image][am::strings::image_type]
+ .asInt();
+ EXPECT_EQ(image_type,
+ command[am::strings::image][am::strings::image_type].asInt());
+
+ image_value = (*test_choiceset_map[i])[am::strings::choice_set][j]
+ [am::strings::secondary_image]
+ [am::strings::value].asString();
+ EXPECT_EQ(
+ image_value,
+ command[am::strings::secondary_image][am::strings::value].asString());
+ image_type = (*test_choiceset_map[i])[am::strings::choice_set][j]
+ [am::strings::secondary_image]
+ [am::strings::image_type].asInt();
+ EXPECT_EQ(image_type,
+ command[am::strings::secondary_image][am::strings::image_type]
+ .asInt());
+ }
+
+ int choice_set_id =
+ (*test_choiceset_map[i])[am::strings::interaction_choice_set_id]
+ .asUInt();
+ EXPECT_EQ(choice_set_id,
+ res_list[i][am::strings::interaction_choice_set_id].asInt());
+
+ int grammar_id = (*test_choiceset_map[i])[am::strings::grammar_id].asUInt();
+ EXPECT_EQ(grammar_id, res_list[i][am::strings::grammar_id].asInt());
+ }
+}
+
+void ResumptionDataTest::CheckAppFiles(sm::SmartObject& res_list) {
+ am::AppFile check_file;
+
+ for (uint i = 0; i < count_of_files; ++i) {
+ char numb[12];
+ std::snprintf(numb, 12, "%d", i);
+ check_file = app_files_map_["test_file " + std::string(numb)];
+ EXPECT_EQ(check_file.file_name,
+ res_list[i][am::strings::sync_file_name].asString());
+ EXPECT_EQ(check_file.file_type,
+ static_cast<FileType::eType>(
+ res_list[i][am::strings::file_type].asInt()));
+ EXPECT_EQ(check_file.is_download_complete,
+ res_list[i][am::strings::is_download_complete].asBool());
+ EXPECT_EQ(check_file.is_persistent,
+ res_list[i][am::strings::persistent_file].asBool());
+ }
+}
+
+void ResumptionDataTest::CheckGlobalProporties(sm::SmartObject& res_list) {
+ CheckHelpPrompt(res_list[am::strings::help_prompt]);
+ CheckTimeoutPrompt(res_list[am::strings::timeout_prompt]);
+ CheckVRHelp(res_list[am::strings::vr_help]);
+ CheckVRTitle(res_list[am::strings::vr_help_title]);
+ CheckKeyboardProperties(res_list[am::strings::keyboard_properties]);
+ CheckMenuTitle(res_list[am::strings::menu_title]);
+ CheckMenuIcon(res_list[am::strings::menu_icon]);
+}
+
+void ResumptionDataTest::CheckKeyboardProperties(sm::SmartObject& res_list) {
+ Language::eType testlanguage = static_cast<Language::eType>(
+ (*keyboard_props_)[am::strings::language].asInt());
+ KeyboardLayout::eType testlayout = static_cast<KeyboardLayout::eType>(
+ (*keyboard_props_)[am::hmi_request::keyboard_layout].asInt());
+ KeypressMode::eType testmode = static_cast<KeypressMode::eType>(
+ (*keyboard_props_)[am::strings::key_press_mode].asInt());
+
+ std::string auto_complete_text =
+ (*keyboard_props_)[am::strings::auto_complete_text].asString();
+
+ for (uint i = 0;
+ i < (*keyboard_props_)[am::strings::limited_character_list].length();
+ i++) {
+ std::string character =
+ (*keyboard_props_)[am::strings::limited_character_list][i].asString();
+ EXPECT_EQ(character,
+ res_list[am::strings::limited_character_list][i].asString());
+ }
+
+ EXPECT_EQ(testlanguage, static_cast<Language::eType>(
+ res_list[am::strings::language].asInt()));
+ EXPECT_EQ(testlayout,
+ static_cast<KeyboardLayout::eType>(
+ res_list[am::hmi_request::keyboard_layout].asInt()));
+ EXPECT_EQ(testmode, static_cast<KeypressMode::eType>(
+ res_list[am::strings::key_press_mode].asInt()));
+ EXPECT_EQ(auto_complete_text,
+ res_list[am::strings::auto_complete_text].asString());
+}
+
+void ResumptionDataTest::CheckMenuTitle(sm::SmartObject& res_list) {
+ std::string value = (*menu_title_)[am::strings::menu_title].asString();
+ EXPECT_EQ(value, res_list[am::strings::menu_title].asString());
+}
+
+void ResumptionDataTest::CheckMenuIcon(sm::SmartObject& res_list) {
+ std::string value = (*menu_icon_)[am::strings::value].asString();
+ ImageType::eType type = static_cast<ImageType::eType>(
+ (*menu_icon_)[am::strings::image_type].asInt());
+
+ EXPECT_EQ(value, res_list[am::strings::value].asString());
+ EXPECT_EQ(type, static_cast<ImageType::eType>(
+ res_list[am::strings::image_type].asInt()));
+}
+
+void ResumptionDataTest::CheckHelpPrompt(sm::SmartObject& res_list) {
+ for (uint i = 0; i < tts_chunks_count; ++i) {
+ std::string promt = (*help_prompt_)[i][am::strings::help_prompt].asString();
+ std::string dict_promt = res_list[i][am::strings::help_prompt].asString();
+ EXPECT_EQ(promt, dict_promt);
+ }
+}
+
+void ResumptionDataTest::CheckTimeoutPrompt(
+ NsSmartDeviceLink::NsSmartObjects::SmartObject& res_list) {
+ for (uint i = 0; i < tts_chunks_count; ++i) {
+ std::string text = (*timeout_prompt_)[i][am::strings::text].asString();
+ SpeechCapabilities::eType speech = static_cast<SpeechCapabilities::eType>(
+ (*timeout_prompt_)[i][am::strings::type].asInt());
+ EXPECT_EQ(text, res_list[i][am::strings::text].asString());
+ EXPECT_EQ(speech, static_cast<SpeechCapabilities::eType>(
+ res_list[i][am::strings::type].asInt()));
+ }
+}
+
+void ResumptionDataTest::CheckVRHelp(sm::SmartObject& res_list) {
+ std::string text;
+ int position;
+ for (uint i = 0; i < count_of_vrhelptitle; ++i) {
+ text = (*vr_help_)[i][am::strings::text].asString();
+ EXPECT_EQ(text, res_list[i][am::strings::text].asString());
+ position = (*vr_help_)[i][am::strings::position].asInt();
+ EXPECT_EQ(position, res_list[i][am::strings::position].asInt());
+ }
+}
+
+void ResumptionDataTest::CheckVRTitle(
+ NsSmartDeviceLink::NsSmartObjects::SmartObject& res_list) {
+ std::string vtitle = (*vr_help_title_)[am::strings::vr_help_title].asString();
+ EXPECT_EQ(vtitle, res_list[am::strings::vr_help_title].asString());
+}
+
+void ResumptionDataTest::PrepareData() {
+ SetGlobalProporties();
+ SetCommands();
+ SetSubmenues();
+ SetChoiceSet();
+ SetAppFiles();
+
+ DataAccessor<am::SubMenuMap> sub_menu_m(test_submenu_map, sublock_);
+ DataAccessor<am::CommandsMap> commands_m(test_commands_map, comlock_);
+ DataAccessor<am::ChoiceSetMap> choice_set_m(test_choiceset_map, setlock_);
+
+ SetSubscriptions();
+ DataAccessor<am::ButtonSubscriptions> btn_sub(btn_subscr, btnlock_);
+ DataAccessor<am::VehicleInfoSubscriptions> ivi_access(ivi, ivilock_);
+
+ ON_CALL(*app_mock, is_application_data_changed()).WillByDefault(Return(true));
+
+ ON_CALL(*app_mock, policy_app_id()).WillByDefault(Return(policy_app_id_));
+ ON_CALL(*app_mock, curHash()).WillByDefault(ReturnRef(hash_));
+ ON_CALL(*app_mock, get_grammar_id()).WillByDefault(Return(grammar_id_));
+ ON_CALL(*app_mock, device()).WillByDefault(Return(device_handle_));
+ ON_CALL(*app_mock, hmi_level()).WillByDefault(Return(hmi_level_));
+ ON_CALL(*app_mock, app_id()).WillByDefault(Return(app_id_));
+ ON_CALL(*app_mock, hmi_app_id()).WillByDefault(Return(hmi_app_id_));
+ ON_CALL(*app_mock, IsAudioApplication()).WillByDefault(Return(is_audio_));
+ ON_CALL(*app_mock, commands_map()).WillByDefault(Return(commands_m));
+ ON_CALL(*app_mock, sub_menu_map()).WillByDefault(Return(sub_menu_m));
+ ON_CALL(*app_mock, choice_set_map()).WillByDefault(Return(choice_set_m));
+
+ ON_CALL(*app_mock, help_prompt()).WillByDefault(ReturnPointee(&help_prompt_));
+ ON_CALL(*app_mock, timeout_prompt())
+ .WillByDefault(ReturnPointee(&timeout_prompt_));
+ ON_CALL(*app_mock, vr_help()).WillByDefault(ReturnPointee(&vr_help_));
+ ON_CALL(*app_mock, vr_help_title())
+ .WillByDefault(ReturnPointee(&vr_help_title_));
+
+ ON_CALL(*app_mock, keyboard_props())
+ .WillByDefault(ReturnPointee(&keyboard_props_));
+ ON_CALL(*app_mock, menu_title()).WillByDefault(ReturnPointee(&menu_title_));
+ ON_CALL(*app_mock, menu_icon()).WillByDefault(ReturnPointee(&menu_icon_));
+
+ ON_CALL(*app_mock, SubscribedButtons()).WillByDefault(Return(btn_sub));
+ ON_CALL(*app_mock, SubscribedIVI()).WillByDefault(Return(ivi_access));
+
+ ON_CALL(*app_mock, getAppFiles()).WillByDefault(ReturnRef(app_files_map_));
+}
+
+void ResumptionDataTest::SetGlobalProporties() {
+ SetKeyboardProperties();
+ SetMenuTitleAndIcon();
+ SetHelpAndTimeoutPrompt();
+ SetVRHelpTitle();
+}
+
+void ResumptionDataTest::SetMenuTitleAndIcon() {
+ sm::SmartObject sm_icon;
+ sm_icon[am::strings::value] = "test icon";
+ sm_icon[am::strings::image_type] = ImageType::STATIC;
+
+ sm::SmartObject sm_title;
+ sm_title = "test title";
+ menu_title_ = new sm::SmartObject(sm_title);
+ menu_icon_ = new sm::SmartObject(sm_icon);
+}
+
+void ResumptionDataTest::SetHelpAndTimeoutPrompt() {
+ sm::SmartObject help_prompt;
+ sm::SmartObject timeout_prompt;
+
+ for (uint i = 0; i < tts_chunks_count + 3; ++i) {
+ char numb[12];
+ std::snprintf(numb, 12, "%d", i);
+ help_prompt[i][am::strings::text] = "help prompt name" + std::string(numb);
+ help_prompt[i][am::strings::type] = SpeechCapabilities::PRE_RECORDED;
+ }
+ help_prompt_ = new sm::SmartObject(help_prompt);
+ for (uint i = 0; i < tts_chunks_count; ++i) {
+ char numb[12];
+ std::snprintf(numb, 12, "%d", i);
+ timeout_prompt[i][am::strings::text] = "timeout test" + std::string(numb);
+ timeout_prompt[i][am::strings::type] = SpeechCapabilities::SC_TEXT;
+ }
+
+ timeout_prompt_ = new sm::SmartObject(timeout_prompt);
+}
+
+void ResumptionDataTest::SetVRHelpTitle() {
+ sm::SmartObject vr_help_title;
+ vr_help_title = "vr help title";
+
+ sm::SmartObject vr_help;
+ for (uint i = 0; i < count_of_vrhelptitle; ++i) {
+ char numb[12];
+ std::snprintf(numb, 12, "%d", i);
+ vr_help[i][am::strings::text] = "vr help " + std::string(numb);
+ vr_help[i][am::strings::position] = i;
+ }
+
+ vr_help_ = new sm::SmartObject(vr_help);
+ vr_help_title_ = new sm::SmartObject(vr_help_title);
+}
+
+void ResumptionDataTest::SetCommands() {
+ sm::SmartObject sm_comm;
+
+ sm::SmartObject vr_commandsvector;
+ sm::SmartObject sm_icon;
+ for (uint32_t i = 0; i < count_of_commands; ++i) {
+ char numb[12];
+ std::snprintf(numb, 12, "%d", i);
+ sm_comm[am::strings::cmd_id] = i;
+ sm_comm[am::strings::menu_params][am::strings::position] = i;
+ sm_comm[am::strings::menu_params][am::hmi_request::parent_id] = i;
+ sm_comm[am::strings::menu_params][am::strings::menu_name] =
+ "Command" + std::string(numb);
+
+ for (uint32_t j = 0; j < count_of_choice; ++j) {
+ char vr[12];
+ std::snprintf(vr, 12, "%d", i + j);
+ vr_commandsvector[j] = "VrCommand " + std::string(vr);
+ }
+ sm_comm[am::strings::vr_commands] = vr_commandsvector;
+
+ sm_icon[am::strings::value] = "command icon " + std::string(numb);
+ sm_icon[am::strings::image_type] = ImageType::STATIC;
+
+ sm_comm[am::strings::cmd_icon] = sm_icon;
+
+ test_commands_map[i] = new sm::SmartObject(sm_comm);
+ }
+}
+
+void ResumptionDataTest::SetSubmenues() {
+ sm::SmartObject sm_comm;
+ for (uint32_t i = 10; i < count_of_submenues + 10; ++i) {
+ char numb[12];
+ std::snprintf(numb, 12, "%d", i);
+ sm_comm[am::strings::menu_id] = i;
+ sm_comm[am::strings::position] = i;
+ sm_comm[am::strings::menu_name] = "SubMenu" + std::string(numb);
+ test_submenu_map[i] = new sm::SmartObject(sm_comm);
+ }
+}
+
+void ResumptionDataTest::SetChoiceSet() {
+ sm::SmartObject choice_vector;
+ sm::SmartObject choice;
+ sm::SmartObject vr_commandsvector;
+ sm::SmartObject sm_icon;
+ sm::SmartObject sec_icon;
+ sm::SmartObject app_choice_set;
+ sm::SmartObject application_choice_sets;
+ for (uint32_t i = 0; i < count_of_choice_sets; ++i) {
+ for (uint32_t j = 0; j < count_of_choice; ++j) {
+ char numb[12];
+ std::snprintf(numb, 12, "%d", i + j);
+
+ choice[am::strings::choice_id] = i + j;
+ vr_commandsvector[0] = "ChoiceSet VrCommand " + std::string(numb);
+ choice[am::strings::vr_commands] = vr_commandsvector;
+ choice[am::strings::menu_name] = "Choice name " + std::string(numb);
+ choice[am::strings::secondary_text] =
+ "secondaryText " + std::string(numb);
+ choice[am::strings::tertiary_text] = "tertiaryText " + std::string(numb);
+
+ sm_icon[am::strings::value] = "Choiceset icon " + std::string(numb);
+ sm_icon[am::strings::image_type] = ImageType::STATIC;
+
+ sec_icon[am::strings::value] =
+ "Second choiceset icon " + std::string(numb);
+ sec_icon[am::strings::image_type] = ImageType::STATIC;
+
+ choice[am::strings::image] = sm_icon;
+ choice[am::strings::secondary_image] = sec_icon;
+
+ choice_vector[j] = choice;
+ }
+ app_choice_set[am::strings::interaction_choice_set_id] = i;
+ app_choice_set[am::strings::grammar_id] = 100 + i;
+ app_choice_set[am::strings::choice_set] = choice_vector;
+ application_choice_sets[i] = app_choice_set;
+
+ test_choiceset_map[i] = new sm::SmartObject(application_choice_sets[i]);
+ }
+}
+
+void ResumptionDataTest::SetAppFiles() {
+ am::AppFile test_file;
+ int file_types;
+ for (uint i = 0; i < count_of_files; ++i) {
+ char numb[12];
+ std::snprintf(numb, 12, "%d", i);
+ file_types = i;
+ test_file.is_persistent = true;
+ test_file.is_download_complete = true;
+ test_file.file_type = static_cast<FileType::eType>(file_types);
+ test_file.file_name = "test_file " + std::string(numb);
+
+ app_files_map_[test_file.file_name] = test_file;
+ }
+}
+
+void ResumptionDataTest::SetKeyboardProperties() {
+ sm::SmartObject keyboard;
+ keyboard[am::strings::language] = Language::EN_US;
+ keyboard[am::hmi_request::keyboard_layout] = KeyboardLayout::QWERTY;
+ keyboard[am::strings::key_press_mode] = KeypressMode::SINGLE_KEYPRESS;
+ keyboard[am::strings::auto_complete_text] = "complete";
+ keyboard[am::strings::limited_character_list][0] = "y";
+ keyboard[am::strings::limited_character_list][1] = "n";
+ keyboard_props_ = new sm::SmartObject(keyboard);
+}
+
+void ResumptionDataTest::SetSubscriptions() {
+ btn_subscr.insert(ButtonName::eType::CUSTOM_BUTTON);
+ btn_subscr.insert(ButtonName::eType::OK);
+ ivi.insert(0);
+ ivi.insert(5);
+}
+
+} // namespace resumption_test
+} // namespace components
+} // namespace test
diff --git a/src/components/application_manager/test/resumption/smartDeviceLink_test.ini b/src/components/application_manager/test/resumption/smartDeviceLink_test.ini
new file mode 100644
index 000000000..cf51439d8
--- /dev/null
+++ b/src/components/application_manager/test/resumption/smartDeviceLink_test.ini
@@ -0,0 +1,37 @@
+[MAIN]
+
+; For resume_ctrl tests
+LogsEnabled = false
+; Contains .json/.ini files
+AppConfigFolder =
+; Contains output files, e.g. .wav. Changed for tests
+AppStorageFolder = test_storage
+
+[AppInfo]
+; The path for applications info storage. Changed for tests
+AppInfoStorage = test_app_info.dat
+
+[Resumption]
+
+# Timeout in milliseconds for resumption Application HMILevel
+# and resolving conflicts in case if multiple applications initiate resumption
+# Time changed for test onAppActivated
+ApplicationResumingTimeout = 30000000
+
+# Timeout in milliseconds for periodical saving resumption persistent data
+AppSavePersistentDataTimeout = 10000
+
+# Timeout in seconds to store hmi_level for media app before ign_off
+ResumptionDelayBeforeIgn = 30;
+
+# Timeout in seconds to restore hmi_level for media app after sdl run
+ResumptionDelayAfterIgn = 30;
+
+# Resumption ctrl uses JSON if UseDBForResumption=false for store data otherwise uses DB
+UseDBForResumption = false
+
+# Number of attempts to open resumption DB
+AttemptsToOpenResumptionDB = 5
+
+# Timeout between attempts during opening DB in milliseconds
+OpenAttemptTimeoutMsResumptionDB = 500
diff --git a/src/components/application_manager/test/state_controller/CMakeLists.txt b/src/components/application_manager/test/state_controller/CMakeLists.txt
new file mode 100644
index 000000000..243e6218e
--- /dev/null
+++ b/src/components/application_manager/test/state_controller/CMakeLists.txt
@@ -0,0 +1,51 @@
+# Copyright (c) 2015, Ford Motor Company
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# Redistributions of source code must retain the above copyright notice, this
+# list of conditions and the following disclaimer.
+#
+# Redistributions in binary form must reproduce the above copyright notice,
+# this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided with the
+# distribution.
+#
+# Neither the name of the Ford Motor Company nor the names of its contributors
+# may be used to endorse or promote products derived from this software
+# without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+if(BUILD_TESTS)
+
+set(appMain_DIR ${CMAKE_SOURCE_DIR}/src/appMain)
+
+include_directories(
+ ${GMOCK_INCLUDE_DIRECTORY}
+ ${COMPONENTS_DIR}/application_manager/test/state_controller/include
+)
+
+set(LIBRARIES
+ gmock
+ ApplicationManager
+)
+
+set(SOURCES
+ state_controller_test.cc
+)
+
+create_test("state_controller_test" "${SOURCES}" "${LIBRARIES}")
+
+endif()
diff --git a/src/components/application_manager/test/state_controller/include/application_manager_mock.h b/src/components/application_manager/test/state_controller/include/application_manager_mock.h
new file mode 100644
index 000000000..22ff93687
--- /dev/null
+++ b/src/components/application_manager/test/state_controller/include/application_manager_mock.h
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef SRC_COMPONENTS_APPLICATION_MANAGER_TEST_STATE_CONTROLLER_INCLUDE_APPLICATION_MANAGER_MOCK_H_
+#define SRC_COMPONENTS_APPLICATION_MANAGER_TEST_STATE_CONTROLLER_INCLUDE_APPLICATION_MANAGER_MOCK_H_
+#include <string>
+#include <vector>
+#include "gmock/gmock.h"
+#include "application_manager/application_manager.h"
+#include "application_manager/usage_statistics.h"
+
+namespace state_controller_test {
+namespace am = application_manager;
+
+class ApplicationManagerMock : public application_manager::ApplicationManager {
+ public:
+ MOCK_METHOD0(Init, bool());
+ MOCK_METHOD0(Stop, bool());
+
+ MOCK_METHOD1(set_hmi_message_handler,
+ void(hmi_message_handler::HMIMessageHandler*));
+ MOCK_METHOD1(set_protocol_handler, void(protocol_handler::ProtocolHandler*));
+ MOCK_METHOD1(set_connection_handler,
+ void(connection_handler::ConnectionHandler*));
+ MOCK_CONST_METHOD0(applications, DataAccessor<am::ApplicationSet>());
+ MOCK_CONST_METHOD1(application_by_hmi_app,
+ am::ApplicationSharedPtr(uint32_t));
+ MOCK_CONST_METHOD1(application, am::ApplicationSharedPtr(uint32_t));
+
+ MOCK_CONST_METHOD0(active_application, am::ApplicationSharedPtr());
+ MOCK_CONST_METHOD1(application_by_policy_id,
+ am::ApplicationSharedPtr(const std::string&));
+ MOCK_METHOD1(applications_by_button,
+ std::vector<am::ApplicationSharedPtr>(uint32_t));
+ MOCK_METHOD0(applications_with_navi, std::vector<am::ApplicationSharedPtr>());
+ MOCK_CONST_METHOD0(get_limited_media_application, am::ApplicationSharedPtr());
+ MOCK_CONST_METHOD0(get_limited_navi_application, am::ApplicationSharedPtr());
+ MOCK_CONST_METHOD0(get_limited_voice_application, am::ApplicationSharedPtr());
+ MOCK_METHOD2(set_application_id, void(const int32_t, const uint32_t));
+ MOCK_METHOD1(application_id, uint32_t(const int32_t));
+ MOCK_METHOD3(OnHMILevelChanged, void(uint32_t, mobile_apis::HMILevel::eType,
+ mobile_apis::HMILevel::eType));
+ MOCK_METHOD1(SendHMIStatusNotification, void(const am::ApplicationSharedPtr));
+ MOCK_CONST_METHOD1(GetDefaultHmiLevel, mobile_apis::HMILevel::eType(
+ am::ApplicationConstSharedPtr));
+ MOCK_METHOD0(hmi_capabilities, am::HMICapabilities&());
+ MOCK_METHOD0(is_attenuated_supported, bool());
+ MOCK_CONST_METHOD1(IsAppTypeExistsInFullOrLimited, bool(am::ApplicationConstSharedPtr));
+};
+} // namespace state_controller_test
+#endif // SRC_COMPONENTS_APPLICATION_MANAGER_TEST_STATE_CONTROLLER_INCLUDE_APPLICATION_MANAGER_MOCK_H_
diff --git a/src/components/application_manager/test/state_controller/include/application_mock.h b/src/components/application_manager/test/state_controller/include/application_mock.h
new file mode 100644
index 000000000..01dafd10f
--- /dev/null
+++ b/src/components/application_manager/test/state_controller/include/application_mock.h
@@ -0,0 +1,252 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef SRC_COMPONENTS_APPLICATION_MANAGER_TEST_STATE_CONTROLLER_INCLUDE_APPLICATION_MOCK_H_
+#define SRC_COMPONENTS_APPLICATION_MANAGER_TEST_STATE_CONTROLLER_INCLUDE_APPLICATION_MOCK_H_
+
+#include <string>
+
+#include "gmock/gmock.h"
+#include "application_manager/application.h"
+namespace state_controller_test {
+namespace am = application_manager;
+
+class ApplicationMock : public am::Application {
+ public:
+ MOCK_CONST_METHOD0(active_message, const smart_objects::SmartObject*());
+ MOCK_CONST_METHOD0(curHash, const std::string&());
+ MOCK_METHOD0(UpdateHash, void());
+ MOCK_CONST_METHOD0(flag_sending_hash_change_after_awake, bool());
+ MOCK_METHOD1(set_flag_sending_hash_change_after_awake, void(bool flag));
+ MOCK_CONST_METHOD0(is_application_data_changed, bool());
+ MOCK_METHOD1(set_is_application_data_changed,
+ void(bool state_application_data));
+ MOCK_METHOD0(CloseActiveMessage, void());
+ MOCK_CONST_METHOD0(IsFullscreen, bool());
+ MOCK_METHOD0(ChangeSupportingAppHMIType, void());
+ MOCK_CONST_METHOD0(is_navi, bool());
+ MOCK_METHOD1(set_is_navi, void(bool allow));
+ MOCK_CONST_METHOD0(video_streaming_approved, bool());
+ MOCK_METHOD1(set_video_streaming_approved, void(bool state));
+ MOCK_CONST_METHOD0(audio_streaming_approved, bool());
+ MOCK_METHOD1(set_audio_streaming_approved, void(bool state));
+ MOCK_CONST_METHOD0(video_streaming_allowed, bool());
+ MOCK_METHOD1(set_video_streaming_allowed, void(bool state));
+ MOCK_CONST_METHOD0(audio_streaming_allowed, bool());
+ MOCK_METHOD1(set_audio_streaming_allowed, void(bool state));
+ MOCK_METHOD1(StartStreaming,
+ void(protocol_handler::ServiceType service_type));
+ MOCK_METHOD1(StopStreaming, void(protocol_handler::ServiceType service_type));
+ MOCK_METHOD1(SuspendStreaming,
+ void(protocol_handler::ServiceType service_type));
+ MOCK_METHOD1(WakeUpStreaming,
+ void(protocol_handler::ServiceType service_type));
+ MOCK_CONST_METHOD0(is_voice_communication_supported, bool());
+ MOCK_METHOD1(set_voice_communication_supported,
+ void(bool is_voice_communication_supported));
+ MOCK_CONST_METHOD0(app_allowed, bool());
+ MOCK_CONST_METHOD0(has_been_activated, bool());
+ MOCK_METHOD1(set_activated, bool(bool is_active));
+ MOCK_CONST_METHOD0(version, const am::Version&());
+ MOCK_METHOD1(set_hmi_application_id, void(uint32_t hmi_app_id));
+
+ MOCK_CONST_METHOD0(hmi_app_id, uint32_t());
+ MOCK_CONST_METHOD0(name, const std::string&());
+ MOCK_METHOD1(set_folder_name, void(const std::string& folder_name));
+ MOCK_CONST_METHOD0(folder_name, const std::string());
+ MOCK_CONST_METHOD0(is_media_application, bool());
+ MOCK_CONST_METHOD0(hmi_level, const mobile_apis::HMILevel::eType());
+ MOCK_CONST_METHOD0(put_file_in_none_count, const uint32_t());
+ MOCK_CONST_METHOD0(delete_file_in_none_count, const uint32_t());
+ MOCK_CONST_METHOD0(list_files_in_none_count, const uint32_t());
+ MOCK_CONST_METHOD0(system_context, const mobile_apis::SystemContext::eType());
+ MOCK_CONST_METHOD0(audio_streaming_state,
+ const mobile_apis::AudioStreamingState::eType());
+ MOCK_CONST_METHOD0(app_icon_path, const std::string&());
+ MOCK_CONST_METHOD0(device, connection_handler::DeviceHandle());
+ MOCK_METHOD0(tts_speak_state, bool());
+ MOCK_CONST_METHOD0(CurrentHmiState, am::HmiStatePtr());
+ MOCK_CONST_METHOD0(RegularHmiState, am::HmiStatePtr());
+ MOCK_CONST_METHOD0(PostponedHmiState, am::HmiStatePtr());
+ MOCK_METHOD1(set_tts_properties_in_none, void(bool active));
+ MOCK_METHOD0(tts_properties_in_none, bool());
+ MOCK_METHOD1(set_tts_properties_in_full, void(bool active));
+ MOCK_METHOD0(tts_properties_in_full, bool());
+ MOCK_METHOD1(set_version, void(const am::Version& version));
+ MOCK_METHOD1(set_name, void(const std::string& name));
+ MOCK_METHOD1(set_is_media_application, void(bool is_media));
+ MOCK_METHOD0(increment_put_file_in_none_count, void());
+ MOCK_METHOD0(increment_delete_file_in_none_count, void());
+ MOCK_METHOD0(increment_list_files_in_none_count, void());
+ MOCK_METHOD1(set_app_icon_path, bool(const std::string& file_name));
+ MOCK_METHOD1(set_app_allowed, void(const bool& allowed));
+ MOCK_METHOD1(set_device, void(connection_handler::DeviceHandle device));
+ MOCK_CONST_METHOD0(get_grammar_id, uint32_t());
+ MOCK_METHOD1(set_grammar_id, void(uint32_t value));
+ MOCK_METHOD1(set_protocol_version,
+ void(const am::ProtocolVersion& protocol_version));
+ MOCK_CONST_METHOD0(protocol_version, am::ProtocolVersion());
+ MOCK_METHOD1(set_is_resuming, void(bool));
+ MOCK_CONST_METHOD0(is_resuming, bool());
+ MOCK_METHOD1(AddFile, bool(const am::AppFile& file));
+ MOCK_CONST_METHOD0(getAppFiles, const am::AppFilesMap&());
+ MOCK_METHOD1(UpdateFile, bool(const am::AppFile& file));
+ MOCK_METHOD1(DeleteFile, bool(const std::string& file_name));
+ MOCK_METHOD1(GetFile, const am::AppFile*(const std::string& file_name));
+ MOCK_METHOD1(SubscribeToButton,
+ bool(mobile_apis::ButtonName::eType btn_name));
+ MOCK_METHOD1(IsSubscribedToButton,
+ bool(mobile_apis::ButtonName::eType btn_name));
+ MOCK_METHOD1(UnsubscribeFromButton,
+ bool(mobile_apis::ButtonName::eType btn_name));
+ MOCK_METHOD1(SubscribeToIVI, bool(uint32_t vehicle_info_type));
+ MOCK_CONST_METHOD1(IsSubscribedToIVI, bool(uint32_t vehicle_info_type));
+ MOCK_METHOD1(UnsubscribeFromIVI, bool(uint32_t vehicle_info_type));
+ MOCK_METHOD0(ResetDataInNone, void());
+ MOCK_METHOD2(IsCommandLimitsExceeded,
+ bool(mobile_apis::FunctionID::eType cmd_id,
+ am::TLimitSource source));
+ MOCK_METHOD0(usage_report, am::UsageStatistics&());
+ MOCK_METHOD1(SetRegularState, void(am::HmiStatePtr state));
+ MOCK_METHOD1(SetPostponedState, void(am::HmiStatePtr state));
+ MOCK_METHOD1(AddHMIState, void(am::HmiStatePtr state));
+ MOCK_METHOD1(RemoveHMIState, void(am::HmiState::StateID state_id));
+ MOCK_METHOD2(SubscribeToSoftButtons,
+ void(int32_t cmd_id, const am::SoftButtonID& softbuttons_id));
+ MOCK_METHOD1(IsSubscribedToSoftButton, bool(const uint32_t softbutton_id));
+ MOCK_METHOD1(UnsubscribeFromSoftButtons, void(int32_t cmd_id));
+ MOCK_CONST_METHOD0(IsAudioApplication, bool());
+ MOCK_METHOD0(LoadPersistentFiles, void());
+
+ // InitialApplicationData methods
+ MOCK_CONST_METHOD0(app_types, const smart_objects::SmartObject*());
+ MOCK_CONST_METHOD0(vr_synonyms, const smart_objects::SmartObject*());
+ MOCK_CONST_METHOD0(policy_app_id, std::string());
+ MOCK_CONST_METHOD0(tts_name, const smart_objects::SmartObject*());
+ MOCK_CONST_METHOD0(ngn_media_screen_name,
+ const smart_objects::SmartObject*());
+ MOCK_CONST_METHOD0(language, const mobile_apis::Language::eType&());
+ MOCK_CONST_METHOD0(ui_language, const mobile_apis::Language::eType&());
+ MOCK_METHOD1(set_app_types,
+ void(const smart_objects::SmartObject& app_types));
+ MOCK_METHOD1(set_vr_synonyms,
+ void(const smart_objects::SmartObject& vr_synonyms));
+ MOCK_METHOD1(set_policy_app_id, void(const std::string& policy_app_id));
+ MOCK_METHOD1(set_tts_name, void(const smart_objects::SmartObject& tts_name));
+ MOCK_METHOD1(set_ngn_media_screen_name,
+ void(const smart_objects::SmartObject& ngn_name));
+ MOCK_METHOD1(set_language,
+ void(const mobile_apis::Language::eType& language));
+ MOCK_METHOD1(set_ui_language,
+ void(const mobile_apis::Language::eType& ui_language));
+
+ // DynamicApplicationData methods
+ MOCK_CONST_METHOD0(help_prompt, const smart_objects::SmartObject*());
+ MOCK_CONST_METHOD0(timeout_prompt, const smart_objects::SmartObject*());
+ MOCK_CONST_METHOD0(vr_help_title, const smart_objects::SmartObject*());
+ MOCK_CONST_METHOD0(vr_help, const smart_objects::SmartObject*());
+ MOCK_CONST_METHOD0(tbt_state, const mobile_apis::TBTState::eType&());
+ MOCK_CONST_METHOD0(show_command, const smart_objects::SmartObject*());
+ MOCK_CONST_METHOD0(tbt_show_command, const smart_objects::SmartObject*());
+ MOCK_CONST_METHOD0(SubscribedButtons,
+ DataAccessor<am::ButtonSubscriptions>());
+ MOCK_CONST_METHOD0(SubscribedIVI,
+ DataAccessor<am::VehicleInfoSubscriptions>());
+ MOCK_CONST_METHOD0(keyboard_props, const smart_objects::SmartObject*());
+ MOCK_CONST_METHOD0(menu_title, const smart_objects::SmartObject*());
+ MOCK_CONST_METHOD0(menu_icon, const smart_objects::SmartObject*());
+ MOCK_METHOD1(load_global_properties,
+ void(const smart_objects::SmartObject& so));
+ MOCK_METHOD1(set_help_prompt,
+ void(const smart_objects::SmartObject& help_prompt));
+ MOCK_METHOD1(set_timeout_prompt,
+ void(const smart_objects::SmartObject& timeout_prompt));
+ MOCK_METHOD1(set_vr_help_title,
+ void(const smart_objects::SmartObject& vr_help_title));
+ MOCK_METHOD0(reset_vr_help_title, void());
+ MOCK_METHOD1(set_vr_help, void(const smart_objects::SmartObject& vr_help));
+ MOCK_METHOD0(reset_vr_help, void());
+ MOCK_METHOD1(set_tbt_state,
+ void(const mobile_apis::TBTState::eType& tbt_state));
+ MOCK_METHOD1(set_show_command,
+ void(const smart_objects::SmartObject& show_command));
+ MOCK_METHOD1(set_tbt_show_command,
+ void(const smart_objects::SmartObject& tbt_show));
+ MOCK_METHOD1(set_keyboard_props,
+ void(const smart_objects::SmartObject& keyboard_props));
+ MOCK_METHOD1(set_menu_title,
+ void(const smart_objects::SmartObject& menu_title));
+ MOCK_METHOD1(set_menu_icon,
+ void(const smart_objects::SmartObject& menu_icon));
+ MOCK_CONST_METHOD0(audio_stream_retry_number, uint32_t());
+ MOCK_METHOD1(set_audio_stream_retry_number,
+ void(const uint32_t& audio_stream_retry_number));
+ MOCK_CONST_METHOD0(video_stream_retry_number, uint32_t());
+ MOCK_METHOD1(set_video_stream_retry_number,
+ void(const uint32_t& video_stream_retry_number));
+ MOCK_METHOD2(AddCommand, void(uint32_t cmd_id,
+ const smart_objects::SmartObject& command));
+ MOCK_METHOD1(RemoveCommand, void(uint32_t cmd_id));
+ MOCK_METHOD1(FindCommand, smart_objects::SmartObject*(uint32_t cmd_id));
+ MOCK_METHOD2(AddSubMenu,
+ void(uint32_t menu_id, const smart_objects::SmartObject& menu));
+ MOCK_METHOD1(RemoveSubMenu, void(uint32_t menu_id));
+ MOCK_CONST_METHOD1(FindSubMenu,
+ smart_objects::SmartObject*(uint32_t menu_id));
+ MOCK_METHOD1(IsSubMenuNameAlreadyExist, bool(const std::string& name));
+ MOCK_METHOD2(AddChoiceSet,
+ void(uint32_t choice_set_id,
+ const smart_objects::SmartObject& choice_set));
+ MOCK_METHOD1(RemoveChoiceSet, void(uint32_t choice_set_id));
+ MOCK_METHOD1(FindChoiceSet,
+ smart_objects::SmartObject*(uint32_t choice_set_id));
+ MOCK_METHOD3(AddPerformInteractionChoiceSet,
+ void(uint32_t correlation_id, uint32_t choice_set_id,
+ const smart_objects::SmartObject& choice_set));
+ MOCK_METHOD1(DeletePerformInteractionChoiceSet,
+ void(uint32_t correlation_id));
+ MOCK_CONST_METHOD0(performinteraction_choice_set_map,
+ DataAccessor<am::PerformChoiceSetMap>());
+ MOCK_CONST_METHOD0(commands_map, DataAccessor<am::CommandsMap>());
+ MOCK_CONST_METHOD0(sub_menu_map, DataAccessor<am::SubMenuMap>());
+ MOCK_CONST_METHOD0(choice_set_map, DataAccessor<am::ChoiceSetMap>());
+ MOCK_METHOD1(set_perform_interaction_active, void(uint32_t active));
+ MOCK_CONST_METHOD0(is_perform_interaction_active, uint32_t());
+ MOCK_METHOD1(set_perform_interaction_mode, void(int32_t mode));
+ MOCK_CONST_METHOD0(perform_interaction_mode, int32_t());
+ MOCK_METHOD1(set_reset_global_properties_active, void(bool active));
+ MOCK_CONST_METHOD0(is_reset_global_properties_active, bool());
+ MOCK_CONST_METHOD0(app_id, uint32_t());
+};
+
+} // namespace state_controller_test
+#endif // SRC_COMPONENTS_APPLICATION_MANAGER_TEST_STATE_CONTROLLER_INCLUDE_APPLICATION_MOCK_H_
diff --git a/src/components/application_manager/test/state_controller/include/state_controller_mock.h b/src/components/application_manager/test/state_controller/include/state_controller_mock.h
new file mode 100644
index 000000000..b9f7dd30d
--- /dev/null
+++ b/src/components/application_manager/test/state_controller/include/state_controller_mock.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef SRC_COMPONENTS_APPLICATION_MANAGER_TEST_STATE_CONTROLLER_INCLUDE_STATE_CONTROLLER_MOCK
+#define SRC_COMPONENTS_APPLICATION_MANAGER_TEST_STATE_CONTROLLER_INCLUDE_STATE_CONTROLLER_MOCK
+
+#include "gmock/gmock.h"
+#include "application_manager/application.h"
+#include "application_manager/hmi_state.h"
+#include "application_manager/state_controller.h"
+#include "application_manager/application_manager.h"
+#include "interfaces/MOBILE_API.h"
+
+namespace state_controller_test {
+namespace am = application_manager;
+
+class StateControllerMock :public am::StateController {
+ public:
+ MOCK_METHOD2(SetRegularState, void (
+ am::ApplicationSharedPtr, const mobile_apis::AudioStreamingState::eType));
+ MOCK_METHOD2(SetRegularState, void (
+ am::ApplicationSharedPtr, const mobile_apis::SystemContext::eType));
+ MOCK_METHOD3(OnStateChanged, void (
+ am::ApplicationSharedPtr, am::HmiStatePtr, am::HmiStatePtr));
+ MOCK_METHOD1(ApplyStatesForApp, void (am::ApplicationSharedPtr));
+ MOCK_METHOD0(OnNaviStreamingStarted, void ());
+ MOCK_METHOD0(OnNaviStreamingStopped, void ());
+};
+
+}
+#endif // SRC_COMPONENTS_APPLICATION_MANAGER_TEST_STATE_CONTROLLER_INCLUDE_STATE_CONTROLLER_MOCK
diff --git a/src/components/application_manager/test/state_controller/include/statistics_manager_mock.h b/src/components/application_manager/test/state_controller/include/statistics_manager_mock.h
new file mode 100644
index 000000000..4e2dae78d
--- /dev/null
+++ b/src/components/application_manager/test/state_controller/include/statistics_manager_mock.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef SRC_COMPONENTS_APPLICATION_MANAGER_TEST_STATE_CONTROLLER_INCLUDE_STATISTICS_MANAGER_MOCK_H_
+#define SRC_COMPONENTS_APPLICATION_MANAGER_TEST_STATE_CONTROLLER_INCLUDE_STATISTICS_MANAGER_MOCK_H_
+
+#include <string>
+#include "gmock/gmock.h"
+#include "usage_statistics/statistics_manager.h"
+
+namespace state_controller_test {
+namespace us = usage_statistics;
+
+class StatisticsManagerMock : public us::StatisticsManager {
+ public:
+ MOCK_METHOD1(Increment, void (us::GlobalCounterId));
+ MOCK_METHOD2(Increment, void (const std::string&, us::AppCounterId));
+ MOCK_METHOD3(Set, void (const std::string&, us::AppInfoId, const std::string&));
+ MOCK_METHOD3(Add, void (const std::string&, us::AppStopwatchId, int32_t));
+};
+
+} // namespace state_controller_test
+#endif // SRC_COMPONENTS_APPLICATION_MANAGER_TEST_STATE_CONTROLLER_INCLUDE_STATISTICS_MANAGER_MOCK_H_
diff --git a/src/components/application_manager/test/state_controller/state_controller_test.cc b/src/components/application_manager/test/state_controller/state_controller_test.cc
new file mode 100644
index 000000000..488d12b50
--- /dev/null
+++ b/src/components/application_manager/test/state_controller/state_controller_test.cc
@@ -0,0 +1,1483 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <gtest/gtest.h>
+#include "application_manager/hmi_state.h"
+#include "application_manager/state_controller.h"
+#include "application_manager/usage_statistics.h"
+#include "application_manager_mock.h"
+#include "application_mock.h"
+#include "statistics_manager_mock.h"
+#include "utils/lock.h"
+#include "utils/data_accessor.h"
+#include "utils/make_shared.h"
+#include "application_manager/message_helper.h"
+#include "application_manager/event_engine/event.h"
+#include "application_manager/smart_object_keys.h"
+
+namespace am = application_manager;
+using ::testing::_;
+using ::testing::Return;
+using ::testing::ReturnRef;
+using ::testing::ReturnPointee;
+using ::testing::Mock;
+using ::testing::NiceMock;
+using ::testing::InSequence;
+using ::testing::Truly;
+
+class MessageHelperMock {
+ public:
+ MOCK_METHOD3(SendActivateAppToHMI,
+ uint32_t(uint32_t const app_id,
+ hmi_apis::Common_HMILevel::eType level,
+ bool send_policy_priority));
+ MOCK_METHOD1(SendOnResumeAudioSourceToHMI, void(const uint32_t app_id));
+};
+
+static MessageHelperMock* message_helper_mock_;
+
+uint32_t application_manager::MessageHelper::SendActivateAppToHMI(
+ uint32_t const app_id, hmi_apis::Common_HMILevel::eType level,
+ bool send_policy_priority) {
+ return message_helper_mock_->SendActivateAppToHMI(app_id, level,
+ send_policy_priority);
+}
+
+void application_manager::MessageHelper::SendOnResumeAudioSourceToHMI(
+ const uint32_t app_id) {
+ message_helper_mock_->SendOnResumeAudioSourceToHMI(app_id);
+}
+
+namespace state_controller_test {
+
+struct HmiStatesComparator {
+ mobile_apis::HMILevel::eType hmi_level_;
+ mobile_apis::AudioStreamingState::eType audio_streaming_state_;
+ mobile_apis::SystemContext::eType system_context_;
+
+ HmiStatesComparator(
+ mobile_apis::HMILevel::eType hmi_level,
+ mobile_apis::AudioStreamingState::eType audio_streaming_state,
+ mobile_apis::SystemContext::eType system_context)
+ : hmi_level_(hmi_level),
+ audio_streaming_state_(audio_streaming_state),
+ system_context_(system_context) {}
+
+ HmiStatesComparator(am::HmiStatePtr state_ptr)
+ : hmi_level_(state_ptr->hmi_level()),
+ audio_streaming_state_(state_ptr->audio_streaming_state()),
+ system_context_(state_ptr->system_context()) {}
+
+ bool operator()(am::HmiStatePtr state_ptr) const {
+ return state_ptr->hmi_level() == hmi_level_ &&
+ state_ptr->audio_streaming_state() == audio_streaming_state_ &&
+ state_ptr->system_context() == system_context_;
+ }
+};
+
+struct HmiStatesIDComparator {
+ am::HmiState::StateID state_id_;
+
+ HmiStatesIDComparator(am::HmiState::StateID state_id)
+ : state_id_(state_id) {}
+
+ bool operator()(am::HmiStatePtr state_ptr) const {
+ return state_ptr->state_id() == state_id_;
+ }
+};
+
+#define MEDIA true
+#define NOT_MEDIA false
+#define VC true
+#define NOT_VC false
+#define NAVI true
+#define NOT_NAVI false
+
+class StateControllerTest : public ::testing::Test {
+ public:
+ StateControllerTest()
+ : ::testing::Test(),
+ usage_stat("0", utils::SharedPtr<us::StatisticsManager>(
+ new StatisticsManagerMock)),
+ applications_(application_set_, applications_lock_),
+ state_ctrl_(&app_manager_mock_) {}
+ NiceMock<ApplicationManagerMock> app_manager_mock_;
+
+ am::UsageStatistics usage_stat;
+
+ am::ApplicationSet application_set_;
+ mutable sync_primitives::Lock applications_lock_;
+ DataAccessor<am::ApplicationSet> applications_;
+ am::StateController state_ctrl_;
+
+ am::ApplicationSharedPtr simple_app_;
+ NiceMock<ApplicationMock>* simple_app_ptr_;
+ uint32_t simple_app_id_ = 1721;
+
+ am::ApplicationSharedPtr navi_app_;
+ NiceMock<ApplicationMock>* navi_app_ptr_;
+ uint32_t navi_app_id_ = 1762;
+
+ am::ApplicationSharedPtr media_app_;
+ NiceMock<ApplicationMock>* media_app_ptr_;
+ uint32_t media_app_id_ = 1801;
+
+ am::ApplicationSharedPtr vc_app_;
+ NiceMock<ApplicationMock>* vc_app_ptr_;
+ uint32_t vc_app_id_ = 1825;
+
+ am::ApplicationSharedPtr media_navi_app_;
+ NiceMock<ApplicationMock>* media_navi_app_ptr_;
+ uint32_t media_navi_app_id_ = 1855;
+
+ am::ApplicationSharedPtr media_vc_app_;
+ NiceMock<ApplicationMock>* media_vc_app_ptr_;
+ uint32_t media_vc_app_id_ = 1881;
+
+ am::ApplicationSharedPtr navi_vc_app_;
+ NiceMock<ApplicationMock>* navi_vc_app_ptr_;
+ uint32_t navi_vc_app_id_ = 1894;
+
+ am::ApplicationSharedPtr media_navi_vc_app_;
+ NiceMock<ApplicationMock>* media_navi_vc_app_ptr_;
+ uint32_t media_navi_vc_app_id_ = 1922;
+
+ std::vector<am::HmiStatePtr> valid_states_for_audio_app_;
+ std::vector<am::HmiStatePtr> valid_states_for_not_audio_app_;
+ std::vector<am::HmiStatePtr> common_invalid_states_;
+ std::vector<am::HmiStatePtr> invalid_states_for_not_audio_app;
+ std::vector<am::HmiStatePtr> invalid_states_for_audio_app;
+ std::vector<am::HmiState::StateID> valid_state_ids_;
+
+ am::HmiStatePtr createHmiState(
+ mobile_apis::HMILevel::eType hmi_level,
+ mobile_apis::AudioStreamingState::eType aidio_ss,
+ mobile_apis::SystemContext::eType system_context) {
+ namespace HMILevel = mobile_apis::HMILevel;
+ namespace AudioStreamingState = mobile_apis::AudioStreamingState;
+ namespace SystemContext = mobile_apis::SystemContext;
+
+ am::HmiStatePtr state =
+ utils::MakeShared<am::HmiState>(simple_app_id_, &app_manager_mock_);
+ state->set_hmi_level(hmi_level);
+ state->set_audio_streaming_state(aidio_ss);
+ state->set_system_context(system_context);
+ return state;
+ }
+
+ protected:
+ am::ApplicationSharedPtr ConfigureApp(NiceMock<ApplicationMock>** app_mock,
+ uint32_t app_id, bool media, bool navi,
+ bool vc) {
+ *app_mock = new NiceMock<ApplicationMock>;
+
+ Mock::AllowLeak(*app_mock); // WorkAround for gogletest bug
+ am::ApplicationSharedPtr app(*app_mock);
+
+ ON_CALL(**app_mock, app_id()).WillByDefault(Return(app_id));
+ ON_CALL(**app_mock, is_media_application()).WillByDefault(Return(media));
+ ON_CALL(**app_mock, is_navi()).WillByDefault(Return(navi));
+ ON_CALL(**app_mock, is_voice_communication_supported())
+ .WillByDefault(Return(vc));
+ ON_CALL(**app_mock, IsAudioApplication())
+ .WillByDefault(Return(media || navi || vc));
+
+ EXPECT_CALL(**app_mock, usage_report())
+ .WillRepeatedly(ReturnRef(usage_stat));
+
+ return app;
+ }
+
+ void FillStatesLists() {
+ namespace HMILevel = mobile_apis::HMILevel;
+ namespace AudioStreamingState = mobile_apis::AudioStreamingState;
+ namespace SystemContext = mobile_apis::SystemContext;
+ // Valid states for not audio app
+ message_helper_mock_ = new MessageHelperMock;
+ valid_states_for_not_audio_app_.push_back(
+ createHmiState(HMILevel::HMI_NONE, AudioStreamingState::NOT_AUDIBLE,
+ SystemContext::SYSCTXT_MAIN));
+ valid_states_for_not_audio_app_.push_back(
+ createHmiState(HMILevel::HMI_NONE, AudioStreamingState::NOT_AUDIBLE,
+ SystemContext::SYSCTXT_VRSESSION));
+ valid_states_for_not_audio_app_.push_back(
+ createHmiState(HMILevel::HMI_NONE, AudioStreamingState::NOT_AUDIBLE,
+ SystemContext::SYSCTXT_MENU));
+ valid_states_for_not_audio_app_.push_back(
+ createHmiState(HMILevel::HMI_NONE, AudioStreamingState::NOT_AUDIBLE,
+ SystemContext::SYSCTXT_HMI_OBSCURED));
+ valid_states_for_not_audio_app_.push_back(
+ createHmiState(HMILevel::HMI_NONE, AudioStreamingState::NOT_AUDIBLE,
+ SystemContext::SYSCTXT_ALERT));
+ valid_states_for_not_audio_app_.push_back(createHmiState(
+ HMILevel::HMI_BACKGROUND, AudioStreamingState::NOT_AUDIBLE,
+ SystemContext::SYSCTXT_MAIN));
+ valid_states_for_not_audio_app_.push_back(
+ createHmiState(HMILevel::HMI_FULL, AudioStreamingState::NOT_AUDIBLE,
+ SystemContext::SYSCTXT_MAIN));
+
+ // Valid states audio app
+ valid_states_for_audio_app_.push_back(
+ createHmiState(HMILevel::HMI_NONE, AudioStreamingState::NOT_AUDIBLE,
+ SystemContext::SYSCTXT_MAIN));
+ valid_states_for_audio_app_.push_back(
+ createHmiState(HMILevel::HMI_NONE, AudioStreamingState::NOT_AUDIBLE,
+ SystemContext::SYSCTXT_VRSESSION));
+ valid_states_for_audio_app_.push_back(
+ createHmiState(HMILevel::HMI_NONE, AudioStreamingState::NOT_AUDIBLE,
+ SystemContext::SYSCTXT_MENU));
+ valid_states_for_audio_app_.push_back(
+ createHmiState(HMILevel::HMI_NONE, AudioStreamingState::NOT_AUDIBLE,
+ SystemContext::SYSCTXT_HMI_OBSCURED));
+ valid_states_for_audio_app_.push_back(
+ createHmiState(HMILevel::HMI_NONE, AudioStreamingState::NOT_AUDIBLE,
+ SystemContext::SYSCTXT_ALERT));
+ valid_states_for_audio_app_.push_back(createHmiState(
+ HMILevel::HMI_BACKGROUND, AudioStreamingState::NOT_AUDIBLE,
+ SystemContext::SYSCTXT_MAIN));
+ valid_states_for_audio_app_.push_back(
+ createHmiState(HMILevel::HMI_LIMITED, AudioStreamingState::AUDIBLE,
+ SystemContext::SYSCTXT_MAIN));
+ valid_states_for_audio_app_.push_back(
+ createHmiState(HMILevel::HMI_LIMITED, AudioStreamingState::ATTENUATED,
+ SystemContext::SYSCTXT_MAIN));
+ valid_states_for_audio_app_.push_back(
+ createHmiState(HMILevel::HMI_FULL, AudioStreamingState::NOT_AUDIBLE,
+ SystemContext::SYSCTXT_MAIN));
+ valid_states_for_audio_app_.push_back(
+ createHmiState(HMILevel::HMI_FULL, AudioStreamingState::AUDIBLE,
+ SystemContext::SYSCTXT_MAIN));
+
+ // Common Invalid States
+ common_invalid_states_.push_back(
+ createHmiState(HMILevel::INVALID_ENUM, AudioStreamingState::NOT_AUDIBLE,
+ SystemContext::SYSCTXT_MAIN));
+ common_invalid_states_.push_back(
+ createHmiState(HMILevel::HMI_NONE, AudioStreamingState::INVALID_ENUM,
+ SystemContext::SYSCTXT_MAIN));
+ common_invalid_states_.push_back(
+ createHmiState(HMILevel::HMI_NONE, AudioStreamingState::NOT_AUDIBLE,
+ SystemContext::INVALID_ENUM));
+ common_invalid_states_.push_back(createHmiState(
+ HMILevel::INVALID_ENUM, AudioStreamingState::INVALID_ENUM,
+ SystemContext::SYSCTXT_MAIN));
+ common_invalid_states_.push_back(
+ createHmiState(HMILevel::HMI_NONE, AudioStreamingState::INVALID_ENUM,
+ SystemContext::INVALID_ENUM));
+ common_invalid_states_.push_back(createHmiState(
+ HMILevel::INVALID_ENUM, AudioStreamingState::INVALID_ENUM,
+ SystemContext::INVALID_ENUM));
+ common_invalid_states_.push_back(createHmiState(
+ HMILevel::INVALID_ENUM, AudioStreamingState::INVALID_ENUM,
+ SystemContext::INVALID_ENUM));
+ // Invalid States for audio apps
+ invalid_states_for_audio_app.push_back(
+ createHmiState(HMILevel::HMI_LIMITED, AudioStreamingState::NOT_AUDIBLE,
+ SystemContext::SYSCTXT_MAIN));
+ invalid_states_for_audio_app.push_back(
+ createHmiState(HMILevel::HMI_BACKGROUND, AudioStreamingState::AUDIBLE,
+ SystemContext::SYSCTXT_MAIN));
+ invalid_states_for_audio_app.push_back(createHmiState(
+ HMILevel::HMI_BACKGROUND, AudioStreamingState::ATTENUATED,
+ SystemContext::SYSCTXT_MAIN));
+ invalid_states_for_audio_app.push_back(
+ createHmiState(HMILevel::HMI_NONE, AudioStreamingState::AUDIBLE,
+ SystemContext::SYSCTXT_MAIN));
+ invalid_states_for_audio_app.push_back(
+ createHmiState(HMILevel::HMI_NONE, AudioStreamingState::ATTENUATED,
+ SystemContext::SYSCTXT_MAIN));
+ invalid_states_for_audio_app.push_back(
+ createHmiState(HMILevel::HMI_NONE, AudioStreamingState::ATTENUATED,
+ SystemContext::SYSCTXT_MAIN));
+ // Invalid States for not audio apps
+ invalid_states_for_not_audio_app.push_back(
+ createHmiState(HMILevel::HMI_LIMITED, AudioStreamingState::ATTENUATED,
+ SystemContext::SYSCTXT_MAIN));
+ invalid_states_for_not_audio_app.push_back(
+ createHmiState(HMILevel::HMI_LIMITED, AudioStreamingState::AUDIBLE,
+ SystemContext::SYSCTXT_MAIN));
+ invalid_states_for_not_audio_app.push_back(
+ createHmiState(HMILevel::HMI_FULL, AudioStreamingState::ATTENUATED,
+ SystemContext::SYSCTXT_MAIN));
+ invalid_states_for_not_audio_app.push_back(
+ createHmiState(HMILevel::HMI_FULL, AudioStreamingState::AUDIBLE,
+ SystemContext::SYSCTXT_MAIN));
+
+ // Valid state ids
+ valid_state_ids_.push_back(am::HmiState::StateID::STATE_ID_VR_SESSION);
+ valid_state_ids_.push_back(am::HmiState::StateID::STATE_ID_TTS_SESSION);
+ valid_state_ids_.push_back(am::HmiState::StateID::STATE_ID_PHONE_CALL);
+ valid_state_ids_.push_back(am::HmiState::StateID::STATE_ID_SAFETY_MODE);
+ valid_state_ids_.push_back(am::HmiState::StateID::STATE_ID_NAVI_STREAMING);
+ }
+
+ void ConfigureApps() {
+ simple_app_ = ConfigureApp(&simple_app_ptr_, simple_app_id_, NOT_MEDIA,
+ NOT_NAVI, NOT_VC);
+ media_app_ =
+ ConfigureApp(&media_app_ptr_, media_app_id_, MEDIA, NOT_NAVI, NOT_VC);
+ navi_app_ =
+ ConfigureApp(&navi_app_ptr_, navi_app_id_, NOT_MEDIA, NAVI, NOT_VC);
+ vc_app_ = ConfigureApp(&vc_app_ptr_, vc_app_id_, NOT_MEDIA, NOT_NAVI, VC);
+ media_navi_app_ = ConfigureApp(&media_navi_app_ptr_, media_navi_app_id_,
+ MEDIA, NAVI, NOT_VC);
+ media_vc_app_ =
+ ConfigureApp(&media_vc_app_ptr_, media_vc_app_id_, MEDIA, NOT_NAVI, VC);
+ navi_vc_app_ =
+ ConfigureApp(&navi_vc_app_ptr_, navi_vc_app_id_, NOT_MEDIA, NAVI, VC);
+ media_navi_vc_app_ = ConfigureApp(&media_navi_vc_app_ptr_,
+ media_navi_vc_app_id_, MEDIA, NAVI, VC);
+ }
+ void CheckAppConfiguration() {
+ ASSERT_EQ(simple_app_.get(), simple_app_ptr_);
+ ASSERT_EQ(media_app_.get(), media_app_ptr_);
+ ASSERT_EQ(navi_app_.get(), navi_app_ptr_);
+ ASSERT_EQ(vc_app_.get(), vc_app_ptr_);
+ ASSERT_EQ(media_navi_app_.get(), media_navi_app_ptr_);
+ ASSERT_EQ(media_vc_app_.get(), media_vc_app_ptr_);
+ ASSERT_EQ(navi_vc_app_.get(), navi_vc_app_ptr_);
+ ASSERT_EQ(media_navi_vc_app_.get(), media_navi_vc_app_ptr_);
+
+ ASSERT_EQ(simple_app_->app_id(), simple_app_id_);
+ ASSERT_EQ(media_app_->app_id(), media_app_id_);
+ ASSERT_EQ(navi_app_->app_id(), navi_app_id_);
+ ASSERT_EQ(vc_app_->app_id(), vc_app_id_);
+ ASSERT_EQ(media_navi_app_->app_id(), media_navi_app_id_);
+ ASSERT_EQ(media_vc_app_->app_id(), media_vc_app_id_);
+ ASSERT_EQ(navi_vc_app_->app_id(), navi_vc_app_id_);
+ ASSERT_EQ(media_navi_vc_app_->app_id(), media_navi_vc_app_id_);
+
+ ASSERT_FALSE(simple_app_->IsAudioApplication());
+ ASSERT_TRUE(media_app_->IsAudioApplication());
+ ASSERT_TRUE(navi_app_->IsAudioApplication());
+ ASSERT_TRUE(vc_app_->IsAudioApplication());
+ ASSERT_TRUE(media_navi_app_->IsAudioApplication());
+ ASSERT_TRUE(media_vc_app_->IsAudioApplication());
+ ASSERT_TRUE(navi_vc_app_->IsAudioApplication());
+ ASSERT_TRUE(media_navi_vc_app_->IsAudioApplication());
+
+ ASSERT_FALSE(simple_app_->is_media_application());
+ ASSERT_TRUE(media_app_->is_media_application());
+ ASSERT_FALSE(navi_app_->is_media_application());
+ ASSERT_FALSE(vc_app_->is_media_application());
+ ASSERT_TRUE(media_navi_app_->is_media_application());
+ ASSERT_TRUE(media_vc_app_->is_media_application());
+ ASSERT_FALSE(navi_vc_app_->is_media_application());
+ ASSERT_TRUE(media_navi_vc_app_->is_media_application());
+
+ ASSERT_FALSE(simple_app_->is_navi());
+ ASSERT_TRUE(navi_app_->is_navi());
+ ASSERT_FALSE(media_app_->is_navi());
+ ASSERT_FALSE(vc_app_->is_navi());
+ ASSERT_TRUE(media_navi_app_->is_navi());
+ ASSERT_FALSE(media_vc_app_->is_navi());
+ ASSERT_TRUE(navi_vc_app_->is_navi());
+ ASSERT_TRUE(media_navi_vc_app_->is_navi());
+
+ ASSERT_FALSE(simple_app_->is_voice_communication_supported());
+ ASSERT_FALSE(navi_app_->is_voice_communication_supported());
+ ASSERT_FALSE(media_app_->is_voice_communication_supported());
+ ASSERT_TRUE(vc_app_->is_voice_communication_supported());
+ ASSERT_FALSE(media_navi_app_->is_voice_communication_supported());
+ ASSERT_TRUE(media_vc_app_->is_voice_communication_supported());
+ ASSERT_TRUE(navi_vc_app_->is_voice_communication_supported());
+ ASSERT_TRUE(media_navi_vc_app_->is_voice_communication_supported());
+ }
+
+ void SetUp() {
+ ON_CALL(app_manager_mock_, applications())
+ .WillByDefault(Return(applications_));
+ ConfigureApps();
+ CheckAppConfiguration();
+ FillStatesLists();
+ }
+
+ void TearDown() { delete message_helper_mock_; }
+
+ void ExpectSuccesfullSetHmiState(am::ApplicationSharedPtr app,
+ NiceMock<ApplicationMock>* app_mock,
+ am::HmiStatePtr old_state,
+ am::HmiStatePtr new_state) {
+ EXPECT_CALL(*app_mock, CurrentHmiState())
+ .WillOnce(Return(old_state))
+ .WillOnce(Return(new_state));
+ EXPECT_CALL(*app_mock,
+ SetRegularState(Truly(HmiStatesComparator(new_state))));
+ if (!HmiStatesComparator(old_state)(new_state)) {
+ EXPECT_CALL(app_manager_mock_, SendHMIStatusNotification(app));
+ EXPECT_CALL(app_manager_mock_,
+ OnHMILevelChanged(app->app_id(), old_state->hmi_level(),
+ new_state->hmi_level()));
+ }
+ }
+
+ void ExpectAppChangeHmiStateDueToConflictResolving(
+ am::ApplicationSharedPtr app, NiceMock<ApplicationMock>* app_mock,
+ am::HmiStatePtr old_state, am::HmiStatePtr new_state) {
+ EXPECT_CALL(*app_mock, RegularHmiState())
+ .WillOnce(Return(old_state))
+ .WillOnce(Return(old_state));
+ ExpectSuccesfullSetHmiState(app, app_mock, old_state, new_state);
+ }
+
+ void ExpectAppWontChangeHmiStateDueToConflictResolving(
+ am::ApplicationSharedPtr app, NiceMock<ApplicationMock>* app_mock,
+ am::HmiStatePtr state) {
+ EXPECT_CALL(*app_mock, RegularHmiState()).WillOnce(Return(state));
+ EXPECT_CALL(app_manager_mock_, SendHMIStatusNotification(app)).Times(0);
+ EXPECT_CALL(app_manager_mock_, OnHMILevelChanged(app->app_id(), _, _))
+ .Times(0);
+ }
+
+ void InsertApplication(am::ApplicationSharedPtr app) {
+ application_set_.insert(app);
+ ON_CALL(app_manager_mock_, application(app->app_id()))
+ .WillByDefault(Return(app));
+ }
+
+ am::HmiStatePtr NoneNotAudibleState() {
+ return createHmiState(mobile_apis::HMILevel::HMI_NONE,
+ mobile_apis::AudioStreamingState::NOT_AUDIBLE,
+ mobile_apis::SystemContext::SYSCTXT_MAIN);
+ }
+
+ am::HmiStatePtr FullAudibleState() {
+ return createHmiState(mobile_apis::HMILevel::HMI_FULL,
+ mobile_apis::AudioStreamingState::AUDIBLE,
+ mobile_apis::SystemContext::SYSCTXT_MAIN);
+ }
+
+ am::HmiStatePtr FullNotAudibleState() {
+ return createHmiState(mobile_apis::HMILevel::HMI_FULL,
+ mobile_apis::AudioStreamingState::NOT_AUDIBLE,
+ mobile_apis::SystemContext::SYSCTXT_MAIN);
+ }
+
+ am::HmiStatePtr LimitedState() {
+ return createHmiState(mobile_apis::HMILevel::HMI_LIMITED,
+ mobile_apis::AudioStreamingState::AUDIBLE,
+ mobile_apis::SystemContext::SYSCTXT_MAIN);
+ }
+
+ am::HmiStatePtr BackgroundState() {
+ return createHmiState(mobile_apis::HMILevel::HMI_BACKGROUND,
+ mobile_apis::AudioStreamingState::NOT_AUDIBLE,
+ mobile_apis::SystemContext::SYSCTXT_MAIN);
+ }
+
+ void CheckStateApplyingForApplication(
+ NiceMock<ApplicationMock>& application,
+ std::vector<am::HmiState::StateID>& state_ids) {
+ using smart_objects::SmartObject;
+ using am::event_engine::Event;
+ namespace FunctionID = hmi_apis::FunctionID;
+
+ EXPECT_CALL(application, CurrentHmiState())
+ .WillRepeatedly(Return(NoneNotAudibleState()));
+
+ for (uint32_t i = 0; i < state_ids.size(); ++i) {
+ am::HmiState::StateID state_id = state_ids[i];
+ EXPECT_CALL(application,
+ AddHMIState(Truly(HmiStatesIDComparator(state_id)))).Times(1);
+
+ switch (state_id) {
+ case am::HmiState::StateID::STATE_ID_VR_SESSION: {
+ Event vr_start_event(FunctionID::VR_Started);
+ state_ctrl_.on_event(vr_start_event);
+ break;
+ }
+ case am::HmiState::StateID::STATE_ID_TTS_SESSION: {
+ Event tts_start_event(FunctionID::TTS_Started);
+ state_ctrl_.on_event(tts_start_event);
+ break;
+ }
+ case am::HmiState::StateID::STATE_ID_PHONE_CALL: {
+ Event phone_call_event(
+ FunctionID::BasicCommunication_OnPhoneCall);
+ SmartObject message;
+ message[am::strings::msg_params][am::hmi_notification::is_active] = true;
+ phone_call_event.set_smart_object(message);
+ state_ctrl_.on_event(phone_call_event);
+ break;
+ }
+ case am::HmiState::StateID::STATE_ID_SAFETY_MODE: {
+ Event emergency_event(
+ FunctionID::BasicCommunication_OnEmergencyEvent);
+ SmartObject message;
+ message[am::strings::msg_params][am::hmi_response::enabled] = true;
+ emergency_event.set_smart_object(message);
+ state_ctrl_.on_event(emergency_event);
+ break;
+ }
+ case am::HmiState::StateID::STATE_ID_NAVI_STREAMING: {
+ state_ctrl_.OnNaviStreamingStarted();
+ break;
+ }
+ default:
+ break;
+ }
+
+ EXPECT_CALL(application, AddHMIState(_)).Times(0);
+ }
+
+ for (uint32_t i = 0; i < state_ids.size(); ++i) {
+ am::HmiState::StateID state_id = state_ids[i];
+ EXPECT_CALL(application, RemoveHMIState(state_id)).Times(1);
+
+ switch (state_id) {
+ case am::HmiState::StateID::STATE_ID_VR_SESSION: {
+ Event vr_stop_event(FunctionID::VR_Stopped);
+ state_ctrl_.on_event(vr_stop_event);
+ break;
+ }
+ case am::HmiState::StateID::STATE_ID_TTS_SESSION: {
+ Event tts_stop_event(FunctionID::TTS_Stopped);
+ state_ctrl_.on_event(tts_stop_event);
+ break;
+ }
+ case am::HmiState::StateID::STATE_ID_PHONE_CALL: {
+ Event phone_call_event(
+ FunctionID::BasicCommunication_OnPhoneCall);
+ SmartObject message;
+ message[am::strings::msg_params][am::hmi_notification::is_active] = false;
+ phone_call_event.set_smart_object(message);
+ state_ctrl_.on_event(phone_call_event);
+ break;
+ }
+ case am::HmiState::StateID::STATE_ID_SAFETY_MODE: {
+ Event emergency_event(
+ FunctionID::BasicCommunication_OnEmergencyEvent);
+ SmartObject message;
+ message[am::strings::msg_params][am::hmi_response::enabled] = false;
+ emergency_event.set_smart_object(message);
+ state_ctrl_.on_event(emergency_event);
+ break;
+ }
+ case am::HmiState::StateID::STATE_ID_NAVI_STREAMING: {
+ state_ctrl_.OnNaviStreamingStopped();
+ break;
+ }
+ default:
+ break;
+ }
+
+ EXPECT_CALL(application, RemoveHMIState(_)).Times(0);
+ }
+ }
+};
+
+TEST_F(StateControllerTest, OnStateChangedWithEqualStates) {
+ EXPECT_CALL(app_manager_mock_, SendHMIStatusNotification(_)).Times(0);
+ EXPECT_CALL(app_manager_mock_, OnHMILevelChanged(_, _, _)).Times(0);
+ EXPECT_CALL(*simple_app_ptr_, ResetDataInNone()).Times(0);
+
+ for (uint32_t i = 0; i < valid_states_for_not_audio_app_.size(); ++i) {
+ state_ctrl_.OnStateChanged(simple_app_,
+ valid_states_for_not_audio_app_[i],
+ valid_states_for_not_audio_app_[i]);
+ }
+}
+
+TEST_F(StateControllerTest, OnStateChangedWithDifferentStates) {
+ for (uint32_t i = 0; i < valid_states_for_not_audio_app_.size(); ++i) {
+ for (uint32_t j = 0; j < valid_states_for_not_audio_app_.size(); ++j) {
+ HmiStatesComparator comp(valid_states_for_not_audio_app_[i]);
+ if (!comp(valid_states_for_not_audio_app_[j])) {
+ EXPECT_CALL(app_manager_mock_,
+ SendHMIStatusNotification(simple_app_)).Times(1);
+ EXPECT_CALL(app_manager_mock_,
+ OnHMILevelChanged(
+ simple_app_id_,
+ valid_states_for_not_audio_app_[i]->hmi_level(),
+ valid_states_for_not_audio_app_[j]->hmi_level())).Times(1);
+ if (mobile_apis::HMILevel::HMI_NONE ==
+ valid_states_for_not_audio_app_[j]->hmi_level()) {
+ EXPECT_CALL(*simple_app_ptr_, ResetDataInNone()).Times(1);
+ }
+ state_ctrl_.OnStateChanged(simple_app_,
+ valid_states_for_not_audio_app_[i],
+ valid_states_for_not_audio_app_[j]);
+
+ EXPECT_CALL(app_manager_mock_, SendHMIStatusNotification(_)).Times(0);
+ EXPECT_CALL(app_manager_mock_, OnHMILevelChanged(_, _, _)).Times(0);
+ EXPECT_CALL(*simple_app_ptr_, ResetDataInNone()).Times(0);
+ }
+ }
+ }
+}
+
+TEST_F(StateControllerTest, OnStateChangedToNone) {
+ using namespace am;
+ using namespace mobile_apis;
+
+ HmiStatePtr none_state = createHmiState(HMILevel::HMI_NONE,
+ AudioStreamingState::NOT_AUDIBLE,
+ SystemContext::SYSCTXT_MAIN);
+ HmiStatePtr not_none_state = createHmiState(HMILevel::HMI_FULL,
+ AudioStreamingState::NOT_AUDIBLE,
+ SystemContext::SYSCTXT_MAIN);
+
+ EXPECT_CALL(*simple_app_ptr_, ResetDataInNone()).Times(0);
+ state_ctrl_.OnStateChanged(simple_app_, none_state, not_none_state);
+
+ EXPECT_CALL(*simple_app_ptr_, ResetDataInNone()).Times(1);
+ state_ctrl_.OnStateChanged(simple_app_, not_none_state, none_state);
+}
+
+TEST_F(StateControllerTest, MoveSimpleAppToValidStates) {
+ using am::HmiState;
+ using am::HmiStatePtr;
+ using am::UsageStatistics;
+ namespace HMILevel = mobile_apis::HMILevel;
+ namespace AudioStreamingState = mobile_apis::AudioStreamingState;
+ namespace SystemContext = mobile_apis::SystemContext;
+ HmiStatePtr initial_state =
+ createHmiState(HMILevel::INVALID_ENUM, AudioStreamingState::INVALID_ENUM,
+ SystemContext::INVALID_ENUM);
+
+ for (std::vector<HmiStatePtr>::iterator it =
+ valid_states_for_not_audio_app_.begin();
+ it != valid_states_for_not_audio_app_.end(); ++it) {
+ HmiStatePtr state_to_setup = *it;
+ EXPECT_CALL(*simple_app_ptr_, CurrentHmiState())
+ .WillOnce(Return(initial_state))
+ .WillOnce(Return(state_to_setup));
+ EXPECT_CALL(app_manager_mock_, SendHMIStatusNotification(simple_app_));
+ EXPECT_CALL(app_manager_mock_,
+ OnHMILevelChanged(simple_app_id_, initial_state->hmi_level(),
+ state_to_setup->hmi_level()));
+
+ EXPECT_CALL(*simple_app_ptr_,
+ SetRegularState(Truly(HmiStatesComparator(state_to_setup))));
+ state_ctrl_.SetRegularState<false>(simple_app_, state_to_setup);
+ initial_state = state_to_setup;
+ }
+}
+
+TEST_F(StateControllerTest, MoveAudioAppAppToValidStates) {
+ using am::HmiState;
+ using am::HmiStatePtr;
+ using am::UsageStatistics;
+ namespace HMILevel = mobile_apis::HMILevel;
+ namespace AudioStreamingState = mobile_apis::AudioStreamingState;
+ namespace SystemContext = mobile_apis::SystemContext;
+
+ am::ApplicationSharedPtr audio_app = media_navi_vc_app_;
+ NiceMock<ApplicationMock>* audio_app_mock = media_navi_vc_app_ptr_;
+
+ HmiStatePtr initial_state =
+ createHmiState(HMILevel::INVALID_ENUM, AudioStreamingState::INVALID_ENUM,
+ SystemContext::INVALID_ENUM);
+
+ for (std::vector<HmiStatePtr>::iterator it =
+ valid_states_for_audio_app_.begin();
+ it != valid_states_for_audio_app_.end(); ++it) {
+ HmiStatePtr state_to_setup = *it;
+ EXPECT_CALL(*audio_app_mock, CurrentHmiState())
+ .WillOnce(Return(initial_state))
+ .WillOnce(Return(state_to_setup));
+ EXPECT_CALL(app_manager_mock_, SendHMIStatusNotification(audio_app));
+ EXPECT_CALL(
+ app_manager_mock_,
+ OnHMILevelChanged(audio_app->app_id(), initial_state->hmi_level(),
+ state_to_setup->hmi_level()));
+
+ EXPECT_CALL(*audio_app_mock,
+ SetRegularState(Truly(HmiStatesComparator(state_to_setup))));
+ state_ctrl_.SetRegularState<false>(media_navi_vc_app_, state_to_setup);
+ initial_state = state_to_setup;
+ }
+}
+/*
+TEST_F(StateControllerTest, MoveAppFromValidStateToInvalid) {
+ using am::HmiState;
+ using am::HmiStatePtr;
+ using am::UsageStatistics;
+ namespace HMILevel = mobile_apis::HMILevel;
+ namespace AudioStreamingState = mobile_apis::AudioStreamingState;
+ namespace SystemContext = mobile_apis::SystemContext;
+
+ for (std::vector<HmiStatePtr>::iterator valid_state_it =
+ valid_states_for_not_audio_app_.begin();
+ valid_state_it != valid_states_for_not_audio_app_.end();
+ ++valid_state_it) {
+ for (std::vector<HmiStatePtr>::iterator invalid_state_it =
+ common_invalid_states_.begin();
+ invalid_state_it != common_invalid_states_.end(); ++invalid_state_it) {
+ HmiStatePtr initial_state = *valid_state_it;
+ HmiStatePtr invalid_state = *invalid_state_it;
+ EXPECT_CALL(*simple_app_ptr_, CurrentHmiState())
+ .WillOnce(Return(initial_state));
+ EXPECT_CALL(app_manager_mock_, OnHMILevelChanged(_, _, _)).Times(0);
+ EXPECT_CALL(*simple_app_ptr_, SetRegularState(_)).Times(0);
+ state_ctrl_.SetRegularState<false>(simple_app_, invalid_state);
+ }
+ }
+
+ NiceMock<ApplicationMock>* audio_app_mock = media_navi_vc_app_ptr_;
+ am::ApplicationSharedPtr audio_app = media_navi_vc_app_;
+ for (std::vector<HmiStatePtr>::iterator valid_state_it =
+ valid_states_for_audio_app_.begin();
+ valid_state_it != valid_states_for_audio_app_.end(); ++valid_state_it) {
+ for (std::vector<HmiStatePtr>::iterator invalid_state_it =
+ invalid_states_for_audio_app.begin();
+ invalid_state_it != invalid_states_for_audio_app.end();
+ ++invalid_state_it) {
+ HmiStatePtr initial_state = *valid_state_it;
+ HmiStatePtr invalid_state = *invalid_state_it;
+ EXPECT_CALL(*audio_app_mock, CurrentHmiState())
+ .WillOnce(Return(initial_state));
+ EXPECT_CALL(app_manager_mock_, OnHMILevelChanged(_, _, _)).Times(0);
+ EXPECT_CALL(*audio_app_mock, SetRegularState(_)).Times(0);
+ state_ctrl_.SetRegularState<false>(audio_app, invalid_state);
+ }
+ }
+
+ for (std::vector<HmiStatePtr>::iterator valid_state_it =
+ valid_states_for_not_audio_app_.begin();
+ valid_state_it != valid_states_for_not_audio_app_.end();
+ ++valid_state_it) {
+ for (std::vector<HmiStatePtr>::iterator invalid_state_it =
+ invalid_states_for_not_audio_app.begin();
+ invalid_state_it != invalid_states_for_not_audio_app.end();
+ ++invalid_state_it) {
+ HmiStatePtr initial_state = *valid_state_it;
+ HmiStatePtr invalid_state = *invalid_state_it;
+ EXPECT_CALL(*simple_app_ptr_, CurrentHmiState())
+ .WillOnce(Return(initial_state));
+ EXPECT_CALL(app_manager_mock_, OnHMILevelChanged(_, _, _)).Times(0);
+ EXPECT_CALL(*simple_app_ptr_, SetRegularState(_)).Times(0);
+ state_ctrl_.SetRegularState<false>(simple_app_, invalid_state);
+ }
+ }
+}
+
+TEST_F(StateControllerTest, MoveAppFromInValidStateToValid) {
+ using am::HmiState;
+ using am::HmiStatePtr;
+ using am::UsageStatistics;
+ namespace HMILevel = mobile_apis::HMILevel;
+ namespace AudioStreamingState = mobile_apis::AudioStreamingState;
+ namespace SystemContext = mobile_apis::SystemContext;
+
+ NiceMock<ApplicationMock>* audio_app_mock = media_navi_vc_app_ptr_;
+ am::ApplicationSharedPtr audio_app = media_navi_vc_app_;
+ HmiStatePtr invalid_state =
+ createHmiState(HMILevel::INVALID_ENUM, AudioStreamingState::INVALID_ENUM,
+ SystemContext::INVALID_ENUM);
+
+ for (std::vector<HmiStatePtr>::iterator it =
+ valid_states_for_audio_app_.begin();
+ it != valid_states_for_audio_app_.end(); ++it) {
+ HmiStatePtr initial_state = *it;
+ EXPECT_CALL(*audio_app_mock, CurrentHmiState())
+ .WillOnce(Return(initial_state));
+ EXPECT_CALL(app_manager_mock_, OnHMILevelChanged(_, _, _)).Times(0);
+ EXPECT_CALL(*audio_app_mock, SetRegularState(_)).Times(0);
+ state_ctrl_.SetRegularState<false>(audio_app, invalid_state);
+ }
+
+ for (std::vector<HmiStatePtr>::iterator it =
+ valid_states_for_not_audio_app_.begin();
+ it != valid_states_for_not_audio_app_.end(); ++it) {
+ HmiStatePtr initial_state = *it;
+ EXPECT_CALL(*simple_app_ptr_, CurrentHmiState())
+ .WillOnce(Return(initial_state));
+ EXPECT_CALL(app_manager_mock_, OnHMILevelChanged(_, _, _)).Times(0);
+ EXPECT_CALL(*simple_app_ptr_, SetRegularState(_)).Times(0);
+ state_ctrl_.SetRegularState<false>(simple_app_, invalid_state);
+ }
+}
+
+TEST_F(StateControllerTest, MoveAppFromInValidStateToInvalid) {
+ using am::HmiState;
+ using am::HmiStatePtr;
+ using am::UsageStatistics;
+ namespace HMILevel = mobile_apis::HMILevel;
+ namespace AudioStreamingState = mobile_apis::AudioStreamingState;
+ namespace SystemContext = mobile_apis::SystemContext;
+ NiceMock<ApplicationMock>* audio_app_mock = media_navi_vc_app_ptr_;
+ am::ApplicationSharedPtr audio_app = media_navi_vc_app_;
+ HmiStatePtr initial_invalid_state =
+ createHmiState(HMILevel::INVALID_ENUM, AudioStreamingState::INVALID_ENUM,
+ SystemContext::INVALID_ENUM);
+
+ am::ApplicationConstSharedPtr const_audio_app(audio_app);
+
+ for (std::vector<HmiStatePtr>::iterator it =
+ invalid_states_for_audio_app.begin();
+ it != invalid_states_for_audio_app.end(); ++it) {
+ HmiStatePtr state_to_setup = *it;
+ HmiStatePtr default_state =
+ createHmiState(HMILevel::HMI_LIMITED, AudioStreamingState::AUDIBLE,
+ SystemContext::SYSCTXT_MAIN);
+ EXPECT_CALL(app_manager_mock_, GetDefaultHmiLevel(const_audio_app))
+ .WillOnce(Return(HMILevel::HMI_LIMITED));
+ EXPECT_CALL(*audio_app_mock, CurrentHmiState())
+ .WillOnce(Return(initial_invalid_state))
+ .WillOnce(Return(initial_invalid_state))
+ .WillOnce(Return(default_state));
+ EXPECT_CALL(app_manager_mock_,
+ OnHMILevelChanged(audio_app->app_id(),
+ initial_invalid_state->hmi_level(),
+ default_state->hmi_level()));
+ EXPECT_CALL(*audio_app_mock,
+ SetRegularState(Truly(HmiStatesComparator(default_state))));
+ state_ctrl_.SetRegularState<false>(audio_app, state_to_setup);
+ }
+
+ for (std::vector<HmiStatePtr>::iterator it =
+ invalid_states_for_not_audio_app.begin();
+ it != invalid_states_for_not_audio_app.end(); ++it) {
+ HmiStatePtr state_to_setup = *it;
+ HmiStatePtr default_state = createHmiState(HMILevel::HMI_BACKGROUND,
+ AudioStreamingState::NOT_AUDIBLE,
+ SystemContext::SYSCTXT_MAIN);
+ am::ApplicationConstSharedPtr const_simple_app(simple_app_);
+ EXPECT_CALL(app_manager_mock_, GetDefaultHmiLevel(const_simple_app))
+ .WillOnce(Return(HMILevel::HMI_BACKGROUND));
+ EXPECT_CALL(*simple_app_ptr_, CurrentHmiState())
+ .WillOnce(Return(initial_invalid_state))
+ .WillOnce(Return(initial_invalid_state))
+ .WillOnce(Return(default_state));
+ EXPECT_CALL(app_manager_mock_,
+ OnHMILevelChanged(simple_app_ptr_->app_id(),
+ initial_invalid_state->hmi_level(),
+ default_state->hmi_level()));
+ EXPECT_CALL(*simple_app_ptr_,
+ SetRegularState(Truly(HmiStatesComparator(default_state))));
+ state_ctrl_.SetRegularState<false>(simple_app_, state_to_setup);
+ }
+}
+*/
+TEST_F(StateControllerTest, SetFullToSimpleAppWhileAnotherSimpleAppIsInFull) {
+ using am::HmiState;
+ using am::HmiStatePtr;
+ namespace HMILevel = mobile_apis::HMILevel;
+ namespace AudioStreamingState = mobile_apis::AudioStreamingState;
+ namespace SystemContext = mobile_apis::SystemContext;
+ am::ApplicationSharedPtr app_in_full;
+ NiceMock<ApplicationMock>* app_in_full_mock;
+
+ am::ApplicationSharedPtr app_moved_to_full;
+ NiceMock<ApplicationMock>* app_moved_to_full_mock;
+
+ app_in_full =
+ ConfigureApp(&app_in_full_mock, 1761, NOT_MEDIA, NOT_NAVI, NOT_VC);
+ app_moved_to_full =
+ ConfigureApp(&app_moved_to_full_mock, 1796, NOT_MEDIA, NOT_NAVI, NOT_VC);
+
+ InsertApplication(app_in_full);
+ InsertApplication(app_moved_to_full);
+
+ ExpectSuccesfullSetHmiState(app_moved_to_full, app_moved_to_full_mock,
+ BackgroundState(), FullNotAudibleState());
+
+ ExpectAppChangeHmiStateDueToConflictResolving(
+ app_in_full, app_in_full_mock, FullNotAudibleState(), BackgroundState());
+
+ state_ctrl_.SetRegularState<false>(app_moved_to_full, FullNotAudibleState());
+}
+
+TEST_F(StateControllerTest, SetFullToSimpleAppWhileAudioAppAppIsInFull) {
+ using am::HmiState;
+ using am::HmiStatePtr;
+ namespace HMILevel = mobile_apis::HMILevel;
+ namespace AudioStreamingState = mobile_apis::AudioStreamingState;
+ namespace SystemContext = mobile_apis::SystemContext;
+ am::ApplicationSharedPtr app_in_full = media_navi_vc_app_;
+ NiceMock<ApplicationMock>* app_in_full_mock = media_navi_vc_app_ptr_;
+
+ am::ApplicationSharedPtr app_moved_to_full = simple_app_;
+ NiceMock<ApplicationMock>* app_moved_to_full_mock = simple_app_ptr_;
+
+ InsertApplication(app_in_full);
+ InsertApplication(app_moved_to_full);
+
+ ExpectSuccesfullSetHmiState(app_moved_to_full, app_moved_to_full_mock,
+ BackgroundState(), FullNotAudibleState());
+
+ ExpectAppChangeHmiStateDueToConflictResolving(
+ app_in_full, app_in_full_mock, FullAudibleState(), LimitedState());
+ state_ctrl_.SetRegularState<false>(app_moved_to_full, FullNotAudibleState());
+}
+
+TEST_F(StateControllerTest,
+ SetFullToAudioAppAppWhileAnotherTypeAudioAppAppIsInFull) {
+ using am::HmiState;
+ using am::HmiStatePtr;
+ namespace HMILevel = mobile_apis::HMILevel;
+ namespace AudioStreamingState = mobile_apis::AudioStreamingState;
+ namespace SystemContext = mobile_apis::SystemContext;
+
+ am::ApplicationSharedPtr app_in_full = media_app_;
+ NiceMock<ApplicationMock>* app_in_full_mock = media_app_ptr_;
+
+ am::ApplicationSharedPtr app_moved_to_full = navi_app_;
+ NiceMock<ApplicationMock>* app_moved_to_full_mock = navi_app_ptr_;
+
+ InsertApplication(app_in_full);
+ InsertApplication(app_moved_to_full);
+
+ ExpectSuccesfullSetHmiState(app_moved_to_full, app_moved_to_full_mock,
+ BackgroundState(), FullAudibleState());
+
+ ExpectAppChangeHmiStateDueToConflictResolving(
+ app_in_full, app_in_full_mock, FullAudibleState(), LimitedState());
+ state_ctrl_.SetRegularState<false>(app_moved_to_full, FullAudibleState());
+}
+
+TEST_F(StateControllerTest,
+ SetFullToAudioAppAppWhileSameTypeAudioAppAppIsInFull) {
+ using am::HmiState;
+ using am::HmiStatePtr;
+ namespace HMILevel = mobile_apis::HMILevel;
+ namespace AudioStreamingState = mobile_apis::AudioStreamingState;
+ namespace SystemContext = mobile_apis::SystemContext;
+ NiceMock<ApplicationMock>* app_in_full_mock;
+ am::ApplicationSharedPtr app_in_full =
+ ConfigureApp(&app_in_full_mock, 1761, MEDIA, NOT_NAVI, NOT_VC);
+
+ NiceMock<ApplicationMock>* app_moved_to_full_mock;
+ am::ApplicationSharedPtr app_moved_to_full =
+ ConfigureApp(&app_moved_to_full_mock, 1796, MEDIA, NOT_NAVI, NOT_VC);
+
+ InsertApplication(app_in_full);
+ InsertApplication(app_moved_to_full);
+ ExpectSuccesfullSetHmiState(app_moved_to_full, app_moved_to_full_mock,
+ BackgroundState(), FullAudibleState());
+
+ ExpectAppChangeHmiStateDueToConflictResolving(
+ app_in_full, app_in_full_mock, FullAudibleState(), BackgroundState());
+
+ state_ctrl_.SetRegularState<false>(app_moved_to_full, FullAudibleState());
+}
+
+TEST_F(StateControllerTest,
+ SetFullToAudioAppAppWhileSameTypeAudioAppAppIsInLimited) {
+ using am::HmiState;
+ using am::HmiStatePtr;
+ namespace HMILevel = mobile_apis::HMILevel;
+ namespace AudioStreamingState = mobile_apis::AudioStreamingState;
+ namespace SystemContext = mobile_apis::SystemContext;
+
+ NiceMock<ApplicationMock>* app_in_limited_mock;
+ am::ApplicationSharedPtr app_in_limited =
+ ConfigureApp(&app_in_limited_mock, 1761, NOT_MEDIA, NAVI, NOT_VC);
+
+ NiceMock<ApplicationMock>* app_moved_to_full_mock;
+ am::ApplicationSharedPtr app_moved_to_full =
+ ConfigureApp(&app_moved_to_full_mock, 1796, NOT_MEDIA, NAVI, VC);
+
+ InsertApplication(app_in_limited);
+ InsertApplication(app_moved_to_full);
+ ExpectSuccesfullSetHmiState(app_moved_to_full, app_moved_to_full_mock,
+ BackgroundState(), FullAudibleState());
+
+ ExpectAppChangeHmiStateDueToConflictResolving(
+ app_in_limited, app_in_limited_mock, LimitedState(), BackgroundState());
+
+ state_ctrl_.SetRegularState<false>(app_moved_to_full, FullAudibleState());
+}
+
+TEST_F(StateControllerTest,
+ SetLimitedToAudioAppAppWhileSameTypeAudioAppAppIsInLimited) {
+ using am::HmiState;
+ using am::HmiStatePtr;
+ namespace HMILevel = mobile_apis::HMILevel;
+ namespace AudioStreamingState = mobile_apis::AudioStreamingState;
+ namespace SystemContext = mobile_apis::SystemContext;
+ NiceMock<ApplicationMock>* app_in_limited_mock;
+ am::ApplicationSharedPtr app_in_limited =
+ ConfigureApp(&app_in_limited_mock, 1761, NOT_MEDIA, NOT_NAVI, VC);
+
+ NiceMock<ApplicationMock>* app_moved_to_limited_mock;
+ am::ApplicationSharedPtr app_moved_to_limited =
+ ConfigureApp(&app_moved_to_limited_mock, 1796, NOT_MEDIA, NOT_NAVI, VC);
+
+ InsertApplication(app_in_limited);
+ InsertApplication(app_moved_to_limited);
+
+ ExpectSuccesfullSetHmiState(app_moved_to_limited, app_moved_to_limited_mock,
+ BackgroundState(), LimitedState());
+
+ ExpectAppChangeHmiStateDueToConflictResolving(
+ app_in_limited, app_in_limited_mock, LimitedState(), BackgroundState());
+
+ state_ctrl_.SetRegularState<false>(app_moved_to_limited, LimitedState());
+}
+
+TEST_F(StateControllerTest,
+ SetLimitedToAudioAppAppWhileOtherTypeAudioAppAppIsInLimited) {
+ using am::HmiState;
+ using am::HmiStatePtr;
+ namespace HMILevel = mobile_apis::HMILevel;
+ namespace AudioStreamingState = mobile_apis::AudioStreamingState;
+ namespace SystemContext = mobile_apis::SystemContext;
+
+ am::ApplicationSharedPtr app_in_limited = navi_app_;
+ NiceMock<ApplicationMock>* app_in_limited_mock = navi_app_ptr_;
+
+ am::ApplicationSharedPtr app_moved_to_limited = vc_app_;
+ NiceMock<ApplicationMock>* app_moved_to_limited_mock = vc_app_ptr_;
+
+ InsertApplication(app_in_limited);
+ InsertApplication(app_moved_to_limited);
+ ExpectSuccesfullSetHmiState(app_moved_to_limited, app_moved_to_limited_mock,
+ BackgroundState(), LimitedState());
+ ExpectAppWontChangeHmiStateDueToConflictResolving(
+ app_in_limited, app_in_limited_mock, LimitedState());
+ state_ctrl_.SetRegularState<false>(app_moved_to_limited, LimitedState());
+}
+
+TEST_F(StateControllerTest,
+ SetLimitedToAudioAppAppWhileOtherTypeAudioAppAppIsInFull) {
+ using am::HmiState;
+ using am::HmiStatePtr;
+ namespace HMILevel = mobile_apis::HMILevel;
+ namespace AudioStreamingState = mobile_apis::AudioStreamingState;
+ namespace SystemContext = mobile_apis::SystemContext;
+ am::ApplicationSharedPtr app_in_full = navi_app_;
+ NiceMock<ApplicationMock>* app_in_full_mock = navi_app_ptr_;
+
+ am::ApplicationSharedPtr app_moved_to_limited = vc_app_;
+ NiceMock<ApplicationMock>* app_moved_to_limited_mock = vc_app_ptr_;
+
+ InsertApplication(app_in_full);
+ InsertApplication(app_moved_to_limited);
+
+ ExpectSuccesfullSetHmiState(app_moved_to_limited, app_moved_to_limited_mock,
+ BackgroundState(), LimitedState());
+
+ ExpectAppWontChangeHmiStateDueToConflictResolving(
+ app_in_full, app_in_full_mock, FullAudibleState());
+ state_ctrl_.SetRegularState<false>(app_moved_to_limited, LimitedState());
+}
+
+TEST_F(StateControllerTest, SetFullToSimpleAppWhile2AudioAppsInLimited) {
+ using am::HmiState;
+ using am::HmiStatePtr;
+ namespace HMILevel = mobile_apis::HMILevel;
+ namespace AudioStreamingState = mobile_apis::AudioStreamingState;
+ namespace SystemContext = mobile_apis::SystemContext;
+
+ am::ApplicationSharedPtr app_moved_to_full = simple_app_;
+ NiceMock<ApplicationMock>* app_moved_to_full_mock = simple_app_ptr_;
+
+ am::ApplicationSharedPtr limited_app1 = media_app_;
+ NiceMock<ApplicationMock>* limited_app1_mock = media_app_ptr_;
+
+ am::ApplicationSharedPtr limited_app2 = navi_vc_app_;
+ NiceMock<ApplicationMock>* limited_app2_mock = navi_vc_app_ptr_;
+
+ InsertApplication(app_moved_to_full);
+ InsertApplication(limited_app1);
+ InsertApplication(limited_app2);
+
+ ExpectSuccesfullSetHmiState(app_moved_to_full, app_moved_to_full_mock,
+ BackgroundState(), FullNotAudibleState());
+
+ ExpectAppWontChangeHmiStateDueToConflictResolving(
+ limited_app1, limited_app1_mock, LimitedState());
+ ExpectAppWontChangeHmiStateDueToConflictResolving(
+ limited_app2, limited_app2_mock, LimitedState());
+
+ state_ctrl_.SetRegularState<false>(app_moved_to_full, FullNotAudibleState());
+}
+
+TEST_F(StateControllerTest,
+ SetFullToSimpleAppWhile1AudioAppInLimitedAnd1AudioAppInFull) {
+ using am::HmiState;
+ using am::HmiStatePtr;
+ namespace HMILevel = mobile_apis::HMILevel;
+ namespace AudioStreamingState = mobile_apis::AudioStreamingState;
+ namespace SystemContext = mobile_apis::SystemContext;
+
+ am::ApplicationSharedPtr app_moved_to_full = simple_app_;
+ NiceMock<ApplicationMock>* app_moved_to_full_mock = simple_app_ptr_;
+
+ am::ApplicationSharedPtr limited_app = media_app_;
+ NiceMock<ApplicationMock>* limited_app_mock = media_app_ptr_;
+
+ am::ApplicationSharedPtr full_app = navi_vc_app_;
+ NiceMock<ApplicationMock>* full_app_mock = navi_vc_app_ptr_;
+
+ InsertApplication(app_moved_to_full);
+ InsertApplication(limited_app);
+ InsertApplication(full_app);
+
+ ExpectSuccesfullSetHmiState(app_moved_to_full, app_moved_to_full_mock,
+ BackgroundState(), FullNotAudibleState());
+
+ ExpectAppWontChangeHmiStateDueToConflictResolving(
+ limited_app, limited_app_mock, LimitedState());
+
+ ExpectAppChangeHmiStateDueToConflictResolving(
+ full_app, full_app_mock, FullAudibleState(), LimitedState());
+
+ state_ctrl_.SetRegularState<false>(app_moved_to_full, FullNotAudibleState());
+}
+
+TEST_F(StateControllerTest,
+ SetFullToSimpleAppWhile1AudioAppInLimitedAnd1SimpleAppInFull) {
+ using am::HmiState;
+ using am::HmiStatePtr;
+ namespace HMILevel = mobile_apis::HMILevel;
+ namespace AudioStreamingState = mobile_apis::AudioStreamingState;
+ namespace SystemContext = mobile_apis::SystemContext;
+
+ NiceMock<ApplicationMock>* app_moved_to_full_mock;
+ am::ApplicationSharedPtr app_moved_to_full =
+ ConfigureApp(&app_moved_to_full_mock, 1761, NOT_MEDIA, NOT_NAVI, NOT_VC);
+
+ am::ApplicationSharedPtr limited_app = media_app_;
+ NiceMock<ApplicationMock>* limited_app_mock = media_app_ptr_;
+
+ NiceMock<ApplicationMock>* full_app_mock;
+ am::ApplicationSharedPtr full_app =
+ ConfigureApp(&full_app_mock, 1796, NOT_MEDIA, NOT_NAVI, NOT_VC);
+
+ InsertApplication(app_moved_to_full);
+ InsertApplication(limited_app);
+ InsertApplication(full_app);
+
+ ExpectSuccesfullSetHmiState(app_moved_to_full, app_moved_to_full_mock,
+ BackgroundState(), FullNotAudibleState());
+
+ ExpectAppWontChangeHmiStateDueToConflictResolving(
+ limited_app, limited_app_mock, LimitedState());
+
+ ExpectAppChangeHmiStateDueToConflictResolving(
+ full_app, full_app_mock, FullNotAudibleState(), BackgroundState());
+
+ state_ctrl_.SetRegularState<false>(app_moved_to_full, FullNotAudibleState());
+}
+
+TEST_F(
+ StateControllerTest,
+ SetFullToAudioAppWhile1AudioAppWithSameTypeInLimitedAnd1SimpleAppInFull) {
+ using am::HmiState;
+ using am::HmiStatePtr;
+ namespace HMILevel = mobile_apis::HMILevel;
+ namespace AudioStreamingState = mobile_apis::AudioStreamingState;
+ namespace SystemContext = mobile_apis::SystemContext;
+
+ NiceMock<ApplicationMock>* app_moved_to_full_mock;
+ am::ApplicationSharedPtr app_moved_to_full =
+ ConfigureApp(&app_moved_to_full_mock, 1761, MEDIA, NOT_NAVI, NOT_VC);
+
+ NiceMock<ApplicationMock>* limited_app_mock;
+ am::ApplicationSharedPtr limited_app =
+ ConfigureApp(&limited_app_mock, 1762, MEDIA, NOT_NAVI, NOT_VC);
+
+ NiceMock<ApplicationMock>* full_app_mock;
+ am::ApplicationSharedPtr full_app =
+ ConfigureApp(&full_app_mock, 1796, NOT_MEDIA, NOT_NAVI, NOT_VC);
+
+ InsertApplication(app_moved_to_full);
+ InsertApplication(limited_app);
+ InsertApplication(full_app);
+
+ ExpectSuccesfullSetHmiState(app_moved_to_full, app_moved_to_full_mock,
+ BackgroundState(), FullAudibleState());
+
+ ExpectAppChangeHmiStateDueToConflictResolving(
+ limited_app, limited_app_mock, LimitedState(), BackgroundState());
+
+ ExpectAppChangeHmiStateDueToConflictResolving(
+ full_app, full_app_mock, FullNotAudibleState(), BackgroundState());
+
+ state_ctrl_.SetRegularState<false>(app_moved_to_full, FullAudibleState());
+}
+
+TEST_F(
+ StateControllerTest,
+ SetFullToAudioAppWhileAudioAppWithSameTypeInLimitedAndAudioAppWithOtherTypeInFull) {
+ using am::HmiState;
+ using am::HmiStatePtr;
+ namespace HMILevel = mobile_apis::HMILevel;
+ namespace AudioStreamingState = mobile_apis::AudioStreamingState;
+ namespace SystemContext = mobile_apis::SystemContext;
+
+ NiceMock<ApplicationMock>* app_moved_to_full_mock;
+ am::ApplicationSharedPtr app_moved_to_full =
+ ConfigureApp(&app_moved_to_full_mock, 1761, MEDIA, NOT_NAVI, NOT_VC);
+
+ NiceMock<ApplicationMock>* limited_app_mock;
+ am::ApplicationSharedPtr limited_app =
+ ConfigureApp(&limited_app_mock, 1762, MEDIA, NOT_NAVI, NOT_VC);
+
+ NiceMock<ApplicationMock>* full_app_mock;
+ am::ApplicationSharedPtr full_app =
+ ConfigureApp(&full_app_mock, 1796, NOT_MEDIA, NAVI, NOT_VC);
+
+ InsertApplication(app_moved_to_full);
+ InsertApplication(limited_app);
+ InsertApplication(full_app);
+
+ ExpectSuccesfullSetHmiState(app_moved_to_full, app_moved_to_full_mock,
+ BackgroundState(), FullAudibleState());
+
+ ExpectAppChangeHmiStateDueToConflictResolving(
+ limited_app, limited_app_mock, LimitedState(), BackgroundState());
+
+ ExpectAppChangeHmiStateDueToConflictResolving(
+ full_app, full_app_mock, FullAudibleState(), LimitedState());
+
+ state_ctrl_.SetRegularState<false>(app_moved_to_full, FullAudibleState());
+}
+
+TEST_F(StateControllerTest,
+ SetFullToAudioAppWhile3AudioAppsWithSameTypeInLimited) {
+ using am::HmiState;
+ using am::HmiStatePtr;
+ namespace HMILevel = mobile_apis::HMILevel;
+ namespace AudioStreamingState = mobile_apis::AudioStreamingState;
+ namespace SystemContext = mobile_apis::SystemContext;
+
+ InsertApplication(media_navi_vc_app_);
+ InsertApplication(media_app_);
+ InsertApplication(navi_app_);
+ InsertApplication(vc_app_);
+ ExpectSuccesfullSetHmiState(media_navi_vc_app_, media_navi_vc_app_ptr_,
+ BackgroundState(), FullAudibleState());
+ ExpectAppChangeHmiStateDueToConflictResolving(
+ media_app_, media_app_ptr_, LimitedState(), BackgroundState());
+ ExpectAppChangeHmiStateDueToConflictResolving(
+ navi_app_, navi_app_ptr_, LimitedState(), BackgroundState());
+ ExpectAppChangeHmiStateDueToConflictResolving(
+ vc_app_, vc_app_ptr_, LimitedState(), BackgroundState());
+ state_ctrl_.SetRegularState<false>(media_navi_vc_app_, FullAudibleState());
+}
+
+TEST_F(StateControllerTest,
+ SetFullToAudioAppWhile2AudioAppsWithSameTypeInLimitedAndOneInFull) {
+ using am::HmiState;
+ using am::HmiStatePtr;
+ namespace HMILevel = mobile_apis::HMILevel;
+ namespace AudioStreamingState = mobile_apis::AudioStreamingState;
+ namespace SystemContext = mobile_apis::SystemContext;
+
+ InsertApplication(media_navi_vc_app_);
+ InsertApplication(media_app_);
+ InsertApplication(navi_app_);
+ InsertApplication(vc_app_);
+ ExpectSuccesfullSetHmiState(media_navi_vc_app_, media_navi_vc_app_ptr_,
+ BackgroundState(), FullAudibleState());
+ ExpectAppChangeHmiStateDueToConflictResolving(
+ media_app_, media_app_ptr_, LimitedState(), BackgroundState());
+ ExpectAppChangeHmiStateDueToConflictResolving(
+ navi_app_, navi_app_ptr_, LimitedState(), BackgroundState());
+ ExpectAppChangeHmiStateDueToConflictResolving(
+ vc_app_, vc_app_ptr_, FullAudibleState(), BackgroundState());
+ state_ctrl_.SetRegularState<false>(media_navi_vc_app_, FullAudibleState());
+}
+
+TEST_F(StateControllerTest, ActivateAppSuccessReceivedFromHMI) {
+ using namespace hmi_apis;
+ using namespace mobile_apis;
+
+ const uint32_t corr_id = 314;
+ const uint32_t hmi_app_id = 2718;
+ typedef std::pair<am::HmiStatePtr, Common_HMILevel::eType> StateLevelPair;
+ std::vector<StateLevelPair> hmi_states;
+ hmi_states.push_back(
+ StateLevelPair(FullAudibleState(), Common_HMILevel::FULL));
+ hmi_states.push_back(
+ StateLevelPair(FullNotAudibleState(), Common_HMILevel::FULL));
+ hmi_states.push_back(
+ StateLevelPair(LimitedState(), Common_HMILevel::LIMITED));
+ hmi_states.push_back(
+ StateLevelPair(BackgroundState(), Common_HMILevel::BACKGROUND));
+ hmi_states.push_back(StateLevelPair(
+ createHmiState(HMILevel::HMI_NONE, AudioStreamingState::NOT_AUDIBLE,
+ SystemContext::SYSCTXT_MAIN),
+ Common_HMILevel::NONE));
+ std::vector<StateLevelPair> initial_hmi_states = hmi_states;
+ std::vector<StateLevelPair>::iterator it = hmi_states.begin();
+ std::vector<StateLevelPair>::iterator it2 = initial_hmi_states.begin();
+ for (; it != hmi_states.end(); ++it) {
+ for (; it2 != initial_hmi_states.end(); ++it2) {
+ am::HmiStatePtr hmi_state = it->first;
+ am::HmiStatePtr initial_hmi_state = it->first;
+ Common_HMILevel::eType hmi_level = it->second;
+
+ EXPECT_CALL(*message_helper_mock_,
+ SendActivateAppToHMI(media_app_->app_id(), hmi_level, _))
+ .WillOnce(Return(corr_id));
+ EXPECT_CALL(app_manager_mock_, application_id(corr_id))
+ .WillOnce(Return(hmi_app_id));
+ EXPECT_CALL(app_manager_mock_, application_by_hmi_app(hmi_app_id))
+ .WillOnce(Return(media_app_));
+ ExpectSuccesfullSetHmiState(media_app_, media_app_ptr_, initial_hmi_state,
+ hmi_state);
+ state_ctrl_.SetRegularState<true>(media_app_, hmi_state);
+ smart_objects::SmartObject message;
+ message[am::strings::params][am::hmi_response::code] =
+ Common_Result::SUCCESS;
+ message[am::strings::params][am::strings::correlation_id] = corr_id;
+ am::event_engine::Event event(
+ hmi_apis::FunctionID::BasicCommunication_ActivateApp);
+ event.set_smart_object(message);
+ state_ctrl_.on_event(event);
+ }
+ }
+}
+/*
+TEST_F(StateControllerTest, ActivateAppErrorReceivedFromHMI) {
+ using namespace hmi_apis;
+ const uint32_t corr_id = 314;
+ const uint32_t hmi_app_id = 2718;
+ std::vector<Common_Result::eType> hmi_results;
+ hmi_results.push_back(Common_Result::ABORTED);
+ hmi_results.push_back(Common_Result::APPLICATION_NOT_REGISTERED);
+ hmi_results.push_back(Common_Result::CHAR_LIMIT_EXCEEDED);
+ hmi_results.push_back(Common_Result::DATA_NOT_AVAILABLE);
+ hmi_results.push_back(Common_Result::DISALLOWED);
+ hmi_results.push_back(Common_Result::DUPLICATE_NAME);
+ hmi_results.push_back(Common_Result::GENERIC_ERROR);
+ hmi_results.push_back(Common_Result::IGNORED);
+ hmi_results.push_back(Common_Result::INVALID_DATA);
+ hmi_results.push_back(Common_Result::INVALID_ENUM);
+ hmi_results.push_back(Common_Result::INVALID_ID);
+ hmi_results.push_back(Common_Result::IN_USE);
+ hmi_results.push_back(Common_Result::NO_APPS_REGISTERED);
+ hmi_results.push_back(Common_Result::NO_DEVICES_CONNECTED);
+ hmi_results.push_back(Common_Result::OUT_OF_MEMORY);
+ hmi_results.push_back(Common_Result::REJECTED);
+ hmi_results.push_back(Common_Result::RETRY);
+ hmi_results.push_back(Common_Result::TIMED_OUT);
+ hmi_results.push_back(Common_Result::TOO_MANY_PENDING_REQUESTS);
+ hmi_results.push_back(Common_Result::TRUNCATED_DATA);
+ hmi_results.push_back(Common_Result::UNSUPPORTED_REQUEST);
+ hmi_results.push_back(Common_Result::UNSUPPORTED_RESOURCE);
+ hmi_results.push_back(Common_Result::USER_DISALLOWED);
+ hmi_results.push_back(Common_Result::WARNINGS);
+ hmi_results.push_back(Common_Result::WRONG_LANGUAGE);
+
+ std::vector<Common_Result::eType>::iterator it = hmi_results.begin();
+ for (; it != hmi_results.end(); ++it) {
+ EXPECT_CALL(
+ *message_helper_mock_,
+ SendActivateAppToHMI(simple_app_->app_id(), Common_HMILevel::FULL, _))
+ .WillOnce(Return(corr_id));
+ EXPECT_CALL(app_manager_mock_, application_id(corr_id))
+ .WillOnce(Return(hmi_app_id));
+ EXPECT_CALL(app_manager_mock_, application_by_hmi_app(hmi_app_id))
+ .WillOnce(Return(simple_app_));
+ EXPECT_CALL(*simple_app_ptr_, RegularHmiState())
+ .WillOnce(Return(BackgroundState()));
+ EXPECT_CALL(*simple_app_ptr_, CurrentHmiState())
+ .WillOnce(Return(BackgroundState()))
+ .WillOnce(Return(BackgroundState()));
+ EXPECT_CALL(*simple_app_ptr_,
+ SetRegularState(Truly(HmiStatesComparator(BackgroundState()))));
+ EXPECT_CALL(app_manager_mock_, SendHMIStatusNotification(simple_app_))
+ .Times(0);
+ EXPECT_CALL(app_manager_mock_,
+ OnHMILevelChanged(simple_app_->app_id(), _, _)).Times(0);
+ state_ctrl_.SetRegularState<true>(simple_app_, FullNotAudibleState());
+ smart_objects::SmartObject message;
+ message[am::strings::params][am::hmi_response::code] = *it;
+ message[am::strings::params][am::strings::correlation_id] = corr_id;
+ am::event_engine::Event event(FunctionID::BasicCommunication_ActivateApp);
+ event.set_smart_object(message);
+ state_ctrl_.on_event(event);
+ }
+}
+*/
+TEST_F(StateControllerTest, ActivateAppInvalidCorrelationId) {
+ using namespace hmi_apis;
+ const uint32_t corr_id = 314;
+ const uint32_t hmi_app_id = 2718;
+ EXPECT_CALL(*message_helper_mock_,
+ SendActivateAppToHMI(simple_app_->app_id(), Common_HMILevel::FULL,
+ _)).WillOnce(Return(hmi_app_id));
+ EXPECT_CALL(app_manager_mock_, application_id(corr_id))
+ .WillOnce(Return(hmi_app_id));
+ EXPECT_CALL(app_manager_mock_, application_by_hmi_app(hmi_app_id))
+ .WillOnce(Return(am::ApplicationSharedPtr()));
+ EXPECT_CALL(*simple_app_ptr_, SetRegularState(_)).Times(0);
+ EXPECT_CALL(app_manager_mock_, SendHMIStatusNotification(simple_app_))
+ .Times(0);
+ EXPECT_CALL(app_manager_mock_, OnHMILevelChanged(simple_app_->app_id(), _, _))
+ .Times(0);
+ state_ctrl_.SetRegularState<true>(simple_app_, FullNotAudibleState());
+ smart_objects::SmartObject message;
+ message[am::strings::params][am::hmi_response::code] = Common_Result::SUCCESS;
+ message[am::strings::params][am::strings::correlation_id] = corr_id;
+ am::event_engine::Event event(FunctionID::BasicCommunication_ActivateApp);
+ event.set_smart_object(message);
+ state_ctrl_.on_event(event);
+}
+/*
+TEST_F(StateControllerTest, ApplyTempStatesForSimpleApp) {
+ InsertApplication(simple_app_);
+ CheckStateApplyingForApplication(*simple_app_ptr_, valid_state_ids_);
+}
+
+TEST_F(StateControllerTest, ApplyTempStatesForMediaApp) {
+ InsertApplication(media_app_);
+ CheckStateApplyingForApplication(*media_app_ptr_, valid_state_ids_);
+}
+
+TEST_F(StateControllerTest, ApplyTempStatesForNaviApp) {
+ InsertApplication(navi_app_);
+ CheckStateApplyingForApplication(*navi_app_ptr_, valid_state_ids_);
+}
+
+TEST_F(StateControllerTest, ApplyTempStatesForVCApp) {
+ InsertApplication(vc_app_);
+ CheckStateApplyingForApplication(*vc_app_ptr_, valid_state_ids_);
+}
+
+TEST_F(StateControllerTest, ApplyTempStatesForMediaNaviApp) {
+ InsertApplication(media_navi_app_);
+ CheckStateApplyingForApplication(*media_navi_app_ptr_, valid_state_ids_);
+}
+
+TEST_F(StateControllerTest, ApplyTempStatesForMediaVCApp) {
+ InsertApplication(media_vc_app_);
+ CheckStateApplyingForApplication(*media_vc_app_ptr_, valid_state_ids_);
+}
+
+TEST_F(StateControllerTest, ApplyTempStatesForNaviVCApp) {
+ InsertApplication(navi_vc_app_);
+ CheckStateApplyingForApplication(*navi_vc_app_ptr_, valid_state_ids_);
+}
+
+TEST_F(StateControllerTest, ApplyTempStatesForMediaNaviVCApp) {
+ InsertApplication(media_navi_vc_app_);
+ CheckStateApplyingForApplication(*media_navi_vc_app_ptr_, valid_state_ids_);
+}
+*/
+} // namespace state_controller_test
diff --git a/src/components/config_profile/CMakeLists.txt b/src/components/config_profile/CMakeLists.txt
index 7eb098a30..fe6f373b3 100644
--- a/src/components/config_profile/CMakeLists.txt
+++ b/src/components/config_profile/CMakeLists.txt
@@ -42,3 +42,7 @@ set (SOURCES
add_library("ConfigProfile" ${SOURCES})
target_link_libraries("ConfigProfile" Utils)
+
+if(BUILD_TESTS)
+ add_subdirectory(test)
+endif() \ No newline at end of file
diff --git a/src/components/config_profile/test/CMakeLists.txt b/src/components/config_profile/test/CMakeLists.txt
new file mode 100644
index 000000000..e474d3fc2
--- /dev/null
+++ b/src/components/config_profile/test/CMakeLists.txt
@@ -0,0 +1,59 @@
+# Copyright (c) 2015, Ford Motor Company
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# Redistributions of source code must retain the above copyright notice, this
+# list of conditions and the following disclaimer.
+#
+# Redistributions in binary form must reproduce the above copyright notice,
+# this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided with the
+# distribution.
+#
+# Neither the name of the Ford Motor Company nor the names of its contributors
+# may be used to endorse or promote products derived from this software
+# without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+if(BUILD_TESTS)
+
+include_directories (
+ ${CMAKE_SOURCE_DIR}/src/3rd_party-static/gmock-1.7.0/include
+ ${CMAKE_SOURCE_DIR}/src/3rd_party-static/gmock-1.7.0/gtest/include
+ ${COMPONENTS_DIR}/include/utils
+ ${COMPONENTS_DIR}/config_profile/include
+ )
+
+
+set(testSources
+ profile_test.cc
+ ini_file_test.cc
+)
+
+set(testLibraries
+ gmock
+ ConfigProfile
+)
+
+file(COPY smartDeviceLink.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
+file(COPY smartDeviceLink_test.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
+file(COPY smartDeviceLink_invalid_pairs.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
+file(COPY smartDeviceLink_invalid_string.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
+file(COPY smartDeviceLink_invalid_int.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
+file(COPY smartDeviceLink_invalid_boolean.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
+create_test("config_profile_test" "${testSources}" "${testLibraries}")
+
+endif()
diff --git a/src/components/config_profile/test/ini_file_test.cc b/src/components/config_profile/test/ini_file_test.cc
new file mode 100644
index 000000000..10d500df7
--- /dev/null
+++ b/src/components/config_profile/test/ini_file_test.cc
@@ -0,0 +1,335 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * FERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "gtest/gtest.h"
+#include "config_profile/ini_file.h"
+#include "utils/file_system.h"
+
+namespace test {
+namespace components {
+namespace profile {
+
+using namespace ::profile;
+
+TEST(IniFileTest, DISABLED_WriteItemReadItem) {
+ // Write line in chapter
+ const char * fname = "./test_ini_file.ini";
+ const char *chapter = "Chapter";
+ const char * item = "Test_item";
+ const char * value = "test_value";
+ const bool write_result = ini_write_value(fname, chapter, item, value,
+ INI_FLAG_ITEM_UP_CREA);
+ EXPECT_TRUE(write_result);
+
+ // Read value from file
+ char search_value[INI_LINE_LEN] = "";
+ const bool read_result = ini_read_value(fname, chapter, item, search_value);
+
+ EXPECT_TRUE(read_result);
+ EXPECT_EQ(*search_value, *value);
+ EXPECT_TRUE(file_system::DeleteFile("./test_ini_file.ini"));
+}
+
+TEST(IniFileTest, DISABLED_WriteItemWithoutValueReadItem) {
+ // Write line in chapter
+ const char * fname = "./test_ini_file.ini";
+ const char *chapter = "Chapter";
+ const char * test_item = "Test_item";
+ const char * value = "";
+ const bool write_result = ini_write_value(fname, chapter, test_item, value,
+ INI_FLAG_ITEM_UP_CREA);
+ EXPECT_TRUE(write_result);
+
+ // Read value from file
+ char search_value[INI_LINE_LEN] = "";
+ const bool read_result = ini_read_value(fname, chapter, test_item, search_value);
+
+ EXPECT_TRUE(read_result);
+ EXPECT_EQ(*search_value, *value);
+
+ EXPECT_TRUE(file_system::DeleteFile("./test_ini_file.ini"));
+}
+
+TEST(IniFileTest, DISABLED_WriteSameItemInDifferentChapters) {
+ // Write line in chapter
+ const char * fname = "./test_ini_file.ini";
+ const char *chapter1 = "Chapter1";
+ const char * test_item = "Test_item";
+ const char * value = "test_value";
+ const bool write_result = ini_write_value(fname, chapter1, test_item, value,
+ INI_FLAG_ITEM_UP_CREA);
+ EXPECT_TRUE(write_result);
+
+ char search_value[INI_LINE_LEN] = "";
+ const bool read_result = ini_read_value(fname, chapter1, test_item, search_value);
+
+ EXPECT_TRUE(read_result);
+ EXPECT_EQ(*search_value, *value);
+
+ // Create new chapter and write the same value
+ const char *chapter2 = "Chapter2";
+
+ const bool write_result2 = ini_write_value(fname, chapter2, test_item, value,
+ INI_FLAG_ITEM_UP_CREA);
+
+ EXPECT_TRUE(write_result2);
+
+ char value2[INI_LINE_LEN] = "test_value";
+ const bool read_result2 = ini_read_value(fname, chapter2, test_item, value2);
+
+ EXPECT_TRUE(read_result2);
+ EXPECT_EQ(*value2, *value);
+
+ EXPECT_TRUE(file_system::DeleteFile("./test_ini_file.ini"));
+}
+
+TEST(IniFileTest, DISABLED_RewriteItem) {
+ // Write line in chapter
+ const char * fname = "./test_ini_file.ini";
+ const char *chapter = "Chapter";
+ const char * item = "Test_item";
+ const char * value = "test_value";
+ bool write_result = ini_write_value(fname, chapter, item, value,
+ INI_FLAG_ITEM_UP_CREA);
+
+ EXPECT_TRUE(write_result);
+
+ char search_value[INI_LINE_LEN] = "";
+ bool read_result = ini_read_value(fname, chapter, item, search_value);
+
+ EXPECT_TRUE(read_result);
+ EXPECT_EQ(*search_value, *value);
+
+ // Write item again
+ const char * newvalue = "new_test_value";
+ write_result = ini_write_value(fname, chapter, item, newvalue,
+ INI_FLAG_ITEM_UP_CREA);
+
+ EXPECT_TRUE(write_result);
+
+ char new_search_value[INI_LINE_LEN] = "";
+ read_result = ini_read_value(fname, chapter, item, new_search_value);
+
+ EXPECT_TRUE(read_result);
+ EXPECT_EQ(*new_search_value, *newvalue);
+ EXPECT_TRUE(file_system::DeleteFile("./test_ini_file.ini"));
+}
+
+TEST(IniFileTest, DISABLED_WriteTwoItemsInOneChapter) {
+ // Write line in chapter
+ const char * fname = "./test_ini_file.ini";
+ const char *chapter = "Chapter";
+ const char * item = "Test_item";
+ const char * value1 = "test_value";
+
+ bool write_result = ini_write_value(fname, chapter, item, value1,
+ INI_FLAG_ITEM_UP_CREA);
+ EXPECT_TRUE(write_result);
+
+ // Write another line in the same chapter
+ const char * item2 = "Test_item2";
+ const char * value2 = "test_value2";
+
+ write_result = ini_write_value(fname, chapter, item2, value2,
+ INI_FLAG_ITEM_UP_CREA);
+ EXPECT_TRUE(write_result);
+
+ // Search both values
+ char search_value[INI_LINE_LEN] = "";
+ bool read_result = ini_read_value(fname, chapter, item, search_value);
+
+ EXPECT_TRUE(read_result);
+ EXPECT_EQ(*search_value, *value1);
+
+ char search_value2[INI_LINE_LEN] = "";
+ read_result = ini_read_value(fname, chapter, item2, search_value2);
+
+ EXPECT_TRUE(read_result);
+ EXPECT_EQ(*search_value2, *value2);
+
+ EXPECT_TRUE(file_system::DeleteFile("./test_ini_file.ini"));
+}
+
+TEST(IniFileTest, WriteEmptyItemWithValueReadItem) {
+ const char * fname = "./test_ini_file.ini";
+ const char *chapter = "Chapter";
+ const char * test_item = "";
+ const char * value = "test_value";
+ bool result = ini_write_value(fname, chapter, test_item, value,
+ INI_FLAG_ITEM_UP_CREA);
+ EXPECT_FALSE(result);
+}
+
+TEST(IniFileTest, WriteEmptyItemWithEmptyValue_ExpectFalse) {
+ // Write empty line in chapter
+ const char * fname = "./test_ini_file.ini";
+ const char *chapter = "Chapter";
+ const char * test_item = "";
+ const char * value = "";
+ bool result = ini_write_value(fname, chapter, test_item, value,
+ INI_FLAG_ITEM_UP_CREA);
+ EXPECT_FALSE(result);
+}
+
+TEST(IniFileTest, WriteItemInEmptyChapter_ExpectFalse) {
+ // Write line in empty chapter
+ const char * fname = "./test_ini_file.ini";
+ const char *chapter = "";
+ const char * test_item = "Test_item";
+ const char * value = "test_value";
+ bool result = ini_write_value(fname, chapter, test_item, value,
+ INI_FLAG_ITEM_UP_CREA);
+ EXPECT_FALSE(result);
+}
+
+TEST(IniFileTest,ParseEmptyLine) {
+ char line[INI_LINE_LEN] = "";
+ char val[INI_LINE_LEN] = "";
+ char tag[INI_LINE_LEN] = "HMI";
+
+ Ini_search_id result;
+ result = ini_parse_line(line, tag, val);
+ EXPECT_EQ(INI_NOTHING, result);
+}
+
+TEST(IniFileTest,ParseChapter) {
+ char line[INI_LINE_LEN] = "[HMI]";
+ char val[INI_LINE_LEN] = "";
+ char tag[INI_LINE_LEN] = "HMI";
+
+ Ini_search_id result;
+ result = ini_parse_line(line, tag, val);
+ EXPECT_EQ(INI_RIGHT_CHAPTER, result);
+}
+
+TEST(IniFileTest,ParseChapterTagEmpty) {
+ char line[INI_LINE_LEN] = "[HMI]";
+ char val[INI_LINE_LEN] = "";
+ char tag[INI_LINE_LEN] = "";
+
+ Ini_search_id result;
+ result = ini_parse_line(line, tag, val);
+ EXPECT_EQ(INI_WRONG_CHAPTER, result);
+}
+
+TEST(IniFileTest,ParseChapterWithUppercaseTag) {
+ char line[INI_LINE_LEN] = "[Security Manager]";
+ char val[INI_LINE_LEN] = "";
+ char tag[INI_LINE_LEN] = "SECURITY MANAGER";
+
+ Ini_search_id result;
+ result = ini_parse_line(line, tag, val);
+ EXPECT_EQ(INI_RIGHT_CHAPTER, result);
+}
+
+TEST(IniFileTest,ParseChapterWithLowcaseTag) {
+ char line[INI_LINE_LEN] = "[Security Manager]";
+ char val[INI_LINE_LEN] = "";
+ char tag[INI_LINE_LEN] = "Security Manager";
+
+ Ini_search_id result;
+ result = ini_parse_line(line, tag, val);
+ EXPECT_EQ(INI_WRONG_CHAPTER, result);
+}
+
+TEST(IniFileTest,ParseWithWrongChapter) {
+ char line[INI_LINE_LEN] = "[HMI]";
+ char val[INI_LINE_LEN] = "";
+ char tag[INI_LINE_LEN] = "MAIN";
+
+ Ini_search_id result;
+ result = ini_parse_line(line, tag, val);
+ EXPECT_EQ(INI_WRONG_CHAPTER, result);
+}
+
+TEST(IniFileTest,ParseLineWithItem) {
+ char line[INI_LINE_LEN] = "LaunchHMI = true";
+ char val[INI_LINE_LEN] = "";
+ char tag[INI_LINE_LEN] = "LAUNCHHMI";
+
+ Ini_search_id result;
+ result = ini_parse_line(line, tag, val);
+ EXPECT_EQ(INI_RIGHT_ITEM, result);
+
+ char check_val[INI_LINE_LEN] = "true";
+ EXPECT_EQ(*check_val, *val);
+}
+
+TEST(IniFileTest,ParseLineWithoutItem) {
+ char line[INI_LINE_LEN] = "LaunchHMI = ";
+ char val[INI_LINE_LEN] = "";
+ char tag[INI_LINE_LEN] = "LAUNCHHMI";
+
+ Ini_search_id result;
+ result = ini_parse_line(line, tag, val);
+ EXPECT_EQ(INI_RIGHT_ITEM, result);
+
+ char check_val[INI_LINE_LEN] = "";
+ EXPECT_EQ(*check_val, *val);
+}
+
+TEST(IniFileTest,ParseLineWithEmptytag) {
+ char line[INI_LINE_LEN] = "LaunchHMI = true";
+ char val[INI_LINE_LEN] = "";
+ char tag[INI_LINE_LEN] = "";
+
+ Ini_search_id result;
+ result = ini_parse_line(line, tag, val);
+ EXPECT_EQ(INI_WRONG_ITEM, result);
+}
+
+TEST(IniFileTest,ParseLineWithLowcaseTag) {
+ char line[INI_LINE_LEN] = "LaunchHMI = true";
+ char val[INI_LINE_LEN] = "";
+ char tag[INI_LINE_LEN] = "LaunchHmi";
+
+ Ini_search_id result;
+ result = ini_parse_line(line, tag, val);
+ EXPECT_EQ(INI_WRONG_ITEM, result);
+}
+
+TEST(IniFileTest,ParseLineWithComment) {
+ char line[INI_LINE_LEN] = "; [HMI]";
+ char val[INI_LINE_LEN] = "";
+ char tag[INI_LINE_LEN] = "HMI";
+
+ Ini_search_id result;
+ result = ini_parse_line(line, tag, val);
+ EXPECT_EQ(INI_REMARK, result);
+
+ char check_val[INI_LINE_LEN] = ";";
+ EXPECT_EQ(*check_val, *val);
+}
+
+} // namespace profile
+} // namespace components
+} // namespace test
diff --git a/src/components/config_profile/test/profile_test.cc b/src/components/config_profile/test/profile_test.cc
new file mode 100644
index 000000000..9d9eca755
--- /dev/null
+++ b/src/components/config_profile/test/profile_test.cc
@@ -0,0 +1,789 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "gtest/gtest.h"
+#include "config_profile/profile.h"
+#include <algorithm>
+#include "utils/file_system.h"
+#include "utils/threads/thread.h"
+
+namespace test {
+namespace components {
+namespace profile {
+
+using namespace ::profile;
+
+class ProfileTest : public ::testing::Test {
+ protected:
+ virtual void SetUp() {
+ profile::Profile::destroy();
+ }
+ virtual void TearDown() {
+ profile::Profile::destroy();
+ }
+
+};
+
+TEST_F(ProfileTest, SingletonProfile) {
+ Profile::instance();
+ EXPECT_TRUE(Profile::exists());
+ profile::Profile::destroy();
+ EXPECT_FALSE(Profile::exists());
+}
+
+TEST_F(ProfileTest, UpdateConfigWithDefaultFile) {
+ // Default value
+ uint32_t thread_min_stack_size = threads::Thread::kMinStackSize;
+ EXPECT_EQ(thread_min_stack_size,
+ Profile::instance()->thread_min_stack_size());
+ EXPECT_FALSE(profile::Profile::instance()->enable_policy());
+ std::string vr_help_title_ = "";
+ EXPECT_EQ(vr_help_title_, Profile::instance()->vr_help_title());
+ EXPECT_EQ("smartDeviceLink.ini", Profile::instance()->config_file_name());
+
+ profile::Profile::instance()->UpdateValues();
+ // Value was updated
+ thread_min_stack_size = 20480;
+ EXPECT_EQ(thread_min_stack_size,
+ Profile::instance()->thread_min_stack_size());
+ EXPECT_TRUE(profile::Profile::instance()->enable_policy());
+ vr_help_title_ = "Available Vr Commands List";
+ EXPECT_EQ(vr_help_title_, Profile::instance()->vr_help_title());
+}
+
+TEST_F(ProfileTest, SetConfigFileWithoutCallUpdate) {
+ // Default value
+ uint32_t thread_min_stack_size = threads::Thread::kMinStackSize;
+ EXPECT_EQ(thread_min_stack_size,
+ Profile::instance()->thread_min_stack_size());
+ EXPECT_FALSE(profile::Profile::instance()->enable_policy());
+ std::string vr_help_title_ = "";
+ EXPECT_EQ(vr_help_title_, Profile::instance()->vr_help_title());
+ EXPECT_EQ("smartDeviceLink.ini", Profile::instance()->config_file_name());
+
+ Profile::instance()->config_file_name("smartDeviceLink.ini");
+ EXPECT_EQ("smartDeviceLink.ini", Profile::instance()->config_file_name());
+
+ // Value was updated
+ thread_min_stack_size = 20480;
+ EXPECT_EQ(thread_min_stack_size,
+ Profile::instance()->thread_min_stack_size());
+ EXPECT_TRUE(profile::Profile::instance()->enable_policy());
+ vr_help_title_ = "Available Vr Commands List";
+ EXPECT_EQ(vr_help_title_, Profile::instance()->vr_help_title());
+}
+
+TEST_F(ProfileTest, SetConfigFileWithUpdate) {
+ // Default value
+ uint32_t thread_min_stack_size = threads::Thread::kMinStackSize;
+ EXPECT_EQ(thread_min_stack_size,
+ Profile::instance()->thread_min_stack_size());
+ Profile::instance()->config_file_name("smartDeviceLink.ini");
+ EXPECT_EQ("smartDeviceLink.ini", Profile::instance()->config_file_name());
+
+ // Value was updated
+ thread_min_stack_size = 20480;
+ EXPECT_EQ(thread_min_stack_size,
+ Profile::instance()->thread_min_stack_size());
+
+ // Update config file again
+ profile::Profile::instance()->UpdateValues();
+
+ // Value should be the same
+ EXPECT_EQ(thread_min_stack_size,
+ Profile::instance()->thread_min_stack_size());
+}
+
+TEST_F(ProfileTest, UpdateManyTimesDefaultFile) {
+ //using for check logger's work - core dump when this test was started and log4cxx exists in test derictory
+ Profile::instance()->config_file_name("smartDeviceLink.ini");
+ EXPECT_EQ("smartDeviceLink.ini", Profile::instance()->config_file_name());
+ // Update config many times
+ for (int i = 0; i < 10; i++) {
+ profile::Profile::instance()->UpdateValues();
+ }
+}
+
+TEST_F(ProfileTest, UpdateIntValues) {
+ // Default value
+ EXPECT_EQ("smartDeviceLink.ini", Profile::instance()->config_file_name());
+ uint32_t thread_min_stack_size = threads::Thread::kMinStackSize;
+ EXPECT_EQ(thread_min_stack_size,
+ Profile::instance()->thread_min_stack_size());
+
+ // Set config file with default name
+ Profile::instance()->config_file_name("smartDeviceLink.ini");
+ EXPECT_EQ("smartDeviceLink.ini", Profile::instance()->config_file_name());
+
+ // Value changes
+ thread_min_stack_size = 20480;
+ EXPECT_EQ(thread_min_stack_size,
+ Profile::instance()->thread_min_stack_size());
+
+ // Update config file again
+ profile::Profile::instance()->UpdateValues();
+ // Values are same
+ EXPECT_EQ(thread_min_stack_size,
+ Profile::instance()->thread_min_stack_size());
+
+ // Set new config file
+ Profile::instance()->config_file_name("smartDeviceLink_test.ini");
+ EXPECT_EQ("smartDeviceLink_test.ini",
+ Profile::instance()->config_file_name());
+
+ // Value changes
+ thread_min_stack_size = 21000;
+ EXPECT_EQ(thread_min_stack_size,
+ Profile::instance()->thread_min_stack_size());
+
+ // Update config file again
+ profile::Profile::instance()->UpdateValues();
+ EXPECT_EQ("smartDeviceLink_test.ini",
+ Profile::instance()->config_file_name());
+
+ // Value should be the same
+ EXPECT_EQ(thread_min_stack_size,
+ Profile::instance()->thread_min_stack_size());
+
+ // Set config file with default name again
+ Profile::instance()->config_file_name("smartDeviceLink.ini");
+ EXPECT_EQ("smartDeviceLink.ini", Profile::instance()->config_file_name());
+
+ // Value should be changed
+ thread_min_stack_size = 20480;
+ EXPECT_EQ(thread_min_stack_size,
+ Profile::instance()->thread_min_stack_size());
+}
+
+TEST_F(ProfileTest, UpdateBoolValues) {
+ // Default values
+ EXPECT_EQ("smartDeviceLink.ini", Profile::instance()->config_file_name());
+ EXPECT_TRUE(profile::Profile::instance()->launch_hmi());
+ EXPECT_FALSE(profile::Profile::instance()->enable_policy());
+
+ // Set config file
+ Profile::instance()->config_file_name("smartDeviceLink.ini");
+ // Check values
+ EXPECT_TRUE(profile::Profile::instance()->launch_hmi());
+ EXPECT_TRUE(profile::Profile::instance()->enable_policy());
+ EXPECT_FALSE(profile::Profile::instance()->is_redecoding_enabled());
+
+ // Update config file again
+ profile::Profile::instance()->UpdateValues();
+ // Values are same
+ EXPECT_TRUE(profile::Profile::instance()->launch_hmi());
+ EXPECT_TRUE(profile::Profile::instance()->enable_policy());
+ EXPECT_FALSE(profile::Profile::instance()->is_redecoding_enabled());
+
+ // Change config file
+ Profile::instance()->config_file_name("smartDeviceLink_test.ini");
+ EXPECT_EQ("smartDeviceLink_test.ini",
+ Profile::instance()->config_file_name());
+
+ // Parameters after updating
+ EXPECT_FALSE(profile::Profile::instance()->launch_hmi());
+ EXPECT_FALSE(profile::Profile::instance()->enable_policy());
+ EXPECT_TRUE(profile::Profile::instance()->is_redecoding_enabled());
+
+ // Update config file
+ profile::Profile::instance()->UpdateValues();
+
+ // Parameters are same
+ EXPECT_FALSE(profile::Profile::instance()->launch_hmi());
+ EXPECT_FALSE(profile::Profile::instance()->enable_policy());
+ EXPECT_TRUE(profile::Profile::instance()->is_redecoding_enabled());
+}
+
+TEST_F(ProfileTest, UpdateStringValue) {
+ // Default values
+ std::string config_folder = "";
+ std::string tts_delimiter_ = "";
+ std::string vr_help_title_ = "";
+ std::string server_address = "127.0.0.1";
+ std::string app_resourse_folder = "";
+ EXPECT_EQ(config_folder, Profile::instance()->app_resourse_folder());
+ EXPECT_EQ(server_address, profile::Profile::instance()->server_address());
+
+ Profile::instance()->config_file_name("smartDeviceLink.ini");
+ EXPECT_EQ("smartDeviceLink.ini", Profile::instance()->config_file_name());
+
+ // Check values
+ config_folder = file_system::CurrentWorkingDirectory();
+ EXPECT_EQ(config_folder, Profile::instance()->app_resourse_folder());
+ tts_delimiter_ = ",";
+ EXPECT_EQ(tts_delimiter_, Profile::instance()->tts_delimiter());
+ vr_help_title_ = "Available Vr Commands List";
+ EXPECT_EQ(vr_help_title_, Profile::instance()->vr_help_title());
+
+ EXPECT_EQ(server_address, profile::Profile::instance()->server_address());
+ app_resourse_folder = file_system::CurrentWorkingDirectory();
+ EXPECT_EQ(app_resourse_folder, Profile::instance()->app_resourse_folder());
+
+ // Update config file
+ profile::Profile::instance()->UpdateValues();
+
+ // Values are the same
+ EXPECT_EQ(config_folder, Profile::instance()->app_resourse_folder());
+ EXPECT_EQ(tts_delimiter_, Profile::instance()->tts_delimiter());
+ EXPECT_EQ(vr_help_title_, Profile::instance()->vr_help_title());
+ EXPECT_EQ(server_address, profile::Profile::instance()->server_address());
+ EXPECT_EQ(app_resourse_folder, Profile::instance()->app_resourse_folder());
+}
+
+TEST_F(ProfileTest, UpdateInt_ValueAppearsInFileTwice) {
+ // Default values
+ uint32_t server_port = 8087;
+ EXPECT_EQ(server_port, Profile::instance()->server_port());
+ // Change config file
+ Profile::instance()->config_file_name("smartDeviceLink_test.ini");
+ EXPECT_EQ("smartDeviceLink_test.ini",
+ Profile::instance()->config_file_name());
+ // Update config file
+ // First server_port = 8088
+ server_port = 8088;
+ EXPECT_EQ(server_port, Profile::instance()->server_port());
+}
+
+TEST_F(ProfileTest, UpdateBool_ValueAppearsInFileTwice) {
+ // Default values
+ EXPECT_FALSE(Profile::instance()->is_mixing_audio_supported());
+ // Change config file
+ Profile::instance()->config_file_name("smartDeviceLink_test.ini");
+ EXPECT_EQ("smartDeviceLink_test.ini",
+ Profile::instance()->config_file_name());
+ // Update config file
+ // First value is false
+ EXPECT_FALSE(profile::Profile::instance()->is_mixing_audio_supported());
+}
+
+TEST_F(ProfileTest, UpdateVectorOfString_ValueAppearsInFileTwice) {
+ // Default values
+ std::vector < std::string > time_out_promt;
+ EXPECT_EQ(time_out_promt, Profile::instance()->time_out_promt());
+ // Change config file
+ Profile::instance()->config_file_name("smartDeviceLink_test.ini");
+ EXPECT_EQ("smartDeviceLink_test.ini",
+ Profile::instance()->config_file_name());
+ // Update config file
+ time_out_promt.push_back("Please say a command,");
+ EXPECT_EQ(time_out_promt, Profile::instance()->time_out_promt());
+}
+
+TEST_F(ProfileTest, UpdateString_ValueAppearsInFileTwice) {
+ // Default values
+ std::string recording_file_name = "record.wav";
+ EXPECT_EQ(recording_file_name, Profile::instance()->recording_file_name());
+ // Change config file
+ Profile::instance()->config_file_name("smartDeviceLink_test.ini");
+ EXPECT_EQ("smartDeviceLink_test.ini",
+ Profile::instance()->config_file_name());
+ // Update config file
+ recording_file_name = "video.wav";
+ EXPECT_EQ(recording_file_name, Profile::instance()->recording_file_name());
+}
+
+TEST_F(ProfileTest, UpdatePairsValue) {
+ // Default values
+ std::pair < uint32_t, int32_t > value;
+ value.first = 0;
+ value.second = 0;
+ EXPECT_EQ(value, Profile::instance()->get_vehicle_data_frequency());
+
+ Profile::instance()->config_file_name("smartDeviceLink.ini");
+ EXPECT_EQ("smartDeviceLink.ini", Profile::instance()->config_file_name());
+
+ value.first = 5;
+ value.second = 1;
+ EXPECT_EQ(value, Profile::instance()->get_vehicle_data_frequency());
+
+ // Update config file
+ profile::Profile::instance()->UpdateValues();
+ EXPECT_EQ(value, Profile::instance()->get_vehicle_data_frequency());
+}
+
+// Section with negative tests
+
+TEST_F(ProfileTest, PairsValueEmpty) {
+ // Default values
+ std::pair < uint32_t, int32_t > value;
+ value.first = 0;
+ value.second = 0;
+ EXPECT_EQ(value, Profile::instance()->read_did_frequency());
+
+ Profile::instance()->config_file_name("smartDeviceLink_invalid_pairs.ini");
+ EXPECT_EQ("smartDeviceLink_invalid_pairs.ini",
+ Profile::instance()->config_file_name());
+
+ // Default values
+ value.first = 5;
+ value.second = 1;
+ EXPECT_EQ(value, Profile::instance()->read_did_frequency());
+
+ // Update config file
+ profile::Profile::instance()->UpdateValues();
+ // Values are same
+ EXPECT_EQ(value, Profile::instance()->read_did_frequency());
+}
+
+TEST_F(ProfileTest, CharValueInPairInsteadOfInt) {
+ std::pair < uint32_t, int32_t > value;
+ value.first = 0;
+ value.second = 0;
+ EXPECT_EQ(value, Profile::instance()->get_vehicle_data_frequency());
+
+ Profile::instance()->config_file_name("smartDeviceLink_invalid_string.ini");
+ EXPECT_EQ("smartDeviceLink_invalid_string.ini",
+ Profile::instance()->config_file_name());
+
+ EXPECT_EQ(value, Profile::instance()->get_vehicle_data_frequency());
+
+ // Update config file
+ profile::Profile::instance()->UpdateValues();
+ // Values are same
+ EXPECT_EQ(value, Profile::instance()->get_vehicle_data_frequency());
+}
+
+TEST_F(ProfileTest, EmptyValuesInPair) {
+ Profile::instance()->config_file_name("smartDeviceLink_invalid_pairs.ini");
+ EXPECT_EQ("smartDeviceLink_invalid_pairs.ini",
+ Profile::instance()->config_file_name());
+
+ std::pair < uint32_t, int32_t > value;
+ value.first = 0;
+ value.second = 0;
+ EXPECT_EQ(value, Profile::instance()->get_vehicle_data_frequency());
+
+ // Update config file
+ profile::Profile::instance()->UpdateValues();
+ // Values are same
+ EXPECT_EQ(value, Profile::instance()->get_vehicle_data_frequency());
+}
+
+TEST_F(ProfileTest, DISABLED_IntInsteadOfPair) {
+ // Default values
+ std::pair < uint32_t, int32_t > value;
+ value.first = 0;
+ value.second = 0;
+ EXPECT_EQ(value, Profile::instance()->start_stream_retry_amount());
+
+ Profile::instance()->config_file_name("smartDeviceLink_invalid_pairs.ini");
+ EXPECT_EQ("smartDeviceLink_invalid_pairs.ini",
+ Profile::instance()->config_file_name());
+ // Ini file includes only one element
+ value.first = 9;
+ value.second = 1000;
+ EXPECT_EQ(value, Profile::instance()->start_stream_retry_amount());
+
+ // Update config file
+ profile::Profile::instance()->UpdateValues();
+ // Values are same
+ EXPECT_EQ(value, Profile::instance()->start_stream_retry_amount());
+}
+
+TEST_F(ProfileTest, WrongIntValue) {
+ // Default value
+ int32_t heart_beat_timeout = 0;
+ EXPECT_EQ(heart_beat_timeout, Profile::instance()->heart_beat_timeout());
+
+ // Change config file
+ Profile::instance()->config_file_name("smartDeviceLink_invalid_int.ini");
+ EXPECT_EQ("smartDeviceLink_invalid_int.ini",
+ Profile::instance()->config_file_name());
+
+ // Value in file includes letters. Check that value is default
+ heart_beat_timeout = 0;
+ EXPECT_EQ(heart_beat_timeout, Profile::instance()->heart_beat_timeout());
+
+ // Update config file
+ profile::Profile::instance()->UpdateValues();
+ EXPECT_EQ(heart_beat_timeout, Profile::instance()->heart_beat_timeout());
+}
+
+TEST_F(ProfileTest, DISABLED_WrongMaxIntValue) {
+ // Default value
+ uint32_t maxvalue = 2000000000;
+ EXPECT_EQ(maxvalue, Profile::instance()->max_cmd_id());
+
+ // Change config file
+ Profile::instance()->config_file_name("smartDeviceLink_invalid_int.ini");
+ EXPECT_EQ("smartDeviceLink_invalid_int.ini",
+ Profile::instance()->config_file_name());
+
+ // Value in file is more than could be saved.
+ // Check that value is default
+ EXPECT_EQ(maxvalue, Profile::instance()->max_cmd_id());
+
+ // Update config file
+ profile::Profile::instance()->UpdateValues();
+ EXPECT_EQ(maxvalue, Profile::instance()->max_cmd_id());
+}
+
+TEST_F(ProfileTest, DISABLED_WrongMinIntValue) {
+ // Default value
+ uint32_t minvalue = threads::Thread::kMinStackSize;
+ EXPECT_EQ(minvalue, Profile::instance()->thread_min_stack_size());
+
+ uint16_t server_port = 8087;
+ EXPECT_EQ(server_port, Profile::instance()->server_port());
+
+ // Change config file
+ Profile::instance()->config_file_name("smartDeviceLink_invalid_int.ini");
+ EXPECT_EQ("smartDeviceLink_invalid_int.ini",
+ Profile::instance()->config_file_name());
+
+ //File include 0, value should be lefted as default
+ EXPECT_EQ(minvalue, Profile::instance()->thread_min_stack_size());
+ //File include -1, value should be lefted as default
+ EXPECT_EQ(server_port, Profile::instance()->server_port());
+
+ // Update config file
+ profile::Profile::instance()->UpdateValues();
+
+ // Default value should be lefted
+ EXPECT_EQ(minvalue, Profile::instance()->thread_min_stack_size());
+ EXPECT_EQ(server_port, Profile::instance()->server_port());
+}
+
+TEST_F(ProfileTest, DISABLED_CheckCorrectValueWhenOtherValueInvalid) {
+ // Default value
+ uint32_t maxvalue = 2000000000;
+ EXPECT_EQ(maxvalue, Profile::instance()->max_cmd_id());
+
+ uint32_t thread_min_stack_size = threads::Thread::kMinStackSize;
+ EXPECT_EQ(thread_min_stack_size,
+ Profile::instance()->thread_min_stack_size());
+
+ // Change config file
+ Profile::instance()->config_file_name("smartDeviceLink_test.ini");
+ EXPECT_EQ("smartDeviceLink_test.ini",
+ Profile::instance()->config_file_name());
+
+ // Check that value is default
+ maxvalue = 2000000000;
+ EXPECT_EQ(maxvalue, Profile::instance()->max_cmd_id());
+
+ // Other value is correct
+ thread_min_stack_size = 21000;
+ EXPECT_EQ(thread_min_stack_size,
+ Profile::instance()->thread_min_stack_size());
+
+ // Update config file
+ profile::Profile::instance()->UpdateValues();
+
+ // In file the number is bigger than can be, default value should be lefted
+ EXPECT_EQ(maxvalue, Profile::instance()->max_cmd_id());
+ EXPECT_EQ(thread_min_stack_size,
+ Profile::instance()->thread_min_stack_size());
+}
+
+TEST_F(ProfileTest, PairsValueInsteadOfInt) {
+ // Set new config file
+ Profile::instance()->config_file_name("smartDeviceLink_invalid_int.ini");
+ EXPECT_EQ("smartDeviceLink_invalid_int.ini",
+ Profile::instance()->config_file_name());
+ // Get first number
+ uint32_t list_files_in_none = 5;
+ EXPECT_EQ(list_files_in_none, Profile::instance()->list_files_in_none());
+
+ // Update config file
+ profile::Profile::instance()->UpdateValues();
+ // Values are same
+ EXPECT_EQ(list_files_in_none, Profile::instance()->list_files_in_none());
+}
+
+TEST_F(ProfileTest, DISABLED_StringValueIncludeSlashesAndRussianLetters) {
+ // Default values
+ std::string config_folder = "";
+ EXPECT_EQ(config_folder, Profile::instance()->app_resourse_folder());
+ std::string tts_delimiter_ = "";
+ std::string app_resourse_folder = "";
+ std::string app_storage_folder = "";
+
+ Profile::instance()->config_file_name("smartDeviceLink_invalid_string.ini");
+ EXPECT_EQ("smartDeviceLink_invalid_string.ini",
+ Profile::instance()->config_file_name());
+
+ // Check values
+ config_folder = "///";
+ EXPECT_EQ(config_folder, Profile::instance()->app_config_folder());
+ tts_delimiter_ = "coma and point";
+ EXPECT_EQ(tts_delimiter_, Profile::instance()->tts_delimiter());
+ std::string server_address = "127.0.0.1 + слово";
+ EXPECT_EQ(server_address, profile::Profile::instance()->server_address());
+ app_resourse_folder = "new folder/";
+ EXPECT_EQ(app_resourse_folder, Profile::instance()->app_resourse_folder());
+ app_storage_folder = "\" \"";
+ EXPECT_EQ(app_storage_folder, Profile::instance()->app_storage_folder());
+
+ // Update config file
+ profile::Profile::instance()->UpdateValues();
+
+ // Values are the same
+ EXPECT_EQ(config_folder, Profile::instance()->app_config_folder());
+ EXPECT_EQ(tts_delimiter_, Profile::instance()->tts_delimiter());
+ EXPECT_EQ(server_address, profile::Profile::instance()->server_address());
+ EXPECT_EQ(app_resourse_folder, Profile::instance()->app_resourse_folder());
+}
+
+TEST_F(ProfileTest, StringUpperBoundValue) {
+ // Default values
+ std::string vr_help_title = "";
+ std::string recording_file_name = "record.wav";
+ EXPECT_EQ(vr_help_title, Profile::instance()->vr_help_title());
+ EXPECT_EQ(recording_file_name, Profile::instance()->recording_file_name());
+
+ Profile::instance()->config_file_name("smartDeviceLink_invalid_string.ini");
+ EXPECT_EQ("smartDeviceLink_invalid_string.ini",
+ Profile::instance()->config_file_name());
+
+ // Total count of elements in ini file's string will be less 512
+ vr_help_title =
+ "0/0/0/1/2345678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHIJKL+MNO|PQR~STU{}WXY[]Z,01234567890a00012345678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHIJKL+MNO|PQR~STU{}WXY[]Z,01234567890a00012345678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHIJKL+MNO|PQR~STU{}WXY[]Z,01234567890a00012345678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHIJKL+MNO|PQR~STU{}WXY[]Z,01234567890a00012345678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHIJKL+MNO|PQR~STU{}WXY[]Z,01234567890abc!def@ghi";
+ EXPECT_EQ(vr_help_title, Profile::instance()->vr_help_title());
+ EXPECT_NE(vr_help_title, Profile::instance()->recording_file_name());
+ recording_file_name =
+ "0/0/0/1/2345678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHIJKL+MNO|PQR~STU{}WXY[]Z,01234567890a00012345678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHIJKL+MNO|PQR~STU{}WXY[]Z,01234567890a00012345678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHIJKL+MNO|PQR~STU{}WXY[]Z,01234567890a00012345678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHIJKL+MNO|PQR~STU{}WXY[]Z,01234567890a00012345678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHIJKL+MNO|PQR~STU{}WXY[]Z,01234567890abc";
+ EXPECT_EQ(recording_file_name, Profile::instance()->recording_file_name());
+ // Update config file
+ profile::Profile::instance()->UpdateValues();
+ // Values are the same
+ EXPECT_EQ(vr_help_title, Profile::instance()->vr_help_title());
+ EXPECT_EQ(recording_file_name, Profile::instance()->recording_file_name());
+}
+
+TEST_F(ProfileTest, CapitalLetterInBoolValue) {
+ // Default values
+ EXPECT_EQ("smartDeviceLink.ini", Profile::instance()->config_file_name());
+ EXPECT_TRUE(profile::Profile::instance()->launch_hmi());
+ EXPECT_FALSE(profile::Profile::instance()->enable_policy());
+
+ // Set config file
+ Profile::instance()->config_file_name("smartDeviceLink.ini");
+ // Check values
+ EXPECT_TRUE(profile::Profile::instance()->launch_hmi());
+ EXPECT_TRUE(profile::Profile::instance()->enable_policy());
+ EXPECT_FALSE(profile::Profile::instance()->is_redecoding_enabled());
+
+ // Change config file
+ Profile::instance()->config_file_name("smartDeviceLink_invalid_boolean.ini");
+ EXPECT_EQ("smartDeviceLink_invalid_boolean.ini",
+ Profile::instance()->config_file_name());
+
+ // Parameters after updating
+ // Parameter launch_hmi = True
+ EXPECT_FALSE(profile::Profile::instance()->launch_hmi());
+ // EnablePolicy = TRUE
+ EXPECT_FALSE(profile::Profile::instance()->enable_policy());
+ // EnableRedecoding = FALSE
+ EXPECT_FALSE(profile::Profile::instance()->is_redecoding_enabled());
+}
+
+TEST_F(ProfileTest, CheckReadStringValue) {
+ // Set new config file
+ Profile::instance()->config_file_name("smartDeviceLink_test.ini");
+ EXPECT_EQ("smartDeviceLink_test.ini",
+ Profile::instance()->config_file_name());
+
+ std::string app_resourse_folder_;
+ profile::Profile::instance()->ReadStringValue(
+ &app_resourse_folder_, file_system::CurrentWorkingDirectory().c_str(),
+ "MAIN", "AppResourceFolder");
+ // Get default value
+ EXPECT_EQ(app_resourse_folder_, file_system::CurrentWorkingDirectory());
+
+ // Get value from file
+ std::string server_address;
+ profile::Profile::instance()->ReadStringValue(&server_address, "", "HMI",
+ "ServerAddress");
+ EXPECT_EQ("127.0.0.1", server_address);
+}
+
+TEST_F(ProfileTest, DISABLED_CheckReadBoolValue) {
+ // Set new config file
+ Profile::instance()->config_file_name("smartDeviceLink_test.ini");
+ EXPECT_EQ("smartDeviceLink_test.ini",
+ Profile::instance()->config_file_name());
+
+ bool enable_policy;
+ profile::Profile::instance()->ReadBoolValue(&enable_policy, false, "Policy",
+ "EnablePolicy");
+ EXPECT_FALSE(enable_policy);
+
+ // Change config back
+ profile::Profile::destroy();
+ EXPECT_EQ("smartDeviceLink.ini", Profile::instance()->config_file_name());
+
+ //get default value
+ bool launch_hmi;
+ profile::Profile::instance()->ReadBoolValue(&launch_hmi, true, "HMI",
+ "LaunchHMI");
+ EXPECT_TRUE(launch_hmi);
+}
+
+TEST_F(ProfileTest, CheckReadIntValue) {
+ // Set new config file
+ Profile::instance()->config_file_name("smartDeviceLink_test.ini");
+ EXPECT_EQ("smartDeviceLink_test.ini",
+ Profile::instance()->config_file_name());
+
+ int server_port = 0;
+ profile::Profile::instance()->ReadIntValue(&server_port, 0, "HMI",
+ "ServerPort");
+
+ EXPECT_EQ(8088, server_port);
+}
+
+//TEST_F(ProfileTest, CheckIntContainer) {
+// // Set new config file
+// Profile::instance()->config_file_name("smartDeviceLink_test.ini");
+// EXPECT_EQ("smartDeviceLink_test.ini",
+// Profile::instance()->config_file_name());
+
+// bool isread = false;
+// std::vector<int> diagmodes_list =
+// profile::Profile::instance()->ReadIntContainer("MAIN",
+// "SupportedDiagModes",
+// &isread);
+// EXPECT_TRUE(isread);
+
+// std::vector<int>::iterator diag_mode = std::find(diagmodes_list.begin(),
+// diagmodes_list.end(), 0x12);
+
+// // This element doesn't appear in list
+// EXPECT_EQ(diag_mode, diagmodes_list.end());
+
+// // List includes 0x01
+// diag_mode = std::find(diagmodes_list.begin(), diagmodes_list.end(), 0x01);
+// EXPECT_EQ(diag_mode, diagmodes_list.begin());
+
+// // List includes 0x03
+// std::vector<int>::iterator element_mode = diagmodes_list.begin();
+// element_mode++;
+// element_mode++;
+
+// diag_mode = std::find(diagmodes_list.begin(), diagmodes_list.end(), 0x03);
+// EXPECT_EQ(diag_mode, element_mode);
+//}
+
+//TEST_F(ProfileTest, CheckVectorContainer) {
+// Profile::instance()->config_file_name("smartDeviceLink_test.ini");
+// EXPECT_EQ("smartDeviceLink_test.ini",
+// Profile::instance()->config_file_name());
+
+// // Get diag_modes after updating
+// const std::vector<uint32_t> &diag_modes = profile::Profile::instance()
+// ->supported_diag_modes();
+
+// bool isread = false;
+// std::vector<int> diagmodes_list =
+// profile::Profile::instance()->ReadIntContainer("MAIN",
+// "SupportedDiagModes",
+// &isread);
+// EXPECT_TRUE(isread);
+// // Compare with result of ReadIntContainer
+// ASSERT_EQ(diag_modes.size(), diagmodes_list.size());
+// bool isEqual = true;
+// std::vector<int>::iterator iter = diagmodes_list.begin();
+
+// for (std::vector<uint32_t>::const_iterator it = diag_modes.begin();
+// it != diag_modes.end(); it++) {
+
+// if ((uint32_t)(*iter) != (*it)) {
+// isEqual = false;
+// break;
+// }
+// iter++;
+// }
+// EXPECT_TRUE(isEqual);
+//}
+
+//TEST_F(ProfileTest, CheckStringContainer) {
+// // Set new config file
+// Profile::instance()->config_file_name("smartDeviceLink_test.ini");
+// EXPECT_EQ("smartDeviceLink_test.ini",
+// Profile::instance()->config_file_name());
+
+// bool isread = false;
+// std::vector < std::string > diagmodes_list = profile::Profile::instance()
+// ->ReadStringContainer("MAIN", "SupportedDiagModes", &isread);
+// EXPECT_TRUE(isread);
+
+// std::vector<std::string>::iterator diag_mode =
+// std::find(diagmodes_list.begin(), diagmodes_list.end(), "0x12");
+
+// // This element doesn't appear in list
+// EXPECT_EQ(diag_mode, diagmodes_list.end());
+
+// // List includes 0x01
+// diag_mode = std::find(diagmodes_list.begin(), diagmodes_list.end(), "0x01");
+// EXPECT_EQ(diag_mode, diagmodes_list.begin());
+
+// // List includes 0x03
+// std::vector<std::string>::iterator element_mode = diagmodes_list.begin();
+// element_mode++;
+// element_mode++;
+// diag_mode = std::find(diagmodes_list.begin(), diagmodes_list.end(), " 0x03");
+// EXPECT_EQ(diag_mode, element_mode);
+//}
+
+//#ifdef ENABLE_SECURITY
+//TEST_F(ProfileTest, CheckIntContainerInSecurityData) {
+// // Set new config file
+// Profile::instance()->config_file_name("smartDeviceLink_test.ini");
+// EXPECT_EQ("smartDeviceLink_test.ini",
+// Profile::instance()->config_file_name());
+
+// std::vector<int> force_unprotected_list =
+// profile::Profile::instance()->ReadIntContainer(
+// "Security Manager", "ForceUnprotectedService", NULL);
+
+// std::vector<int> force_protected_list =
+// profile::Profile::instance()->ReadIntContainer(
+// "Security Manager", "ForceProtectedService", NULL);
+
+// std::vector<int>::iterator res_unprotect = std::find(force_unprotected_list.begin(), force_unprotected_list.end(), 0x07);
+// std::vector<int>::iterator res_protect = std::find(force_protected_list.begin(), force_protected_list.end(), 0x07);
+// // This element doesn't appear in both lists
+// EXPECT_EQ(res_unprotect, force_unprotected_list.end() );
+// EXPECT_EQ(res_protect, force_protected_list.end() );
+
+// // Both lists include 0
+// res_unprotect = std::find(force_unprotected_list.begin(), force_unprotected_list.end(), 0);
+// res_protect = std::find(force_protected_list.begin(), force_protected_list.end(), 0);
+// EXPECT_EQ(res_unprotect, force_unprotected_list.begin() );
+// EXPECT_EQ(res_protect, force_protected_list.begin() );
+//}
+//#endif
+
+} // namespace profile
+} // namespace components
+} // namespace test
diff --git a/src/components/config_profile/test/smartDeviceLink.ini b/src/components/config_profile/test/smartDeviceLink.ini
new file mode 100644
index 000000000..41dabaa53
--- /dev/null
+++ b/src/components/config_profile/test/smartDeviceLink.ini
@@ -0,0 +1,185 @@
+ ; The INI-file consists of different chapters.
+; Each chapter begins with the line containing
+; the name in square brackets. Syntax:
+; [chapter]
+; The chapters consists of a set of items with a
+; assinged value. The syntax is:
+; item=value
+; All white spaces an second encounters of chapters
+; or items will be ignored.
+; Remarks start with semicolon or star as first character.
+; It is alowed for names of chapters and items to
+; contain semicolon and star. Possible syntax is:
+; [ chapter ] ;Remark
+; item = value ;Remark
+
+[HMI]
+LaunchHMI = true
+ServerAddress = 127.0.0.1
+ServerPort = 8087
+VideoStreamingPort = 5050
+AudioStreamingPort = 5080
+
+[MAIN]
+; Contains .json/.ini files
+AppConfigFolder =
+; Contains output files, e.g. .wav
+AppStorageFolder = storage
+; Contains resourses, e.g. audio8bit.wav
+AppResourceFolder =
+; Standard min stack size
+; in Ubuntu : PTHREAD_STACK_MIN = 16384
+; in QNX : PTHREAD_STACK_MIN = 256
+;The value of a variable ThreadStackSize used only if its realy needed, other way stack size will be PTHREAD_STACK_MIN
+;
+ThreadStackSize = 20480
+MixingAudioSupported = true
+HMICapabilities = hmi_capabilities.json
+MaxCmdID = 2000000000
+; Default request timeout in milliseconds
+DefaultTimeout = 10000
+
+AppDirectoryQuota = 104857600
+; Allowed requests amount in HMI level NONE during time scale.
+; If value is 0 check will be skipped
+AppHMILevelNoneTimeScaleMaxRequests = 100
+AppHMILevelNoneRequestsTimeScale = 10
+; Allowed requests amount during time scale.
+; If value is 0 check will be skipped
+AppTimeScaleMaxRequests = 1000
+AppRequestsTimeScale = 10
+; Allowed pending requests amount. If value is 0 check will be skipped
+PendingRequestsAmount = 5000
+HeartBeatTimeout = 7
+SupportedDiagModes = 0x01, 0x02, 0x03, 0x05, 0x06, 0x07, 0x09, 0x0A, 0x18, 0x19, 0x22, 0x3E
+SystemFilesPath = /tmp/fs/mp/images/ivsu_cache
+UseLastState = true
+TimeTestingPort = 8090
+ReadDIDRequest = 5, 1
+GetVehicleDataRequest = 5, 1
+
+[MEDIA MANAGER]
+; where 3 is a number of retries and 1 is a timeout in seconds for request frequency
+StartStreamRetry = 3, 1
+EnableRedecoding = false
+VideoStreamConsumer = socket
+AudioStreamConsumer = socket
+;VideoStreamConsumer = file
+;AudioStreamConsumer = file
+;VideoStreamConsumer = pipe
+;AudioStreamConsumer = pipe
+;Temp solution: if you change NamedPipePath also change path to pipe in src/components/qt_hmi/qml_model_qtXX/views/SDLNavi.qml
+;Named pipe path will be constructed using AppStorageFolder + name
+NamedVideoPipePath = video_stream_pipe
+NamedAudioPipePath = audio_stream_pipe
+;File path will be constructed using AppStorageFolder + name
+VideoStreamFile = video_stream_file
+AudioStreamFile = audio_stream_file
+; Recording file source (used for audio pass thru emulation only)
+RecordingFileSource = audio.8bit.wav
+; Recording file for audio pass thru
+RecordingFileName = audio.wav
+
+; HelpPromt and TimeOutPrompt is a vector of strings separated by comma
+[GLOBAL PROPERTIES]
+
+; Delimiter, which will be appended to each TTS chunck, e.g. helpPrompt/timeoutPrompt
+TTSDelimiter = ,
+; Default prompt items, separated by comma
+HelpPromt = Please speak one of the following commands,Please say a command
+; Default prompt items, separated by comma
+TimeOutPromt = Please speak one of the following commands,Please say a command
+HelpTitle = Available Vr Commands List
+; In case mobile app didn't send global properties default global properties will be sent after this timeout
+; max value TTSGlobalPropertiesTimeout 64K
+TTSGlobalPropertiesTimeout = 20
+
+[FILESYSTEM RESTRICTIONS]
+; Max allowed number of PutFile requests for one application in NONE
+PutFileRequest = 5
+; Max allowed number of DeleteFile requests for one application in NONE
+DeleteFileRequest = 5
+; Max allowed number of ListFiles requests for one application in NONE
+ListFilesRequest = 5
+
+[VR COMMANDS]
+HelpCommand = Help
+
+[AppInfo]
+; The path for applications info storage.
+AppInfoStorage = app_info.dat
+
+[Security Manager]
+Protocol = TLSv1.2
+; Certificate and key path to pem file
+CertificatePath = mycert.pem
+KeyPath = mykey.pem
+; SSL mode could be SERVER or CLIENT
+SSLMode = CLIENT
+; Could be ALL ciphers or list of chosen
+;CipherList = AES256-GCM-SHA384
+CipherList = ALL
+; Verify Mobile app certificate (could be used in both SSLMode Server and Client)
+VerifyPeer = false
+; If VerifyPeer is enable - terminate handshake if mobile app did not return a certificate
+FialOnNoCert = false
+; If VerifyPeer is enable - do not ask for a mobile app certificate again in case of a renegotiation
+VerifyClientOnce = false
+; Force protected services (could be id's from 0x01 to 0xFF)
+;ForceProtectedService = 0x0A, 0x0B
+ForceProtectedService = Non
+; Force unprotected services
+;ForceUnprotectedService = 0x07
+ForceUnprotectedService = Non
+
+[Policy]
+EnablePolicy = true
+PreloadedPT = sdl_preloaded_pt.json
+PathToSnapshot = sdl_snapshot.json
+; Number of attempts to open policy DB
+AttemptsToOpenPolicyDB = 5
+; Timeout between attempts during opening DB in milliseconds
+OpenAttemptTimeoutMs = 500
+
+[TransportManager]
+TCPAdapterPort = 12345
+MMEDatabase = /dev/qdb/mediaservice_db
+EventMQ = /dev/mqueue/ToSDLCoreUSBAdapter
+AckMQ = /dev/mqueue/FromSDLCoreUSBAdapter
+
+[IAP]
+LegacyProtocol = com.ford.sync.prot[0-29]
+HubProtocol = com.smartdevicelink.prot0
+PoolProtocol = com.smartdevicelink.prot[1-29]
+IAPSystemConfig = /fs/mp/etc/mm/ipod.cfg
+IAP2SystemConfig = /fs/mp/etc/mm/iap2.cfg
+IAP2HubConnectAttempts = 3
+
+[ProtocolHandler]
+; Packet with payload bigger than next value will be marked as a malformed
+; 1488 = 1500 - 12 = TCP MTU - header size
+MaximumPayloadSize = 1488
+; Application shall send less #FrequencyCount messages per #FrequencyTime mSecs
+; Frequency check could be disable by setting FrequencyTime to Zero
+FrequencyCount = 1000
+FrequencyTime = 1000
+
+[ApplicationManager]
+ApplicationListUpdateTimeout = 2
+; Max allowed threads for handling mobile requests. Currently max allowed is 2
+ThreadPoolSize = 1
+
+[Resumption]
+
+# Timeout in seconds for resumption Application HMILevel
+# and resolving conflicts in case if multiple applications initiate resumption
+ApplicationResumingTimeout = 3
+
+# Timeout in seconds for pereodical saving resumption persisten data
+AppSavePersistentDataTimeout = 10 #seconds
+
+# Timeout in seconds to store hmi_level for media app before ign_off
+ResumptionDelayBeforeIgn = 30;
+
+# Timeout in seconds to restore hmi_level for media app after sdl run
+ResumptionDelayAfterIgn = 30;
diff --git a/src/components/config_profile/test/smartDeviceLink_invalid_boolean.ini b/src/components/config_profile/test/smartDeviceLink_invalid_boolean.ini
new file mode 100644
index 000000000..560fb5117
--- /dev/null
+++ b/src/components/config_profile/test/smartDeviceLink_invalid_boolean.ini
@@ -0,0 +1,185 @@
+ ; The INI-file consists of different chapters.
+; Each chapter begins with the line containing
+; the name in square brackets. Syntax:
+; [chapter]
+; The chapters consists of a set of items with a
+; assinged value. The syntax is:
+; item=value
+; All white spaces an second encounters of chapters
+; or items will be ignored.
+; Remarks start with semicolon or star as first character.
+; It is alowed for names of chapters and items to
+; contain semicolon and star. Possible syntax is:
+; [ chapter ] ;Remark
+; item = value ;Remark
+
+[HMI]
+LaunchHMI = True
+ServerAddress = 127.0.0.1
+ServerPort = 8087
+VideoStreamingPort = 5050
+AudioStreamingPort = 5080
+
+[MAIN]
+; Contains .json/.ini files
+AppConfigFolder =
+; Contains output files, e.g. .wav
+AppStorageFolder = storage
+; Contains resourses, e.g. audio8bit.wav
+AppResourceFolder =
+; Standard min stack size
+; in Ubuntu : PTHREAD_STACK_MIN = 16384
+; in QNX : PTHREAD_STACK_MIN = 256
+;The value of a variable ThreadStackSize used only if its realy needed, other way stack size will be PTHREAD_STACK_MIN
+;
+ThreadStackSize = 20480
+MixingAudioSupported = true
+HMICapabilities = hmi_capabilities.json
+MaxCmdID = 2000000000
+; Default request timeout in milliseconds
+DefaultTimeout = 10000
+
+AppDirectoryQuota = 104857600
+; Allowed requests amount in HMI level NONE during time scale.
+; If value is 0 check will be skipped
+AppHMILevelNoneTimeScaleMaxRequests = 100
+AppHMILevelNoneRequestsTimeScale = 10
+; Allowed requests amount during time scale.
+; If value is 0 check will be skipped
+AppTimeScaleMaxRequests = 1000
+AppRequestsTimeScale = 10
+; Allowed pending requests amount. If value is 0 check will be skipped
+PendingRequestsAmount = 5000
+HeartBeatTimeout = 7
+SupportedDiagModes = 0x01, 0x02, 0x03, 0x05, 0x06, 0x07, 0x09, 0x0A, 0x18, 0x19, 0x22, 0x3E
+SystemFilesPath = /tmp/fs/mp/images/ivsu_cache
+UseLastState = true
+TimeTestingPort = 8090
+ReadDIDRequest = 5, 1
+GetVehicleDataRequest = 5, 1
+
+[MEDIA MANAGER]
+; where 3 is a number of retries and 1 is a timeout in seconds for request frequency
+StartStreamRetry = 3, 1
+EnableRedecoding = FALSE
+VideoStreamConsumer = socket
+AudioStreamConsumer = socket
+;VideoStreamConsumer = file
+;AudioStreamConsumer = file
+;VideoStreamConsumer = pipe
+;AudioStreamConsumer = pipe
+;Temp solution: if you change NamedPipePath also change path to pipe in src/components/qt_hmi/qml_model_qtXX/views/SDLNavi.qml
+;Named pipe path will be constructed using AppStorageFolder + name
+NamedVideoPipePath = video_stream_pipe
+NamedAudioPipePath = audio_stream_pipe
+;File path will be constructed using AppStorageFolder + name
+VideoStreamFile = video_stream_file
+AudioStreamFile = audio_stream_file
+; Recording file source (used for audio pass thru emulation only)
+RecordingFileSource = audio.8bit.wav
+; Recording file for audio pass thru
+RecordingFileName = audio.wav
+
+; HelpPromt and TimeOutPrompt is a vector of strings separated by comma
+[GLOBAL PROPERTIES]
+
+; Delimiter, which will be appended to each TTS chunck, e.g. helpPrompt/timeoutPrompt
+TTSDelimiter = ,
+; Default prompt items, separated by comma
+HelpPromt = Please speak one of the following commands,Please say a command
+; Default prompt items, separated by comma
+TimeOutPromt = Please speak one of the following commands,Please say a command
+HelpTitle = Available Vr Commands List
+; In case mobile app didn't send global properties default global properties will be sent after this timeout
+; max value TTSGlobalPropertiesTimeout 64K
+TTSGlobalPropertiesTimeout = 20
+
+[FILESYSTEM RESTRICTIONS]
+; Max allowed number of PutFile requests for one application in NONE
+PutFileRequest = 5
+; Max allowed number of DeleteFile requests for one application in NONE
+DeleteFileRequest = 5
+; Max allowed number of ListFiles requests for one application in NONE
+ListFilesRequest = 5
+
+[VR COMMANDS]
+HelpCommand = Help
+
+[AppInfo]
+; The path for applications info storage.
+AppInfoStorage = app_info.dat
+
+[Security Manager]
+Protocol = TLSv1.2
+; Certificate and key path to pem file
+CertificatePath = mycert.pem
+KeyPath = mykey.pem
+; SSL mode could be SERVER or CLIENT
+SSLMode = CLIENT
+; Could be ALL ciphers or list of chosen
+;CipherList = AES256-GCM-SHA384
+CipherList = ALL
+; Verify Mobile app certificate (could be used in both SSLMode Server and Client)
+VerifyPeer = false
+; If VerifyPeer is enable - terminate handshake if mobile app did not return a certificate
+FialOnNoCert = false
+; If VerifyPeer is enable - do not ask for a mobile app certificate again in case of a renegotiation
+VerifyClientOnce = false
+; Force protected services (could be id's from 0x01 to 0xFF)
+;ForceProtectedService = 0x0A, 0x0B
+ForceProtectedService = Non
+; Force unprotected services
+;ForceUnprotectedService = 0x07
+ForceUnprotectedService = Non
+
+[Policy]
+EnablePolicy = TRUE
+PreloadedPT = sdl_preloaded_pt.json
+PathToSnapshot = sdl_snapshot.json
+; Number of attempts to open policy DB
+AttemptsToOpenPolicyDB = 5
+; Timeout between attempts during opening DB in milliseconds
+OpenAttemptTimeoutMs = 500
+
+[TransportManager]
+TCPAdapterPort = 12345
+MMEDatabase = /dev/qdb/mediaservice_db
+EventMQ = /dev/mqueue/ToSDLCoreUSBAdapter
+AckMQ = /dev/mqueue/FromSDLCoreUSBAdapter
+
+[IAP]
+LegacyProtocol = com.ford.sync.prot[0-29]
+HubProtocol = com.smartdevicelink.prot0
+PoolProtocol = com.smartdevicelink.prot[1-29]
+IAPSystemConfig = /fs/mp/etc/mm/ipod.cfg
+IAP2SystemConfig = /fs/mp/etc/mm/iap2.cfg
+IAP2HubConnectAttempts = 3
+
+[ProtocolHandler]
+; Packet with payload bigger than next value will be marked as a malformed
+; 1488 = 1500 - 12 = TCP MTU - header size
+MaximumPayloadSize = 1488
+; Application shall send less #FrequencyCount messages per #FrequencyTime mSecs
+; Frequency check could be disable by setting FrequencyTime to Zero
+FrequencyCount = 1000
+FrequencyTime = 1000
+
+[ApplicationManager]
+ApplicationListUpdateTimeout = 2
+; Max allowed threads for handling mobile requests. Currently max allowed is 2
+ThreadPoolSize = 1
+
+[Resumption]
+
+# Timeout in seconds for resumption Application HMILevel
+# and resolving conflicts in case if multiple applications initiate resumption
+ApplicationResumingTimeout = 3
+
+# Timeout in seconds for pereodical saving resumption persisten data
+AppSavePersistentDataTimeout = 10 #seconds
+
+# Timeout in seconds to store hmi_level for media app before ign_off
+ResumptionDelayBeforeIgn = 30;
+
+# Timeout in seconds to restore hmi_level for media app after sdl run
+ResumptionDelayAfterIgn = 30;
diff --git a/src/components/config_profile/test/smartDeviceLink_invalid_int.ini b/src/components/config_profile/test/smartDeviceLink_invalid_int.ini
new file mode 100644
index 000000000..76bcc5a0f
--- /dev/null
+++ b/src/components/config_profile/test/smartDeviceLink_invalid_int.ini
@@ -0,0 +1,187 @@
+ ; The INI-file consists of different chapters.
+; Each chapter begins with the line containing
+; the name in square brackets. Syntax:
+; [chapter]
+; The chapters consists of a set of items with a
+; assinged value. The syntax is:
+; item=value
+; All white spaces an second encounters of chapters
+; or items will be ignored.
+; Remarks start with semicolon or star as first character.
+; It is alowed for names of chapters and items to
+; contain semicolon and star. Possible syntax is:
+; [ chapter ] ;Remark
+; item = value ;Remark
+
+[HMI]
+LaunchHMI = true
+ServerAddress = 127.0.0.1
+ServerPort = -1
+VideoStreamingPort = 5050
+AudioStreamingPort = 5080
+
+[MAIN]
+; Contains .json/.ini files
+AppConfigFolder =
+; Contains output files, e.g. .wav
+AppStorageFolder = storage
+; Contains resourses, e.g. audio8bit.wav
+AppResourceFolder =
+; Standard min stack size
+; in Ubuntu : PTHREAD_STACK_MIN = 16384
+; in QNX : PTHREAD_STACK_MIN = 256
+;The value of a variable ThreadStackSize used only if its realy needed, other way stack size will be PTHREAD_STACK_MIN
+;
+ThreadStackSize = 0
+MixingAudioSupported = true
+HMICapabilities = hmi_capabilities.json
+MaxCmdID = 20000000000
+; Default request timeout in milliseconds
+DefaultTimeout = 10000
+
+AppDirectoryQuota = 104857600
+; Allowed requests amount in HMI level NONE during time scale.
+; If value is 0 check will be skipped
+AppHMILevelNoneTimeScaleMaxRequests = 100
+AppHMILevelNoneRequestsTimeScale = 10
+; Allowed requests amount during time scale.
+; If value is 0 check will be skipped
+AppTimeScaleMaxRequests = 1000
+AppRequestsTimeScale = 10
+; Allowed pending requests amount. If value is 0 check will be skipped
+PendingRequestsAmount = 5000
+; word instead of number
+HeartBeatTimeout = seven
+SupportedDiagModes = 0x01, 0x02, 0x03, 0x05, 0x06, 0x07, 0x09, 0x0A, 0x18, 0x19, 0x22, 0x3E
+SystemFilesPath = /tmp/fs/mp/images/ivsu_cache
+UseLastState = true
+TimeTestingPort = 8090
+ReadDIDRequest = 5, 1
+GetVehicleDataRequest = 5, 1
+
+[MEDIA MANAGER]
+; where 3 is a number of retries and 1 is a timeout in seconds for request frequency
+StartStreamRetry = 3, 1
+EnableRedecoding = false
+VideoStreamConsumer = socket
+AudioStreamConsumer = socket
+;VideoStreamConsumer = file
+;AudioStreamConsumer = file
+;VideoStreamConsumer = pipe
+;AudioStreamConsumer = pipe
+;Temp solution: if you change NamedPipePath also change path to pipe in src/components/qt_hmi/qml_model_qtXX/views/SDLNavi.qml
+;Named pipe path will be constructed using AppStorageFolder + name
+NamedVideoPipePath = video_stream_pipe
+NamedAudioPipePath = audio_stream_pipe
+;File path will be constructed using AppStorageFolder + name
+VideoStreamFile = video_stream_file
+AudioStreamFile = audio_stream_file
+; Recording file source (used for audio pass thru emulation only)
+RecordingFileSource = audio.8bit.wav
+; Recording file for audio pass thru
+RecordingFileName = audio.wav
+
+; HelpPromt and TimeOutPrompt is a vector of strings separated by comma
+[GLOBAL PROPERTIES]
+
+; Delimiter, which will be appended to each TTS chunck, e.g. helpPrompt/timeoutPrompt
+TTSDelimiter = ,
+; Default prompt items, separated by comma
+HelpPromt = Please speak one of the following commands,Please say a command
+; Default prompt items, separated by comma
+TimeOutPromt = Please speak one of the following commands,Please say a command
+HelpTitle = Available Vr Commands List
+; In case mobile app didn't send global properties default global properties will be sent after this timeout
+; max value TTSGlobalPropertiesTimeout 64K
+TTSGlobalPropertiesTimeout = 20
+
+[FILESYSTEM RESTRICTIONS]
+; Max allowed number of PutFile requests for one application in NONE
+PutFileRequest = 5
+; Max allowed number of DeleteFile requests for one application in NONE
+DeleteFileRequest = 5
+; Max allowed number of ListFiles requests for one application in NONE
+;--------------- should be int
+ListFilesRequest = 5,1
+
+[VR COMMANDS]
+HelpCommand = Help
+
+[AppInfo]
+; The path for applications info storage.
+AppInfoStorage = app_info.dat
+
+[Security Manager]
+Protocol = TLSv1.2
+; Certificate and key path to pem file
+CertificatePath = mycert.pem
+KeyPath = mykey.pem
+; SSL mode could be SERVER or CLIENT
+SSLMode = CLIENT
+; Could be ALL ciphers or list of chosen
+;CipherList = AES256-GCM-SHA384
+CipherList = ALL
+; Verify Mobile app certificate (could be used in both SSLMode Server and Client)
+VerifyPeer = false
+; If VerifyPeer is enable - terminate handshake if mobile app did not return a certificate
+FialOnNoCert = false
+; If VerifyPeer is enable - do not ask for a mobile app certificate again in case of a renegotiation
+VerifyClientOnce = false
+; Force protected services (could be id's from 0x01 to 0xFF)
+;ForceProtectedService = 0x0A, 0x0B
+ForceProtectedService = Non
+; Force unprotected services
+;ForceUnprotectedService = 0x07
+ForceUnprotectedService = Non
+
+[Policy]
+EnablePolicy = true
+PreloadedPT = sdl_preloaded_pt.json
+PathToSnapshot = sdl_snapshot.json
+; Number of attempts to open policy DB
+AttemptsToOpenPolicyDB = 5
+; Timeout between attempts during opening DB in milliseconds
+OpenAttemptTimeoutMs = 500
+
+[TransportManager]
+TCPAdapterPort = 12345
+MMEDatabase = /dev/qdb/mediaservice_db
+EventMQ = /dev/mqueue/ToSDLCoreUSBAdapter
+AckMQ = /dev/mqueue/FromSDLCoreUSBAdapter
+
+[IAP]
+LegacyProtocol = com.ford.sync.prot[0-29]
+HubProtocol = com.smartdevicelink.prot0
+PoolProtocol = com.smartdevicelink.prot[1-29]
+IAPSystemConfig = /fs/mp/etc/mm/ipod.cfg
+IAP2SystemConfig = /fs/mp/etc/mm/iap2.cfg
+IAP2HubConnectAttempts = 3
+
+[ProtocolHandler]
+; Packet with payload bigger than next value will be marked as a malformed
+; 1488 = 1500 - 12 = TCP MTU - header size
+MaximumPayloadSize = 1488
+; Application shall send less #FrequencyCount messages per #FrequencyTime mSecs
+; Frequency check could be disable by setting FrequencyTime to Zero
+FrequencyCount = 1000
+FrequencyTime = 1000
+
+[ApplicationManager]
+ApplicationListUpdateTimeout = 2
+; Max allowed threads for handling mobile requests. Currently max allowed is 2
+ThreadPoolSize = 1
+
+[Resumption]
+
+# Timeout in seconds for resumption Application HMILevel
+# and resolving conflicts in case if multiple applications initiate resumption
+ApplicationResumingTimeout = 3
+
+# Timeout in seconds for pereodical saving resumption persisten data
+AppSavePersistentDataTimeout = 10 #seconds
+
+# Timeout in seconds to store hmi_level for media app before ign_off
+ResumptionDelayBeforeIgn = 30;
+
+# Timeout in seconds to restore hmi_level for media app after sdl run
+ResumptionDelayAfterIgn = 30;
diff --git a/src/components/config_profile/test/smartDeviceLink_invalid_pairs.ini b/src/components/config_profile/test/smartDeviceLink_invalid_pairs.ini
new file mode 100644
index 000000000..1507b2a84
--- /dev/null
+++ b/src/components/config_profile/test/smartDeviceLink_invalid_pairs.ini
@@ -0,0 +1,187 @@
+ ; The INI-file consists of different chapters.
+; Each chapter begins with the line containing
+; the name in square brackets. Syntax:
+; [chapter]
+; The chapters consists of a set of items with a
+; assinged value. The syntax is:
+; item=value
+; All white spaces an second encounters of chapters
+; or items will be ignored.
+; Remarks start with semicolon or star as first character.
+; It is alowed for names of chapters and items to
+; contain semicolon and star. Possible syntax is:
+; [ chapter ] ;Remark
+; item = value ;Remark
+
+[HMI]
+LaunchHMI = true
+ServerAddress = 127.0.0.1
+ServerPort = 8087
+VideoStreamingPort = 5050
+AudioStreamingPort = 5080
+
+[MAIN]
+; Contains .json/.ini files
+AppConfigFolder =
+; Contains output files, e.g. .wav
+AppStorageFolder = storage
+; Contains resourses, e.g. audio8bit.wav
+AppResourceFolder =
+; Standard min stack size
+; in Ubuntu : PTHREAD_STACK_MIN = 16384
+; in QNX : PTHREAD_STACK_MIN = 256
+;The value of a variable ThreadStackSize used only if its realy needed, other way stack size will be PTHREAD_STACK_MIN
+;
+ThreadStackSize = 20480
+MixingAudioSupported = true
+HMICapabilities = hmi_capabilities.json
+MaxCmdID = 2000000000
+; Default request timeout in milliseconds
+DefaultTimeout = 10000
+
+AppDirectoryQuota = 104857600
+; Allowed requests amount in HMI level NONE during time scale.
+; If value is 0 check will be skipped
+AppHMILevelNoneTimeScaleMaxRequests = 100
+AppHMILevelNoneRequestsTimeScale = 10
+; Allowed requests amount during time scale.
+; If value is 0 check will be skipped
+AppTimeScaleMaxRequests = 1000
+AppRequestsTimeScale = 10
+; Allowed pending requests amount. If value is 0 check will be skipped
+PendingRequestsAmount = 5000
+HeartBeatTimeout = 7
+SupportedDiagModes = 0x01, 0x02, 0x03, 0x05, 0x06, 0x07, 0x09, 0x0A, 0x18, 0x19, 0x22, 0x3E
+SystemFilesPath = /tmp/fs/mp/images/ivsu_cache
+UseLastState = true
+TimeTestingPort = 8090
+;----------------------
+ReadDIDRequest =
+GetVehicleDataRequest = ,
+
+[MEDIA MANAGER]
+; where 3 is a number of retries and 1 is a timeout in seconds for request frequency
+;------------------------ should be pair
+StartStreamRetry = 9
+EnableRedecoding = false
+VideoStreamConsumer = socket
+AudioStreamConsumer = socket
+;VideoStreamConsumer = file
+;AudioStreamConsumer = file
+;VideoStreamConsumer = pipe
+;AudioStreamConsumer = pipe
+;Temp solution: if you change NamedPipePath also change path to pipe in src/components/qt_hmi/qml_model_qtXX/views/SDLNavi.qml
+;Named pipe path will be constructed using AppStorageFolder + name
+NamedVideoPipePath = video_stream_pipe
+NamedAudioPipePath = audio_stream_pipe
+;File path will be constructed using AppStorageFolder + name
+VideoStreamFile = video_stream_file
+AudioStreamFile = audio_stream_file
+; Recording file source (used for audio pass thru emulation only)
+RecordingFileSource = audio.8bit.wav
+; Recording file for audio pass thru
+RecordingFileName = audio.wav
+
+; HelpPromt and TimeOutPrompt is a vector of strings separated by comma
+[GLOBAL PROPERTIES]
+
+; Delimiter, which will be appended to each TTS chunck, e.g. helpPrompt/timeoutPrompt
+TTSDelimiter = ,
+; Default prompt items, separated by comma
+HelpPromt = Please speak one of the following commands,Please say a command
+; Default prompt items, separated by comma
+TimeOutPromt = Please speak one of the following commands,Please say a command
+HelpTitle = Available Vr Commands List
+; In case mobile app didn't send global properties default global properties will be sent after this timeout
+; max value TTSGlobalPropertiesTimeout 64K
+TTSGlobalPropertiesTimeout = 20
+
+[FILESYSTEM RESTRICTIONS]
+; Max allowed number of PutFile requests for one application in NONE
+PutFileRequest = 5
+; Max allowed number of DeleteFile requests for one application in NONE
+DeleteFileRequest = 5
+; Max allowed number of ListFiles requests for one application in NONE
+ListFilesRequest = 5
+
+[VR COMMANDS]
+HelpCommand = Help
+
+[AppInfo]
+; The path for applications info storage.
+AppInfoStorage = app_info.dat
+
+[Security Manager]
+Protocol = TLSv1.2
+; Certificate and key path to pem file
+CertificatePath = mycert.pem
+KeyPath = mykey.pem
+; SSL mode could be SERVER or CLIENT
+SSLMode = CLIENT
+; Could be ALL ciphers or list of chosen
+;CipherList = AES256-GCM-SHA384
+CipherList = ALL
+; Verify Mobile app certificate (could be used in both SSLMode Server and Client)
+VerifyPeer = false
+; If VerifyPeer is enable - terminate handshake if mobile app did not return a certificate
+FialOnNoCert = false
+; If VerifyPeer is enable - do not ask for a mobile app certificate again in case of a renegotiation
+VerifyClientOnce = false
+; Force protected services (could be id's from 0x01 to 0xFF)
+;ForceProtectedService = 0x0A, 0x0B
+ForceProtectedService = Non
+; Force unprotected services
+;ForceUnprotectedService = 0x07
+ForceUnprotectedService = Non
+
+[Policy]
+EnablePolicy = true
+PreloadedPT = sdl_preloaded_pt.json
+PathToSnapshot = sdl_snapshot.json
+; Number of attempts to open policy DB
+AttemptsToOpenPolicyDB = 5
+; Timeout between attempts during opening DB in milliseconds
+OpenAttemptTimeoutMs = 500
+
+[TransportManager]
+TCPAdapterPort = 12345
+MMEDatabase = /dev/qdb/mediaservice_db
+EventMQ = /dev/mqueue/ToSDLCoreUSBAdapter
+AckMQ = /dev/mqueue/FromSDLCoreUSBAdapter
+
+[IAP]
+LegacyProtocol = com.ford.sync.prot[0-29]
+HubProtocol = com.smartdevicelink.prot0
+PoolProtocol = com.smartdevicelink.prot[1-29]
+IAPSystemConfig = /fs/mp/etc/mm/ipod.cfg
+IAP2SystemConfig = /fs/mp/etc/mm/iap2.cfg
+IAP2HubConnectAttempts = 3
+
+[ProtocolHandler]
+; Packet with payload bigger than next value will be marked as a malformed
+; 1488 = 1500 - 12 = TCP MTU - header size
+MaximumPayloadSize = 1488
+; Application shall send less #FrequencyCount messages per #FrequencyTime mSecs
+; Frequency check could be disable by setting FrequencyTime to Zero
+FrequencyCount = 1000
+FrequencyTime = 1000
+
+[ApplicationManager]
+ApplicationListUpdateTimeout = 2
+; Max allowed threads for handling mobile requests. Currently max allowed is 2
+ThreadPoolSize = 1
+
+[Resumption]
+
+# Timeout in seconds for resumption Application HMILevel
+# and resolving conflicts in case if multiple applications initiate resumption
+ApplicationResumingTimeout = 3
+
+# Timeout in seconds for pereodical saving resumption persisten data
+AppSavePersistentDataTimeout = 10 #seconds
+
+# Timeout in seconds to store hmi_level for media app before ign_off
+ResumptionDelayBeforeIgn = 30;
+
+# Timeout in seconds to restore hmi_level for media app after sdl run
+ResumptionDelayAfterIgn = 30;
diff --git a/src/components/config_profile/test/smartDeviceLink_invalid_string.ini b/src/components/config_profile/test/smartDeviceLink_invalid_string.ini
new file mode 100644
index 000000000..6669b580c
--- /dev/null
+++ b/src/components/config_profile/test/smartDeviceLink_invalid_string.ini
@@ -0,0 +1,190 @@
+ ; The INI-file consists of different chapters.
+; Each chapter begins with the line containing
+; the name in square brackets. Syntax:
+; [chapter]
+; The chapters consists of a set of items with a
+; assinged value. The syntax is:
+; item=value
+; All white spaces an second encounters of chapters
+; or items will be ignored.
+; Remarks start with semicolon or star as first character.
+; It is alowed for names of chapters and items to
+; contain semicolon and star. Possible syntax is:
+; [ chapter ] ;Remark
+; item = value ;Remark
+
+[HMI]
+LaunchHMI = true
+ServerAddress = 127.0.0.1 + слово
+ServerPort = 8087
+VideoStreamingPort = 5050
+AudioStreamingPort = 5080
+
+[MAIN]
+; Contains .json/.ini files
+; forbidden name for directory
+AppConfigFolder = ///
+; Contains output files, e.g. .wav
+;
+AppStorageFolder = " "
+; Contains resourses, e.g. audio8bit.wav
+;-----
+AppResourceFolder = new folder/
+; Standard min stack size
+; in Ubuntu : PTHREAD_STACK_MIN = 16384
+; in QNX : PTHREAD_STACK_MIN = 256
+;The value of a variable ThreadStackSize used only if its realy needed, other way stack size will be PTHREAD_STACK_MIN
+;
+ThreadStackSize = 20480
+MixingAudioSupported = true
+HMICapabilities = hmi_capabilities.json
+MaxCmdID = 2000000000
+; Default request timeout in milliseconds
+DefaultTimeout = 10000
+
+AppDirectoryQuota = 104857600
+; Allowed requests amount in HMI level NONE during time scale.
+; If value is 0 check will be skipped
+AppHMILevelNoneTimeScaleMaxRequests = 100
+AppHMILevelNoneRequestsTimeScale = 10
+; Allowed requests amount during time scale.
+; If value is 0 check will be skipped
+AppTimeScaleMaxRequests = 1000
+AppRequestsTimeScale = 10
+; Allowed pending requests amount. If value is 0 check will be skipped
+PendingRequestsAmount = 5000
+HeartBeatTimeout = 7
+SupportedDiagModes = 0x01, 0x02, 0x03, 0x05, 0x06, 0x07, 0x09, 0x0A, 0x18, 0x19, 0x22, 0x3E
+SystemFilesPath = /tmp/fs/mp/images/ivsu_cache
+UseLastState = true
+TimeTestingPort = 8090
+ReadDIDRequest = 5, 1
+;Check wrong pair value
+GetVehicleDataRequest = A, 0
+
+[MEDIA MANAGER]
+; where 3 is a number of retries and 1 is a timeout in seconds for request frequency
+StartStreamRetry = 3, 1
+EnableRedecoding = false
+VideoStreamConsumer = socket
+AudioStreamConsumer = socket
+;VideoStreamConsumer = file
+;AudioStreamConsumer = file
+;VideoStreamConsumer = pipe
+;AudioStreamConsumer = pipe
+;Temp solution: if you change NamedPipePath also change path to pipe in src/components/qt_hmi/qml_model_qtXX/views/SDLNavi.qml
+;Named pipe path will be constructed using AppStorageFolder + name
+NamedVideoPipePath = video_stream_pipe
+NamedAudioPipePath = audio_stream_pipe
+;File path will be constructed using AppStorageFolder + name
+VideoStreamFile = video_stream_file
+AudioStreamFile = audio_stream_file
+; Recording file source (used for audio pass thru emulation only)
+RecordingFileSource = 00012\\345/678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHIJKL+MNO|PQR~STU{}WXY[]Z,01234567890a00012\\345/678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHIJKL+MNO|PQR~STU{}WXY[]Z,01234567890a00012\\345/678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHIJKL+MNO|PQR~STU{}WXY[]Z,01234567890a00012\\345/678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHIJKL+MNO|PQR~STU{}WXY[]Z,01234567890a00012\\345/678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHIJKL+MNO|PQR~STU{}WXY[]Z,01234567890a
+; Recording file for audio pass thru
+RecordingFileName = 0/0/0/1/2345678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHIJKL+MNO|PQR~STU{}WXY[]Z,01234567890a00012345678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHIJKL+MNO|PQR~STU{}WXY[]Z,01234567890a00012345678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHIJKL+MNO|PQR~STU{}WXY[]Z,01234567890a00012345678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHIJKL+MNO|PQR~STU{}WXY[]Z,01234567890a00012345678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHIJKL+MNO|PQR~STU{}WXY[]Z,01234567890abc!def@ghi
+
+; HelpPromt and TimeOutPrompt is a vector of strings separated by comma
+[GLOBAL PROPERTIES]
+
+; Delimiter, which will be appended to each TTS chunck, e.g. helpPrompt/timeoutPrompt
+; ---------- words instead of coma
+TTSDelimiter = coma and point
+; Default prompt items, separated by comma
+HelpPromt = Please speak one of the following commands,Please say a command
+; Default prompt items, separated by comma
+TimeOutPromt = Please speak one of the following commands,Please say a command
+HelpTitle = 0/0/0/1/2345678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHIJKL+MNO|PQR~STU{}WXY[]Z,01234567890a00012345678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHIJKL+MNO|PQR~STU{}WXY[]Z,01234567890a00012345678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHIJKL+MNO|PQR~STU{}WXY[]Z,01234567890a00012345678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHIJKL+MNO|PQR~STU{}WXY[]Z,01234567890a00012345678'90abc!def@ghi#jkl$mno%pqr^stu*vwx:yz()ABC-DEF_GHIJKL+MNO|PQR~STU{}WXY[]Z,01234567890abc!def@ghi
+; In case mobile app didn't send global properties default global properties will be sent after this timeout
+; max value TTSGlobalPropertiesTimeout 64K
+TTSGlobalPropertiesTimeout = 20
+
+[FILESYSTEM RESTRICTIONS]
+; Max allowed number of PutFile requests for one application in NONE
+PutFileRequest = 5
+; Max allowed number of DeleteFile requests for one application in NONE
+DeleteFileRequest = 5
+; Max allowed number of ListFiles requests for one application in NONE
+ListFilesRequest = 5
+
+[VR COMMANDS]
+HelpCommand = Help
+
+[AppInfo]
+; The path for applications info storage.
+AppInfoStorage = app_info.dat
+
+[Security Manager]
+Protocol = TLSv1.2
+; Certificate and key path to pem file
+CertificatePath = mycert.pem
+KeyPath = mykey.pem
+; SSL mode could be SERVER or CLIENT
+SSLMode = CLIENT
+; Could be ALL ciphers or list of chosen
+;CipherList = AES256-GCM-SHA384
+CipherList = ALL
+; Verify Mobile app certificate (could be used in both SSLMode Server and Client)
+VerifyPeer = false
+; If VerifyPeer is enable - terminate handshake if mobile app did not return a certificate
+FialOnNoCert = false
+; If VerifyPeer is enable - do not ask for a mobile app certificate again in case of a renegotiation
+VerifyClientOnce = false
+; Force protected services (could be id's from 0x01 to 0xFF)
+;ForceProtectedService = 0x0A, 0x0B
+ForceProtectedService = Non
+; Force unprotected services
+;ForceUnprotectedService = 0x07
+ForceUnprotectedService = Non
+
+[Policy]
+EnablePolicy = true
+PreloadedPT = sdl_preloaded_pt.json
+PathToSnapshot = sdl_snapshot.json
+; Number of attempts to open policy DB
+AttemptsToOpenPolicyDB = 5
+; Timeout between attempts during opening DB in milliseconds
+OpenAttemptTimeoutMs = 500
+
+[TransportManager]
+TCPAdapterPort = 12345
+MMEDatabase = /dev/qdb/mediaservice_db
+EventMQ = /dev/mqueue/ToSDLCoreUSBAdapter
+AckMQ = /dev/mqueue/FromSDLCoreUSBAdapter
+
+[IAP]
+LegacyProtocol = com.ford.sync.prot[0-29]
+HubProtocol = com.smartdevicelink.prot0
+PoolProtocol = com.smartdevicelink.prot[1-29]
+IAPSystemConfig = /fs/mp/etc/mm/ipod.cfg
+IAP2SystemConfig = /fs/mp/etc/mm/iap2.cfg
+IAP2HubConnectAttempts = 3
+
+[ProtocolHandler]
+; Packet with payload bigger than next value will be marked as a malformed
+; 1488 = 1500 - 12 = TCP MTU - header size
+MaximumPayloadSize = 1488
+; Application shall send less #FrequencyCount messages per #FrequencyTime mSecs
+; Frequency check could be disable by setting FrequencyTime to Zero
+FrequencyCount = 1000
+FrequencyTime = 1000
+
+[ApplicationManager]
+ApplicationListUpdateTimeout = 2
+; Max allowed threads for handling mobile requests. Currently max allowed is 2
+ThreadPoolSize = 1
+
+[Resumption]
+
+# Timeout in seconds for resumption Application HMILevel
+# and resolving conflicts in case if multiple applications initiate resumption
+ApplicationResumingTimeout = 3
+
+# Timeout in seconds for pereodical saving resumption persisten data
+AppSavePersistentDataTimeout = 10 #seconds
+
+# Timeout in seconds to store hmi_level for media app before ign_off
+ResumptionDelayBeforeIgn = 30;
+
+# Timeout in seconds to restore hmi_level for media app after sdl run
+ResumptionDelayAfterIgn = 30;
diff --git a/src/components/config_profile/test/smartDeviceLink_test.ini b/src/components/config_profile/test/smartDeviceLink_test.ini
new file mode 100644
index 000000000..6e2943b56
--- /dev/null
+++ b/src/components/config_profile/test/smartDeviceLink_test.ini
@@ -0,0 +1,192 @@
+ ; The INI-file consists of different chapters.
+; Each chapter begins with the line containing
+; the name in square brackets. Syntax:
+; [chapter]
+; The chapters consists of a set of items with a
+; assinged value. The syntax is:
+; item=value
+; All white spaces an second encounters of chapters
+; or items will be ignored.
+; Remarks start with semicolon or star as first character.
+; It is alowed for names of chapters and items to
+; contain semicolon and star. Possible syntax is:
+; [ chapter ] ;Remark
+; item = value ;Remark
+
+[HMI]
+;--------------------
+LaunchHMI = false
+ServerAddress = 127.0.0.1
+ServerPort = 8088
+ServerPort = 8087
+VideoStreamingPort = 5050
+AudioStreamingPort = 5080
+
+[MAIN]
+; Contains .json/.ini files
+AppConfigFolder =
+; Contains output files, e.g. .wav
+AppStorageFolder = storage
+; Contains resourses, e.g. audio8bit.wav
+AppResourceFolder =
+; Standard min stack size
+; in Ubuntu : PTHREAD_STACK_MIN = 16384
+; in QNX : PTHREAD_STACK_MIN = 256
+;The value of a variable ThreadStackSize used only if its realy needed, other way stack size will be PTHREAD_STACK_MIN
+;
+ThreadStackSize = 21000
+MixingAudioSupported = false
+HMICapabilities = hmi_capabilities.json
+;-----------------------
+MaxCmdID = 20000000000
+; Default request timeout in milliseconds
+;-----------------------
+DefaultTimeout =
+
+AppDirectoryQuota = 104857600
+; Allowed requests amount in HMI level NONE during time scale.
+; If value is 0 check will be skipped
+AppHMILevelNoneTimeScaleMaxRequests = 100
+AppHMILevelNoneRequestsTimeScale = 10
+; Allowed requests amount during time scale.
+; If value is 0 check will be skipped
+AppTimeScaleMaxRequests = 1000
+AppRequestsTimeScale = 10
+; Allowed pending requests amount. If value is 0 check will be skipped
+PendingRequestsAmount = 5000
+HeartBeatTimeout = 7
+SupportedDiagModes = 0x01, 0x02, 0x03, 0x05, 0x06, 0x07, 0x09, 0x0A, 0x18, 0x19, 0x22, 0x3E
+SystemFilesPath = /tmp/fs/mp/images/ivsu_cache
+UseLastState = true
+TimeTestingPort = 8090
+ReadDIDRequest = 5, 1
+GetVehicleDataRequest = 5, 1
+
+[MEDIA MANAGER]
+; where 3 is a number of retries and 1 is a timeout in seconds for request frequency
+StartStreamRetry = 3, 1
+EnableRedecoding = true
+VideoStreamConsumer = socket
+AudioStreamConsumer = socket
+;VideoStreamConsumer = file
+;AudioStreamConsumer = file
+;VideoStreamConsumer = pipe
+;AudioStreamConsumer = pipe
+;Temp solution: if you change NamedPipePath also change path to pipe in src/components/qt_hmi/qml_model_qtXX/views/SDLNavi.qml
+;Named pipe path will be constructed using AppStorageFolder + name
+NamedVideoPipePath = video_stream_pipe
+NamedAudioPipePath = audio_stream_pipe
+;File path will be constructed using AppStorageFolder + name
+VideoStreamFile = video_stream_file
+AudioStreamFile = audio_stream_file
+; Recording file source (used for audio pass thru emulation only)
+RecordingFileSource = audio.8bit.wav
+; Recording file for audio pass thru
+RecordingFileName = video.wav
+RecordingFileName = audio.wav
+
+; HelpPromt and TimeOutPrompt is a vector of strings separated by comma
+[GLOBAL PROPERTIES]
+
+; Delimiter, which will be appended to each TTS chunck, e.g. helpPrompt/timeoutPrompt
+TTSDelimiter = ,
+; Default prompt items, separated by comma
+HelpPromt = Please speak one of the following commands,Please say a command
+; Default prompt items, separated by comma
+TimeOutPromt = Please say a command
+TimeOutPromt = Please speak one of the following commands,Please say a command
+HelpTitle = Available Vr Commands List
+; In case mobile app didn't send global properties default global properties will be sent after this timeout
+; max value TTSGlobalPropertiesTimeout 64K
+TTSGlobalPropertiesTimeout = 20
+
+[FILESYSTEM RESTRICTIONS]
+; Max allowed number of PutFile requests for one application in NONE
+PutFileRequest = 5
+; Max allowed number of DeleteFile requests for one application in NONE
+DeleteFileRequest = 5
+; Max allowed number of ListFiles requests for one application in NONE
+ListFilesRequest = 5
+
+[VR COMMANDS]
+HelpCommand = Help
+
+[AppInfo]
+; The path for applications info storage.
+AppInfoStorage = app_info.dat
+
+[Security Manager]
+Protocol = TLSv1.2
+; Certificate and key path to pem file
+CertificatePath = mycert.pem
+KeyPath = mykey.pem
+; SSL mode could be SERVER or CLIENT
+SSLMode = CLIENT
+; Could be ALL ciphers or list of chosen
+;CipherList = AES256-GCM-SHA384
+CipherList = ALL
+; Verify Mobile app certificate (could be used in both SSLMode Server and Client)
+VerifyPeer = false
+; If VerifyPeer is enable - terminate handshake if mobile app did not return a certificate
+FialOnNoCert = false
+; If VerifyPeer is enable - do not ask for a mobile app certificate again in case of a renegotiation
+VerifyClientOnce = false
+; Force protected services (could be id's from 0x01 to 0xFF)
+;ForceProtectedService = 0x0A, 0x0B
+ForceProtectedService = Non
+; Force unprotected services
+;ForceUnprotectedService = 0x07
+ForceUnprotectedService = Non
+
+[Policy]
+;-----------------------------
+EnablePolicy = false
+PreloadedPT = sdl_preloaded_pt.json
+PathToSnapshot = sdl_snapshot.json
+; Number of attempts to open policy DB
+AttemptsToOpenPolicyDB = 5
+; Timeout between attempts during opening DB in milliseconds
+OpenAttemptTimeoutMs = 500
+
+[TransportManager]
+TCPAdapterPort = 12345
+MMEDatabase = /dev/qdb/mediaservice_db
+EventMQ = /dev/mqueue/ToSDLCoreUSBAdapter
+AckMQ = /dev/mqueue/FromSDLCoreUSBAdapter
+
+[IAP]
+LegacyProtocol = com.ford.sync.prot[0-29]
+HubProtocol = com.smartdevicelink.prot0
+PoolProtocol = com.smartdevicelink.prot[1-29]
+IAPSystemConfig = /fs/mp/etc/mm/ipod.cfg
+IAP2SystemConfig = /fs/mp/etc/mm/iap2.cfg
+IAP2HubConnectAttempts = 3
+
+[ProtocolHandler]
+; Packet with payload bigger than next value will be marked as a malformed
+; 1488 = 1500 - 12 = TCP MTU - header size
+MaximumPayloadSize = 1488
+; Application shall send less #FrequencyCount messages per #FrequencyTime mSecs
+; Frequency check could be disable by setting FrequencyTime to Zero
+FrequencyCount = 1000
+FrequencyTime = 1000
+
+[ApplicationManager]
+ApplicationListUpdateTimeout = 2
+; Max allowed threads for handling mobile requests. Currently max allowed is 2
+ThreadPoolSize = 1
+
+[Resumption]
+
+# Timeout in seconds for resumption Application HMILevel
+# and resolving conflicts in case if multiple applications initiate resumption
+ApplicationResumingTimeout = 3
+
+# Timeout in seconds for pereodical saving resumption persisten data
+AppSavePersistentDataTimeout = 10 #seconds
+
+# Timeout in seconds to store hmi_level for media app before ign_off
+ResumptionDelayBeforeIgn = 30;
+
+# Timeout in seconds to restore hmi_level for media app after sdl run
+ResumptionDelayAfterIgn = 30;
diff --git a/src/components/connection_handler/test/CMakeLists.txt b/src/components/connection_handler/test/CMakeLists.txt
index 49899aeb6..7c0e1b2a9 100644
--- a/src/components/connection_handler/test/CMakeLists.txt
+++ b/src/components/connection_handler/test/CMakeLists.txt
@@ -36,19 +36,25 @@ include_directories(
${GMOCK_INCLUDE_DIRECTORY}
${COMPONENTS_DIR}/connection_handler/include
${COMPONENTS_DIR}/security_manager/test/include
+ ${COMPONENTS_DIR}/protocol_handler/test/include
${COMPONENTS_DIR}/security_manager/include
+ ${COMPONENTS_DIR}/connection_handler/test/include
+ ${COMPONENTS_DIR}/transport_manager/test/include
)
set(LIBRARIES
gmock
connectionHandler
ConfigProfile
+ ProtocolHandler
+ TransportManager
)
set(SOURCES
- connection_handler_impl_test.cc
+ #connection_handler_impl_test.cc
connection_test.cc
- heart_beat_monitor_test.cc
+ device_test.cc
+ #heart_beat_monitor_test.cc
)
file(COPY ${appMain_DIR}/smartDeviceLink.ini DESTINATION "./")
diff --git a/src/components/connection_handler/test/connection_handler_impl_test.cc b/src/components/connection_handler/test/connection_handler_impl_test.cc
index 8d2e9b6a0..94e4c816f 100644
--- a/src/components/connection_handler/test/connection_handler_impl_test.cc
+++ b/src/components/connection_handler/test/connection_handler_impl_test.cc
@@ -38,6 +38,9 @@
#include "config_profile/profile.h"
// TODO(EZamakhov): move security test
#include "security_manager_mock.h"
+#include "protocol_handler_mock.h"
+#include "connection_handler_observer_mock.h"
+#include "transport_manager_mock.h"
namespace test {
namespace components {
@@ -46,52 +49,66 @@ namespace connection_handle_test {
using namespace ::connection_handler;
using ::protocol_handler::ServiceType;
using namespace ::protocol_handler;
+using ::testing::_;
+using ::testing::InSequence;
// For service types and PROTECTION_ON/OFF
class ConnectionHandlerTest : public ::testing::Test {
protected:
void SetUp() OVERRIDE {
connection_handler_ = ConnectionHandlerImpl::instance();
- uid = 1u;
- connection_key = connection_handler_->KeyFromPair(0, 0u);
+ uid_ = 1u;
+ connection_key_ = connection_handler_->KeyFromPair(0, 0u);
}
void TearDown() OVERRIDE {
ConnectionHandlerImpl::destroy();
}
// Additional SetUp
void AddTestDeviceConnection() {
- const transport_manager::DeviceHandle device_handle = 0;
- const transport_manager::DeviceInfo device_info(device_handle,
- std::string("test_address"),
- std::string("test_name"),
- std::string("BTMAC"));
+ device_handle_ = 0;
+
+ connection_type_ = "BTMAC";
+ device_name_ = "test_name";
+ mac_address_ = "test_address";
+
+ const transport_manager::DeviceInfo device_info(device_handle_,
+ mac_address_,
+ device_name_,
+ connection_type_);
// Add Device and connection
- connection_handler_->addDeviceConnection(device_info, uid);
- connection_key = connection_handler_->KeyFromPair(uid, 0u);
+ connection_handler_->addDeviceConnection(device_info, uid_);
+ connection_key_ = connection_handler_->KeyFromPair(uid_, 0u);
// Remove all specific services
SetSpecificServices("", "");
}
void AddTestSession() {
- start_session_id = connection_handler_->OnSessionStartedCallback(
- uid, 0, kRpc, PROTECTION_OFF, &out_hash_id);
- EXPECT_NE(0u, start_session_id);
- EXPECT_EQ(SessionHash(uid, start_session_id), out_hash_id);
- connection_key = connection_handler_->KeyFromPair(uid, start_session_id);
- CheckSessionExists(uid, start_session_id);
+ start_session_id_ = connection_handler_->OnSessionStartedCallback(
+ uid_, 0, kRpc, PROTECTION_OFF, &out_hash_id_);
+ EXPECT_NE(0u, start_session_id_);
+ EXPECT_EQ(SessionHash(uid_, start_session_id_), out_hash_id_);
+ connection_key_ = connection_handler_->KeyFromPair(uid_, start_session_id_);
+ CheckSessionExists(uid_, start_session_id_);
}
uint32_t SessionHash(const uint32_t connection, const uint32_t session) {
return connection_handler_->KeyFromPair(connection, session);
}
+ void AddTestService(ServiceType service_type) {
+ EXPECT_NE(0u, start_session_id_);
+ EXPECT_EQ(SessionHash(uid_, start_session_id_), out_hash_id_);
+ connection_key_ = connection_handler_->KeyFromPair(uid_, start_session_id_);
+ CheckSessionExists(uid_, start_session_id_);
+ uint32_t session_id = connection_handler_->OnSessionStartedCallback(
+ uid_, start_session_id_, service_type, PROTECTION_OFF, 0);
+ EXPECT_EQ(session_id, start_session_id_);
+ }
// Additional SetUp
- void SetSpecificServices(const std::string& protect,
- const std::string& not_protect) {
+ void SetSpecificServices(const std::string& protect, const std::string& not_protect) {
const char* config_file = "config.ini";
std::ofstream file_config(config_file);
ASSERT_TRUE(file_config.is_open());
const std::string non("NON");
- file_config
- << "[Security Manager]" << std::endl
+ file_config << "[Security Manager]" << std::endl
<< "; Force protected services (could be id's from 0x01 to 0xFF)"
<< std::endl << "ForceProtectedService = "
<< (protect.empty() ? non : protect) << std::endl
@@ -105,8 +122,7 @@ class ConnectionHandlerTest : public ::testing::Test {
// If session_id is NULL - check that there is no sessions in connection
void CheckSessionExists(const int connectionId, const int session_id) {
// Check all tree to find Session and check own protected value
- const ConnectionList& connection_list = connection_handler_
- ->getConnectionList();
+ const ConnectionList& connection_list = connection_handler_->getConnectionList();
ASSERT_FALSE(connection_list.empty());
ConnectionList::const_iterator conn_it = connection_list.find(connectionId);
ASSERT_NE(conn_it, connection_list.end());
@@ -123,10 +139,8 @@ class ConnectionHandlerTest : public ::testing::Test {
const ServiceList& service_list = session.service_list;
ASSERT_FALSE(service_list.empty());
// Check RPC and bulk services in session
- ASSERT_NE(service_list.end(),
- std::find(service_list.begin(), service_list.end(), kRpc));
- ASSERT_NE(service_list.end(),
- std::find(service_list.begin(), service_list.end(), kBulk));
+ ASSERT_NE(service_list.end(), std::find(service_list.begin(), service_list.end(), kRpc));
+ ASSERT_NE(service_list.end(), std::find(service_list.begin(), service_list.end(), kBulk));
}
}
@@ -135,8 +149,7 @@ class ConnectionHandlerTest : public ::testing::Test {
const ::protocol_handler::ServiceType serviceId,
const bool exists) {
// Check all trees to find Service and check own protected value
- const ConnectionList& connection_list = connection_handler_
- ->getConnectionList();
+ const ConnectionList& connection_list = connection_handler_->getConnectionList();
ASSERT_FALSE(connection_list.empty());
ConnectionList::const_iterator conn_it = connection_list.find(connectionId);
ASSERT_NE(conn_it, connection_list.end());
@@ -149,9 +162,7 @@ class ConnectionHandlerTest : public ::testing::Test {
const Session& session = sess_it->second;
const ServiceList& service_list = session.service_list;
ASSERT_FALSE(service_list.empty());
- ServiceList::const_iterator serv_it = std::find(service_list.begin(),
- service_list.end(),
- serviceId);
+ ServiceList::const_iterator serv_it = std::find(service_list.begin(), service_list.end(), serviceId);
if (exists) {
ASSERT_NE(serv_it, service_list.end());
} else {
@@ -164,8 +175,7 @@ class ConnectionHandlerTest : public ::testing::Test {
const ::security_manager::SSLContext* ssl_context,
const bool is_protected) {
// Check all tree to find Service and check own protected value
- const ConnectionList& connection_list = connection_handler_
- ->getConnectionList();
+ const ConnectionList& connection_list = connection_handler_->getConnectionList();
ASSERT_FALSE(connection_list.empty());
ConnectionList::const_iterator conn_it = connection_list.find(connectionId);
ASSERT_NE(conn_it, connection_list.end());
@@ -181,9 +191,7 @@ class ConnectionHandlerTest : public ::testing::Test {
#endif // ENABLE_SECURITY
const ServiceList& service_list = session.service_list;
ASSERT_FALSE(service_list.empty());
- ServiceList::const_iterator serv_it = std::find(service_list.begin(),
- service_list.end(),
- serviceId);
+ ServiceList::const_iterator serv_it = std::find(service_list.begin(), service_list.end(), serviceId);
ASSERT_NE(serv_it, service_list.end());
const Service& service = *serv_it;
@@ -191,31 +199,51 @@ class ConnectionHandlerTest : public ::testing::Test {
#ifdef ENABLE_SECURITY
if (is_protected) {
// Emulate success protection - check enable service flag
- const uint32_t connection_key = connection_handler_->KeyFromPair(
+ const uint32_t connection_key_ = connection_handler_->KeyFromPair(
connectionId, session_id);
- connection_handler_->SetProtectionFlag(connection_key, serviceId);
+ connection_handler_->SetProtectionFlag(connection_key_, serviceId);
}
#endif // ENABLE_SECURITY
}
+ void ChangeProtocol(const int connectionId, const int session_id, const uint8_t protocol_version) {
+ ConnectionList connection_list = connection_handler_->getConnectionList();
+
+ ConnectionList::const_iterator conn_it = (connection_handler_->getConnectionList()).find(connectionId);
+ ASSERT_NE(conn_it, connection_list.end());
+ Connection * connection = conn_it->second;
+ ASSERT_TRUE(connection != NULL);
+ connection->UpdateProtocolVersionSession(session_id, protocol_version);
+ uint8_t check_protocol_version;
+ EXPECT_TRUE(connection->ProtocolVersion(session_id, check_protocol_version));
+ EXPECT_EQ(check_protocol_version,protocol_version);
+
+ }
+
ConnectionHandlerImpl* connection_handler_;
- transport_manager::ConnectionUID uid;
- uint32_t connection_key;
- uint32_t start_session_id;
- uint32_t out_hash_id;
+ transport_manager::DeviceHandle device_handle_;
+ transport_manager::ConnectionUID uid_;
+ uint32_t connection_key_;
+ uint32_t start_session_id_;
+ uint32_t out_hash_id_;
+
+ std::string connection_type_;
+ std::string device_name_;
+ std::string mac_address_;
+
};
TEST_F(ConnectionHandlerTest, StartSession_NoConnection) {
// Null sessionId for start new session
const uint8_t sessionID = 0;
// Start new session with RPC service
- const uint32_t result_fail = connection_handler_->OnSessionStartedCallback(
- uid, sessionID, kRpc, PROTECTION_ON, &out_hash_id);
+ const uint32_t result_fail = connection_handler_->OnSessionStartedCallback(uid_, sessionID, kRpc, PROTECTION_ON, &out_hash_id_);
// Unknown connection error is '0'
EXPECT_EQ(0u, result_fail);
- EXPECT_EQ(protocol_handler::HASH_ID_WRONG, out_hash_id);
+ EXPECT_EQ(protocol_handler::HASH_ID_WRONG, out_hash_id_);
ASSERT_TRUE(connection_handler_->getConnectionList().empty());
}
+
TEST_F(ConnectionHandlerTest, StartSession) {
// Add virtual device and connection
AddTestDeviceConnection();
@@ -238,7 +266,7 @@ TEST_F(ConnectionHandlerTest, GetAppIdOnSessionKey) {
uint32_t app_id = 0;
const uint32_t testid = SessionHash(uid_, start_session_id_);
- EXPECT_EQ(0, connection_handler_->GetDataOnSessionKey(connection_key_, &app_id));
+ EXPECT_EQ(0, connection_handler_->GetDataOnSessionKey(connection_key_, &app_id, NULL, NULL));
EXPECT_EQ(testid, app_id);
}
@@ -376,17 +404,28 @@ TEST_F(ConnectionHandlerTest,OnFindNewApplicationsRequestWithoutSession) {
TEST_F(ConnectionHandlerTest, OnMalformedMessageCallback) {
AddTestDeviceConnection();
AddTestSession();
+ AddTestService(kAudio);
+ AddTestService(kMobileNav);
connection_handler_test::ConnectionHandlerObserverMock mock_connection_handler_observer;
connection_handler_->set_connection_handler_observer(&mock_connection_handler_observer);
+ InSequence seq;
+ EXPECT_CALL(mock_connection_handler_observer,
+ OnServiceEndedCallback(connection_key_,kMobileNav, kMalformed)).Times(1);
+ EXPECT_CALL(mock_connection_handler_observer,
+ OnServiceEndedCallback(connection_key_,kAudio, kMalformed)).Times(1);
EXPECT_CALL(mock_connection_handler_observer,
- OnServiceEndedCallback(connection_key_,_, kMalformed)).Times(2);
+ OnServiceEndedCallback(connection_key_,kBulk, kMalformed)).Times(1);
+ EXPECT_CALL(mock_connection_handler_observer,
+ OnServiceEndedCallback(connection_key_,kRpc, kMalformed)).Times(1);
connection_handler_->OnMalformedMessageCallback(uid_);
}
TEST_F(ConnectionHandlerTest, OnApplicationFloodCallBack) {
AddTestDeviceConnection();
AddTestSession();
+ AddTestService(kAudio);
+ AddTestService(kMobileNav);
connection_handler_test::ConnectionHandlerObserverMock mock_connection_handler_observer;
connection_handler_->set_connection_handler_observer(&mock_connection_handler_observer);
@@ -394,8 +433,16 @@ TEST_F(ConnectionHandlerTest, OnApplicationFloodCallBack) {
connection_handler_->set_protocol_handler(&mock_protocol_handler);
EXPECT_CALL(mock_protocol_handler, SendEndSession(uid_,start_session_id_));
+
+ InSequence seq;
+ EXPECT_CALL(mock_connection_handler_observer,
+ OnServiceEndedCallback(connection_key_,kMobileNav, kCommon)).Times(1);
+ EXPECT_CALL(mock_connection_handler_observer,
+ OnServiceEndedCallback(connection_key_,kAudio, kCommon)).Times(1);
EXPECT_CALL(mock_connection_handler_observer,
- OnServiceEndedCallback(connection_key_,_, kCommon)).Times(2);
+ OnServiceEndedCallback(connection_key_,kBulk, kCommon)).Times(1);
+ EXPECT_CALL(mock_connection_handler_observer,
+ OnServiceEndedCallback(connection_key_,kRpc, kCommon)).Times(1);
connection_handler_->OnApplicationFloodCallBack(uid_);
}
@@ -442,7 +489,8 @@ TEST_F(ConnectionHandlerTest, CloseRevokedConnection) {
TEST_F(ConnectionHandlerTest, CloseSessionWithCommonReason) {
AddTestDeviceConnection();
AddTestSession();
-
+ AddTestService(kAudio);
+ AddTestService(kMobileNav);
connection_handler_test::ConnectionHandlerObserverMock mock_connection_handler_observer;
connection_handler_->set_connection_handler_observer(&mock_connection_handler_observer);
@@ -450,16 +498,24 @@ TEST_F(ConnectionHandlerTest, CloseSessionWithCommonReason) {
connection_handler_->set_protocol_handler(&mock_protocol_handler);
EXPECT_CALL(mock_protocol_handler, SendEndSession(uid_,start_session_id_));
- EXPECT_CALL(mock_connection_handler_observer,
- OnServiceEndedCallback(connection_key_,_, kCommon)).Times(2);
+ InSequence seq;
+ EXPECT_CALL(mock_connection_handler_observer,
+ OnServiceEndedCallback(connection_key_,kMobileNav, kCommon)).Times(1);
+ EXPECT_CALL(mock_connection_handler_observer,
+ OnServiceEndedCallback(connection_key_,kAudio, kCommon)).Times(1);
+ EXPECT_CALL(mock_connection_handler_observer,
+ OnServiceEndedCallback(connection_key_,kBulk, kCommon)).Times(1);
+ EXPECT_CALL(mock_connection_handler_observer,
+ OnServiceEndedCallback(connection_key_,kRpc, kCommon)).Times(1);
connection_handler_->CloseSession(connection_key_, kCommon);
}
TEST_F(ConnectionHandlerTest, CloseSessionWithFloodReason) {
AddTestDeviceConnection();
AddTestSession();
-
+ AddTestService(kAudio);
+ AddTestService(kMobileNav);
connection_handler_test::ConnectionHandlerObserverMock mock_connection_handler_observer;
connection_handler_->set_connection_handler_observer(&mock_connection_handler_observer);
@@ -467,16 +523,24 @@ TEST_F(ConnectionHandlerTest, CloseSessionWithFloodReason) {
connection_handler_->set_protocol_handler(&mock_protocol_handler);
EXPECT_CALL(mock_protocol_handler, SendEndSession(uid_,start_session_id_));
- EXPECT_CALL(mock_connection_handler_observer,
- OnServiceEndedCallback(connection_key_,_, kFlood)).Times(2);
+ InSequence seq;
+ EXPECT_CALL(mock_connection_handler_observer,
+ OnServiceEndedCallback(connection_key_,kMobileNav, kFlood)).Times(1);
+ EXPECT_CALL(mock_connection_handler_observer,
+ OnServiceEndedCallback(connection_key_,kAudio, kFlood)).Times(1);
+ EXPECT_CALL(mock_connection_handler_observer,
+ OnServiceEndedCallback(connection_key_,kBulk, kFlood)).Times(1);
+ EXPECT_CALL(mock_connection_handler_observer,
+ OnServiceEndedCallback(connection_key_,kRpc, kFlood)).Times(1);
connection_handler_->CloseSession(connection_key_, kFlood);
}
TEST_F(ConnectionHandlerTest, CloseSessionWithMalformedMessage) {
AddTestDeviceConnection();
AddTestSession();
-
+ AddTestService(kAudio);
+ AddTestService(kMobileNav);
connection_handler_test::ConnectionHandlerObserverMock mock_connection_handler_observer;
connection_handler_->set_connection_handler_observer(&mock_connection_handler_observer);
@@ -484,16 +548,24 @@ TEST_F(ConnectionHandlerTest, CloseSessionWithMalformedMessage) {
connection_handler_->set_protocol_handler(&mock_protocol_handler);
EXPECT_CALL(mock_protocol_handler, SendEndSession(uid_,start_session_id_)).Times(0);
- EXPECT_CALL(mock_connection_handler_observer,
- OnServiceEndedCallback(connection_key_,_, kMalformed)).Times(2);
+ InSequence seq;
+ EXPECT_CALL(mock_connection_handler_observer,
+ OnServiceEndedCallback(connection_key_,kMobileNav, kMalformed)).Times(1);
+ EXPECT_CALL(mock_connection_handler_observer,
+ OnServiceEndedCallback(connection_key_,kAudio, kMalformed)).Times(1);
+ EXPECT_CALL(mock_connection_handler_observer,
+ OnServiceEndedCallback(connection_key_,kBulk, kMalformed)).Times(1);
+ EXPECT_CALL(mock_connection_handler_observer,
+ OnServiceEndedCallback(connection_key_,kRpc, kMalformed)).Times(1);
connection_handler_->CloseSession(connection_key_, kMalformed);
}
TEST_F(ConnectionHandlerTest, CloseConnectionSessionsWithMalformedMessage) {
AddTestDeviceConnection();
AddTestSession();
-
+ AddTestService(kAudio);
+ AddTestService(kMobileNav);
connection_handler_test::ConnectionHandlerObserverMock mock_connection_handler_observer;
connection_handler_->set_connection_handler_observer(&mock_connection_handler_observer);
@@ -501,16 +573,24 @@ TEST_F(ConnectionHandlerTest, CloseConnectionSessionsWithMalformedMessage) {
connection_handler_->set_protocol_handler(&mock_protocol_handler);
EXPECT_CALL(mock_protocol_handler, SendEndSession(uid_,start_session_id_)).Times(0);
- EXPECT_CALL(mock_connection_handler_observer,
- OnServiceEndedCallback(connection_key_,_, kMalformed)).Times(2);
+ InSequence seq;
+ EXPECT_CALL(mock_connection_handler_observer,
+ OnServiceEndedCallback(connection_key_,kMobileNav, kMalformed)).Times(1);
+ EXPECT_CALL(mock_connection_handler_observer,
+ OnServiceEndedCallback(connection_key_,kAudio, kMalformed)).Times(1);
+ EXPECT_CALL(mock_connection_handler_observer,
+ OnServiceEndedCallback(connection_key_,kBulk, kMalformed)).Times(1);
+ EXPECT_CALL(mock_connection_handler_observer,
+ OnServiceEndedCallback(connection_key_,kRpc, kMalformed)).Times(1);
connection_handler_->CloseConnectionSessions(uid_, kMalformed);
}
TEST_F(ConnectionHandlerTest, CloseConnectionSessionsWithCommonReason) {
AddTestDeviceConnection();
AddTestSession();
-
+ AddTestService(kAudio);
+ AddTestService(kMobileNav);
connection_handler_test::ConnectionHandlerObserverMock mock_connection_handler_observer;
connection_handler_->set_connection_handler_observer(&mock_connection_handler_observer);
@@ -518,9 +598,16 @@ TEST_F(ConnectionHandlerTest, CloseConnectionSessionsWithCommonReason) {
connection_handler_->set_protocol_handler(&mock_protocol_handler);
EXPECT_CALL(mock_protocol_handler, SendEndSession(uid_,start_session_id_));
- EXPECT_CALL(mock_connection_handler_observer,
- OnServiceEndedCallback(connection_key_,_, kCommon)).Times(2);
+ InSequence seq;
+ EXPECT_CALL(mock_connection_handler_observer,
+ OnServiceEndedCallback(connection_key_,kMobileNav, kCommon)).Times(1);
+ EXPECT_CALL(mock_connection_handler_observer,
+ OnServiceEndedCallback(connection_key_,kAudio, kCommon)).Times(1);
+ EXPECT_CALL(mock_connection_handler_observer,
+ OnServiceEndedCallback(connection_key_,kBulk, kCommon)).Times(1);
+ EXPECT_CALL(mock_connection_handler_observer,
+ OnServiceEndedCallback(connection_key_,kRpc, kCommon)).Times(1);
connection_handler_->CloseConnectionSessions(uid_, kCommon);
}
@@ -531,35 +618,35 @@ TEST_F(ConnectionHandlerTest, StartService_withServices) {
// Start Audio service
const uint32_t start_audio = connection_handler_->OnSessionStartedCallback(
- uid, start_session_id, kAudio, PROTECTION_OFF, &out_hash_id);
- EXPECT_EQ(start_session_id, start_audio);
- CheckServiceExists(uid, start_session_id, kAudio, true);
- EXPECT_EQ(protocol_handler::HASH_ID_NOT_SUPPORTED, out_hash_id);
+ uid_, start_session_id_, kAudio, PROTECTION_OFF, &out_hash_id_);
+ EXPECT_EQ(start_session_id_, start_audio);
+ CheckServiceExists(uid_, start_session_id_, kAudio, true);
+ EXPECT_EQ(protocol_handler::HASH_ID_NOT_SUPPORTED, out_hash_id_);
// Start Audio service
const uint32_t start_video = connection_handler_->OnSessionStartedCallback(
- uid, start_session_id, kMobileNav, PROTECTION_OFF, &out_hash_id);
- EXPECT_EQ(start_session_id, start_video);
- CheckServiceExists(uid, start_session_id, kMobileNav, true);
- EXPECT_EQ(protocol_handler::HASH_ID_NOT_SUPPORTED, out_hash_id);
+ uid_, start_session_id_, kMobileNav, PROTECTION_OFF, &out_hash_id_);
+ EXPECT_EQ(start_session_id_, start_video);
+ CheckServiceExists(uid_, start_session_id_, kMobileNav, true);
+ EXPECT_EQ(protocol_handler::HASH_ID_NOT_SUPPORTED, out_hash_id_);
}
TEST_F(ConnectionHandlerTest, ServiceStop_UnExistSession) {
AddTestDeviceConnection();
- const uint32_t end_session_result = connection_handler_
- ->OnSessionEndedCallback(uid, 0u, 0u, kAudio);
+ const uint32_t end_session_result = connection_handler_->OnSessionEndedCallback(
+ uid_, 0u, 0u, kAudio);
EXPECT_EQ(0u, end_session_result);
- CheckSessionExists(uid, 0);
+ CheckSessionExists(uid_, 0);
}
TEST_F(ConnectionHandlerTest, ServiceStop_UnExistService) {
AddTestDeviceConnection();
AddTestSession();
- const uint32_t end_session_result = connection_handler_
- ->OnSessionEndedCallback(uid, start_session_id, 0u, kAudio);
+ const uint32_t end_session_result = connection_handler_->OnSessionEndedCallback(
+ uid_, start_session_id_, 0u, kAudio);
EXPECT_EQ(0u, end_session_result);
- CheckServiceExists(uid, start_session_id, kAudio, false);
+ CheckServiceExists(uid_, start_session_id_, kAudio, false);
}
TEST_F(ConnectionHandlerTest, ServiceStop) {
@@ -569,14 +656,14 @@ TEST_F(ConnectionHandlerTest, ServiceStop) {
for (uint32_t some_hash_id = 0; some_hash_id < 0xFF; ++some_hash_id) {
// Start audio service
const uint32_t start_audio = connection_handler_->OnSessionStartedCallback(
- uid, start_session_id, kAudio, PROTECTION_OFF, &out_hash_id);
- EXPECT_EQ(start_session_id, start_audio);
- EXPECT_EQ(protocol_handler::HASH_ID_NOT_SUPPORTED, out_hash_id);
-
- const uint32_t end_session_result = connection_handler_
- ->OnSessionEndedCallback(uid, start_session_id, some_hash_id, kAudio);
- EXPECT_EQ(connection_key, end_session_result);
- CheckServiceExists(uid, start_session_id, kAudio, false);
+ uid_, start_session_id_, kAudio, PROTECTION_OFF, &out_hash_id_);
+ EXPECT_EQ(start_session_id_, start_audio);
+ EXPECT_EQ(protocol_handler::HASH_ID_NOT_SUPPORTED, out_hash_id_);
+
+ const uint32_t end_session_result = connection_handler_->OnSessionEndedCallback(
+ uid_, start_session_id_, some_hash_id, kAudio);
+ EXPECT_EQ(connection_key_, end_session_result);
+ CheckServiceExists(uid_, start_session_id_, kAudio, false);
}
}
@@ -585,18 +672,18 @@ TEST_F(ConnectionHandlerTest, SessionStop_CheckHash) {
for (uint32_t session = 0; session < 0xFF; ++session) {
AddTestSession();
- const uint32_t hash = connection_key;
+ const uint32_t hash = connection_key_;
const uint32_t wrong_hash = hash + 1;
- const uint32_t end_audio_wrong_hash = connection_handler_
- ->OnSessionEndedCallback(uid, start_session_id, wrong_hash, kRpc);
+ const uint32_t end_audio_wrong_hash = connection_handler_->OnSessionEndedCallback(
+ uid_, start_session_id_, wrong_hash, kRpc);
EXPECT_EQ(0u, end_audio_wrong_hash);
- CheckSessionExists(uid, start_session_id);
+ CheckSessionExists(uid_, start_session_id_);
const uint32_t end_audio = connection_handler_->OnSessionEndedCallback(
- uid, start_session_id, hash, kRpc);
- EXPECT_EQ(connection_key, end_audio);
- CheckSessionExists(uid, 0);
+ uid_, start_session_id_, hash, kRpc);
+ EXPECT_EQ(connection_key_, end_audio);
+ CheckSessionExists(uid_, 0);
}
}
@@ -608,15 +695,15 @@ TEST_F(ConnectionHandlerTest, SessionStop_CheckSpecificHash) {
const uint32_t wrong_hash = protocol_handler::HASH_ID_WRONG;
const uint32_t hash = protocol_handler::HASH_ID_NOT_SUPPORTED;
- const uint32_t end_audio_wrong_hash = connection_handler_
- ->OnSessionEndedCallback(uid, start_session_id, wrong_hash, kRpc);
+ const uint32_t end_audio_wrong_hash = connection_handler_->OnSessionEndedCallback(
+ uid_, start_session_id_, wrong_hash, kRpc);
EXPECT_EQ(0u, end_audio_wrong_hash);
- CheckSessionExists(uid, start_session_id);
+ CheckSessionExists(uid_, start_session_id_);
const uint32_t end_audio = connection_handler_->OnSessionEndedCallback(
- uid, start_session_id, hash, kRpc);
- EXPECT_EQ(connection_key, end_audio);
- CheckSessionExists(uid, 0);
+ uid_, start_session_id_, hash, kRpc);
+ EXPECT_EQ(connection_key_, end_audio);
+ CheckSessionExists(uid_, 0);
}
}
@@ -626,28 +713,24 @@ TEST_F(ConnectionHandlerTest, SessionStarted_StartSession_SecureSpecific_Unprote
// Forbid start kRPC without encryption
SetSpecificServices("0x07", "");
// Start new session with RPC service
- const uint32_t session_id_fail =
- connection_handler_->OnSessionStartedCallback(uid, 0, kRpc,
- PROTECTION_OFF,
- &out_hash_id);
+ const uint32_t session_id_fail = connection_handler_->OnSessionStartedCallback(
+ uid_, 0, kRpc, PROTECTION_OFF, &out_hash_id_);
#ifdef ENABLE_SECURITY
EXPECT_EQ(0u, session_id_fail);
- EXPECT_EQ(protocol_handler::HASH_ID_WRONG, out_hash_id);
+ EXPECT_EQ(protocol_handler::HASH_ID_WRONG, out_hash_id_);
#else
EXPECT_EQ(1u, session_id_fail);
- EXPECT_EQ(SessionHash(uid, session_id_fail), out_hash_id);
+ EXPECT_EQ(SessionHash(uid_, session_id_fail), out_hash_id_);
#endif // ENABLE_SECURITY
// Allow start kRPC without encryption
SetSpecificServices("0x00, Non", "");
// Start new session with RPC service
const uint32_t session_id = connection_handler_->OnSessionStartedCallback(
- uid, 0, kRpc, PROTECTION_OFF, &out_hash_id);
+ uid_, 0, kRpc, PROTECTION_OFF, &out_hash_id_);
EXPECT_NE(0u, session_id);
- CheckService(uid, session_id, kRpc,
- NULL,
- PROTECTION_OFF);
- EXPECT_EQ(SessionHash(uid, session_id), out_hash_id);
+ CheckService(uid_, session_id, kRpc, NULL, PROTECTION_OFF);
+ EXPECT_EQ(SessionHash(uid_, session_id), out_hash_id_);
}
TEST_F(ConnectionHandlerTest, SessionStarted_StartSession_SecureSpecific_Protect) {
@@ -656,9 +739,8 @@ TEST_F(ConnectionHandlerTest, SessionStarted_StartSession_SecureSpecific_Protect
// Forbid start kRPC with encryption
SetSpecificServices("", "0x06, 0x07, 0x08, Non");
// Start new session with RPC service
- const uint32_t session_id_fail =
- connection_handler_->OnSessionStartedCallback(uid, 0, kRpc, PROTECTION_ON,
- NULL);
+ const uint32_t session_id_fail = connection_handler_->OnSessionStartedCallback(
+ uid_, 0, kRpc, PROTECTION_ON, NULL);
#ifdef ENABLE_SECURITY
EXPECT_EQ(0u, session_id_fail);
#else
@@ -669,14 +751,12 @@ TEST_F(ConnectionHandlerTest, SessionStarted_StartSession_SecureSpecific_Protect
SetSpecificServices("", "0x00, 0x05, Non");
// Start new session with RPC service
const uint32_t session_id = connection_handler_->OnSessionStartedCallback(
- uid, 0, kRpc, PROTECTION_ON, &out_hash_id);
+ uid_, 0, kRpc, PROTECTION_ON, &out_hash_id_);
EXPECT_NE(0u, session_id);
- EXPECT_EQ(SessionHash(uid, session_id), out_hash_id);
+ EXPECT_EQ(SessionHash(uid_, session_id), out_hash_id_);
// Protection steal FALSE because of APPlink Protocol implementation
- CheckService(uid, session_id, kRpc,
- NULL,
- PROTECTION_OFF);
+ CheckService(uid_, session_id, kRpc, NULL, PROTECTION_OFF);
}
TEST_F(ConnectionHandlerTest, SessionStarted_StartService_SecureSpecific_Unprotect) {
@@ -690,7 +770,7 @@ TEST_F(ConnectionHandlerTest, SessionStarted_StartService_SecureSpecific_Unprote
SetSpecificServices("0x06, 0x0A, 0x08, Non", "");
// Start new session with Audio service
const uint32_t session_id2 = connection_handler_->OnSessionStartedCallback(
- uid, start_session_id, kAudio, PROTECTION_OFF, NULL);
+ uid_, start_session_id_, kAudio, PROTECTION_OFF, NULL);
#ifdef ENABLE_SECURITY
EXPECT_EQ(0u, session_id2);
#else
@@ -699,17 +779,17 @@ TEST_F(ConnectionHandlerTest, SessionStarted_StartService_SecureSpecific_Unprote
// Allow start kAudio without encryption
SetSpecificServices("0x06, 0x0B, 0x08, Non", "");
const uint32_t session_id3 = connection_handler_->OnSessionStartedCallback(
- uid, start_session_id, kAudio, PROTECTION_OFF, &out_hash_id);
+ uid_, start_session_id_, kAudio, PROTECTION_OFF, &out_hash_id_);
// Returned original session id
#ifdef ENABLE_SECURITY
- EXPECT_EQ(start_session_id, session_id3);
- EXPECT_EQ(protocol_handler::HASH_ID_NOT_SUPPORTED, out_hash_id);
- CheckService(uid, session_id3, kRpc,
- NULL,
- PROTECTION_OFF);
+ EXPECT_EQ(start_session_id_, session_id3);
+ EXPECT_EQ(protocol_handler::HASH_ID_NOT_SUPPORTED, out_hash_id_);
+ CheckService(uid_, session_id3, kRpc,
+ NULL,
+ PROTECTION_OFF);
#else
EXPECT_EQ(0u, session_id3);
- EXPECT_EQ(protocol_handler::HASH_ID_WRONG, out_hash_id);
+ EXPECT_EQ(protocol_handler::HASH_ID_WRONG, out_hash_id_);
#endif // ENABLE_SECURITY
}
@@ -722,9 +802,8 @@ TEST_F(ConnectionHandlerTest, SessionStarted_StartService_SecureSpecific_Protect
// Forbid start kAudio with encryption
SetSpecificServices("", "0x06, 0x0A, 0x08, Non");
// Start new session with Audio service
- const uint32_t session_id_reject = connection_handler_
- ->OnSessionStartedCallback(uid, start_session_id, kAudio, PROTECTION_ON,
- NULL);
+ const uint32_t session_id_reject = connection_handler_->OnSessionStartedCallback(
+ uid_, start_session_id_, kAudio, PROTECTION_ON, NULL);
#ifdef ENABLE_SECURITY
EXPECT_EQ(0u, session_id_reject);
#else
@@ -733,20 +812,18 @@ TEST_F(ConnectionHandlerTest, SessionStarted_StartService_SecureSpecific_Protect
// Allow start kAudio with encryption
SetSpecificServices("", "Non");
const uint32_t session_id3 = connection_handler_->OnSessionStartedCallback(
- uid, start_session_id, kAudio, PROTECTION_ON, &out_hash_id);
+ uid_, start_session_id_, kAudio, PROTECTION_ON, &out_hash_id_);
// Returned original session id
#ifdef ENABLE_SECURITY
- EXPECT_EQ(start_session_id, session_id3);
- EXPECT_EQ(protocol_handler::HASH_ID_NOT_SUPPORTED, out_hash_id);
- CheckService(uid, session_id3, kAudio,
- NULL,
- PROTECTION_ON);
+ EXPECT_EQ(start_session_id_, session_id3);
+ EXPECT_EQ(protocol_handler::HASH_ID_NOT_SUPPORTED, out_hash_id_);
+ CheckService(uid_, session_id3, kAudio,
+ NULL,
+ PROTECTION_ON);
#else
EXPECT_EQ(0u, session_id3);
- EXPECT_EQ(protocol_handler::HASH_ID_WRONG, out_hash_id);
- CheckService(uid, start_session_id, kAudio,
- NULL,
- PROTECTION_OFF);
+ EXPECT_EQ(protocol_handler::HASH_ID_WRONG, out_hash_id_);
+ CheckService(uid_, start_session_id_, kAudio, NULL, PROTECTION_OFF);
#endif // ENABLE_SECURITY
}
@@ -756,47 +833,41 @@ TEST_F(ConnectionHandlerTest, SessionStarted_DealyProtect) {
// Start RPC protection
const uint32_t session_id_new = connection_handler_->OnSessionStartedCallback(
- uid, start_session_id, kRpc, PROTECTION_ON, &out_hash_id);
+ uid_, start_session_id_, kRpc, PROTECTION_ON, &out_hash_id_);
#ifdef ENABLE_SECURITY
- EXPECT_EQ(start_session_id, session_id_new);
+ EXPECT_EQ(start_session_id_, session_id_new);
// Post protection nedd no hash
- EXPECT_EQ(protocol_handler::HASH_ID_NOT_SUPPORTED, out_hash_id);
- CheckService(uid, start_session_id, kRpc,
- NULL,
- PROTECTION_ON);
+ EXPECT_EQ(protocol_handler::HASH_ID_NOT_SUPPORTED, out_hash_id_);
+ CheckService(uid_, start_session_id_, kRpc,
+ NULL,
+ PROTECTION_ON);
#else
EXPECT_EQ(0u, session_id_new);
- // Post protection nedd no hash
- EXPECT_EQ(protocol_handler::HASH_ID_WRONG, out_hash_id);
- CheckService(uid, start_session_id, kRpc,
- NULL,
- PROTECTION_OFF);
+ // Post protection nedd no hash
+ EXPECT_EQ(protocol_handler::HASH_ID_WRONG, out_hash_id_);
+ CheckService(uid_, start_session_id_, kRpc, NULL, PROTECTION_OFF);
#endif // ENABLE_SECURITY
// Start Audio session without protection
const uint32_t session_id2 = connection_handler_->OnSessionStartedCallback(
- uid, start_session_id, kAudio, PROTECTION_OFF, &out_hash_id);
- EXPECT_EQ(start_session_id, session_id2);
- EXPECT_EQ(protocol_handler::HASH_ID_NOT_SUPPORTED, out_hash_id);
- CheckService(uid, start_session_id, kAudio,
- NULL,
- PROTECTION_OFF);
+ uid_, start_session_id_, kAudio, PROTECTION_OFF, &out_hash_id_);
+ EXPECT_EQ(start_session_id_, session_id2);
+ EXPECT_EQ(protocol_handler::HASH_ID_NOT_SUPPORTED, out_hash_id_);
+ CheckService(uid_, start_session_id_, kAudio, NULL, PROTECTION_OFF);
// Start Audio protection
const uint32_t session_id3 = connection_handler_->OnSessionStartedCallback(
- uid, start_session_id, kAudio, PROTECTION_ON, &out_hash_id);
+ uid_, start_session_id_, kAudio, PROTECTION_ON, &out_hash_id_);
#ifdef ENABLE_SECURITY
- EXPECT_EQ(start_session_id, session_id3);
- EXPECT_EQ(protocol_handler::HASH_ID_NOT_SUPPORTED, out_hash_id);
- CheckService(uid, start_session_id, kAudio,
- NULL,
- PROTECTION_ON);
+ EXPECT_EQ(start_session_id_, session_id3);
+ EXPECT_EQ(protocol_handler::HASH_ID_NOT_SUPPORTED, out_hash_id_);
+ CheckService(uid_, start_session_id_, kAudio,
+ NULL,
+ PROTECTION_ON);
#else
EXPECT_EQ(0u, session_id3);
- EXPECT_EQ(protocol_handler::HASH_ID_WRONG, out_hash_id);
- CheckService(uid, start_session_id, kAudio,
- NULL,
- PROTECTION_OFF);
+ EXPECT_EQ(protocol_handler::HASH_ID_WRONG, out_hash_id_);
+ CheckService(uid_, start_session_id_, kAudio, NULL, PROTECTION_OFF);
#endif // ENABLE_SECURITY
}
@@ -805,169 +876,168 @@ TEST_F(ConnectionHandlerTest, SessionStarted_DealyProtectBulk) {
AddTestSession();
const uint32_t session_id_new = connection_handler_->OnSessionStartedCallback(
- uid, start_session_id, kBulk, PROTECTION_ON, NULL);
+ uid_, start_session_id_, kBulk, PROTECTION_ON, NULL);
#ifdef ENABLE_SECURITY
- EXPECT_EQ(start_session_id, session_id_new);
- CheckService(uid, start_session_id, kRpc,
- NULL,
- PROTECTION_ON);
+ EXPECT_EQ(start_session_id_, session_id_new);
+ CheckService(uid_, start_session_id_, kRpc,
+ NULL,
+ PROTECTION_ON);
#else
EXPECT_EQ(0u, session_id_new);
- CheckService(uid, start_session_id, kRpc,
- NULL,
- PROTECTION_OFF);
+ CheckService(uid_, start_session_id_, kRpc, NULL, PROTECTION_OFF);
#endif // ENABLE_SECURITY
}
#ifdef ENABLE_SECURITY
TEST_F(ConnectionHandlerTest, SetSSLContext_Null) {
// No SSLContext on start up
- EXPECT_EQ(connection_handler_->GetSSLContext(connection_key, kControl),
- reinterpret_cast<security_manager::SSLContext *>(NULL));
+ EXPECT_EQ(connection_handler_->GetSSLContext(connection_key_, kControl),
+ reinterpret_cast<security_manager::SSLContext *>(NULL));
EXPECT_EQ(::security_manager::SecurityManager::ERROR_INTERNAL,
- connection_handler_->SetSSLContext(connection_key, NULL));
+ connection_handler_->SetSSLContext(connection_key_, NULL));
// No SSLContext after error
- EXPECT_EQ(connection_handler_->GetSSLContext(connection_key, kControl),
- reinterpret_cast<security_manager::SSLContext *>(NULL));
+ EXPECT_EQ(connection_handler_->GetSSLContext(connection_key_, kControl),
+ reinterpret_cast<security_manager::SSLContext *>(NULL));
AddTestDeviceConnection();
EXPECT_EQ(::security_manager::SecurityManager::ERROR_INTERNAL,
- connection_handler_->SetSSLContext(connection_key, NULL));
+ connection_handler_->SetSSLContext(connection_key_, NULL));
// No SSLContext after error
- EXPECT_EQ(connection_handler_->GetSSLContext(connection_key, kControl),
- reinterpret_cast<security_manager::SSLContext *>(NULL));
+ EXPECT_EQ(connection_handler_->GetSSLContext(connection_key_, kControl),
+ reinterpret_cast<security_manager::SSLContext *>(NULL));
AddTestSession();
EXPECT_EQ(::security_manager::SecurityManager::ERROR_SUCCESS,
- connection_handler_->SetSSLContext(connection_key, NULL));
+ connection_handler_->SetSSLContext(connection_key_, NULL));
// NULL SSLContext after success
- EXPECT_EQ(connection_handler_->GetSSLContext(connection_key, kControl),
- reinterpret_cast<security_manager::SSLContext *>(NULL));
+ EXPECT_EQ(connection_handler_->GetSSLContext(connection_key_, kControl),
+ reinterpret_cast<security_manager::SSLContext *>(NULL));
}
TEST_F(ConnectionHandlerTest, SetSSLContext) {
// No SSLContext on start up
- EXPECT_EQ(connection_handler_->GetSSLContext(connection_key, kControl),
- reinterpret_cast<security_manager::SSLContext *>(NULL));
+ EXPECT_EQ(connection_handler_->GetSSLContext(connection_key_, kControl),
+ reinterpret_cast<security_manager::SSLContext *>(NULL));
testing::StrictMock<security_manager_test::SSLContextMock> mock_ssl_context;
// Error on no connection
EXPECT_EQ(
- connection_handler_->SetSSLContext(connection_key, &mock_ssl_context),
+ connection_handler_->SetSSLContext(connection_key_, &mock_ssl_context),
::security_manager::SecurityManager::ERROR_INTERNAL);
// No SSLContext after error
- EXPECT_EQ(connection_handler_->GetSSLContext(connection_key, kControl),
- reinterpret_cast<security_manager::SSLContext *>(NULL));
+ EXPECT_EQ(connection_handler_->GetSSLContext(connection_key_, kControl),
+ reinterpret_cast<security_manager::SSLContext *>(NULL));
AddTestDeviceConnection();
// Error on no session
EXPECT_EQ(
- connection_handler_->SetSSLContext(connection_key, &mock_ssl_context),
+ connection_handler_->SetSSLContext(connection_key_, &mock_ssl_context),
::security_manager::SecurityManager::ERROR_INTERNAL);
// No SSLContext after error
- EXPECT_EQ(connection_handler_->GetSSLContext(connection_key, kControl),
- reinterpret_cast<security_manager::SSLContext *>(NULL));
+ EXPECT_EQ(connection_handler_->GetSSLContext(connection_key_, kControl),
+ reinterpret_cast<security_manager::SSLContext *>(NULL));
AddTestSession();
// Success
EXPECT_EQ(
- connection_handler_->SetSSLContext(connection_key, &mock_ssl_context),
+ connection_handler_->SetSSLContext(connection_key_, &mock_ssl_context),
::security_manager::SecurityManager::ERROR_SUCCESS);
// SSLContext set on Success
- EXPECT_EQ(connection_handler_->GetSSLContext(connection_key, kControl),
- &mock_ssl_context);
+ EXPECT_EQ(connection_handler_->GetSSLContext(connection_key_, kControl),
+ &mock_ssl_context);
// Null SSLContext for unprotected services
- EXPECT_EQ(connection_handler_->GetSSLContext(connection_key, kRpc),
- reinterpret_cast<security_manager::SSLContext *>(NULL));
- EXPECT_EQ(connection_handler_->GetSSLContext(connection_key, kBulk),
- reinterpret_cast<security_manager::SSLContext *>(NULL));
- EXPECT_EQ(connection_handler_->GetSSLContext(connection_key, kAudio),
- reinterpret_cast<security_manager::SSLContext *>(NULL));
- EXPECT_EQ(connection_handler_->GetSSLContext(connection_key, kMobileNav),
- reinterpret_cast<security_manager::SSLContext *>(NULL));
+ EXPECT_EQ(connection_handler_->GetSSLContext(connection_key_, kRpc),
+ reinterpret_cast<security_manager::SSLContext *>(NULL));
+ EXPECT_EQ(connection_handler_->GetSSLContext(connection_key_, kBulk),
+ reinterpret_cast<security_manager::SSLContext *>(NULL));
+ EXPECT_EQ(connection_handler_->GetSSLContext(connection_key_, kAudio),
+ reinterpret_cast<security_manager::SSLContext *>(NULL));
+ EXPECT_EQ(connection_handler_->GetSSLContext(connection_key_, kMobileNav),
+ reinterpret_cast<security_manager::SSLContext *>(NULL));
}
TEST_F(ConnectionHandlerTest, GetSSLContext_ByProtectedService) {
// No SSLContext on start up
- EXPECT_EQ(connection_handler_->GetSSLContext(connection_key, kControl),
- reinterpret_cast<security_manager::SSLContext *>(NULL));
+ EXPECT_EQ(connection_handler_->GetSSLContext(connection_key_, kControl),
+ reinterpret_cast<security_manager::SSLContext *>(NULL));
testing::StrictMock<security_manager_test::SSLContextMock> mock_ssl_context;
AddTestDeviceConnection();
AddTestSession();
EXPECT_EQ(
- connection_handler_->SetSSLContext(connection_key, &mock_ssl_context),
+ connection_handler_->SetSSLContext(connection_key_, &mock_ssl_context),
::security_manager::SecurityManager::ERROR_SUCCESS);
// kControl service mean - return for all connection
- EXPECT_EQ(connection_handler_->GetSSLContext(connection_key, kControl),
- &mock_ssl_context);
+ EXPECT_EQ(connection_handler_->GetSSLContext(connection_key_, kControl),
+ &mock_ssl_context);
// kAudio is not exists yet
- EXPECT_EQ(connection_handler_->GetSSLContext(connection_key, kAudio),
- reinterpret_cast<security_manager::SSLContext *>(NULL));
+ EXPECT_EQ(connection_handler_->GetSSLContext(connection_key_, kAudio),
+ reinterpret_cast<security_manager::SSLContext *>(NULL));
// Open kAudio service
const uint32_t session_id = connection_handler_->OnSessionStartedCallback(
- uid, start_session_id, kAudio, PROTECTION_ON, NULL);
- EXPECT_EQ(session_id, start_session_id);
- CheckService(uid, session_id, kAudio, &mock_ssl_context, PROTECTION_ON);
+ uid_, start_session_id_, kAudio, PROTECTION_ON, NULL);
+ EXPECT_EQ(session_id, start_session_id_);
+ CheckService(uid_, session_id, kAudio, &mock_ssl_context, PROTECTION_ON);
// kAudio is not exists yet
- EXPECT_EQ(connection_handler_->GetSSLContext(connection_key, kAudio),
- &mock_ssl_context);
+ EXPECT_EQ(connection_handler_->GetSSLContext(connection_key_, kAudio),
+ &mock_ssl_context);
}
-TEST_F(ConnectionHandlerTest, GetSSLContext_ByDealyProtecteRPC) {
+TEST_F(ConnectionHandlerTest, GetSSLContext_ByDealyProtectedRPC) {
testing::StrictMock<security_manager_test::SSLContextMock> mock_ssl_context;
AddTestDeviceConnection();
AddTestSession();
EXPECT_EQ(
- connection_handler_->SetSSLContext(connection_key, &mock_ssl_context),
+ connection_handler_->SetSSLContext(connection_key_, &mock_ssl_context),
::security_manager::SecurityManager::ERROR_SUCCESS);
- EXPECT_EQ(connection_handler_->GetSSLContext(connection_key, kControl),
- &mock_ssl_context);
+ EXPECT_EQ(connection_handler_->GetSSLContext(connection_key_, kControl),
+ &mock_ssl_context);
// kRpc is not protected
- EXPECT_EQ(connection_handler_->GetSSLContext(connection_key, kRpc),
- reinterpret_cast<security_manager::SSLContext *>(NULL));
+ EXPECT_EQ(connection_handler_->GetSSLContext(connection_key_, kRpc),
+ reinterpret_cast<security_manager::SSLContext *>(NULL));
// Protect kRpc (Bulk will be protect also)
const uint32_t session_id = connection_handler_->OnSessionStartedCallback(
- uid, start_session_id, kRpc, PROTECTION_ON, NULL);
- EXPECT_EQ(start_session_id, session_id);
- CheckService(uid, session_id, kRpc, &mock_ssl_context, PROTECTION_ON);
+ uid_, start_session_id_, kRpc, PROTECTION_ON, NULL);
+ EXPECT_EQ(start_session_id_, session_id);
+ CheckService(uid_, session_id, kRpc, &mock_ssl_context, PROTECTION_ON);
// kRpc is protected
- EXPECT_EQ(connection_handler_->GetSSLContext(connection_key, kRpc),
- &mock_ssl_context);
+ EXPECT_EQ(connection_handler_->GetSSLContext(connection_key_, kRpc),
+ &mock_ssl_context);
// kBulk is protected
- EXPECT_EQ(connection_handler_->GetSSLContext(connection_key, kBulk),
- &mock_ssl_context);
+ EXPECT_EQ(connection_handler_->GetSSLContext(connection_key_, kBulk),
+ &mock_ssl_context);
}
-TEST_F(ConnectionHandlerTest, GetSSLContext_ByDealyProtecteBulk) {
+TEST_F(ConnectionHandlerTest, GetSSLContext_ByDealyProtectedBulk) {
testing::StrictMock<security_manager_test::SSLContextMock> mock_ssl_context;
AddTestDeviceConnection();
AddTestSession();
EXPECT_EQ(
- connection_handler_->SetSSLContext(connection_key, &mock_ssl_context),
+ connection_handler_->SetSSLContext(connection_key_, &mock_ssl_context),
::security_manager::SecurityManager::ERROR_SUCCESS);
- EXPECT_EQ(connection_handler_->GetSSLContext(connection_key, kControl),
- &mock_ssl_context);
+ EXPECT_EQ(connection_handler_->GetSSLContext(connection_key_, kControl),
+ &mock_ssl_context);
// kRpc is not protected
- EXPECT_EQ(connection_handler_->GetSSLContext(connection_key, kRpc),
- reinterpret_cast<security_manager::SSLContext *>(NULL));
+ EXPECT_EQ(connection_handler_->GetSSLContext(connection_key_, kRpc),
+ reinterpret_cast<security_manager::SSLContext *>(NULL));
// Protect Bulk (kRpc will be protected also)
const uint32_t session_id = connection_handler_->OnSessionStartedCallback(
- uid, start_session_id, kBulk, PROTECTION_ON, NULL);
- EXPECT_EQ(start_session_id, session_id);
- CheckService(uid, session_id, kRpc, &mock_ssl_context, PROTECTION_ON);
+ uid_, start_session_id_, kBulk, PROTECTION_ON, NULL);
+ EXPECT_EQ(start_session_id_, session_id);
+ CheckService(uid_, session_id, kRpc, &mock_ssl_context, PROTECTION_ON);
// kRpc is protected
- EXPECT_EQ(connection_handler_->GetSSLContext(connection_key, kRpc),
- &mock_ssl_context);
+ EXPECT_EQ(connection_handler_->GetSSLContext(connection_key_, kRpc),
+ &mock_ssl_context);
// kBulk is protected
- EXPECT_EQ(connection_handler_->GetSSLContext(connection_key, kBulk),
- &mock_ssl_context);
+ EXPECT_EQ(connection_handler_->GetSSLContext(connection_key_, kBulk),
+ &mock_ssl_context);
}
#endif // ENABLE_SECURITY
+
} // namespace connection_handle_test
} // namespace components
} // namespace test
diff --git a/src/components/connection_handler/test/connection_test.cc b/src/components/connection_handler/test/connection_test.cc
index 9462f039c..a1e9307ce 100644
--- a/src/components/connection_handler/test/connection_test.cc
+++ b/src/components/connection_handler/test/connection_test.cc
@@ -37,6 +37,7 @@
#include "connection_handler/connection_handler_impl.h"
#include "protocol/service_type.h"
#include "utils/shared_ptr.h"
+#include "security_manager_mock.h"
#define EXPECT_RETURN_TRUE true
#define EXPECT_RETURN_FALSE false
@@ -46,17 +47,18 @@
namespace test {
namespace components {
namespace connection_handle {
- using namespace ::connection_handler;
- using namespace ::protocol_handler;
+using namespace ::connection_handler;
+using namespace ::protocol_handler;
-class ConnectionTest: public ::testing::Test {
+class ConnectionTest : public ::testing::Test {
protected:
void SetUp() OVERRIDE {
connection_handler_ = ConnectionHandlerImpl::instance();
const ConnectionHandle connectionHandle = 0;
const DeviceHandle device_handle = 0;
- connection_.reset(new Connection(connectionHandle, device_handle,
- connection_handler_, 10000));
+ connection_.reset(
+ new Connection(connectionHandle, device_handle, connection_handler_,
+ 10000));
}
void TearDown() OVERRIDE {
@@ -70,16 +72,17 @@ class ConnectionTest: public ::testing::Test {
EXPECT_FALSE(sessionMap.empty());
const ServiceList serviceList = sessionMap.begin()->second.service_list;
EXPECT_FALSE(serviceList.empty());
- const ServiceList::const_iterator it =
- std::find(serviceList.begin(), serviceList.end(), protocol_handler::kRpc);
+ const ServiceList::const_iterator it = std::find(serviceList.begin(),
+ serviceList.end(),
+ protocol_handler::kRpc);
EXPECT_NE(it, serviceList.end());
}
void AddNewService(const protocol_handler::ServiceType service_type,
- const bool protection,
- const bool expect_add_new_service_call_result,
- const bool expect_exist_service) {
- const bool result = connection_->
- AddNewService(session_id, service_type, protection);
+ const bool protection,
+ const bool expect_add_new_service_call_result,
+ const bool expect_exist_service) {
+ const bool result = connection_->AddNewService(session_id, service_type,
+ protection);
EXPECT_EQ(result, expect_add_new_service_call_result);
#ifdef ENABLE_SECURITY
@@ -91,8 +94,9 @@ class ConnectionTest: public ::testing::Test {
EXPECT_FALSE(session_map.empty());
const ServiceList newServiceList = session_map.begin()->second.service_list;
EXPECT_FALSE(newServiceList.empty());
- const ServiceList::const_iterator it =
- std::find(newServiceList.begin(), newServiceList.end(), service_type);
+ const ServiceList::const_iterator it = std::find(newServiceList.begin(),
+ newServiceList.end(),
+ service_type);
const bool found_result = it != newServiceList.end();
EXPECT_EQ(expect_exist_service, found_result);
#ifdef ENABLE_SECURITY
@@ -106,16 +110,17 @@ class ConnectionTest: public ::testing::Test {
void RemoveService(const protocol_handler::ServiceType service_type,
const bool expect_remove_service_result,
const bool expect_exist_service) {
- const bool result = connection_->
- RemoveService(session_id, service_type);
+ const bool result = connection_->RemoveService(session_id, service_type);
EXPECT_EQ(result, expect_remove_service_result);
const SessionMap newSessionMap = connection_->session_map();
EXPECT_FALSE(newSessionMap.empty());
- const ServiceList newServiceList = newSessionMap.begin()->second.service_list;
+ const ServiceList newServiceList = newSessionMap.begin()->second
+ .service_list;
EXPECT_FALSE(newServiceList.empty());
- const ServiceList::const_iterator it =
- std::find(newServiceList.begin(), newServiceList.end(), service_type);
+ const ServiceList::const_iterator it = std::find(newServiceList.begin(),
+ newServiceList.end(),
+ service_type);
const bool found_result = it != newServiceList.end();
EXPECT_EQ(expect_exist_service, found_result);
}
@@ -125,50 +130,89 @@ class ConnectionTest: public ::testing::Test {
uint32_t session_id;
};
+
+TEST_F(ConnectionTest, Session_TryGetProtocolVersionWithoutSession) {
+ uint8_t protocol_version;
+ EXPECT_FALSE(connection_->ProtocolVersion(session_id, protocol_version));
+}
+
+TEST_F(ConnectionTest, Session_GetDefaultProtocolVersion) {
+ StartSession();
+ uint8_t protocol_version;
+ EXPECT_TRUE(connection_->ProtocolVersion(session_id, protocol_version));
+ EXPECT_EQ(protocol_version, ::protocol_handler::PROTOCOL_VERSION_2);
+}
+TEST_F(ConnectionTest, Session_UpdateProtocolVersion) {
+ StartSession();
+ uint8_t protocol_version = ::protocol_handler::PROTOCOL_VERSION_3;
+ connection_->UpdateProtocolVersionSession(session_id, protocol_version);
+ EXPECT_TRUE(connection_->ProtocolVersion(session_id, protocol_version));
+ EXPECT_EQ(protocol_version, ::protocol_handler::PROTOCOL_VERSION_3);
+}
+
+TEST_F(ConnectionTest, HeartBeat_NotSupported) {
+ // Arrange
+ StartSession();
+ uint8_t protocol_version;
+ EXPECT_TRUE(connection_->ProtocolVersion(session_id, protocol_version));
+ EXPECT_EQ(protocol_version, ::protocol_handler::PROTOCOL_VERSION_2);
+
+ // Assert
+ EXPECT_FALSE(connection_->SupportHeartBeat(session_id));
+}
+
+TEST_F(ConnectionTest, DISABLED_HeartBeat_Supported) {
+ // Arrange
+ StartSession();
+
+ // Check if protocol version is 3
+ uint8_t protocol_version = ::protocol_handler::PROTOCOL_VERSION_3;
+ connection_->UpdateProtocolVersionSession(session_id, protocol_version);
+ EXPECT_EQ(protocol_version, ::protocol_handler::PROTOCOL_VERSION_3);
+
+ // Assert
+ EXPECT_TRUE(connection_->SupportHeartBeat(session_id));
+}
+
// Try to add service without session
TEST_F(ConnectionTest, Session_AddNewServiceWithoutSession) {
- EXPECT_EQ(connection_->
- AddNewService(session_id, protocol_handler::kAudio, true),
- EXPECT_RETURN_FALSE);
- EXPECT_EQ(connection_->
- AddNewService(session_id, protocol_handler::kAudio, false),
- EXPECT_RETURN_FALSE);
- EXPECT_EQ(connection_->
- AddNewService(session_id, protocol_handler::kMobileNav, true),
- EXPECT_RETURN_FALSE);
- EXPECT_EQ(connection_->
- AddNewService(session_id, protocol_handler::kMobileNav, false),
- EXPECT_RETURN_FALSE);
+ EXPECT_EQ(
+ connection_->AddNewService(session_id, protocol_handler::kAudio, true),
+ EXPECT_RETURN_FALSE);
+ EXPECT_EQ(
+ connection_->AddNewService(session_id, protocol_handler::kAudio, false),
+ EXPECT_RETURN_FALSE);
+ EXPECT_EQ(
+ connection_->AddNewService(session_id, protocol_handler::kMobileNav, true),
+ EXPECT_RETURN_FALSE);
+ EXPECT_EQ(
+ connection_->AddNewService(session_id, protocol_handler::kMobileNav, false),
+ EXPECT_RETURN_FALSE);
}
// Try to remove service without session
TEST_F(ConnectionTest, Session_RemoveServiceWithoutSession) {
- EXPECT_EQ(connection_->
- RemoveService(session_id, protocol_handler::kAudio),
- EXPECT_RETURN_FALSE);
- EXPECT_EQ(connection_->
- RemoveService(session_id, protocol_handler::kMobileNav),
+ EXPECT_EQ(connection_->RemoveService(session_id, protocol_handler::kAudio),
EXPECT_RETURN_FALSE);
+ EXPECT_EQ(
+ connection_->RemoveService(session_id, protocol_handler::kMobileNav),
+ EXPECT_RETURN_FALSE);
}
// Try to remove RPC
TEST_F(ConnectionTest, Session_RemoveRPCBulk) {
StartSession();
- EXPECT_EQ(connection_->
- RemoveService(session_id, protocol_handler::kRpc),
+ EXPECT_EQ(connection_->RemoveService(session_id, protocol_handler::kRpc),
EXPECT_RETURN_FALSE);
- EXPECT_EQ(connection_->
- RemoveService(session_id, protocol_handler::kBulk),
+ EXPECT_EQ(connection_->RemoveService(session_id, protocol_handler::kBulk),
EXPECT_RETURN_FALSE);
}
// Control Service could not be started anyway
TEST_F(ConnectionTest, Session_AddControlService) {
StartSession();
- AddNewService(protocol_handler::kControl, PROTECTION_OFF,
- EXPECT_RETURN_FALSE,
+ AddNewService(protocol_handler::kControl, PROTECTION_OFF, EXPECT_RETURN_FALSE,
EXPECT_SERVICE_NOT_EXISTS);
- AddNewService(protocol_handler::kControl, PROTECTION_ON,
- EXPECT_RETURN_FALSE,
+ AddNewService(protocol_handler::kControl, PROTECTION_ON, EXPECT_RETURN_FALSE,
EXPECT_SERVICE_NOT_EXISTS);
}
@@ -177,89 +221,107 @@ TEST_F(ConnectionTest, Session_AddInvalidService) {
StartSession();
AddNewService(protocol_handler::kInvalidServiceType, PROTECTION_OFF,
- EXPECT_RETURN_FALSE,
- EXPECT_SERVICE_NOT_EXISTS);
+ EXPECT_RETURN_FALSE, EXPECT_SERVICE_NOT_EXISTS);
AddNewService(protocol_handler::kInvalidServiceType, PROTECTION_ON,
- EXPECT_RETURN_FALSE,
- EXPECT_SERVICE_NOT_EXISTS);
+ EXPECT_RETURN_FALSE, EXPECT_SERVICE_NOT_EXISTS);
}
// RPC and Bulk Services could be only delay protected
TEST_F(ConnectionTest, Session_AddRPCBulkServices) {
StartSession();
AddNewService(protocol_handler::kRpc, PROTECTION_OFF,
- EXPECT_RETURN_FALSE,
- EXPECT_SERVICE_EXISTS);
+ EXPECT_RETURN_FALSE, EXPECT_SERVICE_EXISTS);
// Bulk shall not be added and shall be PROTECTION_OFF
AddNewService(protocol_handler::kBulk, PROTECTION_OFF,
- EXPECT_RETURN_FALSE,
- EXPECT_SERVICE_EXISTS);
+ EXPECT_RETURN_FALSE, EXPECT_SERVICE_EXISTS);
#ifdef ENABLE_SECURITY
AddNewService(protocol_handler::kRpc, PROTECTION_ON,
- EXPECT_RETURN_TRUE,
- EXPECT_SERVICE_EXISTS);
+ EXPECT_RETURN_TRUE,
+ EXPECT_SERVICE_EXISTS);
#else
AddNewService(protocol_handler::kRpc, PROTECTION_ON,
- EXPECT_RETURN_FALSE,
- EXPECT_SERVICE_EXISTS);
+ EXPECT_RETURN_FALSE, EXPECT_SERVICE_EXISTS);
#endif // ENABLE_SECURITY
// Bulk shall not be added and shall be PROTECTION_ON
AddNewService(protocol_handler::kBulk, PROTECTION_ON,
- EXPECT_RETURN_FALSE,
- EXPECT_SERVICE_EXISTS);
+ EXPECT_RETURN_FALSE, EXPECT_SERVICE_EXISTS);
}
TEST_F(ConnectionTest, Session_AddAllOtherService_Unprotected) {
StartSession();
AddNewService(protocol_handler::kAudio, PROTECTION_OFF,
- EXPECT_RETURN_TRUE,
- EXPECT_SERVICE_EXISTS);
+ EXPECT_RETURN_TRUE, EXPECT_SERVICE_EXISTS);
AddNewService(protocol_handler::kMobileNav, PROTECTION_OFF,
- EXPECT_RETURN_TRUE,
- EXPECT_SERVICE_EXISTS);
+ EXPECT_RETURN_TRUE, EXPECT_SERVICE_EXISTS);
}
TEST_F(ConnectionTest, Session_AddAllOtherService_Protected) {
StartSession();
AddNewService(protocol_handler::kAudio, PROTECTION_ON,
- EXPECT_RETURN_TRUE,
- EXPECT_SERVICE_EXISTS);
+ EXPECT_RETURN_TRUE, EXPECT_SERVICE_EXISTS);
AddNewService(protocol_handler::kMobileNav, PROTECTION_ON,
- EXPECT_RETURN_TRUE,
- EXPECT_SERVICE_EXISTS);
+ EXPECT_RETURN_TRUE, EXPECT_SERVICE_EXISTS);
+}
+
+TEST_F(ConnectionTest, FindAddedService) {
+ StartSession();
+
+ // Arrange
+ SessionMap currentSessionMap = connection_->session_map();
+ Service * sessionWithService = currentSessionMap.find(session_id)->second
+ .FindService(protocol_handler::kAudio);
+ EXPECT_EQ(NULL, sessionWithService);
+
+ // Act
+ AddNewService(protocol_handler::kAudio, PROTECTION_OFF,
+ EXPECT_RETURN_TRUE, EXPECT_SERVICE_EXISTS);
+
+ currentSessionMap = connection_->session_map();
+
+ // Expect that service is existing
+ sessionWithService = currentSessionMap.find(session_id)->second.FindService(
+ protocol_handler::kAudio);
+ EXPECT_TRUE(sessionWithService != NULL);
+}
+
+TEST_F(ConnectionTest, Session_RemoveAddedService) {
+ StartSession();
+ AddNewService(protocol_handler::kAudio, PROTECTION_OFF,
+ EXPECT_RETURN_TRUE, EXPECT_SERVICE_EXISTS);
+
+ EXPECT_EQ(connection_->RemoveService(session_id, protocol_handler::kAudio),
+ EXPECT_RETURN_TRUE);
+
+ // Try delete nonexisting service
+ EXPECT_EQ(connection_->RemoveService(session_id, protocol_handler::kAudio),
+ EXPECT_RETURN_FALSE);
}
TEST_F(ConnectionTest, Session_AddAllOtherService_DelayProtected1) {
StartSession();
AddNewService(protocol_handler::kAudio, PROTECTION_OFF,
- EXPECT_RETURN_TRUE,
- EXPECT_SERVICE_EXISTS);
+ EXPECT_RETURN_TRUE, EXPECT_SERVICE_EXISTS);
AddNewService(protocol_handler::kMobileNav, PROTECTION_OFF,
- EXPECT_RETURN_TRUE,
- EXPECT_SERVICE_EXISTS);
+ EXPECT_RETURN_TRUE, EXPECT_SERVICE_EXISTS);
#ifdef ENABLE_SECURITY
AddNewService(protocol_handler::kAudio, PROTECTION_ON,
- EXPECT_RETURN_TRUE,
- EXPECT_SERVICE_EXISTS);
+ EXPECT_RETURN_TRUE, EXPECT_SERVICE_EXISTS);
AddNewService(protocol_handler::kMobileNav, PROTECTION_ON,
- EXPECT_RETURN_TRUE,
- EXPECT_SERVICE_EXISTS);
+ EXPECT_RETURN_TRUE, EXPECT_SERVICE_EXISTS);
#else
AddNewService(protocol_handler::kAudio, PROTECTION_ON,
- EXPECT_RETURN_FALSE,
- EXPECT_SERVICE_EXISTS);
+ EXPECT_RETURN_FALSE, EXPECT_SERVICE_EXISTS);
AddNewService(protocol_handler::kMobileNav, PROTECTION_ON,
- EXPECT_RETURN_FALSE,
- EXPECT_SERVICE_EXISTS);
+ EXPECT_RETURN_FALSE, EXPECT_SERVICE_EXISTS);
#endif // ENABLE_SECURITY
}
@@ -268,32 +330,121 @@ TEST_F(ConnectionTest, Session_AddAllOtherService_DelayProtected2) {
StartSession();
AddNewService(protocol_handler::kAudio, PROTECTION_OFF,
- EXPECT_RETURN_TRUE,
- EXPECT_SERVICE_EXISTS);
+ EXPECT_RETURN_TRUE, EXPECT_SERVICE_EXISTS);
#ifdef ENABLE_SECURITY
AddNewService(protocol_handler::kAudio, PROTECTION_ON,
- EXPECT_RETURN_TRUE,
- EXPECT_SERVICE_EXISTS);
+ EXPECT_RETURN_TRUE,
+ EXPECT_SERVICE_EXISTS);
#else
AddNewService(protocol_handler::kAudio, PROTECTION_ON,
- EXPECT_RETURN_FALSE,
- EXPECT_SERVICE_EXISTS);
+ EXPECT_RETURN_FALSE, EXPECT_SERVICE_EXISTS);
#endif // ENABLE_SECURITY
AddNewService(protocol_handler::kMobileNav, PROTECTION_OFF,
- EXPECT_RETURN_TRUE,
- EXPECT_SERVICE_EXISTS);
+ EXPECT_RETURN_TRUE, EXPECT_SERVICE_EXISTS);
#ifdef ENABLE_SECURITY
AddNewService(protocol_handler::kMobileNav, PROTECTION_ON,
- EXPECT_RETURN_TRUE,
- EXPECT_SERVICE_EXISTS);
+ EXPECT_RETURN_TRUE, EXPECT_SERVICE_EXISTS);
#else
AddNewService(protocol_handler::kMobileNav, PROTECTION_ON,
- EXPECT_RETURN_FALSE,
- EXPECT_SERVICE_EXISTS);
+ EXPECT_RETURN_FALSE, EXPECT_SERVICE_EXISTS);
#endif // ENABLE_SECURITY
}
+TEST_F(ConnectionTest, RemoveSession) {
+ StartSession();
+ EXPECT_EQ(session_id, connection_->RemoveSession(session_id));
+ EXPECT_EQ(0u, connection_->RemoveSession(session_id));
+}
+
+#ifdef ENABLE_SECURITY
+
+TEST_F(ConnectionTest, SetSSLContextWithoutSession) {
+ //random value. Session was not started
+ uint8_t session_id = 10;
+ security_manager_test::SSLContextMock mock_ssl_context;
+ int setResult = connection_->SetSSLContext(session_id, &mock_ssl_context);
+ EXPECT_EQ(security_manager::SecurityManager::ERROR_INTERNAL,setResult);
+}
+
+TEST_F(ConnectionTest, GetSSLContextWithoutSession) {
+ //random value. Session was not started
+ uint8_t session_id = 10;
+
+ EXPECT_EQ(NULL,connection_->GetSSLContext(session_id,protocol_handler::kMobileNav));
+}
+
+TEST_F(ConnectionTest, SetGetSSLContext) {
+ StartSession();
+
+ EXPECT_EQ(NULL,connection_->GetSSLContext(session_id,protocol_handler::kMobileNav));
+ AddNewService(protocol_handler::kMobileNav, PROTECTION_ON,
+ EXPECT_RETURN_TRUE, EXPECT_SERVICE_EXISTS);
+
+ EXPECT_EQ(NULL,connection_->GetSSLContext(session_id,protocol_handler::kMobileNav));
+
+ security_manager_test::SSLContextMock mock_ssl_context;
+ //Set SSLContext
+ int setResult = connection_->SetSSLContext(session_id, &mock_ssl_context);
+ EXPECT_EQ(security_manager::SecurityManager::ERROR_SUCCESS,setResult);
+
+ security_manager::SSLContext *result = connection_->GetSSLContext(session_id,protocol_handler::kMobileNav);
+ EXPECT_EQ(result,&mock_ssl_context);
+}
+
+TEST_F(ConnectionTest, SetProtectionFlagForRPC) {
+ StartSession();
+ // Arrange
+ SessionMap currentSessionMap = connection_->session_map();
+ Service * service_rpc = currentSessionMap.find(session_id)->second
+ .FindService(protocol_handler::kRpc);
+
+ EXPECT_FALSE(service_rpc->is_protected_);
+
+ Service * service_bulk = currentSessionMap.find(session_id)->second
+ .FindService(protocol_handler::kBulk);
+ EXPECT_FALSE(service_bulk->is_protected_);
+
+ // Expect that service protection is enabled
+ connection_->SetProtectionFlag(session_id, protocol_handler::kRpc);
+
+ currentSessionMap = connection_->session_map();
+ service_bulk = currentSessionMap.find(session_id)->second
+ .FindService(protocol_handler::kBulk);
+ EXPECT_TRUE(service_bulk->is_protected_);
+
+ service_rpc = currentSessionMap.find(session_id)->second
+ .FindService(protocol_handler::kRpc);
+ EXPECT_TRUE(service_rpc->is_protected_);
+}
+
+
+TEST_F(ConnectionTest, SetProtectionFlagForBulk) {
+ StartSession();
+ // Arrange
+ SessionMap currentSessionMap = connection_->session_map();
+ Service * service_rpc = currentSessionMap.find(session_id)->second
+ .FindService(protocol_handler::kRpc);
+
+ EXPECT_FALSE(service_rpc->is_protected_);
+
+ Service * service_bulk = currentSessionMap.find(session_id)->second
+ .FindService(protocol_handler::kBulk);
+ EXPECT_FALSE(service_bulk->is_protected_);
+
+ // Expect that service protection is enabled
+ connection_->SetProtectionFlag(session_id, protocol_handler::kBulk);
+
+ currentSessionMap = connection_->session_map();
+ service_bulk = currentSessionMap.find(session_id)->second.FindService(protocol_handler::kBulk);
+ EXPECT_TRUE(service_bulk->is_protected_);
+
+ service_rpc = currentSessionMap.find(session_id)->second.FindService(protocol_handler::kRpc);
+ EXPECT_TRUE(service_rpc->is_protected_);
+}
+
+#endif // ENABLE_SECURITY
+
} // namespace connection_handle
} // namespace components
} // namespace test
diff --git a/src/components/connection_handler/test/device_test.cc b/src/components/connection_handler/test/device_test.cc
new file mode 100644
index 000000000..dc1a51faf
--- /dev/null
+++ b/src/components/connection_handler/test/device_test.cc
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <gtest/gtest.h>
+#include "encryption/hashing.h"
+#include "connection_handler/device.h"
+
+namespace test {
+namespace components {
+namespace connection_handle {
+
+using namespace connection_handler;
+TEST(ConnectionDevice, CompareDevicesWithDifferentMacAddresses) {
+ DeviceHandle device_handle = 0;
+
+ std::string connection_type = "BTMAC";
+ std::string device_name = "test_name";
+ std::string mac_address = "test_address";
+
+ Device test_device(device_handle, device_name, mac_address, connection_type);
+
+ EXPECT_EQ(device_handle, test_device.device_handle());
+ EXPECT_EQ(device_name, test_device.user_friendly_name());
+ EXPECT_NE(mac_address, test_device.mac_address());
+ EXPECT_EQ(connection_type, test_device.connection_type());
+ std::string hash_mac_address = test_device.mac_address();
+
+ std::string test_next_mac_address = "test_address_";
+ Device next_test_device(device_handle, device_name, test_next_mac_address, connection_type);
+ EXPECT_NE(test_next_mac_address, next_test_device.mac_address());
+ std::string hash_next_mac_address = next_test_device.mac_address();
+
+ EXPECT_NE(hash_mac_address, hash_next_mac_address);
+}
+
+TEST(ConnectionDevice, MacAddressHash) {
+ DeviceHandle device_handle = 0;
+ std::string connection_type = "BTMAC";
+ std::string device_name = "test_name";
+ std::string mac_address = "test_address";
+
+ Device test_device(device_handle, device_name, mac_address, connection_type);
+
+ std::string hashed_mac_address = encryption::MakeHash(mac_address);
+ EXPECT_EQ(hashed_mac_address, test_device.mac_address());
+}
+
+} // namespace connection_handle
+} // namespace components
+} // namespace test
+
diff --git a/src/components/connection_handler/test/heart_beat_monitor_test.cc b/src/components/connection_handler/test/heart_beat_monitor_test.cc
index f4a1708de..710977c64 100644
--- a/src/components/connection_handler/test/heart_beat_monitor_test.cc
+++ b/src/components/connection_handler/test/heart_beat_monitor_test.cc
@@ -31,6 +31,7 @@
*/
#include <string>
+#include <iostream>
//#include <stdio.h>
#include "gmock/gmock.h"
#include "connection_handler/heartbeat_monitor.h"
@@ -38,6 +39,12 @@
#include "connection_handler/connection_handler.h"
#include "config_profile/profile.h"
+namespace {
+const int32_t MILLISECONDS_IN_SECOND = 1000;
+const int32_t MICROSECONDS_IN_MILLISECONDS = 1000;
+const int32_t MICROSECONDS_IN_SECOND = 1000 * 1000;
+}
+
namespace test {
namespace components {
namespace connection_handler_test {
@@ -62,6 +69,7 @@ class ConnectionHandlerMock : public connection_handler::ConnectionHandler {
MOCK_METHOD2(GetDeviceID,
bool(const std::string& mac_address,
connection_handler::DeviceHandle* device_handle));
+ MOCK_CONST_METHOD1(GetConnectedDevicesMAC, void(std::vector<std::string> &device_macs));
MOCK_METHOD2(CloseSession,
void(uint32_t key,
connection_handler::CloseSessionReason close_reason));
@@ -78,10 +86,14 @@ class ConnectionHandlerMock : public connection_handler::ConnectionHandler {
void(connection_handler::ConnectionHandle connection_handle,
uint8_t session_id));
MOCK_METHOD2(SetHeartBeatTimeout, void(uint32_t connection_key,
- int32_t timeout));
+ uint32_t timeout));
MOCK_METHOD2(BindProtocolVersionWithSession,
void(uint32_t connection_key,
uint8_t protocol_version));
+ MOCK_METHOD4(GetDataOnSessionKey,
+ int32_t(uint32_t key, uint32_t* app_id,
+ std::list<int32_t>* sessions_list,
+ uint32_t* device_id));
};
class HeartBeatMonitorTest : public testing::Test {
@@ -95,7 +107,7 @@ public:
protected:
testing::NiceMock<ConnectionHandlerMock> connection_handler_mock;
connection_handler::Connection* conn;
- int32_t kTimeout;
+ uint32_t kTimeout;
static const connection_handler::ConnectionHandle kConnectionHandle = 0xABCDEF;
virtual void SetUp() {
@@ -122,7 +134,7 @@ TEST_F(HeartBeatMonitorTest, TimerNotStarted) {
EXPECT_CALL(connection_handler_mock, SendHeartBeat(_, _)).Times(0);
conn->AddNewSession();
- sleep(kTimeout + 1);
+ usleep(kTimeout * MICROSECONDS_IN_MILLISECONDS + MICROSECONDS_IN_SECOND);
}
TEST_F(HeartBeatMonitorTest, TimerNotElapsed) {
@@ -132,7 +144,7 @@ TEST_F(HeartBeatMonitorTest, TimerNotElapsed) {
const uint32_t session = conn->AddNewSession();
conn->StartHeartBeat(session);
- sleep(kTimeout - 1);
+ usleep(kTimeout * MICROSECONDS_IN_MILLISECONDS - MICROSECONDS_IN_SECOND);
}
TEST_F(HeartBeatMonitorTest, TimerElapsed) {
@@ -144,7 +156,7 @@ TEST_F(HeartBeatMonitorTest, TimerElapsed) {
EXPECT_CALL(connection_handler_mock, SendHeartBeat(_, session));
conn->StartHeartBeat(session);
- sleep(2 * kTimeout + 1);
+ usleep(2 * kTimeout * MICROSECONDS_IN_MILLISECONDS + MICROSECONDS_IN_SECOND);
}
TEST_F(HeartBeatMonitorTest, KeptAlive) {
@@ -154,13 +166,13 @@ TEST_F(HeartBeatMonitorTest, KeptAlive) {
const uint32_t session = conn->AddNewSession();
conn->StartHeartBeat(session);
- sleep(kTimeout - 1);
+ usleep(kTimeout * MICROSECONDS_IN_MILLISECONDS - MICROSECONDS_IN_SECOND);
conn->KeepAlive(session);
- sleep(kTimeout - 1);
+ usleep(kTimeout * MICROSECONDS_IN_MILLISECONDS - MICROSECONDS_IN_SECOND);
conn->KeepAlive(session);
- sleep(kTimeout - 1);
+ usleep(kTimeout * MICROSECONDS_IN_MILLISECONDS - MICROSECONDS_IN_SECOND);
conn->KeepAlive(session);
- sleep(kTimeout - 1);
+ usleep(kTimeout * MICROSECONDS_IN_MILLISECONDS - MICROSECONDS_IN_SECOND);
}
TEST_F(HeartBeatMonitorTest, NotKeptAlive) {
@@ -172,13 +184,13 @@ TEST_F(HeartBeatMonitorTest, NotKeptAlive) {
EXPECT_CALL(connection_handler_mock, CloseConnection(_));
conn->StartHeartBeat(session);
- sleep(kTimeout - 1);
+ usleep(kTimeout * MICROSECONDS_IN_MILLISECONDS - MICROSECONDS_IN_SECOND);
conn->KeepAlive(session);
- sleep(kTimeout - 1);
+ usleep(kTimeout * MICROSECONDS_IN_MILLISECONDS - MICROSECONDS_IN_SECOND);
conn->KeepAlive(session);
- sleep(kTimeout - 1);
+ usleep(kTimeout * MICROSECONDS_IN_MILLISECONDS - MICROSECONDS_IN_SECOND);
conn->KeepAlive(session);
- sleep(2 * kTimeout + 1);
+ usleep(2 * kTimeout * MICROSECONDS_IN_MILLISECONDS + MICROSECONDS_IN_SECOND);
}
TEST_F(HeartBeatMonitorTest, TwoSessionsElapsed) {
@@ -195,7 +207,7 @@ TEST_F(HeartBeatMonitorTest, TwoSessionsElapsed) {
conn->StartHeartBeat(kSession1);
conn->StartHeartBeat(kSession2);
- sleep(2 * kTimeout + 1);
+ usleep(2 * kTimeout * MICROSECONDS_IN_MILLISECONDS + MICROSECONDS_IN_SECOND);
}
TEST_F(HeartBeatMonitorTest, IncreaseHeartBeatTimeout) {
@@ -206,25 +218,26 @@ TEST_F(HeartBeatMonitorTest, IncreaseHeartBeatTimeout) {
EXPECT_CALL(connection_handler_mock, SendHeartBeat(_, _)).Times(0);
- const int32_t kNewTimeout = kTimeout + 1;
+ const uint32_t kNewTimeout = kTimeout + MICROSECONDS_IN_MILLISECONDS;
conn->StartHeartBeat(kSession);
conn->SetHeartBeatTimeout(kNewTimeout, kSession);
// new timeout greater by old timeout so mock object shouldn't be invoked
- sleep(kTimeout);
+ usleep(kTimeout * MICROSECONDS_IN_MILLISECONDS);
}
TEST_F(HeartBeatMonitorTest, DecreaseHeartBeatTimeout) {
const uint32_t kSession = conn->AddNewSession();
- EXPECT_CALL(connection_handler_mock, SendHeartBeat(_, kSession));
+
EXPECT_CALL(connection_handler_mock, CloseSession(_, kSession,_))
.WillOnce(RemoveSession(conn, kSession));
EXPECT_CALL(connection_handler_mock, CloseConnection(_));
+ EXPECT_CALL(connection_handler_mock, SendHeartBeat(_, kSession));
- const int32_t kNewTimeout = kTimeout - 1;
+ const uint32_t kNewTimeout = kTimeout - MICROSECONDS_IN_MILLISECONDS;
conn->StartHeartBeat(kSession);
conn->SetHeartBeatTimeout(kNewTimeout, kSession);
// new timeout less than old timeout so mock object should be invoked
- sleep(kTimeout*2);
+ usleep(kTimeout * 2 * MICROSECONDS_IN_MILLISECONDS);
}
} // namespace connection_handler_test
diff --git a/src/components/connection_handler/test/include/connection_handler_observer_mock.h b/src/components/connection_handler/test/include/connection_handler_observer_mock.h
new file mode 100644
index 000000000..9a7437526
--- /dev/null
+++ b/src/components/connection_handler/test/include/connection_handler_observer_mock.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef SRC_COMPONENTS_CONNECTION_HANDLER_TEST_INCLUDE_CONNECTION_HANDLER_OBSERVER_MOCK_H_
+#define SRC_COMPONENTS_CONNECTION_HANDLER_TEST_INCLUDE_CONNECTION_HANDLER_OBSERVER_MOCK_H_
+
+#include <gmock/gmock.h>
+#include <string>
+#include "connection_handler/connection_handler_observer.h"
+
+namespace test {
+namespace components {
+namespace connection_handler_test {
+
+/*
+ * MOCK implementation of ::connection_handler::ConnectionHandlerObserver interface
+ */
+class ConnectionHandlerObserverMock : public ::connection_handler::ConnectionHandlerObserver {
+ public:
+ MOCK_METHOD1(OnDeviceListUpdated,
+ void(const connection_handler::DeviceMap &device_list));
+ MOCK_METHOD0(OnFindNewApplicationsRequest,void());
+ MOCK_METHOD1(RemoveDevice,
+ void(const connection_handler::DeviceHandle &device_handle));
+ MOCK_METHOD3(OnServiceStartedCallback,
+ bool(const connection_handler::DeviceHandle &device_handle,
+ const int32_t &session_key,
+ const protocol_handler::ServiceType &type));
+ MOCK_METHOD3(OnServiceEndedCallback,
+ void(const int32_t &session_key,
+ const protocol_handler::ServiceType &type,
+ const connection_handler::CloseSessionReason& close_reason));
+ MOCK_CONST_METHOD1(GetHandshakeContext,
+ security_manager::SSLContext::HandshakeContext(
+ uint32_t key));
+
+};
+} // namespace connection_handler_test
+} // namespace components
+} // namespace test
+#endif //SRC_COMPONENTS_CONNECTION_HANDLER_TEST_INCLUDE_CONNECTION_HANDLER_OBSERVER_MOCK_H_
diff --git a/src/components/connection_handler/test/smartDeviceLink.ini b/src/components/connection_handler/test/smartDeviceLink.ini
index 0e79edf3a..109003eb5 100644
--- a/src/components/connection_handler/test/smartDeviceLink.ini
+++ b/src/components/connection_handler/test/smartDeviceLink.ini
@@ -58,7 +58,7 @@ AppTimeScaleMaxRequests = 1000
AppRequestsTimeScale = 10
; Allowed pending requests amount. If value is 0 check will be skipped
PendingRequestsAmount = 5000
-HeartBeatTimeout = 7
+HeartBeatTimeout = 7000
SupportedDiagModes = 0x01, 0x02, 0x03, 0x05, 0x06, 0x07, 0x09, 0x0A, 0x18, 0x19, 0x22, 0x3E
SystemFilesPath = /tmp/fs/mp/images/ivsu_cache
UseLastState = true
diff --git a/src/components/formatters/test/CFormatterJsonBase_test.cc b/src/components/formatters/test/CFormatterJsonBase_test.cc
new file mode 100644
index 000000000..9efbfdcf7
--- /dev/null
+++ b/src/components/formatters/test/CFormatterJsonBase_test.cc
@@ -0,0 +1,337 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <string>
+#include <algorithm>
+#include "json/value.h"
+#include "gtest/gtest.h"
+#include "json/reader.h"
+#include "formatters/CFormatterJsonBase.hpp"
+#include "formatters/generic_json_formatter.h"
+
+namespace test {
+namespace components {
+namespace formatters {
+
+using namespace NsSmartDeviceLink::NsSmartObjects;
+using namespace NsSmartDeviceLink::NsJSONHandler::Formatters;
+
+TEST(CFormatterJsonBaseTest, JSonStringValueToSmartObj_ExpectSuccessful) {
+ // Arrange value
+ std::string string_val("test_string");
+ Json::Value json_value(string_val); // Json value from string
+ SmartObject object;
+ // Convert json to smart object
+ CFormatterJsonBase::jsonValueToObj(json_value, object);
+ // Check conversion was successful
+ EXPECT_EQ(string_val, object.asString());
+}
+
+TEST(CFormatterJsonBaseTest, JSonDoubleValueToSmartObj_ExpectSuccessful) {
+ // Arrange value
+ double dval = 3.512;
+ Json::Value json_value(dval); // Json value from double
+ SmartObject object;
+ // Convert json to smart object
+ CFormatterJsonBase::jsonValueToObj(json_value, object);
+ // Check conversion was successful
+ EXPECT_DOUBLE_EQ(dval, object.asDouble());
+}
+
+TEST(CFormatterJsonBaseTest, JSonMinIntValueToSmartObj_ExpectSuccessful) {
+ // Arrange value
+ Json::Int ival = Json::Value::minInt;
+ Json::Value json_value(ival); // Json value from possible minimum signed int
+ SmartObject object;
+ // Convert json to smart object
+ CFormatterJsonBase::jsonValueToObj(json_value, object);
+ // Check conversion was successful
+ EXPECT_EQ(ival, object.asInt());
+}
+
+TEST(CFormatterJsonBaseTest, JSonNullIntValueToSmartObj_ExpectSuccessful) {
+ // Arrange value
+ Json::Int ival = Json::nullValue;
+ Json::Value json_value(ival); // Json value from null int value
+ SmartObject object;
+ // Convert json to smart object
+ CFormatterJsonBase::jsonValueToObj(json_value, object);
+ // Check conversion was successful
+ EXPECT_EQ(ival, object.asInt());
+}
+
+TEST(CFormatterJsonBaseTest, JSonSignedMaxIntValueToSmartObj_ExpectSuccessful) {
+ // Arrange value
+ Json::Int ival = Json::Value::maxInt;
+ Json::Value json_value(ival); // Json value from maximum possible signed int
+ SmartObject object;
+ // Convert json to smart object
+ CFormatterJsonBase::jsonValueToObj(json_value, object);
+ // Check conversion was successful
+ EXPECT_EQ(ival, object.asInt());
+}
+
+TEST(CFormatterJsonBaseTest, DISABLED_JSonUnsignedMaxIntValueToSmartObj_ExpectSuccessful) {
+ // Arrange value
+ Json::UInt ui_val = Json::Value::maxUInt;
+ Json::Value json_value(ui_val); // Json value from maximum possible unsigned int
+ SmartObject object;
+ // Convert json to smart object
+ CFormatterJsonBase::jsonValueToObj(json_value, object);
+ // Check conversion was successful
+ EXPECT_EQ(ui_val, object.asUInt());
+}
+
+TEST(CFormatterJsonBaseTest, JSonSignedMaxInt64ValueToSmartObj_ExpectFailed) {
+ // Arrange value
+ Json::Int64 ival = Json::Value::maxInt64;
+ Json::Value json_value(ival); // Json value from maximum possible signed int
+ SmartObject object;
+ // Convert json to smart object
+ CFormatterJsonBase::jsonValueToObj(json_value, object);
+ // Check conversion was not successful as there is no such conversion
+ EXPECT_EQ(invalid_int64_value, object.asInt64());
+}
+
+TEST(CFormatterJsonBaseTest, JSonBoolValueToSmartObj_ExpectSuccessful) {
+ // Arrange value
+ bool bval1 = true;
+ bool bval2 = false;
+ Json::Value json_value1(bval1); // Json value from bool
+ Json::Value json_value2(bval2); // Json value from bool
+ SmartObject object1;
+ SmartObject object2;
+ // Convert json to smart object
+ CFormatterJsonBase::jsonValueToObj(json_value1, object1);
+ CFormatterJsonBase::jsonValueToObj(json_value2, object2);
+ // Check conversion was successful
+ EXPECT_TRUE(object1.asBool());
+ EXPECT_FALSE(object2.asBool());
+}
+
+TEST(CFormatterJsonBaseTest, JSonCStringValueToSmartObj_ExpectSuccessful) {
+ // Arrange value
+ const char* cstr_val = "cstring_test";
+ Json::Value json_value(cstr_val); // Json value from const char*
+ SmartObject object;
+ // Convert json to smart object
+ CFormatterJsonBase::jsonValueToObj(json_value, object);
+ // Check conversion was successful
+ EXPECT_STREQ(cstr_val, object.asCharArray());
+}
+
+TEST(CFormatterJsonBaseTest, JSonArrayValueToSmartObj_ExpectSuccessful) {
+ // Arrange value
+ const char* json_array = "[\"test1\", \"test2\", \"test3\"]"; // Array in json format
+ Json::Value json_value; // Json value from array. Will be initialized later
+ SmartObject object;
+ Json::Reader reader; // Json reader - Needed for correct parsing
+ // Parse array to json value
+ ASSERT_TRUE(reader.parse(json_array, json_value));
+ // Convert json array to SmartObject
+ CFormatterJsonBase::jsonValueToObj(json_value, object);
+ // Check conversion was successful
+ EXPECT_TRUE(json_value.isArray());
+ EXPECT_EQ(3u, object.asArray()->size());
+ SmartArray *ptr = NULL; // Smart Array pointer;
+ EXPECT_NE(ptr, object.asArray());
+}
+
+TEST(CFormatterJsonBaseTest, JSonObjectValueToSmartObj_ExpectSuccessful) {
+ // Arrange value
+ const char* json_object =
+ "{ \"json_test_object\": [\"test1\", \"test2\", \"test3\"], \"json_test_object2\": [\"test11\", \"test12\", \"test13\" ]}"; // Json object
+ Json::Value json_value; // Json value from object. Will be initialized later
+ SmartObject object;
+ Json::Reader reader; // Json reader - Needed for correct parsing
+ ASSERT_TRUE(reader.parse(json_object, json_value)); // If parsing not successful - no sense to continue
+ CFormatterJsonBase::jsonValueToObj(json_value, object);
+ // Check conversion was successful
+ EXPECT_TRUE(json_value.isObject());
+ EXPECT_TRUE(json_value.type() == Json::objectValue);
+ // Get keys collection from Smart Object
+ std::set<std::string> keys = object.enumerate();
+ std::set<std::string>::iterator it1 = keys.begin();
+ // Get members names(keys) from Json object
+ Json::Value::Members mems = json_value.getMemberNames();
+ std::vector<std::string>::iterator it;
+ // Compare sizes
+ EXPECT_EQ(mems.size(), keys.size());
+ // Sort mems
+ std::sort(mems.begin(), mems.end());
+ // Full data compare
+ for (it = mems.begin(); it != mems.end(); ++it) {
+ EXPECT_EQ(*it, *it1);
+ ++it1;
+ }
+ ASSERT(it == mems.end() && it1 == keys.end());
+}
+
+TEST(CFormatterJsonBaseTest, StringSmartObjectToJSon_ExpectSuccessful) {
+ // Arrange value
+ std::string string_val("test_string");
+ SmartObject object(string_val);
+ Json::Value json_value; // Json value from string
+ // Convert smart object to json
+ CFormatterJsonBase::objToJsonValue(object, json_value);
+ // Check conversion was successful
+ EXPECT_EQ(string_val, json_value.asString());
+}
+
+TEST(CFormatterJsonBaseTest, DoubleSmartObjectToJSon_ExpectSuccessful) {
+ // Arrange value
+ double dval = 3.512;
+ Json::Value json_value; // Json value from double
+ SmartObject object(dval);
+ // Convert json to smart object
+ CFormatterJsonBase::objToJsonValue(object, json_value);
+ // Check conversion was successful
+ EXPECT_DOUBLE_EQ(dval, json_value.asDouble());
+}
+
+TEST(CFormatterJsonBaseTest, ZeroIntSmartObjectToJSon_ExpectSuccessful) {
+ // Arrange value
+ Json::Int ival = Json::nullValue;
+ Json::Value json_value; // Json value from zero int
+ SmartObject object(ival);
+ // Convert json to smart object
+ CFormatterJsonBase::objToJsonValue(object, json_value);
+ // Check conversion was successful
+ EXPECT_EQ(ival, json_value.asInt());
+}
+
+TEST(CFormatterJsonBaseTest, MinIntSmartObjectToJSon_ExpectSuccessful) {
+ // Arrange value
+ Json::Int ival = Json::Value::minInt;
+ Json::Value json_value; // Json value from mimimum possible signed int
+ SmartObject object(ival);
+ // Convert json to smart object
+ CFormatterJsonBase::objToJsonValue(object, json_value);
+ // Check conversion was successful
+ EXPECT_EQ(ival, json_value.asInt());
+}
+
+TEST(CFormatterJsonBaseTest, DISABLED_UnsignedMaxIntSmartObjectToJSon_ExpectSuccessful) {
+ // Arrange value
+ Json::UInt ui_val = Json::Value::maxUInt;
+ Json::Value json_value; // Json value from maximum unsigned int
+ SmartObject object(ui_val);
+ // Convert json to smart object
+ CFormatterJsonBase::objToJsonValue(object, json_value);
+ // Check conversion was successful
+ EXPECT_EQ(ui_val, json_value.asUInt());
+}
+
+TEST(CFormatterJsonBaseTest, BoolSmartObjectToJSon_ExpectSuccessful) {
+ // Arrange value
+ bool bval1 = true;
+ bool bval2 = false;
+ Json::Value json_value1; // Json value from bool
+ Json::Value json_value2; // Json value from bool
+ SmartObject object1(bval1);
+ SmartObject object2(bval2);
+ // Convert json to smart object
+ CFormatterJsonBase::objToJsonValue(object1, json_value1);
+ CFormatterJsonBase::objToJsonValue(object2, json_value2);
+ // Check conversion was successful
+ EXPECT_TRUE(json_value1.asBool());
+ EXPECT_FALSE(json_value2.asBool());
+}
+
+TEST(CFormatterJsonBaseTest, CStringSmartObjectToJSon_ExpectSuccessful) {
+ // Arrange value
+ const char* cstr_val = "cstring_test";
+ Json::Value json_value; // Json value from const char*
+ SmartObject object(cstr_val);
+ // Convert json to smart object
+ CFormatterJsonBase::objToJsonValue(object, json_value);
+ // Check conversion was successful
+ EXPECT_STREQ(cstr_val, json_value.asCString());
+}
+
+TEST(CFormatterJsonBaseTest, ArraySmartObjectToJSon_ExpectSuccessful) {
+ // Arrange value
+ const char* json_array = "[\"test1\", \"test2\", \"test3\"]"; // Array in json format
+ Json::Value json_value; // Json value from array. Will be initialized later
+ Json::Value result; // Json value from array. Will be initialized later
+ SmartObject object;
+ Json::Reader reader; // Json reader - Needed for correct parsing
+ // Parse array to json value
+ ASSERT_TRUE(reader.parse(json_array, json_value)); // Convert json array to SmartObject
+ // Convert json array to SmartObject
+ CFormatterJsonBase::jsonValueToObj(json_value, object);
+ // Convert SmartObject to JSon
+ CFormatterJsonBase::objToJsonValue(object, result);
+ // Check conversion was successful
+ EXPECT_TRUE(result.isArray());
+ EXPECT_EQ(3u, result.size());
+}
+
+TEST(CFormatterJsonBaseTest, JSonObjectValueToObj_ExpectSuccessful) {
+ // Arrange value
+ const char* json_object =
+ "{ \"json_test_object\": [\"test1\", \"test2\", \"test3\"], \"json_test_object2\": [\"test11\", \"test12\", \"test13\" ]}"; // Json object
+ Json::Value json_value; // Json value from json object. Will be initialized later
+ Json::Value result; // Json value from Smart object. Will keep conversion result
+ SmartObject object;
+ Json::Reader reader; // Json reader - Needed for correct parsing
+ // Parse json object to correct json value
+ ASSERT_TRUE(reader.parse(json_object, json_value)); // If parsing not successful - no sense to continue
+ // Convert json array to SmartObject
+ CFormatterJsonBase::jsonValueToObj(json_value, object);
+ // Convert SmartObject to JSon
+ CFormatterJsonBase::objToJsonValue(object, result);
+ // Check conversion was successful
+ EXPECT_TRUE(result.isObject());
+ EXPECT_TRUE(result.type() == Json::objectValue);
+ EXPECT_TRUE(result == json_value);
+ // Get keys collection from Smart Object
+ std::set<std::string> keys = object.enumerate();
+ std::set<std::string>::iterator it1 = keys.begin();
+ // Get members names(keys) from Json object
+ Json::Value::Members mems = result.getMemberNames();
+ std::vector<std::string>::iterator it;
+ // Compare sizes
+ EXPECT_EQ(mems.size(), keys.size());
+ // Sort mems
+ std::sort(mems.begin(), mems.end());
+ // Full data compare
+ for (it = mems.begin(); it != mems.end(); ++it) {
+ EXPECT_EQ(*it, *it1);
+ ++it1;
+ }
+ ASSERT(it == mems.end() && it1 == keys.end());
+}
+
+} // namespace formatters
+} // namespace components
+} // namespace test
diff --git a/src/components/formatters/test/CMakeLists.txt b/src/components/formatters/test/CMakeLists.txt
index cbe9a2190..b9966c867 100644
--- a/src/components/formatters/test/CMakeLists.txt
+++ b/src/components/formatters/test/CMakeLists.txt
@@ -1,4 +1,4 @@
-# Copyright (c) 2014, Ford Motor Company
+# Copyright (c) 2015, Ford Motor Company
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
@@ -35,19 +35,33 @@ include_directories(
${GMOCK_INCLUDE_DIRECTORY}
${COMPONENTS_DIR}/smart_objects/include
${COMPONENTS_DIR}/formatters/include
+ ${COMPONENTS_DIR}/formatters/test/include
+ ${CMAKE_BINARY_DIR}/src/components/interfaces
+ ${CMAKE_SOURCE_DIR}/src/3rd_party-static/jsoncpp/include
)
set(LIBRARIES
- gmock
- SmartObjects
- formatters
- jsoncpp
+ gmock
+ HMI_API
+ MOBILE_API
+ SmartObjects
+ formatters
+ jsoncpp
)
set(SOURCES
-${COMPONENTS_DIR}/formatters/test/generic_json_formatter_test.cc
+ ${COMPONENTS_DIR}/formatters/test/src/SmartFactoryTestHelper.cc
+ ${COMPONENTS_DIR}/formatters/test/CSmartFactory_test.cc
+ ${COMPONENTS_DIR}/formatters/test/CFormatterJsonBase_test.cc
+ ${COMPONENTS_DIR}/formatters/test/generic_json_formatter_test.cc
+ ${COMPONENTS_DIR}/formatters/test/formatter_json_rpc_test.cc
+ ${COMPONENTS_DIR}/formatters/test/src/create_smartSchema.cc
+ ${COMPONENTS_DIR}/formatters/test/cFormatterJsonSDLRPCv1_test.cc
+ ${COMPONENTS_DIR}/formatters/test/cFormatterJsonSDLRPCv2_test.cc
+ ${COMPONENTS_DIR}/formatters/test/src/meta_formatter_test_helper.cc
+ ${COMPONENTS_DIR}/formatters/test/meta_formatter_test.cc
)
-create_test("generic_json_formatter_test" "${SOURCES}" "${LIBRARIES}")
+create_test("formatters_test" "${SOURCES}" "${LIBRARIES}")
endif()
diff --git a/src/components/formatters/test/CSmartFactory_test.cc b/src/components/formatters/test/CSmartFactory_test.cc
new file mode 100644
index 000000000..39cf67b3f
--- /dev/null
+++ b/src/components/formatters/test/CSmartFactory_test.cc
@@ -0,0 +1,397 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "SmartFactoryTestHelper.h"
+#include "formatters/CSmartFactory.hpp"
+#include "gtest/gtest.h"
+
+namespace test {
+namespace components {
+namespace formatters {
+
+TEST(CSmartFactoryTest, CreateSmartSchemaKey_ExpectCreated) {
+ SmartSchemaKey<FunctionIdTest::eType, MessageTypeTest::eType> test_key(
+ FunctionIdTest::Function1, MessageTypeTest::notification);
+ EXPECT_EQ(test_key.functionId, FunctionIdTest::Function1);
+ EXPECT_EQ(test_key.messageType, MessageTypeTest::notification);
+}
+
+TEST(CSmartFactoryTest, CreateSmartFactory_ExpectCreated) {
+ CSmartFactoryTest test_factory;
+ EXPECT_EQ(9u, test_factory.function_schemes().size());
+ EXPECT_EQ(2u, test_factory.structs_schemes().size());
+}
+
+TEST(CSmartFactoryTest, CreateSmartObjWithSchema1_ExpectCreatedObjectToCorrespondSmSchema1) {
+ CSmartFactoryTest test_factory;
+ // Create SmartObject with attached SmartChmema
+ SmartObject obj = test_factory.CreateSmartObject(FunctionIdTest::Function1,
+ MessageTypeTest::request);
+ EXPECT_TRUE(SmartType::SmartType_Map == obj.getType());
+ // Adding necessary fields
+ obj[S_PARAMS][S_FUNCTION_ID] = FunctionIdTest::Function1;
+ obj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request;
+ obj[S_PARAMS][S_CORRELATION_ID] = 444;
+ obj[S_PARAMS][S_PROTOCOL_VERSION] = 1;
+ obj[S_PARAMS][S_PROTOCOL_TYPE] = 0;
+ obj[S_MSG_PARAMS] = SmartObject(SmartType::SmartType_Map);
+ std::set<std::string> keys = obj.enumerate();
+ EXPECT_EQ(2u, keys.size());
+ EXPECT_EQ(Errors::eType::OK, obj.validate());
+ EXPECT_TRUE(obj.isValid());
+}
+
+TEST(CSmartFactoryTest, CreateSmartObjWithNotExistedSchema_ExpectCreatedObjectNotValid) {
+ CSmartFactoryTest test_factory;
+ // Create SmartObject with attached SmartChmema
+ SmartObject obj = test_factory.CreateSmartObject(
+ FunctionIdTest::Function1, MessageTypeTest::INVALID_ENUM);
+ EXPECT_FALSE(SmartType::SmartType_Map == obj.getType());
+ EXPECT_TRUE(SmartType::SmartType_Null == obj.getType());
+ EXPECT_EQ(Errors::eType::OK, obj.validate());
+ EXPECT_TRUE(obj.isValid());
+}
+
+TEST(CSmartFactoryTest, CreateSmartObjectWithSchema1_MissedOneField_ExpectCreatedNotCorrespondSmartSchema) {
+ CSmartFactoryTest test_factory;
+ // Create SmartObject with attached SmartChmema
+ SmartObject obj = test_factory.CreateSmartObject(FunctionIdTest::Function1,
+ MessageTypeTest::request);
+ EXPECT_TRUE(SmartType::SmartType_Map == obj.getType());
+ // Adding necessary fields but one field is missed
+ obj[S_PARAMS][S_FUNCTION_ID] = FunctionIdTest::Function1;
+ obj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request;
+ obj[S_PARAMS][S_PROTOCOL_VERSION] = 1;
+ obj[S_PARAMS][S_PROTOCOL_TYPE] = 0;
+ obj[S_MSG_PARAMS] = SmartObject(SmartType::SmartType_Map);
+ std::set<std::string> keys = obj.enumerate();
+ EXPECT_EQ(2u, keys.size());
+ EXPECT_EQ(Errors::eType::MISSING_MANDATORY_PARAMETER, obj.validate());
+ EXPECT_FALSE(obj.isValid());
+}
+
+TEST(CSmartFactoryTest, CreateSmartObjectWithSchema1_AddOutOfRangeValue_ExpectCreatedNotCorrespondSmartSchema) {
+ CSmartFactoryTest test_factory;
+ // Create SmartObject with attached SmartChmema
+ SmartObject obj = test_factory.CreateSmartObject(FunctionIdTest::Function1,
+ MessageTypeTest::request);
+ EXPECT_TRUE(SmartType::SmartType_Map == obj.getType());
+ // Adding necessary fields but one field is missed
+ obj[S_PARAMS][S_FUNCTION_ID] = FunctionIdTest::Function1;
+ obj[S_PARAMS][S_MESSAGE_TYPE] = 5;
+ obj[S_PARAMS][S_PROTOCOL_VERSION] = 1;
+ obj[S_PARAMS][S_PROTOCOL_TYPE] = 0;
+ obj[S_PARAMS][S_CORRELATION_ID] = 444;
+ obj[S_MSG_PARAMS] = SmartObject(SmartType::SmartType_Map);
+ std::set<std::string> keys = obj.enumerate();
+ EXPECT_EQ(2u, keys.size());
+ EXPECT_EQ(Errors::eType::OUT_OF_RANGE, obj.validate());
+ EXPECT_FALSE(obj.isValid());
+}
+
+TEST(CSmartFactoryTest, CreateSmartObjectWithSchema1_AddInvalidValue_ExpectCreatedNotCorrespondSmartSchema) {
+ CSmartFactoryTest test_factory;
+ // Create SmartObject with attached SmartChmema
+ SmartObject obj = test_factory.CreateSmartObject(FunctionIdTest::Function1,
+ MessageTypeTest::request);
+ EXPECT_TRUE(SmartType::SmartType_Map == obj.getType());
+ // Adding necessary fields but one field is missed
+ obj[S_PARAMS][S_FUNCTION_ID] = FunctionIdTest::Function1;
+ obj[S_PARAMS][S_MESSAGE_TYPE] = "return";
+ obj[S_PARAMS][S_PROTOCOL_VERSION] = 1;
+ obj[S_PARAMS][S_PROTOCOL_TYPE] = 0;
+ obj[S_PARAMS][S_CORRELATION_ID] = 444;
+ obj[S_MSG_PARAMS] = SmartObject(SmartType::SmartType_Map);
+ std::set<std::string> keys = obj.enumerate();
+ EXPECT_EQ(2u, keys.size());
+ EXPECT_EQ(Errors::eType::INVALID_VALUE, obj.validate());
+ EXPECT_FALSE(obj.isValid());
+}
+
+TEST(CSmartFactoryTest, CreateSmartObj_AttachSchema1_ExpectCreatedObjectCorrespondsSmSchema1) {
+ CSmartFactoryTest test_factory;
+ // Create empty SmartObject without any schema
+ SmartObject obj;
+ // Adding fields necessary for schema to attach
+ obj[S_PARAMS][S_FUNCTION_ID] = FunctionIdTest::Function1;
+ obj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request;
+ // Attach schema to object
+ EXPECT_TRUE(test_factory.attachSchema(obj));
+ EXPECT_TRUE(SmartType::SmartType_Map == obj.getType());
+ // Adding necessary fileds to correspond schema
+ obj[S_PARAMS][S_CORRELATION_ID] = 444;
+ obj[S_PARAMS][S_PROTOCOL_VERSION] = 1;
+ obj[S_PARAMS][S_PROTOCOL_TYPE] = 0;
+ obj[S_MSG_PARAMS] = SmartObject(SmartType::SmartType_Map);
+ std::set<std::string> keys = obj.enumerate();
+ EXPECT_EQ(2u, keys.size());
+ EXPECT_EQ(Errors::eType::OK, obj.validate());
+ EXPECT_TRUE(obj.isValid());
+}
+
+TEST(CSmartFactoryTest, CreateSmartObj_AttachSchema1_MissOneField_ExpectCreatedObjectNotCorrespondsSmSchema1) {
+ CSmartFactoryTest test_factory;
+ // Create empty SmartObject without any schema
+ SmartObject obj;
+ // Adding fields necessary for schema to attach
+ obj[S_PARAMS][S_FUNCTION_ID] = FunctionIdTest::Function1;
+ obj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request;
+ // Attach schema to object
+ EXPECT_TRUE(test_factory.attachSchema(obj));
+ EXPECT_TRUE(SmartType::SmartType_Map == obj.getType());
+ // Adding necessary fileds to correspond schema but 1 field is missing
+ obj[S_PARAMS][S_PROTOCOL_VERSION] = 1;
+ obj[S_PARAMS][S_PROTOCOL_TYPE] = 0;
+ obj[S_MSG_PARAMS] = SmartObject(SmartType::SmartType_Map);
+ std::set<std::string> keys = obj.enumerate();
+ EXPECT_EQ(2u, keys.size());
+ EXPECT_EQ(Errors::eType::MISSING_MANDATORY_PARAMETER, obj.validate());
+ EXPECT_FALSE(obj.isValid());
+}
+
+TEST(CSmartFactoryTest, CreateSmartObj_AttachNotExistedSchema_ExpectSmSchemaNotAttached) {
+ CSmartFactoryTest test_factory;
+ // Create empty SmartObject without any schema
+ SmartObject obj;
+ // Adding fields necessary for schema to attach but one value is invalid
+ obj[S_PARAMS][S_FUNCTION_ID] = FunctionIdTest::Function1;
+ obj[S_PARAMS][S_MESSAGE_TYPE] = 10;
+ // Attach schema to object
+ EXPECT_FALSE(test_factory.attachSchema(obj));
+ EXPECT_TRUE(SmartType::SmartType_Map == obj.getType());
+}
+
+TEST(CSmartFactoryTest, CreateSmartObj_AttachSchema1_AddInvalidValue_ExpectCreatedObjectNotCorrespondsSmSchema1) {
+ CSmartFactoryTest test_factory;
+ // Create empty SmartObject without any schema
+ SmartObject obj;
+ // Adding fields necessary for schema to attach
+ obj[S_PARAMS][S_FUNCTION_ID] = FunctionIdTest::Function1;
+ obj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request;
+ // Attach schema to object
+ EXPECT_TRUE(test_factory.attachSchema(obj));
+ EXPECT_TRUE(SmartType::SmartType_Map == obj.getType());
+ // Adding necessary fileds to correspond schema but 1 field is missing
+ obj[S_PARAMS][S_PROTOCOL_VERSION] = "string";
+ obj[S_PARAMS][S_PROTOCOL_TYPE] = 0;
+ obj[S_PARAMS][S_CORRELATION_ID] = 444;
+ obj[S_MSG_PARAMS] = SmartObject(SmartType::SmartType_Map);
+ std::set<std::string> keys = obj.enumerate();
+ EXPECT_EQ(2u, keys.size());
+ EXPECT_EQ(Errors::eType::INVALID_VALUE, obj.validate());
+ EXPECT_FALSE(obj.isValid());
+}
+
+TEST(CSmartFactoryTest, CreateSmartObj_AttachSchema1_ExpectCreatedObjectCorrespondsSmSchema) {
+ CSmartFactoryTest test_factory;
+ // Create empty SmartObject without any schema
+ SmartObject obj;
+ // Attach schema to object
+ EXPECT_TRUE(test_factory.AttachSchema(StructIdentifiersTest::Common_1, obj));
+ obj["text"] = "test";
+ obj["position"] = 200;
+ std::set<std::string> keys = obj.enumerate();
+ EXPECT_EQ(2u, keys.size());
+ EXPECT_EQ(Errors::eType::OK, obj.validate());
+ EXPECT_TRUE(obj.isValid());
+}
+
+TEST(CSmartFactoryTest, CreateSmartObj_AttachSchema1_OneMandatoryFieldMissed_ExpectCreatedObjectNotCorrespondsSmSchema) {
+ CSmartFactoryTest test_factory;
+ // Create empty SmartObject without any schema
+ SmartObject obj;
+ // Attach schema to object
+ EXPECT_TRUE(test_factory.AttachSchema(StructIdentifiersTest::Common_1, obj));
+ obj["text"] = "test";
+ std::set<std::string> keys = obj.enumerate();
+ EXPECT_EQ(1u, keys.size());
+ EXPECT_EQ(Errors::eType::MISSING_MANDATORY_PARAMETER, obj.validate());
+ EXPECT_FALSE(obj.isValid());
+}
+
+TEST(CSmartFactoryTest, CreateSmartObj_AttachSchema2_ExpectCreatedObjectCorrespondsSmSchema) {
+ CSmartFactoryTest test_factory;
+ // Create empty SmartObject without any schema
+ SmartObject obj;
+ // Attach schema to object
+ EXPECT_TRUE(test_factory.AttachSchema(StructIdentifiersTest::Common_2, obj));
+ obj["text"] = "test1";
+ obj["position"] = 200;
+ std::set<std::string> keys = obj.enumerate();
+ EXPECT_EQ(2u, keys.size());
+ EXPECT_EQ(Errors::eType::OK, obj.validate());
+ EXPECT_TRUE(obj.isValid());
+}
+
+TEST(CSmartFactoryTest, CreateSmartObj_AttachSchema_ExpectCreatedObjectCorrespondsSmSchema) {
+ CSmartFactoryTest test_factory;
+ // Create empty SmartObject without any schema
+ SmartObject obj;
+ // Attach schema to object
+ EXPECT_TRUE(test_factory.AttachSchema(StructIdentifiersTest::Common_1, obj));
+ obj["text"] = "test";
+ obj["position"] = 200;
+ obj["image"]["text"] = "test2";
+ obj["image"]["position"] = 100;
+ EXPECT_EQ(Errors::eType::OK, obj["image"].validate());
+ std::set<std::string> keys = obj.enumerate();
+ EXPECT_EQ(3u, keys.size());
+ EXPECT_EQ(Errors::eType::OK, obj.validate());
+ EXPECT_TRUE(obj.isValid());
+}
+
+TEST(CSmartFactoryTest, CreateSmartObj_WithSchemaFromStructId_ExpectCreatedObjectCorrespondsSmSchema) {
+ CSmartFactoryTest test_factory;
+ // Create empty SmartObject with schema correspopnding StructId
+ SmartObject obj = test_factory.CreateSmartObject(
+ StructIdentifiersTest::Common_1);
+ // Add fields
+ obj["text"] = "test";
+ obj["position"] = 200;
+ obj["image"]["text"] = "test2";
+ obj["image"]["position"] = 100;
+ // Check object "image"
+ EXPECT_EQ(Errors::eType::OK, obj["image"].validate());
+ std::set<std::string> keys = obj.enumerate();
+ EXPECT_EQ(3u, keys.size());
+ // Check global object
+ EXPECT_EQ(Errors::eType::OK, obj.validate());
+ EXPECT_TRUE(obj.isValid());
+}
+
+TEST(CSmartFactoryTest, CreateSmartObj_WithSchemaFromStructId_MissedOneField_ExpectCreatedObjectNotCorrespondsSmSchema) {
+ CSmartFactoryTest test_factory;
+ // Create empty SmartObject with schema correspopnding StructId
+ SmartObject obj = test_factory.CreateSmartObject(
+ StructIdentifiersTest::Common_1);
+ // Add fields. One missed.
+ obj["text"] = "test";
+ obj["image"]["text"] = "test2";
+ obj["image"]["position"] = 100;
+ // Check object "image"
+ EXPECT_EQ(Errors::eType::OK, obj["image"].validate());
+ std::set<std::string> keys = obj.enumerate();
+ EXPECT_EQ(2u, keys.size());
+ // Check global object
+ EXPECT_EQ(Errors::eType::MISSING_MANDATORY_PARAMETER, obj.validate());
+ EXPECT_FALSE(obj.isValid());
+}
+
+TEST(CSmartFactoryTest, CreateSmartObj_WithSchemaFromStructId2_ExpectCreatedObjectCorrespondsSmSchema) {
+ CSmartFactoryTest test_factory;
+ // Create empty SmartObject with schema correspopnding StructId
+ SmartObject obj = test_factory.CreateSmartObject(
+ StructIdentifiersTest::Common_2);
+ // Add fields
+ obj["text"] = "test";
+ obj["position"] = 200;
+ obj["image"]["text"] = "test2";
+ obj["image"]["position"] = 100;
+ // Check object "image"
+ EXPECT_EQ(Errors::eType::OK, obj["image"].validate());
+ std::set<std::string> keys = obj.enumerate();
+ EXPECT_EQ(3u, keys.size());
+ // Check global object
+ EXPECT_EQ(Errors::eType::OK, obj.validate());
+ EXPECT_TRUE(obj.isValid());
+}
+
+TEST(CSmartFactoryTest, CreateSmartObj_WithSchemaFromStructId2_MissedOneField_ExpectCreatedObjectNotCorrespondsSmSchema) {
+ CSmartFactoryTest test_factory;
+ // Create empty SmartObject with schema correspopnding StructId
+ SmartObject obj = test_factory.CreateSmartObject(
+ StructIdentifiersTest::Common_2);
+ // Add fields. One missed.
+ obj["text"] = "test";
+ obj["image"]["text"] = "test2";
+ std::set<std::string> keys = obj.enumerate();
+ EXPECT_EQ(2u, keys.size());
+ // Check global object
+ EXPECT_EQ(Errors::eType::MISSING_MANDATORY_PARAMETER, obj.validate());
+ EXPECT_FALSE(obj.isValid());
+}
+
+TEST(CSmartFactoryTest, CreateSmartObj_WithSchemaFromStructId2_InvalidValueAdded_ExpectCreatedObjectNotCorrespondsSmSchema) {
+ CSmartFactoryTest test_factory;
+ // Create empty SmartObject with schema correspopnding StructId
+ SmartObject obj = test_factory.CreateSmartObject(
+ StructIdentifiersTest::Common_2);
+ // Add fields. One missed.
+ obj["text"] = 111;
+ obj["position"] = 200;
+ obj["image"]["text"] = "test2";
+ std::set<std::string> keys = obj.enumerate();
+ EXPECT_EQ(3u, keys.size());
+ // Check global object
+ EXPECT_EQ(Errors::eType::INVALID_VALUE, obj.validate());
+ EXPECT_FALSE(obj.isValid());
+}
+
+TEST(CSmartFactoryTest, GetSchemaWithSmartFactory_ExpectReceivedSchema) {
+ CSmartFactoryTest test_factory;
+ CSmartSchema schema;
+ EXPECT_TRUE(
+ test_factory.GetSchema(FunctionIdTest::Function1,
+ MessageTypeTest::request, schema));
+}
+
+TEST(CSmartFactoryTest, GetNotExistedSchemaWithSmartFactory_ExpectNotReceivedSchema) {
+ CSmartFactoryTest test_factory;
+ CSmartSchema schema;
+ EXPECT_FALSE(
+ test_factory.GetSchema(FunctionIdTest::Function1,
+ MessageTypeTest::INVALID_ENUM, schema));
+}
+
+TEST(CSmartFactoryTest, GetSchemaWithSmartFactoryWithStructId1_ExpectReceivedSchema) {
+ CSmartFactoryTest test_factory;
+ CSmartSchema schema;
+ EXPECT_TRUE(test_factory.GetSchema(StructIdentifiersTest::Common_1, schema));
+}
+
+TEST(CSmartFactoryTest, GetSchemaWithSmartFactoryWithStructId2_ExpectReceivedSchema) {
+ CSmartFactoryTest test_factory;
+ CSmartSchema schema;
+ EXPECT_TRUE(test_factory.GetSchema(StructIdentifiersTest::Common_2, schema));
+}
+
+TEST(CSmartFactoryTest, GetNotExistedSchemaWithSmartFactoryWithStructId_ExpectNotReceivedSchema) {
+ CSmartFactoryTest test_factory;
+ CSmartSchema schema;
+ EXPECT_FALSE(
+ test_factory.GetSchema(StructIdentifiersTest::INVALID_ENUM, schema));
+}
+
+} // namespace formatters
+} // namespace components
+} // namespace test
+
diff --git a/src/components/formatters/test/cFormatterJsonSDLRPCv1_test.cc b/src/components/formatters/test/cFormatterJsonSDLRPCv1_test.cc
new file mode 100644
index 000000000..55b7f886f
--- /dev/null
+++ b/src/components/formatters/test/cFormatterJsonSDLRPCv1_test.cc
@@ -0,0 +1,502 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "gtest/gtest.h"
+
+#include "formatters/CFormatterJsonSDLRPCv1.hpp"
+#include "create_smartSchema.h"
+
+namespace test {
+namespace components {
+namespace formatters {
+
+TEST(CFormatterJsonSDLRPCv1Test, EmptySmartObjectToString) {
+ SmartObject srcObj;
+
+ EXPECT_EQ(Errors::eType::OK, srcObj.validate());
+
+ std::string jsonString;
+ bool result = CFormatterJsonSDLRPCv1::toString(srcObj, jsonString);
+
+ EXPECT_TRUE(result);
+
+ std::string expectOutputJsonString =
+ "{\n \
+ \"\" : {\n\
+ \"name\" : \"\",\n\
+ \"parameters\" : \"\"\n\
+ }\n\
+}\n";
+
+ EXPECT_EQ(expectOutputJsonString, jsonString);
+}
+
+TEST(CFormatterJsonSDLRPCv1Test, SmObjWithRequestWithoutMsgNotValid_ToString) {
+ SmartObject srcObj;
+ CSmartSchema schema = initObjectSchema();
+ srcObj.setSchema(schema);
+
+ srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request;
+ srcObj[S_PARAMS][S_FUNCTION_ID] = FunctionIDTest::RegisterAppInterface;
+ srcObj[S_PARAMS][S_CORRELATION_ID] = 13;
+ srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0;
+ srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 1;
+
+ EXPECT_EQ(Errors::eType::MISSING_MANDATORY_PARAMETER, srcObj.validate());
+
+ std::string jsonString;
+ bool result = CFormatterJsonSDLRPCv1::toString(srcObj, jsonString);
+ EXPECT_TRUE(result);
+
+ std::string expectOutputJsonString =
+ "{\n \
+ \"request\" : {\n\
+ \"correlationID\" : 13,\n\
+ \"name\" : \"RegisterAppInterface\",\n\
+ \"parameters\" : \"\"\n\
+ }\n\
+}\n";
+
+ EXPECT_EQ(expectOutputJsonString, jsonString);
+}
+
+TEST(CFormatterJsonSDLRPCv1Test, SmObjWithRequestWithEmptyMsgWithTestSchemaToString) {
+ SmartObject srcObj;
+ CSmartSchema schema = initObjectSchema();
+ srcObj.setSchema(schema);
+
+ srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request;
+ srcObj[S_PARAMS][S_FUNCTION_ID] = FunctionIDTest::RegisterAppInterface;
+ srcObj[S_PARAMS][S_CORRELATION_ID] = 13;
+ srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0;
+ srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 1;
+ srcObj[S_MSG_PARAMS][""] = "";
+
+ EXPECT_EQ(Errors::eType::OK, srcObj.validate());
+
+ std::string jsonString;
+
+ bool result = CFormatterJsonSDLRPCv1::toString(srcObj, jsonString);
+
+ EXPECT_TRUE(result);
+
+ std::string expectOutputJsonString =
+ "{\n \
+ \"request\" : {\n\
+ \"correlationID\" : 13,\n\
+ \"name\" : \"RegisterAppInterface\",\n\
+ \"parameters\" : {}\n\
+ }\n\
+}\n";
+
+ EXPECT_EQ(expectOutputJsonString, jsonString);
+}
+
+TEST(CFormatterJsonSDLRPCv1Test, SmObjWithRequestWithNonemptyMsgWithTestSchemaToString) {
+ SmartObject srcObj;
+ CSmartSchema schema = initObjectSchema();
+ srcObj.setSchema(schema);
+
+ srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request;
+ srcObj[S_PARAMS][S_FUNCTION_ID] = FunctionIDTest::RegisterAppInterface;
+ srcObj[S_PARAMS][S_CORRELATION_ID] = 13;
+ srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0;
+ srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 1;
+ srcObj[S_MSG_PARAMS]["info"] = "value";
+
+ std::string jsonString;
+
+ bool result = CFormatterJsonSDLRPCv1::toString(srcObj, jsonString);
+
+ EXPECT_TRUE(result);
+
+ std::string expectOutputJsonString =
+ "{\n \
+ \"request\" : {\n\
+ \"correlationID\" : 13,\n\
+ \"name\" : \"RegisterAppInterface\",\n\
+ \"parameters\" : {\n\
+ \"info\" : \"value\"\n\
+ }\n\
+ }\n\
+}\n";
+
+ EXPECT_EQ(expectOutputJsonString, jsonString);
+}
+
+TEST(CFormatterJsonSDLRPCv1Test, SmObjWithRequestWithNonemptyMsgToString) {
+ SmartObject srcObj;
+
+ srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request;
+ srcObj[S_PARAMS][S_FUNCTION_ID] = 5;
+ srcObj[S_PARAMS][S_CORRELATION_ID] = 13;
+ srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0;
+ srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 1;
+ srcObj[S_MSG_PARAMS]["vrSynonyms"][0] = "Synonym 1";
+
+ std::string jsonString;
+
+ bool result = CFormatterJsonSDLRPCv1::toString(srcObj, jsonString);
+
+ EXPECT_TRUE(result);
+
+ std::string expectOutputJsonString =
+ "{\n \
+ \"0\" : {\n\
+ \"correlationID\" : 13,\n\
+ \"name\" : \"5\",\n\
+ \"parameters\" : {\n\
+ \"vrSynonyms\" : [ \"Synonym 1\" ]\n\
+ }\n\
+ }\n\
+}\n";
+ EXPECT_EQ(expectOutputJsonString, jsonString);
+}
+
+TEST(CFormatterJsonSDLRPCv1Test, SmObjWithResponseWithoutSchemaToString) {
+ SmartObject srcObj;
+
+ srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::response;
+ srcObj[S_PARAMS][S_FUNCTION_ID] = 5;
+ srcObj[S_PARAMS][S_CORRELATION_ID] = 13;
+ srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0;
+ srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 1;
+ srcObj[S_MSG_PARAMS]["success"] = true;
+ srcObj[S_MSG_PARAMS]["resultCode"] = 0;
+
+ std::string jsonString;
+
+ bool result = CFormatterJsonSDLRPCv1::toString(srcObj, jsonString);
+
+ EXPECT_TRUE(result);
+
+ std::string expectOutputJsonString =
+ "{\n \
+ \"1\" : {\n\
+ \"correlationID\" : 13,\n\
+ \"name\" : \"5\",\n\
+ \"parameters\" : {\n\
+ \"resultCode\" : 0,\n\
+ \"success\" : true\n\
+ }\n\
+ }\n\
+}\n";
+ EXPECT_EQ(expectOutputJsonString, jsonString);
+}
+
+TEST(CFormatterJsonSDLRPCv1Test, SmObjWithNotificationToString) {
+ SmartObject srcObj;
+ CSmartSchema schema = initObjectSchema();
+ srcObj.setSchema(schema);
+
+ srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::notification;
+ srcObj[S_PARAMS][S_FUNCTION_ID] = FunctionIDTest::SetGlobalProperties;
+ srcObj[S_PARAMS][S_CORRELATION_ID] = 13;
+ srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0;
+ srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 1;
+ srcObj[S_MSG_PARAMS][""] = "";
+ std::string jsonString;
+
+ bool result = CFormatterJsonSDLRPCv1::toString(srcObj, jsonString);
+
+ EXPECT_TRUE(result);
+
+ std::string expectOutputJsonString =
+ "{\n \
+ \"notification\" : {\n\
+ \"correlationID\" : 13,\n\
+ \"name\" : \"SetGlobalProperties\",\n\
+ \"parameters\" : {}\n\
+ }\n\
+}\n";
+
+ EXPECT_EQ(expectOutputJsonString, jsonString);
+}
+
+TEST(CFormatterJsonSDLRPCv1Test, SmObjWithResponseToString) {
+ SmartObject srcObj;
+
+ CSmartSchema schema = initObjectSchema();
+ srcObj.setSchema(schema);
+
+ srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::response;
+ srcObj[S_PARAMS][S_FUNCTION_ID] = FunctionIDTest::RegisterAppInterface;
+ srcObj[S_PARAMS][S_CORRELATION_ID] = 13;
+ srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0;
+ srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 1;
+
+ srcObj[S_MSG_PARAMS]["success"] = true;
+ srcObj[S_MSG_PARAMS]["resultCode"] = TestType::SUCCESS;
+
+ std::string jsonString;
+
+ bool result = CFormatterJsonSDLRPCv1::toString(srcObj, jsonString);
+
+ EXPECT_TRUE(result);
+
+ std::string expectOutputJsonString =
+ "{\n \
+ \"response\" : {\n\
+ \"correlationID\" : 13,\n\
+ \"name\" : \"RegisterAppInterface\",\n\
+ \"parameters\" : {\n\
+ \"resultCode\" : \"SUCCESS\",\n\
+ \"success\" : true\n\
+ }\n\
+ }\n\
+}\n";
+
+ EXPECT_EQ(expectOutputJsonString, jsonString);
+}
+
+TEST(CFormatterJsonSDLRPCv1Test, SmObjWithResponseWithoutSchemaWithoutParamsToString) {
+ SmartObject srcObj;
+ srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::response;
+ std::string jsonString;
+
+ bool result = CFormatterJsonSDLRPCv1::toString(srcObj, jsonString);
+
+ EXPECT_TRUE(result);
+
+ std::string expectOutputJsonString =
+ "{\n \
+ \"1\" : {\n\
+ \"name\" : \"\",\n\
+ \"parameters\" : \"\"\n\
+ }\n\
+}\n";
+
+ EXPECT_EQ(expectOutputJsonString, jsonString);
+}
+
+TEST(CFormatterJsonSDLRPCv1Test, StringRequestToSmObj) {
+ std::string inputJsonString =
+ "\
+ {\
+ \"request\": {\
+ \"correlationID\": 5,\
+ \"name\" : \"RegisterAppInterface\",\n\
+ \"parameters\": {\
+ \"syncMsgVersion\" : {\
+ \"majorVersion\" : 2,\
+ \"minorVersion\" : 10\
+ },\
+ \"appName\": \"some app name\",\
+ \"ttsName\": [{\
+ \"text\": \"ABC\",\
+ \"type\": \"TEXT\"\
+ }],\
+ \"vrSynonyms\": [\"Synonym 1\", \"Synonym 2\"]\
+ }\
+ }\
+ }";
+
+ SmartObject obj;
+
+ CSmartSchema schema = initObjectSchema();
+ obj.setSchema(schema);
+
+ bool result = CFormatterJsonSDLRPCv1::fromString<FunctionIDTest::eType,
+ MessageTypeTest::eType>(inputJsonString, obj);
+
+ EXPECT_EQ(CFormatterJsonSDLRPCv1::kSuccess, result);
+ EXPECT_EQ(Errors::eType::OK, obj.validate());
+ EXPECT_EQ(obj[S_PARAMS][S_MESSAGE_TYPE], MessageTypeTest::request);
+ EXPECT_EQ(obj[S_PARAMS][S_FUNCTION_ID], FunctionIDTest::RegisterAppInterface);
+ EXPECT_EQ(obj[S_PARAMS][S_CORRELATION_ID], 5);
+ EXPECT_EQ(obj[S_PARAMS][S_PROTOCOL_TYPE], 0);
+ EXPECT_EQ(obj[S_PARAMS][S_PROTOCOL_VERSION], 1);
+ EXPECT_EQ(obj[S_MSG_PARAMS]["appName"], "some app name");
+
+ EXPECT_EQ(obj[S_MSG_PARAMS]["syncMsgVersion"]["majorVersion"], 2);
+ EXPECT_EQ(obj[S_MSG_PARAMS]["syncMsgVersion"]["minorVersion"], 10);
+ EXPECT_EQ(obj[S_MSG_PARAMS]["ttsName"][0]["text"], "ABC");
+ EXPECT_EQ(obj[S_MSG_PARAMS]["ttsName"][0]["type"], "TEXT");
+ EXPECT_EQ(obj[S_MSG_PARAMS]["vrSynonyms"][0], "Synonym 1");
+ EXPECT_EQ(obj[S_MSG_PARAMS]["vrSynonyms"][1], "Synonym 2");
+}
+
+TEST(CFormatterJsonSDLRPCv1Test, StringRequestWithoutNameToSmartObject) {
+ std::string inputJsonString =
+ "\
+ {\
+ \"request\": {\
+ \"correlationID\": 5,\
+ \"parameters\": {\
+ \"syncMsgVersion\" : {\
+ \"majorVersion\" : 2,\
+ \"minorVersion\" : 10\
+ },\
+ \"appName\": \"some app name\",\
+ \"ttsName\": [{\
+ \"text\": \"ABC\",\
+ \"type\": \"TEXT\"\
+ }],\
+ \"vrSynonyms\": [\"Synonym 1\", \"Synonym 2\"]\
+ }\
+ }\
+ }";
+
+ SmartObject obj;
+
+ bool result = CFormatterJsonSDLRPCv1::fromString<FunctionIDTest::eType,
+ MessageTypeTest::eType>(inputJsonString, obj);
+
+ EXPECT_EQ(CFormatterJsonSDLRPCv1::kParsingError, result);
+
+ EXPECT_EQ(obj[S_PARAMS][S_MESSAGE_TYPE], MessageTypeTest::request);
+ EXPECT_EQ(obj[S_PARAMS][S_FUNCTION_ID], "-1");
+ EXPECT_EQ(obj[S_PARAMS][S_CORRELATION_ID], 5);
+ EXPECT_EQ(obj[S_MSG_PARAMS]["appName"], "some app name");
+
+ EXPECT_EQ(obj[S_MSG_PARAMS]["syncMsgVersion"]["majorVersion"], 2);
+ EXPECT_EQ(obj[S_MSG_PARAMS]["syncMsgVersion"]["minorVersion"], 10);
+ EXPECT_EQ(obj[S_MSG_PARAMS]["ttsName"][0]["text"], "ABC");
+ EXPECT_EQ(obj[S_MSG_PARAMS]["ttsName"][0]["type"], "TEXT");
+ EXPECT_EQ(obj[S_MSG_PARAMS]["vrSynonyms"][0], "Synonym 1");
+ EXPECT_EQ(obj[S_MSG_PARAMS]["vrSynonyms"][1], "Synonym 2");
+}
+
+TEST(CFormatterJsonSDLRPCv1Test, StringRequestWithIncorrectCorIDToSmartObject) {
+ std::string inputJsonString =
+ "\
+ {\
+ \"request\": {\
+ \"correlationID\": \"5\",\
+ \"parameters\": {\
+ \"syncMsgVersion\" : {\
+ \"majorVersion\" : 2,\
+ \"minorVersion\" : 10\
+ },\
+ \"appName\": \"some app name\",\
+ \"ttsName\": [{\
+ \"text\": \"ABC\",\
+ \"type\": \"TEXT\"\
+ }],\
+ \"vrSynonyms\": [\"Synonym 1\", \"Synonym 2\"]\
+ }\
+ }\
+ }";
+
+ SmartObject obj;
+
+ bool result = CFormatterJsonSDLRPCv1::fromString<FunctionIDTest::eType,
+ MessageTypeTest::eType>(inputJsonString, obj);
+ EXPECT_EQ(CFormatterJsonSDLRPCv1::kParsingError, result);
+
+ EXPECT_EQ(obj[S_PARAMS][S_MESSAGE_TYPE], MessageTypeTest::request);
+ EXPECT_EQ(obj[S_PARAMS][S_FUNCTION_ID], "-1");
+ EXPECT_EQ(obj[S_MSG_PARAMS]["appName"], "some app name");
+ EXPECT_EQ(obj[S_MSG_PARAMS]["syncMsgVersion"]["majorVersion"], 2);
+ EXPECT_EQ(obj[S_MSG_PARAMS]["ttsName"][0]["text"], "ABC");
+ EXPECT_EQ(obj[S_MSG_PARAMS]["vrSynonyms"][0], "Synonym 1");
+}
+
+TEST(CFormatterJsonSDLRPCv1Test, StringResponceToSmartObject) {
+ std::string inputJsonString =
+ "{\n \
+ \"response\" : {\n\
+ \"correlationID\" : 13,\n\
+ \"name\" : \"RegisterAppInterface\",\n\
+ \"parameters\" : {\n\
+ \"resultCode\" : \"SUCCESS\",\n\
+ \"success\" : true\n\
+ }\n\
+ }\n\
+}\n";
+
+ SmartObject obj;
+
+ CSmartSchema schema = initObjectSchema();
+ obj.setSchema(schema);
+
+ bool result = CFormatterJsonSDLRPCv1::fromString<FunctionIDTest::eType,
+ MessageTypeTest::eType>(inputJsonString, obj);
+ EXPECT_EQ(CFormatterJsonSDLRPCv1::kSuccess, result);
+ EXPECT_EQ(obj[S_PARAMS][S_MESSAGE_TYPE], MessageTypeTest::response);
+ EXPECT_EQ(obj[S_PARAMS][S_FUNCTION_ID], 0);
+ EXPECT_EQ(obj[S_PARAMS][S_CORRELATION_ID], 13);
+ EXPECT_EQ(obj[S_PARAMS][S_PROTOCOL_TYPE], 0);
+ EXPECT_EQ(obj[S_PARAMS][S_PROTOCOL_VERSION], 1);
+ EXPECT_EQ(obj[S_MSG_PARAMS]["resultCode"], "SUCCESS");
+ EXPECT_EQ(obj[S_MSG_PARAMS]["success"], true);
+}
+
+TEST(CFormatterJsonSDLRPCv1Test, StringNotificationToSmartObject) {
+ std::string inputJsonString =
+ "{\n \
+ \"notification\" : {\n\
+ \"correlationID\" : 13,\n\
+ \"name\" : \"SetGlobalProperties\",\n\
+ \"parameters\" : {}\n\
+ }\n\
+}\n";
+
+ SmartObject obj;
+
+ CSmartSchema schema = initObjectSchema();
+ obj.setSchema(schema);
+
+ bool result = CFormatterJsonSDLRPCv1::fromString<FunctionIDTest::eType,
+ MessageTypeTest::eType>(inputJsonString, obj);
+ EXPECT_EQ(CFormatterJsonSDLRPCv1::kSuccess, result);
+ EXPECT_EQ(Errors::eType::OK, obj.validate());
+ EXPECT_EQ(obj[S_PARAMS][S_MESSAGE_TYPE], MessageTypeTest::notification);
+ EXPECT_EQ(obj[S_PARAMS][S_FUNCTION_ID], FunctionIDTest::SetGlobalProperties);
+ EXPECT_EQ(obj[S_PARAMS][S_CORRELATION_ID], 13);
+ EXPECT_EQ(obj[S_PARAMS][S_PROTOCOL_TYPE], 0);
+ EXPECT_EQ(obj[S_PARAMS][S_PROTOCOL_VERSION], 1);
+}
+
+TEST(CFormatterJsonSDLRPCv1Test, MetaFormatToString) {
+ SmartObject srcObj;
+
+ srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request;
+ srcObj[S_PARAMS][S_FUNCTION_ID] = FunctionIDTest::RegisterAppInterface;
+ srcObj[S_PARAMS][S_CORRELATION_ID] = 13;
+ srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0;
+ srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 1;
+ srcObj[S_MSG_PARAMS]["info"] = "value";
+
+ std::string jsonString;
+
+ CSmartSchema schema = initObjectSchema();
+ srcObj.setSchema(schema);
+
+ meta_formatter_error_code::tMetaFormatterErrorCode result =
+ CFormatterJsonSDLRPCv1::MetaFormatToString(srcObj, schema, jsonString);
+ EXPECT_EQ(meta_formatter_error_code::kErrorOk, result);
+}
+
+} // namespace formatters
+} // namespace components
+} // namespace test
diff --git a/src/components/formatters/test/cFormatterJsonSDLRPCv2_test.cc b/src/components/formatters/test/cFormatterJsonSDLRPCv2_test.cc
new file mode 100644
index 000000000..814cff4ab
--- /dev/null
+++ b/src/components/formatters/test/cFormatterJsonSDLRPCv2_test.cc
@@ -0,0 +1,392 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "gtest/gtest.h"
+#include "create_smartSchema.h"
+#include "formatters/CFormatterJsonSDLRPCv2.hpp"
+
+namespace test {
+namespace components {
+namespace formatters {
+
+TEST(CFormatterJsonSDLRPCv2Test, EmptySmartObjectToString) {
+ SmartObject srcObj;
+
+ EXPECT_EQ(Errors::eType::OK, srcObj.validate());
+
+ std::string jsonString;
+ bool result = CFormatterJsonSDLRPCv2::toString(srcObj, jsonString);
+
+ EXPECT_TRUE(result);
+
+ std::string expectOutputJsonString = "\"\"\n";
+
+ EXPECT_EQ(expectOutputJsonString, jsonString);
+}
+
+TEST(CFormatterJsonSDLRPCv2Test, SmObjWithRequestWithoutMsgNotValid_ToString) {
+ SmartObject srcObj;
+ CSmartSchema schema = initObjectSchema();
+ srcObj.setSchema(schema);
+
+ srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request;
+ srcObj[S_PARAMS][S_FUNCTION_ID] = FunctionIDTest::RegisterAppInterface;
+ srcObj[S_PARAMS][S_CORRELATION_ID] = 13;
+ srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0;
+ srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 2;
+
+ EXPECT_EQ(Errors::eType::MISSING_MANDATORY_PARAMETER, srcObj.validate());
+
+ std::string jsonString;
+ bool result = CFormatterJsonSDLRPCv2::toString(srcObj, jsonString);
+ EXPECT_TRUE(result);
+
+ std::string expectOutputJsonString = "\"\"\n";
+
+ EXPECT_EQ(expectOutputJsonString, jsonString);
+}
+
+TEST(CFormatterJsonSDLRPCv2Test, SmObjWithRequestWithEmptyMsgWithTestSchemaToString) {
+ SmartObject srcObj;
+ CSmartSchema schema = initObjectSchema();
+ srcObj.setSchema(schema);
+
+ srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request;
+ srcObj[S_PARAMS][S_FUNCTION_ID] = FunctionIDTest::RegisterAppInterface;
+ srcObj[S_PARAMS][S_CORRELATION_ID] = 13;
+ srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0;
+ srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 2;
+ srcObj[S_MSG_PARAMS][""] = "";
+
+ EXPECT_EQ(Errors::eType::OK, srcObj.validate());
+
+ std::string jsonString;
+
+ bool result = CFormatterJsonSDLRPCv2::toString(srcObj, jsonString);
+
+ EXPECT_TRUE(result);
+
+ std::string expectOutputJsonString = "{}\n";
+
+ EXPECT_EQ(expectOutputJsonString, jsonString);
+}
+
+TEST(CFormatterJsonSDLRPCv2Test, SmObjWithRequestWithNonemptyMsgWithTestSchemaToString) {
+ SmartObject srcObj;
+ CSmartSchema schema = initObjectSchema();
+ srcObj.setSchema(schema);
+
+ srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request;
+ srcObj[S_PARAMS][S_FUNCTION_ID] = FunctionIDTest::RegisterAppInterface;
+ srcObj[S_PARAMS][S_CORRELATION_ID] = 13;
+ srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0;
+ srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 2;
+ srcObj[S_MSG_PARAMS]["info"] = "value";
+
+ std::string jsonString;
+
+ bool result = CFormatterJsonSDLRPCv2::toString(srcObj, jsonString);
+
+ EXPECT_TRUE(result);
+
+ std::string expectOutputJsonString = "{\n \"info\" : \"value\"\n}\n";
+
+ EXPECT_EQ(expectOutputJsonString, jsonString);
+}
+
+TEST(CFormatterJsonSDLRPCv2Test, SmObjWithRequestWithNonemptyMsgToString) {
+ SmartObject srcObj;
+
+ srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request;
+ srcObj[S_PARAMS][S_FUNCTION_ID] = 5;
+ srcObj[S_PARAMS][S_CORRELATION_ID] = 13;
+ srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0;
+ srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 2;
+ srcObj[S_MSG_PARAMS]["vrSynonyms"][0] = "Synonym 1";
+
+ std::string jsonString;
+
+ bool result = CFormatterJsonSDLRPCv2::toString(srcObj, jsonString);
+
+ EXPECT_TRUE(result);
+
+ std::string expectOutputJsonString =
+ "{\n \"vrSynonyms\" : [ \"Synonym 1\" ]\n}\n";
+ EXPECT_EQ(expectOutputJsonString, jsonString);
+}
+
+TEST(CFormatterJsonSDLRPCv2Test, SmObjWithResponseWithoutSchemaToString) {
+ SmartObject srcObj;
+
+ srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::response;
+ srcObj[S_PARAMS][S_FUNCTION_ID] = 5;
+ srcObj[S_PARAMS][S_CORRELATION_ID] = 13;
+ srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0;
+ srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 2;
+ srcObj[S_MSG_PARAMS]["success"] = true;
+ srcObj[S_MSG_PARAMS]["resultCode"] = 0;
+
+ std::string jsonString;
+
+ bool result = CFormatterJsonSDLRPCv2::toString(srcObj, jsonString);
+
+ EXPECT_TRUE(result);
+
+ std::string expectOutputJsonString =
+ "{\n \"resultCode\" : 0,\n \"success\" : true\n}\n";
+ EXPECT_EQ(expectOutputJsonString, jsonString);
+}
+
+TEST(CFormatterJsonSDLRPCv2Test, SmObjWithNotificationToString) {
+ SmartObject srcObj;
+ CSmartSchema schema = initObjectSchema();
+ srcObj.setSchema(schema);
+
+ srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::notification;
+ srcObj[S_PARAMS][S_FUNCTION_ID] = FunctionIDTest::SetGlobalProperties;
+ srcObj[S_PARAMS][S_CORRELATION_ID] = 13;
+ srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0;
+ srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 2;
+ srcObj[S_MSG_PARAMS]["info"] = "info_notification";
+ std::string jsonString;
+
+ bool result = CFormatterJsonSDLRPCv2::toString(srcObj, jsonString);
+
+ EXPECT_TRUE(result);
+
+ std::string expectOutputJsonString =
+ "{\n \"info\" : \"info_notification\"\n}\n";
+
+ EXPECT_EQ(expectOutputJsonString, jsonString);
+}
+
+TEST(CFormatterJsonSDLRPCv2Test, SmObjWithResponseToString) {
+ SmartObject srcObj;
+
+ CSmartSchema schema = initObjectSchema();
+ srcObj.setSchema(schema);
+
+ srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::response;
+ srcObj[S_PARAMS][S_FUNCTION_ID] = FunctionIDTest::RegisterAppInterface;
+ srcObj[S_PARAMS][S_CORRELATION_ID] = 13;
+ srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0;
+ srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 2;
+
+ srcObj[S_MSG_PARAMS]["success"] = true;
+ srcObj[S_MSG_PARAMS]["resultCode"] = TestType::SUCCESS;
+
+ std::string jsonString;
+
+ bool result = CFormatterJsonSDLRPCv2::toString(srcObj, jsonString);
+
+ EXPECT_TRUE(result);
+
+ std::string expectOutputJsonString =
+ "{\n \"resultCode\" : \"SUCCESS\",\n \"success\" : true\n}\n";
+
+ EXPECT_EQ(expectOutputJsonString, jsonString);
+}
+
+TEST(CFormatterJsonSDLRPCv2Test, SmObjWithResponseWithoutSchemaWithoutParamsToString) {
+ SmartObject srcObj;
+ srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::response;
+ std::string jsonString;
+
+ bool result = CFormatterJsonSDLRPCv2::toString(srcObj, jsonString);
+
+ EXPECT_TRUE(result);
+
+ std::string expectOutputJsonString = "\"\"\n";
+
+ EXPECT_EQ(expectOutputJsonString, jsonString);
+}
+
+TEST(CFormatterJsonSDLRPCv2Test, StringRequestWithoutCorIdToSmObj) {
+ std::string inputJsonString =
+ "\
+ {\
+ \"syncMsgVersion\" : {\
+ \"majorVersion\" : 2,\
+ \"minorVersion\" : 10\
+ },\
+ \"appName\": \"some app name\",\
+ \"ttsName\": [{\
+ \"text\": \"ABC\",\
+ \"type\": \"TEXT\"\
+ }],\
+ \"vrSynonyms\": [\"Synonym 1\", \"Synonym 2\"]\
+ }\n";
+
+ SmartObject obj;
+
+ CSmartSchema schema = initObjectSchema();
+ obj.setSchema(schema);
+
+ bool result = CFormatterJsonSDLRPCv2::fromString<FunctionIDTest::eType,
+ MessageTypeTest::eType>(inputJsonString, obj,
+ FunctionIDTest::RegisterAppInterface,
+ MessageTypeTest::request);
+
+ EXPECT_EQ(true, result);
+ EXPECT_EQ(Errors::eType::MISSING_MANDATORY_PARAMETER, obj.validate());
+ EXPECT_EQ(obj[S_PARAMS][S_MESSAGE_TYPE], MessageTypeTest::request);
+ EXPECT_EQ(obj[S_PARAMS][S_FUNCTION_ID], FunctionIDTest::RegisterAppInterface);
+ EXPECT_EQ(obj[S_PARAMS][S_PROTOCOL_TYPE], 0);
+ EXPECT_EQ(obj[S_PARAMS][S_PROTOCOL_VERSION], 2);
+ EXPECT_EQ(obj[S_MSG_PARAMS]["appName"], "some app name");
+
+ EXPECT_EQ(obj[S_MSG_PARAMS]["syncMsgVersion"]["majorVersion"], 2);
+ EXPECT_EQ(obj[S_MSG_PARAMS]["syncMsgVersion"]["minorVersion"], 10);
+ EXPECT_EQ(obj[S_MSG_PARAMS]["ttsName"][0]["text"], "ABC");
+ EXPECT_EQ(obj[S_MSG_PARAMS]["ttsName"][0]["type"], "TEXT");
+ EXPECT_EQ(obj[S_MSG_PARAMS]["vrSynonyms"][0], "Synonym 1");
+ EXPECT_EQ(obj[S_MSG_PARAMS]["vrSynonyms"][1], "Synonym 2");
+}
+
+TEST(CFormatterJsonSDLRPCv2Test, StringRequestWithCorIdToSmObj) {
+ std::string inputJsonString =
+ "\
+ {\
+ \"syncMsgVersion\" : {\
+ \"majorVersion\" : 2,\
+ \"minorVersion\" : 10\
+ },\
+ \"appName\": \"some app name\",\
+ \"ttsName\": [{\
+ \"text\": \"ABC\",\
+ \"type\": \"TEXT\"\
+ }],\
+ \"vrSynonyms\": [\"Synonym 1\", \"Synonym 2\"]\
+ }\n";
+
+ SmartObject obj;
+
+ CSmartSchema schema = initObjectSchema();
+ obj.setSchema(schema);
+ int32_t corId = 10;
+ bool result = CFormatterJsonSDLRPCv2::fromString<FunctionIDTest::eType,
+ MessageTypeTest::eType>(inputJsonString, obj,
+ FunctionIDTest::RegisterAppInterface,
+ MessageTypeTest::request, corId);
+
+ EXPECT_EQ(true, result);
+ EXPECT_EQ(Errors::eType::OK, obj.validate());
+ EXPECT_EQ(obj[S_PARAMS][S_MESSAGE_TYPE], MessageTypeTest::request);
+ EXPECT_EQ(obj[S_PARAMS][S_FUNCTION_ID], FunctionIDTest::RegisterAppInterface);
+ EXPECT_EQ(obj[S_PARAMS][S_CORRELATION_ID], corId);
+ EXPECT_EQ(obj[S_PARAMS][S_PROTOCOL_TYPE], 0);
+ EXPECT_EQ(obj[S_PARAMS][S_PROTOCOL_VERSION], 2);
+ EXPECT_EQ(obj[S_MSG_PARAMS]["appName"], "some app name");
+
+ EXPECT_EQ(obj[S_MSG_PARAMS]["syncMsgVersion"]["majorVersion"], 2);
+ EXPECT_EQ(obj[S_MSG_PARAMS]["syncMsgVersion"]["minorVersion"], 10);
+ EXPECT_EQ(obj[S_MSG_PARAMS]["ttsName"][0]["text"], "ABC");
+ EXPECT_EQ(obj[S_MSG_PARAMS]["ttsName"][0]["type"], "TEXT");
+ EXPECT_EQ(obj[S_MSG_PARAMS]["vrSynonyms"][0], "Synonym 1");
+ EXPECT_EQ(obj[S_MSG_PARAMS]["vrSynonyms"][1], "Synonym 2");
+}
+
+TEST(CFormatterJsonSDLRPCv2Test, StringResponceWithCorIdToSmartObject) {
+ std::string inputJsonString =
+ "{\n \
+ \"resultCode\" : \"SUCCESS\",\n\
+ \"success\" : true\n\
+ }\n";
+
+ SmartObject obj;
+
+ CSmartSchema schema = initObjectSchema();
+ obj.setSchema(schema);
+ int32_t corId = 10;
+ bool result = CFormatterJsonSDLRPCv2::fromString<FunctionIDTest::eType,
+ MessageTypeTest::eType>(inputJsonString, obj,
+ FunctionIDTest::RegisterAppInterface,
+ MessageTypeTest::response, corId);
+ EXPECT_EQ(true, result);
+
+ EXPECT_EQ(obj[S_PARAMS][S_MESSAGE_TYPE], MessageTypeTest::response);
+ EXPECT_EQ(obj[S_PARAMS][S_FUNCTION_ID], 0);
+ EXPECT_EQ(obj[S_PARAMS][S_CORRELATION_ID], corId);
+ EXPECT_EQ(obj[S_PARAMS][S_PROTOCOL_TYPE], 0);
+ EXPECT_EQ(obj[S_PARAMS][S_PROTOCOL_VERSION], 2);
+ EXPECT_EQ(obj[S_MSG_PARAMS]["resultCode"], "SUCCESS");
+ EXPECT_EQ(obj[S_MSG_PARAMS]["success"], true);
+}
+
+TEST(CFormatterJsonSDLRPCv2Test, StringNotificationToSmartObject) {
+ std::string inputJsonString =
+ "{\
+ \"info\" : \"info_notification\"\
+ }\n";
+
+ SmartObject obj;
+
+ CSmartSchema schema = initObjectSchema();
+ obj.setSchema(schema);
+ int32_t corId = 10;
+ bool result = CFormatterJsonSDLRPCv2::fromString<FunctionIDTest::eType,
+ MessageTypeTest::eType>(inputJsonString, obj,
+ FunctionIDTest::SetGlobalProperties,
+ MessageTypeTest::notification, corId);
+ EXPECT_EQ(true, result);
+ EXPECT_EQ(Errors::eType::OK, obj.validate());
+ EXPECT_EQ(obj[S_PARAMS][S_MESSAGE_TYPE], MessageTypeTest::notification);
+ EXPECT_EQ(obj[S_PARAMS][S_FUNCTION_ID], FunctionIDTest::SetGlobalProperties);
+ EXPECT_EQ(obj[S_PARAMS][S_CORRELATION_ID], corId);
+ EXPECT_EQ(obj[S_PARAMS][S_PROTOCOL_TYPE], 0);
+ EXPECT_EQ(obj[S_PARAMS][S_PROTOCOL_VERSION], 2);
+ EXPECT_EQ(obj[S_MSG_PARAMS]["info"], "info_notification");
+}
+
+TEST(CFormatterJsonSDLRPCv2Test, MetaFormatToString) {
+ SmartObject srcObj;
+
+ srcObj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request;
+ srcObj[S_PARAMS][S_FUNCTION_ID] = FunctionIDTest::RegisterAppInterface;
+ srcObj[S_PARAMS][S_CORRELATION_ID] = 13;
+ srcObj[S_PARAMS][S_PROTOCOL_TYPE] = 0;
+ srcObj[S_PARAMS][S_PROTOCOL_VERSION] = 2;
+ srcObj[S_MSG_PARAMS]["info"] = "value";
+
+ std::string jsonString;
+
+ CSmartSchema schema = initObjectSchema();
+ srcObj.setSchema(schema);
+
+ meta_formatter_error_code::tMetaFormatterErrorCode result =
+ CFormatterJsonSDLRPCv2::MetaFormatToString(srcObj, schema, jsonString);
+ EXPECT_EQ(meta_formatter_error_code::kErrorOk, result);
+}
+
+} // namespace formatters
+} // namespace components
+} // namespace test
diff --git a/src/components/formatters/test/formatter_json_rpc_test.cc b/src/components/formatters/test/formatter_json_rpc_test.cc
new file mode 100644
index 000000000..24bdc2fa3
--- /dev/null
+++ b/src/components/formatters/test/formatter_json_rpc_test.cc
@@ -0,0 +1,199 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <algorithm>
+#include "gtest/gtest.h"
+#include "formatters/formatter_json_rpc.h"
+#include "formatters/CSmartFactory.hpp"
+#include "HMI_API_schema.h"
+#include "MOBILE_API_schema.h"
+
+namespace test {
+namespace components {
+namespace formatters {
+
+using namespace NsSmartDeviceLink::NsSmartObjects;
+using namespace NsSmartDeviceLink::NsJSONHandler::Formatters;
+using namespace NsSmartDeviceLink::NsJSONHandler::strings;
+
+TEST(FormatterJsonRPCTest, CorrectRPCv1_request_SmartObjectToString_EXPECT_SUCCESS) {
+ // Create SmartObject
+ SmartObject obj;
+ obj[S_PARAMS][S_FUNCTION_ID] = hmi_apis::FunctionID::VR_IsReady;
+ obj[S_PARAMS][S_MESSAGE_TYPE] = hmi_apis::messageType::request;
+ obj[S_PARAMS][S_PROTOCOL_VERSION] = 2;
+ obj[S_PARAMS][S_PROTOCOL_TYPE] = 1;
+ obj[S_PARAMS][S_CORRELATION_ID] = 4444;
+ obj[S_MSG_PARAMS] = SmartObject(SmartType::SmartType_Map);
+ // Attach Schema
+ hmi_apis::HMI_API factory;
+ EXPECT_TRUE(factory.attachSchema(obj));
+
+ std::string result;
+ // Convert SmrtObject to Json string
+ EXPECT_TRUE(FormatterJsonRpc::ToString(obj, result));
+ EXPECT_EQ(
+ std::string(
+ "{\n \"id\" : 4444,\n \"jsonrpc\" : \"2.0\",\n \"method\" : \"VR.IsReady\"\n}\n"),
+ result);
+}
+
+TEST(FormatterJsonRPCTest, CorrectRPCv2_request_SmartObjectToString_EXPECT_SUCCESS) {
+ // Create SmartObject
+ SmartObject obj;
+ obj[S_PARAMS][S_FUNCTION_ID] = mobile_apis::FunctionID::AddCommandID;
+ obj[S_PARAMS][S_MESSAGE_TYPE] = mobile_apis::messageType::request;
+ obj[S_PARAMS][S_CORRELATION_ID] = 4444;
+ obj[S_MSG_PARAMS] = SmartObject(SmartType::SmartType_Map);
+ // Attach Schema
+ mobile_apis::MOBILE_API factory;
+ EXPECT_TRUE(factory.attachSchema(obj));
+
+ std::string result;
+ // Convert SmrtObject to Json string
+ EXPECT_TRUE(FormatterJsonRpc::ToString(obj, result));
+ EXPECT_EQ(
+ std::string(
+ "{\n \"id\" : 4444,\n \"jsonrpc\" : \"2.0\",\n \"method\" : \"AddCommandID\"\n}\n"),
+ result);
+}
+
+TEST(FormatterJsonRPCTest, CorrectRPCv1_notification_SmartObjectToString_EXPECT_SUCCESS) {
+ // Create SmartObject
+ SmartObject obj;
+ std::string result;
+ obj[S_PARAMS][S_FUNCTION_ID] = hmi_apis::FunctionID::Buttons_OnButtonPress;
+ obj[S_PARAMS][S_MESSAGE_TYPE] = hmi_apis::messageType::notification;
+ obj[S_PARAMS][S_PROTOCOL_VERSION] = 2;
+ obj[S_PARAMS][S_PROTOCOL_TYPE] = 1;
+ obj[S_PARAMS][S_CORRELATION_ID] = 4222;
+ obj[S_MSG_PARAMS] = SmartObject(SmartType::SmartType_Map);
+ // Attach Schema
+ hmi_apis::HMI_API factory;
+ EXPECT_TRUE(factory.attachSchema(obj));
+ // Convert SmrtObject to Json string
+ EXPECT_TRUE(FormatterJsonRpc::ToString(obj, result));
+ EXPECT_EQ(
+ std::string(
+ "{\n \"jsonrpc\" : \"2.0\",\n \"method\" : \"Buttons.OnButtonPress\",\n \"params\" : {}\n}\n"),
+ result);
+}
+
+TEST(FormatterJsonRPCTest, InvalidRPC_SmartObjectToString_EXPECT_FALSE) {
+ // Create SmartObject
+ SmartObject obj;
+ std::string result;
+ obj[S_PARAMS][S_FUNCTION_ID] =
+ hmi_apis::FunctionID::BasicCommunication_OnReady;
+ obj[S_PARAMS][S_MESSAGE_TYPE] = hmi_apis::messageType::response;
+ obj[S_PARAMS][S_PROTOCOL_VERSION] = 2;
+ obj[S_PARAMS][S_PROTOCOL_TYPE] = 1;
+ obj[S_PARAMS][S_CORRELATION_ID] = 4222;
+ obj[S_MSG_PARAMS] = SmartObject(SmartType::SmartType_Map);
+ // Attach Schema
+ hmi_apis::HMI_API factory;
+ EXPECT_FALSE(factory.attachSchema(obj));
+ // Convert SmrtObject to Json string
+ EXPECT_FALSE(FormatterJsonRpc::ToString(obj, result));
+ // Expect result with default value. No correct conversion was done
+ EXPECT_EQ(std::string("{\n \"jsonrpc\" : \"2.0\"\n}\n"), result);
+}
+
+TEST(FormatterJsonRPCTest, FromStringNotificationToSmartObj_ExpectSuccess) {
+ // Source Json string
+ const std::string json_string(
+ "{\n \"jsonrpc\" : \"2.0\",\n \"method\" : \"BasicCommunication.OnReady\",\n \"params\" : {}\n}\n");
+ // Smart Object to keep result
+ SmartObject obj;
+ // Convert json string to smart object
+ EXPECT_EQ(
+ 0,
+ (FormatterJsonRpc::FromString<hmi_apis::FunctionID::eType,
+ hmi_apis::messageType::eType>(json_string, obj)));
+ // Get keys collection from Smart Object
+ std::set<std::string> keys = obj["params"].enumerate();
+ EXPECT_EQ(4u, keys.size());
+}
+
+TEST(FormatterJsonRPCTest, FromStringToSmartObjInvalidFormat_ExpectFalse) {
+ // Source Json string
+ const std::string json_string(
+ "{\n \"method\" : \"BasicCommunication.OnReady\",\n \"params\" : {}\n}\n");
+ // Smart Object to keep result
+ SmartObject obj;
+ // Convert json string to smart object
+ EXPECT_EQ(
+ 2,
+ (FormatterJsonRpc::FromString<hmi_apis::FunctionID::eType,
+ hmi_apis::messageType::eType>(json_string, obj)));
+ // Get keys collection from Smart Object
+ std::set<std::string> keys = obj["params"].enumerate();
+ EXPECT_EQ(4u, keys.size());
+}
+
+TEST(FormatterJsonRPCTest, FromStringRequestToSmartObj_ExpectSuccess) {
+ // Source Json string
+ const std::string json_string(
+ "{\n \"id\" : 4444,\n \"jsonrpc\" : \"2.0\",\n \"method\" : \"VR.IsReady\"\n}\n");
+ // Smart Object to keep result
+ SmartObject obj;
+ // Convert json string to smart object
+ EXPECT_EQ(
+ 0,
+ (FormatterJsonRpc::FromString<hmi_apis::FunctionID::eType,
+ hmi_apis::messageType::eType>(json_string, obj)));
+ // Get keys collection from Smart Object
+ std::set<std::string> keys = obj["params"].enumerate();
+ std::set<std::string>::iterator it1 = keys.begin();
+ EXPECT_EQ(5u, keys.size());
+}
+
+TEST(FormatterJsonRPCTest, FromStringResponseToSmartObj_ExpectSuccess) {
+ // Source Json string
+ const std::string json_string(
+ "{\n \"id\" : 4444,\n \"jsonrpc\" : \"2.0\",\n \"method\" : \"VR.IsReady\"\n}\n");
+ // Smart Object to keep result
+ SmartObject obj;
+ // Convert json string to smart object
+ EXPECT_EQ(
+ 0,
+ (FormatterJsonRpc::FromString<hmi_apis::FunctionID::eType,
+ hmi_apis::messageType::eType>(json_string, obj)));
+ // Get keys collection from Smart Object
+ std::set<std::string> keys = obj["params"].enumerate();
+ std::set<std::string>::iterator it1 = keys.begin();
+ EXPECT_EQ(5u, keys.size());
+}
+
+} // namespace formatters
+} // namespace components
+} // namespace test
diff --git a/src/components/formatters/test/include/SmartFactoryTestHelper.h b/src/components/formatters/test/include/SmartFactoryTestHelper.h
new file mode 100644
index 000000000..ca7021b84
--- /dev/null
+++ b/src/components/formatters/test/include/SmartFactoryTestHelper.h
@@ -0,0 +1,167 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef SRC_COMPONENTS_FORMATTERS_TEST_INCLUDE_SMARTFACTORYTESTHELPER_H_
+#define SRC_COMPONENTS_FORMATTERS_TEST_INCLUDE_SMARTFACTORYTESTHELPER_H_
+
+#include <map>
+#include <set>
+
+#include "formatters/CSmartFactory.hpp"
+#include "HMI_API_schema.h"
+#include "smart_objects/always_true_schema_item.h"
+#include "smart_objects/always_false_schema_item.h"
+#include "smart_objects/array_schema_item.h"
+#include "smart_objects/bool_schema_item.h"
+#include "smart_objects/object_schema_item.h"
+#include "smart_objects/string_schema_item.h"
+#include "smart_objects/enum_schema_item.h"
+#include "smart_objects/number_schema_item.h"
+#include "smart_objects/schema_item_parameter.h"
+
+namespace test {
+namespace components {
+namespace formatters {
+
+using namespace NsSmartDeviceLink::NsSmartObjects;
+using namespace NsSmartDeviceLink::NsJSONHandler;
+using namespace NsSmartDeviceLink::NsJSONHandler::strings;
+using namespace hmi_apis;
+
+namespace TestType {
+enum eType {
+ INVALID_ENUM = -1,
+ APPLICATION_NOT_REGISTERED = 0,
+ SUCCESS,
+ TOO_MANY_PENDING_REQUESTS,
+ REJECTED,
+ INVALID_DATA,
+ OUT_OF_MEMORY,
+ ABORTED,
+ USER_DISALLOWED,
+ GENERIC_ERROR,
+ DISALLOWED
+};
+} // namespace TestType
+
+namespace FunctionIdTest {
+enum eType {
+ INVALID_ENUM = -1,
+ Function1,
+ Function2,
+ Function3
+};
+} // namespace FunctionIdTest
+
+namespace MessageTypeTest {
+enum eType {
+ INVALID_ENUM = -1,
+ request,
+ response,
+ notification,
+ error_response
+};
+} // namespace MessageTypeTest
+
+namespace StructIdentifiersTest {
+enum eType {
+ INVALID_ENUM = -1,
+ Common_1,
+ Common_2,
+ Common_3
+};
+} // namespace StructIdentifiersTest
+
+class CSmartFactoryTest : public CSmartFactory<FunctionIdTest::eType,
+ MessageTypeTest::eType, StructIdentifiersTest::eType> {
+ public:
+ CSmartFactoryTest();
+ std::map<SmartSchemaKey<FunctionIdTest::eType, MessageTypeTest::eType>,
+ CSmartSchema> function_schemes() {
+ return functions_schemes_;
+ }
+ std::map<StructIdentifiersTest::eType, CSmartSchema> structs_schemes() {
+ return structs_schemes_;
+ }
+ protected:
+ typedef std::map<const StructIdentifiersTest::eType,
+ utils::SharedPtr<ISchemaItem> > TStructsSchemaItems;
+
+ static utils::SharedPtr<ISchemaItem> ProvideObjectSchemaItemForStruct(
+ TStructsSchemaItems &struct_schema_items,
+ const StructIdentifiersTest::eType struct_id);
+
+ void InitStructSchemes(TStructsSchemaItems &struct_schema_items);
+
+ void InitFunctionSchemes(
+ const TStructsSchemaItems &struct_schema_items,
+ const std::set<FunctionIdTest::eType> &function_id_items,
+ const std::set<MessageTypeTest::eType> &message_type_items);
+
+ static CSmartSchema InitFunction_Function1_request(
+ const std::set<FunctionIdTest::eType> &function_id_items,
+ const std::set<MessageTypeTest::eType> &message_type_items);
+
+ static CSmartSchema InitFunction_Function1_response(
+ const TStructsSchemaItems &struct_schema_items,
+ const std::set<FunctionIdTest::eType> &function_id_items,
+ const std::set<MessageTypeTest::eType> &message_type_items);
+
+ static CSmartSchema InitFunction_Function2_request(
+ const std::set<FunctionIdTest::eType> &function_id_items,
+ const std::set<MessageTypeTest::eType> &message_type_items);
+
+ static CSmartSchema InitFunction_Function2_response(
+ const TStructsSchemaItems &struct_schema_items,
+ const std::set<FunctionIdTest::eType> &function_id_items,
+ const std::set<MessageTypeTest::eType> &message_type_items);
+
+ static CSmartSchema InitFunction_Function3_request(
+ const std::set<FunctionIdTest::eType> &function_id_items,
+ const std::set<MessageTypeTest::eType> &message_type_items);
+
+ static CSmartSchema InitFunction_Function3_response(
+ const TStructsSchemaItems &struct_schema_items,
+ const std::set<FunctionIdTest::eType> &function_id_items,
+ const std::set<MessageTypeTest::eType> &message_type_items);
+
+ static utils::SharedPtr<ISchemaItem> InitStructSchemaItem_Common_1(
+ TStructsSchemaItems &struct_schema_items);
+
+ static utils::SharedPtr<ISchemaItem> InitStructSchemaItem_Common_2();
+};
+
+} // namespace formatters
+} // namespace components
+} // namespace test
+
+#endif // SRC_COMPONENTS_FORMATTERS_TEST_INCLUDE_SMARTFACTORYTESTHELPER_H_
diff --git a/src/components/formatters/test/include/create_smartSchema.h b/src/components/formatters/test/include/create_smartSchema.h
new file mode 100644
index 000000000..c3bc2651e
--- /dev/null
+++ b/src/components/formatters/test/include/create_smartSchema.h
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef SRC_COMPONENTS_FORMATTERS_TEST_INCLUDE_CREATESMARTSCHEMA_H_
+#define SRC_COMPONENTS_FORMATTERS_TEST_INCLUDE_CREATESMARTSCHEMA_H_
+
+#include "formatters/CFormatterJsonSDLRPCv1.hpp"
+#include "SmartFactoryTestHelper.h"
+
+namespace test {
+namespace components {
+namespace formatters {
+
+using namespace NsSmartDeviceLink::NsJSONHandler::strings;
+using namespace NsSmartDeviceLink::NsJSONHandler::Formatters;
+using namespace NsSmartDeviceLink::NsSmartObjects;
+
+namespace FunctionIDTest {
+enum eType {
+ INVALID_ENUM = -1,
+ RegisterAppInterface,
+ UnregisterAppInterface,
+ SetGlobalProperties,
+};
+}
+
+namespace Language {
+enum eType {
+ INVALID_ENUM = -1,
+ EN_EU,
+ RU_RU
+};
+}
+namespace AppTypeTest {
+enum eType {
+ INVALID_ENUM = -1,
+ SYSTEM,
+ MEDIA
+};
+}
+namespace SpeechCapabilities {
+enum eType {
+ INVALID_ENUM = -1,
+ SC_TEXT,
+};
+}
+
+namespace StructIdentifiers {
+enum eType {
+ INVALID_ENUM = -1,
+ Struct1,
+ Struct2
+};
+}
+
+CSmartSchema initObjectSchema();
+CSmartSchema initSchemaForMetaFormatter();
+
+} // namespace formatters
+} // namespace components
+} // namespace test
+
+#endif // SRC_COMPONENTS_FORMATTERS_TEST_INCLUDE_CREATESMARTSCHEMA_H_
diff --git a/src/components/formatters/test/include/meta_formatter_test_helper.h b/src/components/formatters/test/include/meta_formatter_test_helper.h
new file mode 100644
index 000000000..e2be3beb6
--- /dev/null
+++ b/src/components/formatters/test/include/meta_formatter_test_helper.h
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef SRC_COMPONENTS_FORMATTERS_TEST_INCLUDE_METAFORMATTERTESTHELPER_H_
+#define SRC_COMPONENTS_FORMATTERS_TEST_INCLUDE_METAFORMATTERTESTHELPER_H_
+
+#include "gtest/gtest.h"
+
+#include "smart_objects/smart_object.h"
+#include "formatters/CFormatterJsonSDLRPCv1.hpp"
+#include "formatters/CSmartFactory.hpp"
+#include "create_smartSchema.h"
+
+namespace test {
+namespace components {
+namespace formatters {
+
+class CMetaFormatterTestHelper : public ::testing::Test {
+ protected:
+
+ virtual void SetUp();
+
+ virtual void TearDown();
+
+ void AnyObjectToJsonString(
+ const NsSmartDeviceLink::NsSmartObjects::SmartObject& obj,
+ std::string& result_string);
+
+ void FillObjectIdenticalToSchema(
+ NsSmartDeviceLink::NsSmartObjects::SmartObject& obj);
+
+ void FillObjectIdenticalToSchemaWithoutNoMandatoriesParams(
+ NsSmartDeviceLink::NsSmartObjects::SmartObject& obj);
+
+ void CompareObjects(
+ const NsSmartDeviceLink::NsSmartObjects::SmartObject& first,
+ const NsSmartDeviceLink::NsSmartObjects::SmartObject& second);
+
+ void FillObjectWithDefaultValues(
+ NsSmartDeviceLink::NsSmartObjects::SmartObject& obj);
+
+ void FillObjectWithoutSomeMandatoryFields(
+ NsSmartDeviceLink::NsSmartObjects::SmartObject& obj);
+
+ // Members
+ std::set<FunctionIDTest::eType> function_id_items_;
+ std::set<MessageTypeTest::eType> message_type_items_;
+};
+
+} // namespace formatters
+} // namespace components
+} // namespace test
+
+#endif // SRC_COMPONENTS_FORMATTERS_TEST_INCLUDE_METAFORMATTERTESTHELPER_H_
diff --git a/src/components/formatters/test/meta_formatter_test.cc b/src/components/formatters/test/meta_formatter_test.cc
new file mode 100644
index 000000000..17c2506ac
--- /dev/null
+++ b/src/components/formatters/test/meta_formatter_test.cc
@@ -0,0 +1,351 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "gtest/gtest.h"
+#include "formatters/meta_formatter.h"
+#include "meta_formatter_test_helper.h"
+
+namespace test {
+namespace components {
+namespace formatters {
+
+TEST_F(CMetaFormatterTestHelper, inputObjectIdenticalToSchemaWithAndWithoutMandatoryParams) {
+ Json::Value value;
+ Json::Reader reader;
+ CSmartFactory<FunctionIDTest::eType, MessageTypeTest::eType,
+ StructIdentifiers::eType> factory_;
+
+ SmartObject object1 = factory_.CreateSmartObject(
+ FunctionIDTest::RegisterAppInterface, MessageTypeTest::request);
+
+ SmartObject object2 = factory_.CreateSmartObject(
+ FunctionIDTest::RegisterAppInterface, MessageTypeTest::request);
+
+ SmartObject result_object1;
+ SmartObject result_object2;
+ // Get schema
+ CSmartSchema schema;
+ schema = initSchemaForMetaFormatter();
+
+ FillObjectIdenticalToSchema(object1);
+ FillObjectIdenticalToSchemaWithoutNoMandatoriesParams(object2);
+ bool creationresult;
+ creationresult = CMetaFormatter::CreateObjectByPattern(object1, schema,
+ result_object1);
+ EXPECT_TRUE(creationresult);
+ creationresult = CMetaFormatter::CreateObjectByPattern(object2, schema,
+ result_object2);
+ EXPECT_TRUE(creationresult);
+
+ // Uncomment code to print objects in console
+// std::string formatted_string;
+// CFormatterJsonSDLRPCv1::toString(object1, formatted_string);
+// printf("object1 %s\n", formatted_string.c_str());
+//
+// CFormatterJsonSDLRPCv1::toString(result_object1, formatted_string);
+// printf("result_object1 %s\n", formatted_string.c_str());
+//
+// CFormatterJsonSDLRPCv1::toString(object2, formatted_string);
+// printf("object2 %s\n", formatted_string.c_str());
+//
+// CFormatterJsonSDLRPCv1::toString(result_object2, formatted_string);
+// printf("result_object2 %s\n", formatted_string.c_str());
+
+ CompareObjects(object1, result_object1);
+ CompareObjects(object2, result_object2);
+
+ // Enums must be unapplied (converted to string) in order to be compared against strings
+ result_object1.getSchema().unapplySchema(result_object1);
+ EXPECT_EQ("request", result_object1[S_PARAMS][S_MESSAGE_TYPE].asString());
+ EXPECT_EQ("RegisterAppInterface",
+ result_object1[S_PARAMS][S_FUNCTION_ID].asString());
+
+ result_object2.getSchema().unapplySchema(result_object2);
+ EXPECT_EQ("request", result_object2[S_PARAMS][S_MESSAGE_TYPE].asString());
+ EXPECT_EQ("RegisterAppInterface",
+ result_object2[S_PARAMS][S_FUNCTION_ID].asString());
+}
+
+TEST_F(CMetaFormatterTestHelper, NormalSchemaWithEmptyObject) {
+ SmartObject object;
+ SmartObject result_object;
+ SmartObject expected_object;
+
+ // Get schema
+ CSmartSchema schema = initSchemaForMetaFormatter();
+ bool create_object_result = CMetaFormatter::CreateObjectByPattern(
+ object, schema, result_object);
+ EXPECT_TRUE(create_object_result);
+
+ FillObjectWithDefaultValues(expected_object);
+
+ CompareObjects(expected_object, result_object);
+
+// Uncomment code to print objects in console
+// std::string str;
+// AnyObjectToJsonString(result_object, str);
+// printf("result_object(default) %s", str.c_str());
+// AnyObjectToJsonString(expected_object, str);
+// printf("expected_object %s", str.c_str());
+
+
+}
+
+TEST_F(CMetaFormatterTestHelper, NormalSchemaWithObjectWithoutSomeMandatoryFields) {
+ SmartObject object;
+ SmartObject result_object;
+
+ // Get schema
+ CSmartSchema schema = initSchemaForMetaFormatter();
+ FillObjectWithoutSomeMandatoryFields(object);
+
+ CMetaFormatter::CreateObjectByPattern(object, schema, result_object);
+
+ CompareObjects(object, result_object);
+ EXPECT_EQ(0, result_object[S_PARAMS][S_CORRELATION_ID].asInt());
+ EXPECT_EQ(
+ 0, result_object[S_MSG_PARAMS]["syncMsgVersion"]["majorVersion"].asInt());
+ EXPECT_EQ(
+ 0, result_object[S_MSG_PARAMS]["syncMsgVersion"]["minorVersion"].asInt());
+
+// Uncomment code to print object in console
+// std::string str;
+// AnyObjectToJsonString(result_object, str);
+// printf("result_object %s", str.c_str());
+
+}
+
+TEST_F(CMetaFormatterTestHelper, ObjectWithEmptyMap) {
+ std::map<std::string, CObjectSchemaItem::SMember> schemaMembersMap;
+ CSmartSchema map_schema = CSmartSchema(
+ CObjectSchemaItem::create(schemaMembersMap));
+
+ SmartObject object;
+ SmartObject result_object_empty_map;
+
+ SmartObject object_empty_map = SmartObject(SmartType_Map);
+ CMetaFormatter::CreateObjectByPattern(object_empty_map, map_schema,
+ result_object_empty_map);
+ EXPECT_EQ(SmartType_Map, result_object_empty_map.getType())<< "smartObject is not map type";
+ EXPECT_EQ(0u, result_object_empty_map.length())<< "non empty map";
+
+ CMetaFormatter::CreateObjectByPattern(object, map_schema,
+ result_object_empty_map);
+ EXPECT_EQ(SmartType_Map, result_object_empty_map.getType())<< "smartObject is not map type";
+ EXPECT_EQ(0u, result_object_empty_map.length())<< "non empty map";
+
+ object["field1"] = 0;
+ object["field2"] = SmartObject();
+ CMetaFormatter::CreateObjectByPattern(object, map_schema,
+ result_object_empty_map);
+ EXPECT_EQ(SmartType_Map, result_object_empty_map.getType())<< "smartObject is not map type";
+ EXPECT_EQ(0u, result_object_empty_map.length())<< "non empty map";
+
+ // Fill object with any values. Result must be the same
+ FillObjectIdenticalToSchema(object);
+ CMetaFormatter::CreateObjectByPattern(object, map_schema,
+ result_object_empty_map);
+ EXPECT_EQ(SmartType_Map, result_object_empty_map.getType())<< "smartObject is not map type";
+ EXPECT_EQ(0u, result_object_empty_map.length())<< "non empty map";
+
+ // Fill object with any values. Result must be the same
+ FillObjectIdenticalToSchemaWithoutNoMandatoriesParams(object);
+ CMetaFormatter::CreateObjectByPattern(object, map_schema,
+ result_object_empty_map);
+ EXPECT_EQ(SmartType_Map, result_object_empty_map.getType())<< "smartObject is not map type";
+ EXPECT_EQ(0u, result_object_empty_map.length())<< "non empty map";
+
+// Uncomment code to print object in console
+// std::string str;
+// AnyObjectToJsonString(result_object_empty_map, str);
+// printf("result_object(empty map) %s", str.c_str());
+
+}
+
+TEST_F(CMetaFormatterTestHelper, ObjectWithEmptyArray) {
+ SmartObject object;
+
+ SmartObject result_object_empty_array;
+ CSmartSchema array_schema = CSmartSchema(CArraySchemaItem::create());
+
+ SmartObject object_empty_aray = SmartObject(SmartType_Array);
+
+ CMetaFormatter::CreateObjectByPattern(object_empty_aray, array_schema,
+ result_object_empty_array);
+ EXPECT_EQ(SmartType_Array, result_object_empty_array.getType())<< "smartObject is not array type";
+ EXPECT_EQ(0u, result_object_empty_array.length())<< "non empty array";
+
+ CMetaFormatter::CreateObjectByPattern(object, array_schema,
+ result_object_empty_array);
+ EXPECT_EQ(SmartType_Array, result_object_empty_array.getType())<< "smartObject is not array type";
+ EXPECT_EQ(0u, result_object_empty_array.length())<< "non empty array";
+
+ // Fill object with any values. Result must be the same
+ FillObjectIdenticalToSchema(object);
+ CMetaFormatter::CreateObjectByPattern(object, array_schema,
+ result_object_empty_array);
+ EXPECT_EQ(SmartType_Array, result_object_empty_array.getType())<< "smartObject is not array type";
+ EXPECT_EQ(0u, result_object_empty_array.length())<< "non empty array";
+
+ // Fill object with any values. Result must be the same
+ FillObjectWithoutSomeMandatoryFields(object);
+ CMetaFormatter::CreateObjectByPattern(object, array_schema,
+ result_object_empty_array);
+ EXPECT_EQ(SmartType_Array, result_object_empty_array.getType())<< "smartObject is not array type";
+ EXPECT_EQ(0u, result_object_empty_array.length())<< "non empty array";
+
+// Uncomment code to print object in console
+// std::string str;
+// AnyObjectToJsonString(result_object_empty_array, str);
+// printf("result_object(empty array) %s", str.c_str());
+
+}
+
+TEST_F(CMetaFormatterTestHelper, ObjectWithEmptyArrayAndEmptyMapWithOtherParameters) {
+ // Arrange
+ SmartObject result_object;
+ SmartObject object;
+
+ std::map<std::string, CObjectSchemaItem::SMember> paramsMembersMap;
+
+ paramsMembersMap[S_FUNCTION_ID] = CObjectSchemaItem::SMember(
+ TEnumSchemaItem<FunctionIDTest::eType>::create(function_id_items_), true);
+
+ paramsMembersMap[S_MESSAGE_TYPE] = CObjectSchemaItem::SMember(
+ TEnumSchemaItem<MessageTypeTest::eType>::create(message_type_items_),
+ true);
+
+ paramsMembersMap[S_CORRELATION_ID] = CObjectSchemaItem::SMember(
+ TNumberSchemaItem<int>::create(TSchemaItemParameter<int>(0),
+ TSchemaItemParameter<int>(100),
+ TSchemaItemParameter<int>(55)),
+ true);
+
+ paramsMembersMap[S_PROTOCOL_VERSION] = CObjectSchemaItem::SMember(
+ TNumberSchemaItem<int>::create(TSchemaItemParameter<int>(1),
+ TSchemaItemParameter<int>(2)),
+ false);
+ paramsMembersMap[S_PROTOCOL_TYPE] = CObjectSchemaItem::SMember(
+ TNumberSchemaItem<int>::create(), false);
+
+ std::map<std::string, CObjectSchemaItem::SMember> schemaMembersMap;
+
+ schemaMembersMap["mandatory_emptyMap1"] = CObjectSchemaItem::SMember(
+ CObjectSchemaItem::create(
+ std::map<std::string, CObjectSchemaItem::SMember>()),
+ true);
+
+ schemaMembersMap["mandatory_emptyMap2"] = CObjectSchemaItem::SMember(
+ CObjectSchemaItem::create(
+ std::map<std::string, CObjectSchemaItem::SMember>()),
+ true);
+
+ schemaMembersMap["mandatory_emptyAray"] = CObjectSchemaItem::SMember(
+ CArraySchemaItem::create(TNumberSchemaItem<int>::create()), true);
+
+ schemaMembersMap["non_mandatory_Array"] = CObjectSchemaItem::SMember(
+ CArraySchemaItem::create(TNumberSchemaItem<int>::create(),
+ TSchemaItemParameter<size_t>(1),
+ TSchemaItemParameter<size_t>(2)),
+ false);
+
+ schemaMembersMap["mandatory_string"] = CObjectSchemaItem::SMember(
+ CStringSchemaItem::create(TSchemaItemParameter<size_t>(0),
+ TSchemaItemParameter<size_t>(500),
+ TSchemaItemParameter<std::string>("defValue")),
+ true);
+
+ schemaMembersMap["non_mandatory_string"] = CObjectSchemaItem::SMember(
+ CStringSchemaItem::create(
+ TSchemaItemParameter<size_t>(0), TSchemaItemParameter<size_t>(500),
+ TSchemaItemParameter<std::string>("ignoredDefValue")),
+ false);
+
+ std::map<std::string, CObjectSchemaItem::SMember> rootMembersMap;
+ rootMembersMap[S_MSG_PARAMS] = CObjectSchemaItem::SMember(
+ CObjectSchemaItem::create(schemaMembersMap), true);
+ rootMembersMap[S_PARAMS] = CObjectSchemaItem::SMember(
+ CObjectSchemaItem::create(paramsMembersMap), true);
+
+ CSmartSchema schema = CSmartSchema(CObjectSchemaItem::create(rootMembersMap));
+
+ // Set object value
+ object[S_PARAMS][S_FUNCTION_ID] = 500;
+ object[S_PARAMS][S_PROTOCOL_VERSION] = 11;
+ object[S_PARAMS]["new_field"] = "100500 string";
+
+ object[S_MSG_PARAMS]["mandatory_emptyMap1"]["field1"] = 123;
+ object[S_MSG_PARAMS]["mandatory_emptyMap1"]["field2"][0] = 100;
+ object[S_MSG_PARAMS]["mandatory_emptyMap1"]["field2"][1] = 200;
+ object[S_MSG_PARAMS]["non_mandatory_Array"][0] = 100;
+ object[S_MSG_PARAMS]["non_mandatory_Array"][1] = 200;
+ object[S_MSG_PARAMS]["non_mandatory_Array"][2] = 300;
+ object[S_MSG_PARAMS]["non_mandatory_string"] = "some string";
+
+ CMetaFormatter::CreateObjectByPattern(object, schema, result_object);
+
+// Uncomment code to print object in console
+// std::string str;
+// AnyObjectToJsonString(object, str);
+// printf("object %s", str.c_str());
+// AnyObjectToJsonString(result_object, str);
+// printf("result_object %s", str.c_str());
+
+
+ // Assert
+ EXPECT_EQ(500, result_object[S_PARAMS][S_FUNCTION_ID].asInt());
+ EXPECT_EQ(-1, result_object[S_PARAMS][S_MESSAGE_TYPE].asInt());
+ EXPECT_EQ(55, result_object[S_PARAMS][S_CORRELATION_ID].asInt());
+ EXPECT_EQ(11u, result_object[S_PARAMS][S_PROTOCOL_VERSION].asUInt());
+
+ EXPECT_EQ(SmartType_Map,
+ result_object[S_MSG_PARAMS]["mandatory_emptyMap1"].getType());
+ EXPECT_EQ(0u, result_object[S_MSG_PARAMS]["mandatory_emptyMap1"].length());
+ EXPECT_EQ(SmartType_Map,
+ result_object[S_MSG_PARAMS]["mandatory_emptyMap2"].getType());
+ EXPECT_EQ(0u, result_object[S_MSG_PARAMS]["mandatory_emptyMap2"].length());
+ EXPECT_EQ(SmartType_Array,
+ result_object[S_MSG_PARAMS]["mandatory_emptyAray"].getType());
+ EXPECT_EQ(0u, result_object[S_MSG_PARAMS]["mandatory_emptyAray"].length());
+ EXPECT_EQ(100, result_object[S_MSG_PARAMS]["non_mandatory_Array"][0].asInt());
+ EXPECT_EQ(200, result_object[S_MSG_PARAMS]["non_mandatory_Array"][1].asInt());
+ EXPECT_EQ(300u,
+ result_object[S_MSG_PARAMS]["non_mandatory_Array"][2].asUInt());
+ EXPECT_EQ(std::string("defValue"),
+ result_object[S_MSG_PARAMS]["mandatory_string"].asString());
+ EXPECT_EQ(std::string("some string"),
+ result_object[S_MSG_PARAMS]["non_mandatory_string"].asString());
+}
+
+} // namespace formatters
+} // namespace components
+} // namespace test
diff --git a/src/components/formatters/test/src/SmartFactoryTestHelper.cc b/src/components/formatters/test/src/SmartFactoryTestHelper.cc
new file mode 100644
index 000000000..8f601afc2
--- /dev/null
+++ b/src/components/formatters/test/src/SmartFactoryTestHelper.cc
@@ -0,0 +1,501 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "SmartFactoryTestHelper.h"
+
+using namespace test::components::formatters;
+
+template<>
+const EnumConversionHelper<TestType::eType>::EnumToCStringMap EnumConversionHelper<
+ test::components::formatters::TestType::eType>::enum_to_cstring_map_ =
+ EnumConversionHelper<test::components::formatters::TestType::eType>::InitEnumToCStringMap();
+
+template<>
+const EnumConversionHelper<TestType::eType>::CStringToEnumMap EnumConversionHelper<
+ test::components::formatters::TestType::eType>::cstring_to_enum_map_ =
+ EnumConversionHelper<test::components::formatters::TestType::eType>::InitCStringToEnumMap();
+
+template<>
+const char* const EnumConversionHelper<TestType::eType>::cstring_values_[] = {
+ "APPLICATION_NOT_REGISTERED", "SUCCESS", "TOO_MANY_PENDING_REQUESTS",
+ "REJECTED", "INVALID_DATA", "OUT_OF_MEMORY", "ABORTED", "USER_DISALLOWED",
+ "GENERIC_ERROR", "DISALLOWED" };
+
+template<>
+const TestType::eType EnumConversionHelper<TestType::eType>::enum_values_[] = {
+ test::components::formatters::TestType::APPLICATION_NOT_REGISTERED,
+ test::components::formatters::TestType::SUCCESS,
+ test::components::formatters::TestType::TOO_MANY_PENDING_REQUESTS,
+ test::components::formatters::TestType::REJECTED,
+ test::components::formatters::TestType::INVALID_DATA,
+ test::components::formatters::TestType::OUT_OF_MEMORY,
+ test::components::formatters::TestType::ABORTED,
+ test::components::formatters::TestType::USER_DISALLOWED,
+ test::components::formatters::TestType::GENERIC_ERROR,
+ test::components::formatters::TestType::DISALLOWED };
+
+template<>
+const EnumConversionHelper<FunctionIdTest::eType>::EnumToCStringMap EnumConversionHelper<
+ test::components::formatters::FunctionIdTest::eType>::enum_to_cstring_map_ =
+ EnumConversionHelper<test::components::formatters::FunctionIdTest::eType>::InitEnumToCStringMap();
+
+template<>
+const EnumConversionHelper<FunctionIdTest::eType>::CStringToEnumMap EnumConversionHelper<
+ test::components::formatters::FunctionIdTest::eType>::cstring_to_enum_map_ =
+ EnumConversionHelper<test::components::formatters::FunctionIdTest::eType>::InitCStringToEnumMap();
+
+template<>
+const char* const EnumConversionHelper<FunctionIdTest::eType>::cstring_values_[] =
+ { "Function1", "Function2", "Function3" };
+
+template<>
+const FunctionIdTest::eType EnumConversionHelper<FunctionIdTest::eType>::enum_values_[] =
+ { test::components::formatters::FunctionIdTest::Function1,
+ test::components::formatters::FunctionIdTest::Function2,
+ test::components::formatters::FunctionIdTest::Function3 };
+
+template<>
+const EnumConversionHelper<MessageTypeTest::eType>::EnumToCStringMap EnumConversionHelper<
+ test::components::formatters::MessageTypeTest::eType>::enum_to_cstring_map_ =
+ EnumConversionHelper<test::components::formatters::MessageTypeTest::eType>::InitEnumToCStringMap();
+
+template<>
+const EnumConversionHelper<MessageTypeTest::eType>::CStringToEnumMap EnumConversionHelper<
+ test::components::formatters::MessageTypeTest::eType>::cstring_to_enum_map_ =
+ EnumConversionHelper<test::components::formatters::MessageTypeTest::eType>::InitCStringToEnumMap();
+
+template<>
+const char* const EnumConversionHelper<MessageTypeTest::eType>::cstring_values_[] =
+ { "request", "response", "notification" };
+
+template<>
+const MessageTypeTest::eType EnumConversionHelper<MessageTypeTest::eType>::enum_values_[] =
+ { test::components::formatters::MessageTypeTest::request,
+ test::components::formatters::MessageTypeTest::response,
+ test::components::formatters::MessageTypeTest::notification };
+
+CSmartFactoryTest::CSmartFactoryTest()
+ : CSmartFactory<FunctionIdTest::eType, MessageTypeTest::eType,
+ StructIdentifiersTest::eType>() {
+ TStructsSchemaItems struct_schema_items;
+ InitStructSchemes(struct_schema_items);
+ std::set<FunctionIdTest::eType> function_id_items;
+ function_id_items.insert(FunctionIdTest::Function1);
+ function_id_items.insert(FunctionIdTest::Function2);
+ function_id_items.insert(FunctionIdTest::Function3);
+
+ std::set<MessageTypeTest::eType> message_type_items;
+ message_type_items.insert(MessageTypeTest::request);
+ message_type_items.insert(MessageTypeTest::response);
+ message_type_items.insert(MessageTypeTest::notification);
+ message_type_items.insert(MessageTypeTest::error_response);
+ InitFunctionSchemes(struct_schema_items, function_id_items,
+ message_type_items);
+}
+
+void CSmartFactoryTest::InitStructSchemes(
+ TStructsSchemaItems &struct_schema_items) {
+ utils::SharedPtr<ISchemaItem> struct_schema_item_Common_1 =
+ InitStructSchemaItem_Common_1(struct_schema_items);
+ struct_schema_items.insert(
+ std::make_pair(StructIdentifiersTest::Common_1,
+ struct_schema_item_Common_1));
+ structs_schemes_.insert(
+ std::make_pair(StructIdentifiersTest::Common_1,
+ CSmartSchema(struct_schema_item_Common_1)));
+
+ utils::SharedPtr<ISchemaItem> struct_schema_item_Common_2 =
+ InitStructSchemaItem_Common_2();
+ struct_schema_items.insert(
+ std::make_pair(StructIdentifiersTest::Common_2,
+ struct_schema_item_Common_2));
+ structs_schemes_.insert(
+ std::make_pair(StructIdentifiersTest::Common_2,
+ CSmartSchema(struct_schema_item_Common_2)));
+}
+
+void CSmartFactoryTest::InitFunctionSchemes(
+ const TStructsSchemaItems &struct_schema_items,
+ const std::set<FunctionIdTest::eType> &function_id_items,
+ const std::set<MessageTypeTest::eType> &message_type_items) {
+ CObjectSchemaItem::Members params_members;
+ params_members[S_FUNCTION_ID] = CObjectSchemaItem::SMember(
+ TEnumSchemaItem<FunctionIdTest::eType>::create(function_id_items), true);
+ params_members[S_MESSAGE_TYPE] = CObjectSchemaItem::SMember(
+ TEnumSchemaItem<MessageTypeTest::eType>::create(message_type_items),
+ true);
+ params_members[S_PROTOCOL_VERSION] = CObjectSchemaItem::SMember(
+ TNumberSchemaItem<int>::create(), true);
+ params_members[S_PROTOCOL_TYPE] = CObjectSchemaItem::SMember(
+ TNumberSchemaItem<int>::create(), true);
+ params_members[S_CORRELATION_ID] = CObjectSchemaItem::SMember(
+ TNumberSchemaItem<int>::create(), true);
+ params_members[kCode] = CObjectSchemaItem::SMember(
+ TNumberSchemaItem<int>::create(), true);
+ params_members[kMessage] = CObjectSchemaItem::SMember(
+ CStringSchemaItem::create(), true);
+
+ CObjectSchemaItem::Members root_members_map;
+ root_members_map[NsSmartDeviceLink::NsJSONHandler::strings::S_PARAMS] =
+ CObjectSchemaItem::SMember(CObjectSchemaItem::create(params_members),
+ true);
+
+ CSmartSchema error_response_schema(
+ CObjectSchemaItem::create(root_members_map));
+
+ functions_schemes_.insert(
+ std::make_pair(
+ SmartSchemaKey<FunctionIdTest::eType, MessageTypeTest::eType>(
+ FunctionIdTest::Function1, MessageTypeTest::error_response),
+ error_response_schema));
+ functions_schemes_.insert(
+ std::make_pair(
+ SmartSchemaKey<FunctionIdTest::eType, MessageTypeTest::eType>(
+ FunctionIdTest::Function1, MessageTypeTest::request),
+ InitFunction_Function1_request(function_id_items,
+ message_type_items)));
+ functions_schemes_.insert(
+ std::make_pair(
+ SmartSchemaKey<FunctionIdTest::eType, MessageTypeTest::eType>(
+ FunctionIdTest::Function1, MessageTypeTest::response),
+ InitFunction_Function1_response(struct_schema_items,
+ function_id_items,
+ message_type_items)));
+
+ functions_schemes_.insert(
+ std::make_pair(
+ SmartSchemaKey<FunctionIdTest::eType, MessageTypeTest::eType>(
+ FunctionIdTest::Function2, MessageTypeTest::error_response),
+ error_response_schema));
+ functions_schemes_.insert(
+ std::make_pair(
+ SmartSchemaKey<FunctionIdTest::eType, MessageTypeTest::eType>(
+ FunctionIdTest::Function2, MessageTypeTest::request),
+ InitFunction_Function2_request(function_id_items,
+ message_type_items)));
+ functions_schemes_.insert(
+ std::make_pair(
+ SmartSchemaKey<FunctionIdTest::eType, MessageTypeTest::eType>(
+ FunctionIdTest::Function2, MessageTypeTest::response),
+ InitFunction_Function2_response(struct_schema_items,
+ function_id_items,
+ message_type_items)));
+
+ functions_schemes_.insert(
+ std::make_pair(
+ SmartSchemaKey<FunctionIdTest::eType, MessageTypeTest::eType>(
+ FunctionIdTest::Function3, MessageTypeTest::error_response),
+ error_response_schema));
+ functions_schemes_.insert(
+ std::make_pair(
+ SmartSchemaKey<FunctionIdTest::eType, MessageTypeTest::eType>(
+ FunctionIdTest::Function3, MessageTypeTest::request),
+ InitFunction_Function3_request(function_id_items,
+ message_type_items)));
+ functions_schemes_.insert(
+ std::make_pair(
+ SmartSchemaKey<FunctionIdTest::eType, MessageTypeTest::eType>(
+ FunctionIdTest::Function3, MessageTypeTest::response),
+ InitFunction_Function3_response(struct_schema_items,
+ function_id_items,
+ message_type_items)));
+}
+
+CSmartSchema CSmartFactoryTest::InitFunction_Function1_request(
+ const std::set<FunctionIdTest::eType> &function_id_items,
+ const std::set<MessageTypeTest::eType> &message_type_items) {
+
+ CObjectSchemaItem::Members schema_members;
+ CObjectSchemaItem::Members params_members;
+
+ params_members[S_FUNCTION_ID] = CObjectSchemaItem::SMember(
+ TEnumSchemaItem<FunctionIdTest::eType>::create(function_id_items), true);
+ params_members[S_MESSAGE_TYPE] = CObjectSchemaItem::SMember(
+ TEnumSchemaItem<MessageTypeTest::eType>::create(message_type_items),
+ true);
+ params_members[S_PROTOCOL_VERSION] = CObjectSchemaItem::SMember(
+ TNumberSchemaItem<int>::create(), true);
+ params_members[S_PROTOCOL_TYPE] = CObjectSchemaItem::SMember(
+ TNumberSchemaItem<int>::create(), true);
+ params_members[S_CORRELATION_ID] = CObjectSchemaItem::SMember(
+ TNumberSchemaItem<int>::create(), true);
+
+ CObjectSchemaItem::Members root_members_map;
+ root_members_map[S_MSG_PARAMS] = CObjectSchemaItem::SMember(
+ CObjectSchemaItem::create(schema_members), true);
+ root_members_map[S_PARAMS] = CObjectSchemaItem::SMember(
+ CObjectSchemaItem::create(params_members), true);
+
+ return CSmartSchema(CObjectSchemaItem::create(root_members_map));
+}
+
+CSmartSchema CSmartFactoryTest::InitFunction_Function1_response(
+ const TStructsSchemaItems &struct_schema_items,
+ const std::set<FunctionIdTest::eType> &function_id_items,
+ const std::set<MessageTypeTest::eType> &message_type_items) {
+ // Function parameter available.
+ utils::SharedPtr<ISchemaItem> available_SchemaItem = CBoolSchemaItem::create(
+ TSchemaItemParameter<bool>());
+
+ CObjectSchemaItem::Members schema_members;
+
+ schema_members["available"] = CObjectSchemaItem::SMember(available_SchemaItem,
+ true);
+
+ CObjectSchemaItem::Members params_members;
+ params_members[S_FUNCTION_ID] = CObjectSchemaItem::SMember(
+ TEnumSchemaItem<FunctionIdTest::eType>::create(function_id_items), true);
+ params_members[S_MESSAGE_TYPE] = CObjectSchemaItem::SMember(
+ TEnumSchemaItem<MessageTypeTest::eType>::create(message_type_items),
+ true);
+ params_members[S_PROTOCOL_VERSION] = CObjectSchemaItem::SMember(
+ TNumberSchemaItem<int>::create(), true);
+ params_members[S_PROTOCOL_TYPE] = CObjectSchemaItem::SMember(
+ TNumberSchemaItem<int>::create(), true);
+ params_members[S_CORRELATION_ID] = CObjectSchemaItem::SMember(
+ TNumberSchemaItem<int>::create(), true);
+ params_members[kCode] = CObjectSchemaItem::SMember(
+ TNumberSchemaItem<int>::create(), true);
+
+ CObjectSchemaItem::Members root_members_map;
+ root_members_map[S_MSG_PARAMS] = CObjectSchemaItem::SMember(
+ CObjectSchemaItem::create(schema_members), true);
+ root_members_map[S_PARAMS] = CObjectSchemaItem::SMember(
+ CObjectSchemaItem::create(params_members), true);
+
+ return CSmartSchema(CObjectSchemaItem::create(root_members_map));
+}
+
+CSmartSchema CSmartFactoryTest::InitFunction_Function2_request(
+ const std::set<FunctionIdTest::eType> &function_id_items,
+ const std::set<MessageTypeTest::eType> &message_type_items) {
+ CObjectSchemaItem::Members schema_members;
+
+ CObjectSchemaItem::Members params_members;
+ params_members[S_FUNCTION_ID] = CObjectSchemaItem::SMember(
+ TEnumSchemaItem<FunctionIdTest::eType>::create(function_id_items), true);
+ params_members[S_MESSAGE_TYPE] = CObjectSchemaItem::SMember(
+ TEnumSchemaItem<MessageTypeTest::eType>::create(message_type_items),
+ true);
+ params_members[S_PROTOCOL_VERSION] = CObjectSchemaItem::SMember(
+ TNumberSchemaItem<int>::create(), true);
+ params_members[S_PROTOCOL_TYPE] = CObjectSchemaItem::SMember(
+ TNumberSchemaItem<int>::create(), true);
+ params_members[S_CORRELATION_ID] = CObjectSchemaItem::SMember(
+ TNumberSchemaItem<int>::create(), true);
+
+ CObjectSchemaItem::Members root_members_map;
+ root_members_map[S_MSG_PARAMS] = CObjectSchemaItem::SMember(
+ CObjectSchemaItem::create(schema_members), true);
+ root_members_map[S_PARAMS] = CObjectSchemaItem::SMember(
+ CObjectSchemaItem::create(params_members), true);
+
+ return CSmartSchema(CObjectSchemaItem::create(root_members_map));
+}
+
+CSmartSchema CSmartFactoryTest::InitFunction_Function2_response(
+ const TStructsSchemaItems &struct_schema_items,
+ const std::set<FunctionIdTest::eType> &function_id_items,
+ const std::set<MessageTypeTest::eType> &message_type_items) {
+ // Function parameter available.
+ utils::SharedPtr<ISchemaItem> available_SchemaItem = CBoolSchemaItem::create(
+ TSchemaItemParameter<bool>());
+
+ CObjectSchemaItem::Members schema_members;
+
+ schema_members["available"] = CObjectSchemaItem::SMember(available_SchemaItem,
+ true);
+
+ CObjectSchemaItem::Members params_members;
+ params_members[S_FUNCTION_ID] = CObjectSchemaItem::SMember(
+ TEnumSchemaItem<FunctionIdTest::eType>::create(function_id_items), true);
+ params_members[S_MESSAGE_TYPE] = CObjectSchemaItem::SMember(
+ TEnumSchemaItem<MessageTypeTest::eType>::create(message_type_items),
+ true);
+ params_members[S_PROTOCOL_VERSION] = CObjectSchemaItem::SMember(
+ TNumberSchemaItem<int>::create(), true);
+ params_members[S_PROTOCOL_TYPE] = CObjectSchemaItem::SMember(
+ TNumberSchemaItem<int>::create(), true);
+ params_members[S_CORRELATION_ID] = CObjectSchemaItem::SMember(
+ TNumberSchemaItem<int>::create(), true);
+ params_members[kCode] = CObjectSchemaItem::SMember(
+ TNumberSchemaItem<int>::create(), true);
+
+ CObjectSchemaItem::Members root_members_map;
+ root_members_map[S_MSG_PARAMS] = CObjectSchemaItem::SMember(
+ CObjectSchemaItem::create(schema_members), true);
+ root_members_map[S_PARAMS] = CObjectSchemaItem::SMember(
+ CObjectSchemaItem::create(params_members), true);
+
+ return CSmartSchema(CObjectSchemaItem::create(root_members_map));
+}
+
+CSmartSchema CSmartFactoryTest::InitFunction_Function3_request(
+ const std::set<FunctionIdTest::eType> &function_id_items,
+ const std::set<MessageTypeTest::eType> &message_type_items) {
+ CObjectSchemaItem::Members schema_members;
+
+ CObjectSchemaItem::Members params_members;
+ params_members[S_FUNCTION_ID] = CObjectSchemaItem::SMember(
+ TEnumSchemaItem<FunctionIdTest::eType>::create(function_id_items), true);
+ params_members[S_MESSAGE_TYPE] = CObjectSchemaItem::SMember(
+ TEnumSchemaItem<MessageTypeTest::eType>::create(message_type_items),
+ true);
+ params_members[S_PROTOCOL_VERSION] = CObjectSchemaItem::SMember(
+ TNumberSchemaItem<int>::create(), true);
+ params_members[S_PROTOCOL_TYPE] = CObjectSchemaItem::SMember(
+ TNumberSchemaItem<int>::create(), true);
+ params_members[S_CORRELATION_ID] = CObjectSchemaItem::SMember(
+ TNumberSchemaItem<int>::create(), true);
+
+ CObjectSchemaItem::Members root_members_map;
+ root_members_map[S_MSG_PARAMS] = CObjectSchemaItem::SMember(
+ CObjectSchemaItem::create(schema_members), true);
+ root_members_map[S_PARAMS] = CObjectSchemaItem::SMember(
+ CObjectSchemaItem::create(params_members), true);
+
+ return CSmartSchema(CObjectSchemaItem::create(root_members_map));
+}
+
+CSmartSchema CSmartFactoryTest::InitFunction_Function3_response(
+ const TStructsSchemaItems &struct_schema_items,
+ const std::set<FunctionIdTest::eType> &function_id_items,
+ const std::set<MessageTypeTest::eType> &message_type_items) {
+ // Function parameter available.
+ //
+ // Must be true if VR is present and ready to communicate with SDL.
+ utils::SharedPtr<ISchemaItem> available_SchemaItem = CBoolSchemaItem::create(
+ TSchemaItemParameter<bool>());
+
+ CObjectSchemaItem::Members schema_members;
+
+ schema_members["available"] = CObjectSchemaItem::SMember(available_SchemaItem,
+ true);
+
+ CObjectSchemaItem::Members params_members;
+ params_members[S_FUNCTION_ID] = CObjectSchemaItem::SMember(
+ TEnumSchemaItem<FunctionIdTest::eType>::create(function_id_items), true);
+ params_members[S_MESSAGE_TYPE] = CObjectSchemaItem::SMember(
+ TEnumSchemaItem<MessageTypeTest::eType>::create(message_type_items),
+ true);
+ params_members[S_PROTOCOL_VERSION] = CObjectSchemaItem::SMember(
+ TNumberSchemaItem<int>::create(), true);
+ params_members[S_PROTOCOL_TYPE] = CObjectSchemaItem::SMember(
+ TNumberSchemaItem<int>::create(), true);
+ params_members[S_CORRELATION_ID] = CObjectSchemaItem::SMember(
+ TNumberSchemaItem<int>::create(), true);
+ params_members[kCode] = CObjectSchemaItem::SMember(
+ TNumberSchemaItem<int>::create(), true);
+
+ CObjectSchemaItem::Members root_members_map;
+ root_members_map[S_MSG_PARAMS] = CObjectSchemaItem::SMember(
+ CObjectSchemaItem::create(schema_members), true);
+ root_members_map[S_PARAMS] = CObjectSchemaItem::SMember(
+ CObjectSchemaItem::create(params_members), true);
+
+ return CSmartSchema(CObjectSchemaItem::create(root_members_map));
+}
+
+utils::SharedPtr<ISchemaItem> CSmartFactoryTest::InitStructSchemaItem_Common_1(
+ TStructsSchemaItems &struct_schema_items) {
+ // Struct member text.
+ //
+ // Text to display
+ utils::SharedPtr<ISchemaItem> text_SchemaItem = CStringSchemaItem::create(
+ TSchemaItemParameter<size_t>(1), TSchemaItemParameter<size_t>(500),
+ TSchemaItemParameter<std::string>());
+
+ // Struct member image.
+ //
+ // Image struct
+ utils::SharedPtr<ISchemaItem> image_SchemaItem =
+ ProvideObjectSchemaItemForStruct(struct_schema_items,
+ StructIdentifiersTest::Common_2);
+
+ // Struct member position.
+ //
+ // Position to display item
+ utils::SharedPtr<ISchemaItem> position_SchemaItem =
+ TNumberSchemaItem<int32_t>::create(TSchemaItemParameter<int32_t>(1),
+ TSchemaItemParameter<int32_t>(500),
+ TSchemaItemParameter<int32_t>());
+ CObjectSchemaItem::Members struct_members;
+ struct_members["image"] = CObjectSchemaItem::SMember(image_SchemaItem, false);
+
+ CObjectSchemaItem::Members schema_members;
+
+ schema_members["text"] = CObjectSchemaItem::SMember(text_SchemaItem, true);
+ schema_members["position"] = CObjectSchemaItem::SMember(position_SchemaItem,
+ true);
+
+ CObjectSchemaItem::Members root_members_map;
+ root_members_map[""] = CObjectSchemaItem::SMember(
+ CObjectSchemaItem::create(struct_members), true);
+ root_members_map[""] = CObjectSchemaItem::SMember(
+ CObjectSchemaItem::create(schema_members), true);
+ return CObjectSchemaItem::create(schema_members);
+}
+
+utils::SharedPtr<ISchemaItem> CSmartFactoryTest::InitStructSchemaItem_Common_2() {
+ // Struct member text.
+ //
+ // Text to display
+ utils::SharedPtr<ISchemaItem> text_SchemaItem = CStringSchemaItem::create(
+ TSchemaItemParameter<size_t>(1), TSchemaItemParameter<size_t>(500),
+ TSchemaItemParameter<std::string>());
+ // Struct member position.
+ //
+ // Position to display item
+ utils::SharedPtr<ISchemaItem> position_SchemaItem =
+ TNumberSchemaItem<int32_t>::create(TSchemaItemParameter<int32_t>(1),
+ TSchemaItemParameter<int32_t>(500),
+ TSchemaItemParameter<int32_t>());
+
+ CObjectSchemaItem::Members schema_members;
+ schema_members["text"] = CObjectSchemaItem::SMember(text_SchemaItem, true);
+ schema_members["position"] = CObjectSchemaItem::SMember(position_SchemaItem,
+ true);
+
+ return CObjectSchemaItem::create(schema_members);
+}
+
+utils::SharedPtr<ISchemaItem> CSmartFactoryTest::ProvideObjectSchemaItemForStruct(
+ TStructsSchemaItems &struct_schema_items,
+ const StructIdentifiersTest::eType struct_id) {
+ const TStructsSchemaItems::const_iterator it = struct_schema_items.find(
+ struct_id);
+ if (it != struct_schema_items.end()) {
+ return it->second;
+ }
+ return NsSmartDeviceLink::NsSmartObjects::CAlwaysFalseSchemaItem::create();
+}
+
diff --git a/src/components/formatters/test/src/create_smartSchema.cc b/src/components/formatters/test/src/create_smartSchema.cc
new file mode 100644
index 000000000..9d44567dc
--- /dev/null
+++ b/src/components/formatters/test/src/create_smartSchema.cc
@@ -0,0 +1,379 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "create_smartSchema.h"
+namespace test {
+namespace components {
+namespace formatters {
+
+using namespace NsSmartDeviceLink::NsJSONHandler::strings;
+using namespace NsSmartDeviceLink::NsJSONHandler::Formatters;
+using namespace NsSmartDeviceLink::NsSmartObjects;
+
+template<>
+const EnumConversionHelper<FunctionIDTest::eType>::EnumToCStringMap EnumConversionHelper<
+ test::components::formatters::FunctionIDTest::eType>::enum_to_cstring_map_ =
+ EnumConversionHelper<test::components::formatters::FunctionIDTest::eType>::InitEnumToCStringMap();
+
+template<>
+const EnumConversionHelper<FunctionIDTest::eType>::CStringToEnumMap EnumConversionHelper<
+ test::components::formatters::FunctionIDTest::eType>::cstring_to_enum_map_ =
+ EnumConversionHelper<test::components::formatters::FunctionIDTest::eType>::InitCStringToEnumMap();
+
+template<>
+const char* const EnumConversionHelper<FunctionIDTest::eType>::cstring_values_[] =
+ { "RegisterAppInterface", "UnregisterAppInterface", "SetGlobalProperties" };
+
+template<>
+const FunctionIDTest::eType EnumConversionHelper<FunctionIDTest::eType>::enum_values_[] =
+ { test::components::formatters::FunctionIDTest::RegisterAppInterface,
+ test::components::formatters::FunctionIDTest::UnregisterAppInterface,
+ test::components::formatters::FunctionIDTest::SetGlobalProperties };
+
+template<>
+const EnumConversionHelper<Language::eType>::EnumToCStringMap EnumConversionHelper<
+ test::components::formatters::Language::eType>::enum_to_cstring_map_ =
+ EnumConversionHelper<test::components::formatters::Language::eType>::InitEnumToCStringMap();
+
+template<>
+const EnumConversionHelper<Language::eType>::CStringToEnumMap EnumConversionHelper<
+ test::components::formatters::Language::eType>::cstring_to_enum_map_ =
+ EnumConversionHelper<test::components::formatters::Language::eType>::InitCStringToEnumMap();
+
+template<>
+const char* const EnumConversionHelper<Language::eType>::cstring_values_[] =
+ { "EN_EU", "RU_RU"};
+
+template<>
+const Language::eType EnumConversionHelper<Language::eType>::enum_values_[] =
+ { test::components::formatters::Language::EN_EU,
+ test::components::formatters::Language::RU_RU};
+
+template<>
+const EnumConversionHelper<SpeechCapabilities::eType>::EnumToCStringMap EnumConversionHelper<
+ test::components::formatters::SpeechCapabilities::eType>::enum_to_cstring_map_ =
+ EnumConversionHelper<test::components::formatters::SpeechCapabilities::eType>::InitEnumToCStringMap();
+
+template<>
+const EnumConversionHelper<SpeechCapabilities::eType>::CStringToEnumMap EnumConversionHelper<
+ test::components::formatters::SpeechCapabilities::eType>::cstring_to_enum_map_ =
+ EnumConversionHelper<test::components::formatters::SpeechCapabilities::eType>::InitCStringToEnumMap();
+
+template<>
+const char* const EnumConversionHelper<SpeechCapabilities::eType>::cstring_values_[] =
+ { "SC_TEXT"};
+
+template<>
+const SpeechCapabilities::eType EnumConversionHelper<SpeechCapabilities::eType>::enum_values_[] =
+ { test::components::formatters::SpeechCapabilities::SC_TEXT};
+
+template<>
+const EnumConversionHelper<AppTypeTest::eType>::EnumToCStringMap EnumConversionHelper<
+ test::components::formatters::AppTypeTest::eType>::enum_to_cstring_map_ =
+ EnumConversionHelper<test::components::formatters::AppTypeTest::eType>::InitEnumToCStringMap();
+
+template<>
+const EnumConversionHelper<AppTypeTest::eType>::CStringToEnumMap EnumConversionHelper<
+ test::components::formatters::AppTypeTest::eType>::cstring_to_enum_map_ =
+ EnumConversionHelper<test::components::formatters::AppTypeTest::eType>::InitCStringToEnumMap();
+
+template<>
+const char* const EnumConversionHelper<AppTypeTest::eType>::cstring_values_[] =
+ { "SYSTEM", "MEDIA"};
+
+template<>
+const AppTypeTest::eType EnumConversionHelper<AppTypeTest::eType>::enum_values_[] =
+ { test::components::formatters::AppTypeTest::SYSTEM,
+ test::components::formatters::AppTypeTest::MEDIA,
+ };
+
+CSmartSchema initObjectSchema() {
+ std::set<TestType::eType> resultCode_allowedEnumSubsetValues;
+ resultCode_allowedEnumSubsetValues.insert(
+ TestType::APPLICATION_NOT_REGISTERED);
+ resultCode_allowedEnumSubsetValues.insert(TestType::SUCCESS);
+ resultCode_allowedEnumSubsetValues.insert(
+ TestType::TOO_MANY_PENDING_REQUESTS);
+ resultCode_allowedEnumSubsetValues.insert(TestType::REJECTED);
+ resultCode_allowedEnumSubsetValues.insert(TestType::INVALID_DATA);
+ resultCode_allowedEnumSubsetValues.insert(TestType::OUT_OF_MEMORY);
+ resultCode_allowedEnumSubsetValues.insert(TestType::ABORTED);
+ resultCode_allowedEnumSubsetValues.insert(TestType::USER_DISALLOWED);
+ resultCode_allowedEnumSubsetValues.insert(TestType::GENERIC_ERROR);
+ resultCode_allowedEnumSubsetValues.insert(TestType::DISALLOWED);
+
+ // Possible functions in this test scheme
+ std::set<FunctionIDTest::eType> functionId_allowedEnumSubsetValues;
+ functionId_allowedEnumSubsetValues.insert(
+ FunctionIDTest::RegisterAppInterface);
+ functionId_allowedEnumSubsetValues.insert(
+ FunctionIDTest::UnregisterAppInterface);
+ functionId_allowedEnumSubsetValues.insert(
+ FunctionIDTest::SetGlobalProperties);
+
+ // Possible message types
+ std::set<MessageTypeTest::eType> messageType_allowedEnumSubsetValues;
+ messageType_allowedEnumSubsetValues.insert(MessageTypeTest::request);
+ messageType_allowedEnumSubsetValues.insert(MessageTypeTest::response);
+ messageType_allowedEnumSubsetValues.insert(MessageTypeTest::notification);
+
+ // Create result item
+ ISchemaItemPtr success_SchemaItem = CBoolSchemaItem::create(
+ TSchemaItemParameter<bool>());
+ ISchemaItemPtr resultCode_SchemaItem =
+ TEnumSchemaItem<TestType::eType>::create(
+ resultCode_allowedEnumSubsetValues,
+ TSchemaItemParameter<TestType::eType>());
+
+ // Create info value with min 0 length and max 1000
+ ISchemaItemPtr info_SchemaItem = CStringSchemaItem::create(
+ TSchemaItemParameter<size_t>(0), TSchemaItemParameter<size_t>(1000),
+ TSchemaItemParameter<std::string>());
+
+ ISchemaItemPtr tryAgainTime_SchemaItem = TNumberSchemaItem<int>::create(
+ TSchemaItemParameter<int>(0), TSchemaItemParameter<int>(2000000000),
+ TSchemaItemParameter<int>());
+
+ // Map of parameters
+ std::map<std::string, CObjectSchemaItem::SMember> schemaMembersMap;
+
+ schemaMembersMap["success"] = CObjectSchemaItem::SMember(success_SchemaItem,
+ false);
+ schemaMembersMap["resultCode"] = CObjectSchemaItem::SMember(
+ resultCode_SchemaItem, false);
+ schemaMembersMap["info"] = CObjectSchemaItem::SMember(info_SchemaItem, false);
+ schemaMembersMap["tryAgainTime"] = CObjectSchemaItem::SMember(
+ tryAgainTime_SchemaItem, false);
+
+ std::map<std::string, CObjectSchemaItem::SMember> paramsMembersMap;
+ paramsMembersMap[S_FUNCTION_ID] = CObjectSchemaItem::SMember(
+ TEnumSchemaItem<FunctionIDTest::eType>::create(
+ functionId_allowedEnumSubsetValues),
+ true);
+ paramsMembersMap[S_MESSAGE_TYPE] = CObjectSchemaItem::SMember(
+ TEnumSchemaItem<MessageTypeTest::eType>::create(
+ messageType_allowedEnumSubsetValues),
+ true);
+ paramsMembersMap[S_CORRELATION_ID] = CObjectSchemaItem::SMember(
+ TNumberSchemaItem<int>::create(), true);
+ paramsMembersMap[S_PROTOCOL_VERSION] = CObjectSchemaItem::SMember(
+ TNumberSchemaItem<int>::create(TSchemaItemParameter<int>(1),
+ TSchemaItemParameter<int>(2)),
+ true);
+ paramsMembersMap[S_PROTOCOL_TYPE] = CObjectSchemaItem::SMember(
+ TNumberSchemaItem<int>::create(), true);
+
+ std::map<std::string, CObjectSchemaItem::SMember> rootMembersMap;
+ rootMembersMap[S_MSG_PARAMS] = CObjectSchemaItem::SMember(
+ CObjectSchemaItem::create(schemaMembersMap), true);
+ rootMembersMap[S_PARAMS] = CObjectSchemaItem::SMember(
+ CObjectSchemaItem::create(paramsMembersMap), true);
+ return CSmartSchema(CObjectSchemaItem::create(rootMembersMap));
+};
+
+
+CSmartSchema initSchemaForMetaFormatter() {
+ std::set<TestType::eType> resultCode_allowedEnumSubsetValues;
+ resultCode_allowedEnumSubsetValues.insert(
+ TestType::APPLICATION_NOT_REGISTERED);
+ resultCode_allowedEnumSubsetValues.insert(TestType::SUCCESS);
+ resultCode_allowedEnumSubsetValues.insert(
+ TestType::TOO_MANY_PENDING_REQUESTS);
+ resultCode_allowedEnumSubsetValues.insert(TestType::REJECTED);
+ resultCode_allowedEnumSubsetValues.insert(TestType::INVALID_DATA);
+ resultCode_allowedEnumSubsetValues.insert(TestType::OUT_OF_MEMORY);
+ resultCode_allowedEnumSubsetValues.insert(TestType::ABORTED);
+ resultCode_allowedEnumSubsetValues.insert(TestType::USER_DISALLOWED);
+ resultCode_allowedEnumSubsetValues.insert(TestType::GENERIC_ERROR);
+ resultCode_allowedEnumSubsetValues.insert(TestType::DISALLOWED);
+
+ // Possible functions in this test scheme
+ std::set<FunctionIDTest::eType> functionId_allowedEnumSubsetValues;
+ functionId_allowedEnumSubsetValues.insert(
+ FunctionIDTest::RegisterAppInterface);
+ functionId_allowedEnumSubsetValues.insert(
+ FunctionIDTest::UnregisterAppInterface);
+ functionId_allowedEnumSubsetValues.insert(
+ FunctionIDTest::SetGlobalProperties);
+
+ std::set<Language::eType> languageDesired_allowedEnumSubsetValues;
+ languageDesired_allowedEnumSubsetValues.insert(Language::RU_RU);
+ languageDesired_allowedEnumSubsetValues.insert(Language::EN_EU);
+
+
+ std::set<AppTypeTest::eType> appType_allowedEnumSubsetValues;
+ appType_allowedEnumSubsetValues.insert(AppTypeTest::SYSTEM);
+ appType_allowedEnumSubsetValues.insert(AppTypeTest::MEDIA);
+
+ std::set<SpeechCapabilities::eType> speechCapabilities_allowedEnumSubsetValues;
+ speechCapabilities_allowedEnumSubsetValues.insert(SpeechCapabilities::SC_TEXT);
+
+ // Possible message types
+ std::set<MessageTypeTest::eType> messageType_allowedEnumSubsetValues;
+ messageType_allowedEnumSubsetValues.insert(MessageTypeTest::request);
+ messageType_allowedEnumSubsetValues.insert(MessageTypeTest::response);
+ messageType_allowedEnumSubsetValues.insert(MessageTypeTest::notification);
+
+ // Create param items
+ ISchemaItemPtr appID_SchemaItem = CStringSchemaItem::create(
+ TSchemaItemParameter<size_t>(0), TSchemaItemParameter<size_t>(1000),
+ TSchemaItemParameter<std::string>());
+ ISchemaItemPtr appName_SchemaItem = CStringSchemaItem::create(
+ TSchemaItemParameter<size_t>(0), TSchemaItemParameter<size_t>(1000),
+ TSchemaItemParameter<std::string>());
+ ISchemaItemPtr isMediaApplication_SchemaItem = CBoolSchemaItem::create(
+ TSchemaItemParameter<bool>());
+ ISchemaItemPtr ngnMediaScreenAppName_SchemaItem = CStringSchemaItem::create(
+ TSchemaItemParameter<size_t>(0), TSchemaItemParameter<size_t>(1000),
+ TSchemaItemParameter<std::string>());
+
+ ISchemaItemPtr ttsNameItem_SchemaItem = CStringSchemaItem::create(
+ TSchemaItemParameter<size_t>(0), TSchemaItemParameter<size_t>(1000),
+ TSchemaItemParameter<std::string>());
+
+ ISchemaItemPtr ttstype_SchemaItem =
+ TEnumSchemaItem<SpeechCapabilities::eType>::create(
+ speechCapabilities_allowedEnumSubsetValues,
+ TSchemaItemParameter<SpeechCapabilities::eType>());
+
+ std::map<std::string, CObjectSchemaItem::SMember> ttsMap;
+ ttsMap["text"]=CObjectSchemaItem::SMember(ttsNameItem_SchemaItem,
+ false);
+ ttsMap["type"]=CObjectSchemaItem::SMember(ttstype_SchemaItem,
+ false);;
+
+ ISchemaItemPtr hmiDisplayLanguageDesired_SchemaItem =
+ TEnumSchemaItem<Language::eType>::create(
+ languageDesired_allowedEnumSubsetValues,
+ TSchemaItemParameter<Language::eType>());
+
+ ISchemaItemPtr languageDesired_SchemaItem =
+ TEnumSchemaItem<Language::eType>::create(
+ languageDesired_allowedEnumSubsetValues,
+ TSchemaItemParameter<Language::eType>());
+
+ ISchemaItemPtr vrElementSchemaItem = CStringSchemaItem::create(
+ TSchemaItemParameter<size_t>(0), TSchemaItemParameter<size_t>(1000),
+ TSchemaItemParameter<std::string>());
+
+ ISchemaItemPtr appTypeElementSchemaItem =
+ TEnumSchemaItem<AppTypeTest::eType>::create(
+ appType_allowedEnumSubsetValues,
+ TSchemaItemParameter<AppTypeTest::eType>());
+
+ ISchemaItemPtr ttsElementSchemaItem = CObjectSchemaItem::create(ttsMap);
+
+ ISchemaItemPtr ttsName_SchemaItem =
+ CArraySchemaItem::create(ttsElementSchemaItem,
+ TSchemaItemParameter<size_t>(0), TSchemaItemParameter<size_t>(1000));
+
+ ISchemaItemPtr vrSynonyms_SchemaItem =
+ CArraySchemaItem::create(vrElementSchemaItem,
+ TSchemaItemParameter<size_t>(0), TSchemaItemParameter<size_t>(1000));
+
+ ISchemaItemPtr appType_SchemaItem =
+ CArraySchemaItem::create(appTypeElementSchemaItem,
+ TSchemaItemParameter<size_t>(0), TSchemaItemParameter<size_t>(1000));
+
+
+ ISchemaItemPtr majorVersion_SchemaItem = TNumberSchemaItem<int>::create();
+ ISchemaItemPtr minorVersion_SchemaItem = TNumberSchemaItem<int>::create();
+
+ ISchemaItemPtr syncMsg_SchemaItem =CStringSchemaItem::create(
+ TSchemaItemParameter<size_t>(0), TSchemaItemParameter<size_t>(1000),
+ TSchemaItemParameter<std::string>());
+
+ ISchemaItemPtr syncMsgVersion_SchemaItem =
+ CArraySchemaItem::create(syncMsg_SchemaItem,
+ TSchemaItemParameter<size_t>(0), TSchemaItemParameter<size_t>(1000));
+
+ // Creation map for syncMsgVersion
+ std::map<std::string, CObjectSchemaItem::SMember> schemaSyncMsgVersionMap;
+ schemaSyncMsgVersionMap["majorVersion"]=CObjectSchemaItem::SMember(majorVersion_SchemaItem,
+ false);
+ schemaSyncMsgVersionMap["minorVersion"]=CObjectSchemaItem::SMember(minorVersion_SchemaItem,
+ false);;
+
+ // Map of parameters
+ std::map<std::string, CObjectSchemaItem::SMember> schemaMembersMap;
+
+ schemaMembersMap["appID"] = CObjectSchemaItem::SMember(appID_SchemaItem,
+ false);
+ schemaMembersMap["appName"] = CObjectSchemaItem::SMember(appName_SchemaItem,
+ false);
+ schemaMembersMap["appType"] = CObjectSchemaItem::SMember(appType_SchemaItem,
+ false);
+ schemaMembersMap["hmiDisplayLanguageDesired"] = CObjectSchemaItem::SMember(hmiDisplayLanguageDesired_SchemaItem,
+ false);
+ schemaMembersMap["isMediaApplication"] = CObjectSchemaItem::SMember(isMediaApplication_SchemaItem,
+ false);
+ schemaMembersMap["languageDesired"] = CObjectSchemaItem::SMember(languageDesired_SchemaItem,
+ false);
+ schemaMembersMap["ngnMediaScreenAppName"] = CObjectSchemaItem::SMember(ngnMediaScreenAppName_SchemaItem,
+ false);
+ schemaMembersMap["syncMsgVersion"] = CObjectSchemaItem::SMember(CObjectSchemaItem::create(schemaSyncMsgVersionMap),
+ false);
+ schemaMembersMap["ttsName"] = CObjectSchemaItem::SMember(ttsName_SchemaItem,
+ false);
+ schemaMembersMap["vrSynonyms"] = CObjectSchemaItem::SMember(vrSynonyms_SchemaItem, false);
+
+ std::map<std::string, CObjectSchemaItem::SMember> paramsMembersMap;
+ paramsMembersMap[S_FUNCTION_ID] = CObjectSchemaItem::SMember(
+ TEnumSchemaItem<FunctionIDTest::eType>::create(
+ functionId_allowedEnumSubsetValues),
+ true);
+ paramsMembersMap[S_MESSAGE_TYPE] = CObjectSchemaItem::SMember(
+ TEnumSchemaItem<MessageTypeTest::eType>::create(
+ messageType_allowedEnumSubsetValues),
+ true);
+ paramsMembersMap[S_CORRELATION_ID] = CObjectSchemaItem::SMember(
+ TNumberSchemaItem<int>::create(), true);
+ paramsMembersMap[S_PROTOCOL_VERSION] = CObjectSchemaItem::SMember(
+ TNumberSchemaItem<int>::create(TSchemaItemParameter<int>(1),
+ TSchemaItemParameter<int>(2)),
+ true);
+ paramsMembersMap[S_PROTOCOL_TYPE] = CObjectSchemaItem::SMember(
+ TNumberSchemaItem<int>::create(), true);
+
+ std::map<std::string, CObjectSchemaItem::SMember> rootMembersMap;
+ rootMembersMap[S_MSG_PARAMS] = CObjectSchemaItem::SMember(
+ CObjectSchemaItem::create(schemaMembersMap), true);
+ rootMembersMap[S_PARAMS] = CObjectSchemaItem::SMember(
+ CObjectSchemaItem::create(paramsMembersMap), true);
+ return CSmartSchema(CObjectSchemaItem::create(rootMembersMap));
+};
+
+
+
+} // namespace formatters
+} // namespace components
+} // namespace test
diff --git a/src/components/formatters/test/src/meta_formatter_test_helper.cc b/src/components/formatters/test/src/meta_formatter_test_helper.cc
new file mode 100644
index 000000000..3445d948b
--- /dev/null
+++ b/src/components/formatters/test/src/meta_formatter_test_helper.cc
@@ -0,0 +1,222 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#include "gtest/gtest.h"
+#include "meta_formatter_test_helper.h"
+
+namespace test {
+namespace components {
+namespace formatters {
+
+using namespace NsSmartDeviceLink::NsJSONHandler::strings;
+using namespace NsSmartDeviceLink::NsJSONHandler::Formatters;
+
+void CMetaFormatterTestHelper::SetUp() {
+ function_id_items_.insert(FunctionIDTest::RegisterAppInterface);
+ function_id_items_.insert(FunctionIDTest::UnregisterAppInterface);
+ function_id_items_.insert(FunctionIDTest::SetGlobalProperties);
+
+ message_type_items_.insert(MessageTypeTest::request);
+ message_type_items_.insert(MessageTypeTest::response);
+ message_type_items_.insert(MessageTypeTest::notification);
+}
+
+void CMetaFormatterTestHelper::TearDown() {
+ function_id_items_.clear();
+ message_type_items_.clear();
+}
+
+//-----------------------------------------------------------
+
+void CMetaFormatterTestHelper::AnyObjectToJsonString(
+ const SmartObject& obj, std::string& result_string) {
+
+ Json::Value params(Json::objectValue);
+
+ SmartObject formattedObj(obj);
+
+ CFormatterJsonBase::objToJsonValue(formattedObj, params);
+
+ result_string = params.toStyledString();
+}
+
+//-----------------------------------------------------------
+
+void CMetaFormatterTestHelper::FillObjectIdenticalToSchema(SmartObject& obj) {
+
+ obj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request;
+ obj[S_PARAMS][S_FUNCTION_ID] = FunctionIDTest::RegisterAppInterface;
+ obj[S_PARAMS][S_CORRELATION_ID] = 12;
+ obj[S_PARAMS][S_PROTOCOL_VERSION] = 1;
+ obj[S_PARAMS][S_PROTOCOL_TYPE] = 0;
+
+ obj[S_MSG_PARAMS]["syncMsgVersion"]["majorVersion"] = 2;
+ obj[S_MSG_PARAMS]["syncMsgVersion"]["minorVersion"] = 10;
+ obj[S_MSG_PARAMS]["appName"] = "APP NAME";
+ obj[S_MSG_PARAMS]["ttsName"][0]["text"] = "ABC";
+ obj[S_MSG_PARAMS]["ttsName"][0]["type"] = SpeechCapabilities::SC_TEXT;
+ obj[S_MSG_PARAMS]["ngnMediaScreenAppName"] = "SCREEN NAME";
+ obj[S_MSG_PARAMS]["vrSynonyms"][0] = "Synonym1";
+ obj[S_MSG_PARAMS]["vrSynonyms"][1] = "Synonym2";
+ obj[S_MSG_PARAMS]["isMediaApplication"] = true;
+ obj[S_MSG_PARAMS]["languageDesired"] = Language::EN_EU;
+ obj[S_MSG_PARAMS]["hmiDisplayLanguageDesired"] = Language::RU_RU;
+ obj[S_MSG_PARAMS]["appType"][0] = AppTypeTest::SYSTEM;
+ obj[S_MSG_PARAMS]["appType"][1] = AppTypeTest::MEDIA;
+ obj[S_MSG_PARAMS]["appID"] = "APP ID";
+}
+
+//-----------------------------------------------------------
+void CMetaFormatterTestHelper::FillObjectIdenticalToSchemaWithoutNoMandatoriesParams(
+ SmartObject& obj) {
+ obj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request;
+ obj[S_PARAMS][S_FUNCTION_ID] = FunctionIDTest::RegisterAppInterface;
+ obj[S_PARAMS][S_CORRELATION_ID] = 12;
+ obj[S_PARAMS][S_PROTOCOL_VERSION] = 1;
+ obj[S_PARAMS][S_PROTOCOL_TYPE] = 0;
+
+ obj[S_MSG_PARAMS]["syncMsgVersion"]["majorVersion"] = 2;
+ obj[S_MSG_PARAMS]["syncMsgVersion"]["minorVersion"] = 10;
+ obj[S_MSG_PARAMS]["appName"] = "APP NAME";
+ obj[S_MSG_PARAMS]["ngnMediaScreenAppName"] = "SCREEN NAME";
+ obj[S_MSG_PARAMS]["isMediaApplication"] = true;
+ obj[S_MSG_PARAMS]["languageDesired"] = Language::EN_EU;
+ obj[S_MSG_PARAMS]["hmiDisplayLanguageDesired"] = Language::RU_RU;
+ obj[S_MSG_PARAMS]["appID"] = "APP ID";
+
+ // Commented not mandatory params for check creation object without them
+// obj[S_MSG_PARAMS]["ttsName"][0]["text"] = "ABC";
+// obj[S_MSG_PARAMS]["ttsName"][0]["type"] =
+// SpeechCapabilities::SC_TEXT;
+
+// obj[S_MSG_PARAMS]["vrSynonyms"][0] = "Synonym1";
+// obj[S_MSG_PARAMS]["vrSynonyms"][1] = "Synonym2";
+
+// obj[S_MSG_PARAMS]["appType"][0] = AppTypeTest::SYSTEM; // not mandatory
+// obj[S_MSG_PARAMS]["appType"][1] = AppTypeTest::MEDIA;
+
+}
+
+void CMetaFormatterTestHelper::FillObjectWithoutSomeMandatoryFields(
+ SmartObject& obj) {
+ obj[S_PARAMS][S_MESSAGE_TYPE] = MessageTypeTest::request;
+ obj[S_PARAMS][S_FUNCTION_ID] = FunctionIDTest::RegisterAppInterface;
+
+ obj[S_PARAMS][S_PROTOCOL_VERSION] = 1;
+ obj[S_PARAMS][S_PROTOCOL_TYPE] = 0;
+
+// Commented mandatory params for check creation object without them
+// obj[S_PARAMS][S_CORRELATION_ID] = 12;
+// obj[S_MSG_PARAMS]["syncMsgVersion"]["majorVersion"] = 2;
+// obj[S_MSG_PARAMS]["syncMsgVersion"]["minorVersion"] = 10;
+
+ obj[S_MSG_PARAMS]["appName"] = "APP NAME";
+ obj[S_MSG_PARAMS]["ttsName"][0]["text"] = "ABC";
+ obj[S_MSG_PARAMS]["ttsName"][0]["type"] = SpeechCapabilities::SC_TEXT;
+ obj[S_MSG_PARAMS]["ngnMediaScreenAppName"] = "SCREEN NAME";
+ obj[S_MSG_PARAMS]["vrSynonyms"][0] = "Synonym1";
+ obj[S_MSG_PARAMS]["vrSynonyms"][1] = "Synonym2";
+ obj[S_MSG_PARAMS]["isMediaApplication"] = true;
+ obj[S_MSG_PARAMS]["languageDesired"] = Language::EN_EU;
+ obj[S_MSG_PARAMS]["hmiDisplayLanguageDesired"] = Language::RU_RU;
+ obj[S_MSG_PARAMS]["appType"][0] = AppTypeTest::SYSTEM;
+ obj[S_MSG_PARAMS]["appType"][1] = AppTypeTest::MEDIA;
+ obj[S_MSG_PARAMS]["appID"] = "APP ID";
+}
+
+//-----------------------------------------------------------
+
+void CMetaFormatterTestHelper::CompareObjects(const SmartObject& first,
+ const SmartObject& second) {
+
+ if (SmartType_Array == first.getType()) {
+ ASSERT_EQ(SmartType_Array, second.getType());
+ for (size_t i = 0; i < first.length(); i++) {
+ CompareObjects(first.getElement(i), second.getElement(i));
+ }
+ } else if (SmartType_Map == first.getType()) {
+ ASSERT_EQ(SmartType_Map, second.getType());
+ std::set < std::string > keys = first.enumerate();
+
+ for (std::set<std::string>::const_iterator key = keys.begin();
+ key != keys.end(); key++) {
+ CompareObjects(first.getElement(*key), second.getElement(*key));
+ }
+ } else if (SmartType_Boolean == first.getType()) {
+ ASSERT_EQ(first.asBool(), second.asBool());
+ } else if (SmartType_Integer == first.getType()) {
+ ASSERT_EQ(first.asInt(), second.asInt());
+ } else if (SmartType_Double == first.getType()) {
+ ASSERT_EQ(first.asDouble(), second.asDouble());
+ } else if (SmartType_String == first.getType()) {
+ ASSERT_EQ(first.asString(), second.asString());
+ } else if (SmartType_Null == first.getType()) {
+ ASSERT_EQ(SmartType_Null, second.getType());
+ } else {
+ FAIL()<< "Unknown SmartObject type: " << first.getType();
+ }
+}
+
+//-----------------------------------------------------------
+
+void CMetaFormatterTestHelper::FillObjectWithDefaultValues(SmartObject& obj) {
+
+ obj[S_PARAMS][S_MESSAGE_TYPE] = -1;
+ obj[S_PARAMS][S_FUNCTION_ID] = -1;
+ obj[S_PARAMS][S_CORRELATION_ID] = 0;
+ obj[S_PARAMS][S_PROTOCOL_VERSION] = 0;
+ obj[S_PARAMS][S_PROTOCOL_TYPE] = 0;
+
+ obj[S_MSG_PARAMS]["syncMsgVersion"]["majorVersion"] = 0;
+ obj[S_MSG_PARAMS]["syncMsgVersion"]["minorVersion"] = 0;
+ obj[S_MSG_PARAMS]["appName"] = "";
+ obj[S_MSG_PARAMS]["ngnMediaScreenAppName"] = "";
+ obj[S_MSG_PARAMS]["isMediaApplication"] = false;
+ obj[S_MSG_PARAMS]["languageDesired"] = -1;
+ obj[S_MSG_PARAMS]["hmiDisplayLanguageDesired"] = -1;
+ obj[S_MSG_PARAMS]["appID"] = "";
+
+// Commented params for check creation object with only default values
+// obj[S_MSG_PARAMS]["ttsName"][0]["text"] = "ABC";
+// obj[S_MSG_PARAMS]["ttsName"][0]["type"] =
+// SpeechCapabilities::SC_TEXT;
+
+// obj[S_MSG_PARAMS]["vrSynonyms"][0] = "Synonym1";
+// obj[S_MSG_PARAMS]["vrSynonyms"][1] = "Synonym2";
+
+// obj[S_MSG_PARAMS]["appType"][0] = AppTypeTest::SYSTEM;
+// obj[S_MSG_PARAMS]["appType"][1] = AppTypeTest::MEDIA;
+
+}
+
+} // namespace formatters
+} // namespace components
+} // namespace test
diff --git a/src/components/policy/test/CMakeLists.txt b/src/components/policy/test/CMakeLists.txt
index 20a367028..d23a50e7f 100644
--- a/src/components/policy/test/CMakeLists.txt
+++ b/src/components/policy/test/CMakeLists.txt
@@ -1,4 +1,4 @@
-# Copyright (c) 2013-2014, Ford Motor Company
+# Copyright (c) 2015, Ford Motor Company
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
@@ -39,11 +39,10 @@ include_directories(
${COMPONENTS_DIR}/rpc_base/include
${COMPONENTS_DIR}/config_profile/include
${COMPONENTS_DIR}/utils/include/
-
+ ${COMPONENTS_DIR}/policy/src/policy/policy_table/
)
set(testLibraries
- gtest
gmock
Utils
Policy
@@ -53,8 +52,8 @@ set(testLibraries
set(testSources
usage_statistics_test.cc
shared_library_test.cc
- generated_code_test.cc #APPLINK-10657
- policy_manager_impl_test.cc
+ generated_code_test.cc
+ #policy_manager_impl_test.cc
)
include_directories(${COMPONENTS_DIR}/policy/src/policy/policy_table/table_struct)
@@ -82,7 +81,7 @@ else ()
sqlite_wrapper/sql_query_test.cc
generated_code_with_sqlite_test.cc
- # TODO{ALeshin} APPLINK-11132 AssertTrue in SetUpTestCase() return false
+ # TODO{ALeshin} AssertTrue in SetUpTestCase() return false
#policy_manager_impl_stress_test.cc
)
list (APPEND testLibraries sqlite3)
diff --git a/src/components/policy/test/sql_pt_representation_test.cc b/src/components/policy/test/sql_pt_representation_test.cc
index df9338099..088975ecd 100644
--- a/src/components/policy/test/sql_pt_representation_test.cc
+++ b/src/components/policy/test/sql_pt_representation_test.cc
@@ -34,6 +34,8 @@
#include "driver_dbms.h"
#include "policy/sql_pt_representation.h"
#include "policy/policy_types.h"
+#include "json/writer.h"
+#include "json/reader.h"
using policy::SQLPTRepresentation;
using policy::CheckPermissionResult;
@@ -63,6 +65,121 @@ class SQLPTRepresentationTest : public ::testing::Test {
dbms->Close();
}
+void PolicyTableUpdatePrepare(Json::Value& table) {
+ table["policy_table"] = Json::Value(Json::objectValue);
+ Json::Value& policy_table = table["policy_table"];
+ policy_table["module_config"] = Json::Value(Json::objectValue);
+ policy_table["functional_groupings"] = Json::Value(Json::objectValue);
+ policy_table["consumer_friendly_messages"] = Json::Value(Json::objectValue);
+ policy_table["app_policies"] = Json::Value(Json::objectValue);
+
+ Json::Value& module_config = policy_table["module_config"];
+ module_config["preloaded_pt"] = Json::Value(false);
+ module_config["preloaded_date"] = Json::Value("25-04-2015");
+ module_config["exchange_after_x_ignition_cycles"] = Json::Value(10);
+ module_config["exchange_after_x_kilometers"] = Json::Value(100);
+ module_config["exchange_after_x_days"] = Json::Value(5);
+ module_config["timeout_after_x_seconds"] = Json::Value(500);
+ module_config["seconds_between_retries"] = Json::Value(Json::arrayValue);
+ Json::Value& seconds_between_retries =
+ module_config["seconds_between_retries"];
+ seconds_between_retries[0] = Json::Value(10);
+ seconds_between_retries[1] = Json::Value(20);
+ seconds_between_retries[2] = Json::Value(30);
+ module_config["endpoints"] = Json::Value(Json::objectValue);
+ Json::Value& endpoins = module_config["endpoints"];
+ endpoins["0x00"] = Json::Value(Json::objectValue);
+ endpoins["0x00"]["default"] = Json::Value(Json::arrayValue);
+ endpoins["0x00"]["default"][0] =
+ Json::Value("http://ford.com/cloud/default");
+ module_config["notifications_per_minute_by_priority"] =
+ Json::Value(Json::objectValue);
+ module_config["notifications_per_minute_by_priority"]["emergency"] =
+ Json::Value(1);
+ module_config["notifications_per_minute_by_priority"]["navigation"] =
+ Json::Value(2);
+ module_config["notifications_per_minute_by_priority"]["VOICECOMM"] =
+ Json::Value(3);
+ module_config["notifications_per_minute_by_priority"]["communication"] =
+ Json::Value(4);
+ module_config["notifications_per_minute_by_priority"]["normal"] =
+ Json::Value(5);
+ module_config["notifications_per_minute_by_priority"]["none"] =
+ Json::Value(6);
+ module_config["vehicle_make"] = Json::Value("MakeT");
+ module_config["vehicle_model"] = Json::Value("ModelT");
+ module_config["vehicle_year"] = Json::Value("2014");
+ module_config["certificate"] = Json::Value("my_cert");
+
+ Json::Value& functional_groupings = policy_table["functional_groupings"];
+ functional_groupings["default"] = Json::Value(Json::objectValue);
+ Json::Value& default_group = functional_groupings["default"];
+ default_group["rpcs"] = Json::Value(Json::objectValue);
+ default_group["rpcs"]["Update"] = Json::Value(Json::objectValue);
+ default_group["rpcs"]["Update"]["hmi_levels"] =
+ Json::Value(Json::arrayValue);
+ default_group["rpcs"]["Update"]["hmi_levels"][0] = Json::Value("FULL");
+ default_group["rpcs"]["Update"]["parameters"] =
+ Json::Value(Json::arrayValue);
+ default_group["rpcs"]["Update"]["parameters"][0] = Json::Value("speed");
+
+ Json::Value& consumer_friendly_messages =
+ policy_table["consumer_friendly_messages"];
+ consumer_friendly_messages["version"] = Json::Value("1.2");
+ consumer_friendly_messages["messages"] = Json::Value(Json::objectValue);
+ consumer_friendly_messages["messages"]["MSG1"] =
+ Json::Value(Json::objectValue);
+ Json::Value& msg1 = consumer_friendly_messages["messages"]["MSG1"];
+ msg1["languages"] = Json::Value(Json::objectValue);
+ msg1["languages"]["en-us"] = Json::Value(Json::objectValue);
+ msg1["languages"]["en-us"]["tts"] = Json::Value("TTS message");
+ msg1["languages"]["en-us"]["label"] = Json::Value("LABEL message");
+ msg1["languages"]["en-us"]["line1"] = Json::Value("LINE1 message");
+ msg1["languages"]["en-us"]["line2"] = Json::Value("LINE2 message");
+ msg1["languages"]["en-us"]["textBody"] = Json::Value("TEXTBODY message");
+
+ Json::Value& app_policies = policy_table["app_policies"];
+ app_policies["default"] = Json::Value(Json::objectValue);
+ app_policies["default"]["priority"] = Json::Value("EMERGENCY");
+ app_policies["default"]["memory_kb"] = Json::Value(50);
+ app_policies["default"]["heart_beat_timeout_ms"] = Json::Value(100);
+ app_policies["default"]["groups"] = Json::Value(Json::arrayValue);
+ app_policies["default"]["groups"][0] = Json::Value("default");
+ app_policies["default"]["priority"] = Json::Value("EMERGENCY");
+ app_policies["default"]["is_revoked"] = Json::Value(true);
+ app_policies["default"]["default_hmi"] = Json::Value("FULL");
+ app_policies["default"]["keep_context"] = Json::Value(true);
+ app_policies["default"]["steal_focus"] = Json::Value(true);
+
+ app_policies["pre_DataConsent"] = Json::Value(Json::objectValue);
+ app_policies["pre_DataConsent"]["memory_kb"] = Json::Value(40);
+ app_policies["pre_DataConsent"]["heart_beat_timeout_ms"] = Json::Value(90);
+ app_policies["pre_DataConsent"]["groups"] = Json::Value(Json::arrayValue);
+ app_policies["pre_DataConsent"]["groups"][0] = Json::Value("default");
+ app_policies["pre_DataConsent"]["priority"] = Json::Value("EMERGENCY");
+ app_policies["pre_DataConsent"]["default_hmi"] = Json::Value("FULL");
+ app_policies["pre_DataConsent"]["is_revoked"] = Json::Value(false);
+ app_policies["pre_DataConsent"]["keep_context"] = Json::Value(true);
+ app_policies["pre_DataConsent"]["steal_focus"] = Json::Value(true);
+ app_policies["1234"] = Json::Value(Json::objectValue);
+ app_policies["1234"]["memory_kb"] = Json::Value(150);
+ app_policies["1234"]["heart_beat_timeout_ms"] = Json::Value(200);
+ app_policies["1234"]["groups"] = Json::Value(Json::arrayValue);
+ app_policies["1234"]["groups"][0] = Json::Value("default");
+ app_policies["1234"]["priority"] = Json::Value("EMERGENCY");
+ app_policies["1234"]["default_hmi"] = Json::Value("FULL");
+ app_policies["1234"]["is_revoked"] = Json::Value(true);
+ app_policies["1234"]["keep_context"] = Json::Value(false);
+ app_policies["1234"]["steal_focus"] = Json::Value(false);
+ app_policies["device"] = Json::Value(Json::objectValue);
+ app_policies["device"]["groups"] = Json::Value(Json::arrayValue);
+ app_policies["device"]["groups"][0] = Json::Value("default");
+ app_policies["device"]["priority"] = Json::Value("EMERGENCY");
+ app_policies["device"]["is_revoked"] = Json::Value(true);
+ app_policies["device"]["default_hmi"] = Json::Value("FULL");
+ app_policies["device"]["keep_context"] = Json::Value(true);
+ app_policies["device"]["steal_focus"] = Json::Value(true);
+ }
::testing::AssertionResult IsValid(const policy_table::Table& table) {
if (table.is_valid()) {
return ::testing::AssertionSuccess();
@@ -437,99 +554,47 @@ TEST_F(SQLPTRepresentationTest, TimeoutResponse_Set60Seconds_GetEqualTimeout) {
EXPECT_EQ(60, reps->TimeoutResponse());
}
-TEST_F(SQLPTRepresentationTest, GenerateSnapshot_SetPolicyTable_SnapshotIsPresent) {
-
- //arrange
+TEST_F(SQLPTRepresentationTest,
+ GenerateSnapshot_SetPolicyTable_SnapshotIsPresent) {
+ // Arrange
Json::Value table(Json::objectValue);
- table["policy_table"] = Json::Value(Json::objectValue);
-
- Json::Value& policy_table = table["policy_table"];
- policy_table["module_meta"] = Json::Value(Json::objectValue);
- policy_table["module_config"] = Json::Value(Json::objectValue);
- policy_table["functional_groupings"] = Json::Value(Json::objectValue);
- policy_table["consumer_friendly_messages"] = Json::Value(Json::objectValue);
- policy_table["app_policies"] = Json::Value(Json::objectValue);
-
- Json::Value& module_config = policy_table["module_config"];
- module_config["preloaded_pt"] = Json::Value(true);
- module_config["exchange_after_x_ignition_cycles"] = Json::Value(10);
- module_config["exchange_after_x_kilometers"] = Json::Value(100);
- module_config["exchange_after_x_days"] = Json::Value(5);
- module_config["timeout_after_x_seconds"] = Json::Value(500);
- module_config["seconds_between_retries"] = Json::Value(Json::arrayValue);
- module_config["seconds_between_retries"][0] = Json::Value(10);
- module_config["seconds_between_retries"][1] = Json::Value(20);
- module_config["seconds_between_retries"][2] = Json::Value(30);
- module_config["endpoints"] = Json::Value(Json::objectValue);
- module_config["endpoints"]["0x00"] = Json::Value(Json::objectValue);
- module_config["endpoints"]["0x00"]["default"] = Json::Value(Json::arrayValue);
- module_config["endpoints"]["0x00"]["default"][0] = Json::Value(
- "http://ford.com/cloud/default");
- module_config["notifications_per_minute_by_priority"] = Json::Value(
- Json::objectValue);
- module_config["notifications_per_minute_by_priority"]["emergency"] =
- Json::Value(1);
- module_config["notifications_per_minute_by_priority"]["navigation"] =
- Json::Value(2);
- module_config["notifications_per_minute_by_priority"]["VOICECOMM"] =
- Json::Value(3);
- module_config["notifications_per_minute_by_priority"]["communication"] =
- Json::Value(4);
- module_config["notifications_per_minute_by_priority"]["normal"] = Json::Value(
- 5);
- module_config["notifications_per_minute_by_priority"]["none"] = Json::Value(
- 6);
- module_config["vehicle_make"] = Json::Value("MakeT");
- module_config["vehicle_model"] = Json::Value("ModelT");
- module_config["vehicle_year"] = Json::Value("2014");
-
- Json::Value& functional_groupings = policy_table["functional_groupings"];
- functional_groupings["default"] = Json::Value(Json::objectValue);
- Json::Value& default_group = functional_groupings["default"];
- default_group["rpcs"] = Json::Value(Json::objectValue);
- default_group["rpcs"]["Update"] = Json::Value(Json::objectValue);
- default_group["rpcs"]["Update"]["hmi_levels"] = Json::Value(Json::arrayValue);
- default_group["rpcs"]["Update"]["hmi_levels"][0] = Json::Value("FULL");
- default_group["rpcs"]["Update"]["parameters"] = Json::Value(Json::arrayValue);
- default_group["rpcs"]["Update"]["parameters"][0] = Json::Value("speed");
-
- Json::Value& consumer_friendly_messages =
- policy_table["consumer_friendly_messages"];
- consumer_friendly_messages["version"] = Json::Value("1.2");
- consumer_friendly_messages["messages"] = Json::Value(Json::objectValue);
- consumer_friendly_messages["messages"]["MSG1"] = Json::Value(
- Json::objectValue);
- Json::Value& msg1 = consumer_friendly_messages["messages"]["MSG1"];
- msg1["languages"] = Json::Value(Json::objectValue);
- msg1["languages"]["en-us"] = Json::Value(Json::objectValue);
-
- Json::Value& app_policies = policy_table["app_policies"];
- app_policies["default"] = Json::Value(Json::objectValue);
- app_policies["default"]["priority"] = Json::Value("EMERGENCY");
- app_policies["default"]["memory_kb"] = Json::Value(50);
- app_policies["default"]["heart_beat_timeout_ms"] = Json::Value(10);
- app_policies["default"]["groups"] = Json::Value(Json::arrayValue);
- app_policies["default"]["groups"][0] = Json::Value("default");
- app_policies["default"]["certificate"] = Json::Value("sign");
+ PolicyTableUpdatePrepare(table);
policy_table::Table update(&table);
update.SetPolicyTableType(rpc::policy_table_interface_base::PT_UPDATE);
-
- //assert
+ // Assert
ASSERT_TRUE(IsValid(update));
ASSERT_TRUE(reps->Save(update));
- //act
+ // Act
utils::SharedPtr<policy_table::Table> snapshot = reps->GenerateSnapshot();
snapshot->SetPolicyTableType(rpc::policy_table_interface_base::PT_SNAPSHOT);
-
- consumer_friendly_messages.removeMember("messages");
- policy_table["device_data"] = Json::Value(Json::objectValue);
-
+ // Remove fields which must be absent in snapshot
+ table["policy_table"]["consumer_friendly_messages"].removeMember("messages");
+ table["policy_table"]["app_policies"]["1234"].removeMember("default_hmi");
+ table["policy_table"]["app_policies"]["1234"].removeMember("keep_context");
+ table["policy_table"]["app_policies"]["1234"].removeMember("steal_focus");
+ table["policy_table"]["app_policies"]["default"].removeMember("default_hmi");
+ table["policy_table"]["app_policies"]["default"].removeMember("keep_context");
+ table["policy_table"]["app_policies"]["default"].removeMember("steal_focus");
+ table["policy_table"]["app_policies"]["pre_DataConsent"].removeMember(
+ "default_hmi");
+ table["policy_table"]["app_policies"]["pre_DataConsent"].removeMember(
+ "keep_context");
+ table["policy_table"]["app_policies"]["pre_DataConsent"].removeMember(
+ "steal_focus");
+ table["policy_table"]["app_policies"]["device"].removeMember("default_hmi");
+ table["policy_table"]["app_policies"]["device"].removeMember("keep_context");
+ table["policy_table"]["app_policies"]["device"].removeMember("steal_focus");
+ table["policy_table"]["app_policies"]["device"].removeMember("groups");
+ table["policy_table"]["device_data"] = Json::Value(Json::objectValue);
+ table["policy_table"]["module_meta"] = Json::Value(Json::objectValue);
policy_table::Table expected(&table);
-
- //assert
+ Json::StyledWriter writer;
+ // Checks
+ EXPECT_EQ(writer.write(expected.ToJsonValue()),
+ writer.write(snapshot->ToJsonValue()));
EXPECT_EQ(expected.ToJsonValue().toStyledString(),
snapshot->ToJsonValue().toStyledString());
}
diff --git a/src/components/protocol_handler/test/CMakeLists.txt b/src/components/protocol_handler/test/CMakeLists.txt
index d24fb47ba..935ae5c47 100644
--- a/src/components/protocol_handler/test/CMakeLists.txt
+++ b/src/components/protocol_handler/test/CMakeLists.txt
@@ -1,4 +1,4 @@
-# Copyright (c) 2014, Ford Motor Company
+# Copyright (c) 2015, Ford Motor Company
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
@@ -34,6 +34,7 @@ include_directories(
${GMOCK_INCLUDE_DIRECTORY}
${COMPONENTS_DIR}/protocol_handler/include
${COMPONENTS_DIR}/protocol_handler/test/include
+ ${COMPONENTS_DIR}/include/protocol
)
set(LIBRARIES
@@ -48,7 +49,9 @@ set(LIBRARIES
set(SOURCES
incoming_data_handler_test.cc
protocol_header_validator_test.cc
- protocol_handler_tm_test.cc
+ #protocol_handler_tm_test.cc
+ protocol_packet_test.cc
+ protocol_payload_test.cc
)
create_test("protocol_handler_test" "${SOURCES}" "${LIBRARIES}")
diff --git a/src/components/protocol_handler/test/include/protocol_handler_mock.h b/src/components/protocol_handler/test/include/protocol_handler_mock.h
index 742968e07..41b7c491a 100644
--- a/src/components/protocol_handler/test/include/protocol_handler_mock.h
+++ b/src/components/protocol_handler/test/include/protocol_handler_mock.h
@@ -163,6 +163,8 @@ class SessionObserverMock : public protocol_handler::SessionObserver {
MOCK_METHOD3(ProtocolVersionUsed,
bool( uint32_t connection_id,
uint8_t session_id, uint8_t& protocol_version));
+ MOCK_CONST_METHOD1(GetHandshakeContext,
+ security_manager::SSLContext::HandshakeContext (const uint32_t key) );
};
#ifdef ENABLE_SECURITY
@@ -218,7 +220,10 @@ class SSLContextMock : public security_manager::SSLContext {
MOCK_CONST_METHOD0(IsInitCompleted, bool());
MOCK_CONST_METHOD0(IsHandshakePending, bool());
MOCK_CONST_METHOD0(LastError,
- std::string());
+ std::string());
+ MOCK_METHOD0(ResetConnection,
+ void());
+ MOCK_METHOD1(SetHandshakeContext, void (const HandshakeContext& hsh_ctx));
};
#endif // ENABLE_SECURITY
}
diff --git a/src/components/protocol_handler/test/include/protocol_observer_mock.h b/src/components/protocol_handler/test/include/protocol_observer_mock.h
index 1350319b2..c415e66e4 100644
--- a/src/components/protocol_handler/test/include/protocol_observer_mock.h
+++ b/src/components/protocol_handler/test/include/protocol_observer_mock.h
@@ -46,19 +46,10 @@ namespace protocol_handler_test {
*/
class ProtocolObserverMock : public ::protocol_handler::ProtocolObserver {
public:
- MOCK_METHOD1(OnDeviceListUpdated,
- void(const connection_handler::DeviceMap &device_list));
- MOCK_METHOD0(OnFindNewApplicationsRequest,void());
- MOCK_METHOD1(RemoveDevice,
- void(const connection_handler::DeviceHandle &device_handle));
- MOCK_METHOD3(OnServiceStartedCallback,
- bool(const connection_handler::DeviceHandle &device_handle,
- const int32_t &session_key,
- const protocol_handler::ServiceType &type));
- MOCK_METHOD3(OnServiceEndedCallback,
- void(const int32_t &session_key,
- const protocol_handler::ServiceType &type,
- const connection_handler::CloseSessionReason& close_reason));
+ MOCK_METHOD1(OnMessageReceived,
+ void(const ::protocol_handler::RawMessagePtr));
+ MOCK_METHOD1(OnMobileMessageSent,
+ void(const ::protocol_handler::RawMessagePtr));
};
} // namespace protocol_handler_test
} // namespace components
diff --git a/src/components/protocol_handler/test/include/session_observer_mock.h b/src/components/protocol_handler/test/include/session_observer_mock.h
index d562ec837..383ebaa16 100644
--- a/src/components/protocol_handler/test/include/session_observer_mock.h
+++ b/src/components/protocol_handler/test/include/session_observer_mock.h
@@ -101,6 +101,9 @@ class SessionObserverMock: public ::protocol_handler::SessionObserver {
void(
const uint32_t &key,
const ::protocol_handler::ServiceType &service_type));
+ MOCK_CONST_METHOD1(GetHandshakeContext,
+ security_manager::SSLContext::HandshakeContext (const uint32_t key) );
+
#endif // ENABLE_SECURITY
};
} // namespace protocol_handler_test
diff --git a/src/components/protocol_handler/test/incoming_data_handler_test.cc b/src/components/protocol_handler/test/incoming_data_handler_test.cc
index feb81300f..e45b11f7a 100644
--- a/src/components/protocol_handler/test/incoming_data_handler_test.cc
+++ b/src/components/protocol_handler/test/incoming_data_handler_test.cc
@@ -59,7 +59,7 @@ class IncomingDataHandlerTest : public ::testing::Test {
protov1_message_id = 0x0;
some_message_id = 0xABCDEF0;
some_session_id = 0xFEDCBA0;
- payload_bigger_mtu.resize(MAXIMUM_FRAME_DATA_SIZE + 1);
+ payload_bigger_mtu.resize(MAXIMUM_FRAME_DATA_V2_SIZE + 1);
}
void TearDown() OVERRIDE {
delete[] some_data;
@@ -193,7 +193,7 @@ TEST_F(IncomingDataHandlerTest, MixedPayloadData_TwoConnections) {
// consecutive packet Bulk
mobile_packets.push_back(
new ProtocolPacket(
- uid1, PROTOCOL_VERSION_4, PROTECTION_ON, FRAME_TYPE_CONSECUTIVE,
+ uid1, PROTOCOL_VERSION_3, PROTECTION_ON, FRAME_TYPE_CONSECUTIVE,
kBulk, FRAME_DATA_LAST_CONSECUTIVE, ++some_session_id, some_data2_size,
++some_message_id, some_data2));
for (FrameList::iterator it = mobile_packets.begin(); it != mobile_packets.end(); ++it) {
@@ -215,11 +215,11 @@ TEST_F(IncomingDataHandlerTest, MixedPayloadData_TwoConnections) {
// TODO(EZamakhov): add validator abstraction and replace next test with check only return frames
// Protocol version shall be from 1 to 3
-TEST_F(IncomingDataHandlerTest, MalformedPacket_Version) {
+TEST_F(IncomingDataHandlerTest, DISABLED_MalformedPacket_Version) {
FrameList malformed_packets;
std::vector<uint8_t> malformed_versions;
malformed_versions.push_back(0);
- for (uint8_t version = PROTOCOL_VERSION_4 + 1; version <= PROTOCOL_VERSION_MAX; ++version) {
+ for (uint8_t version = PROTOCOL_VERSION_3 + 1; version <= PROTOCOL_VERSION_MAX; ++version) {
malformed_versions.push_back(version);
}
for (size_t i = 0; i < malformed_versions.size(); ++i) {
@@ -228,19 +228,29 @@ TEST_F(IncomingDataHandlerTest, MalformedPacket_Version) {
uid1, malformed_versions[i], PROTECTION_OFF, FRAME_TYPE_CONTROL, kControl,
FRAME_DATA_HEART_BEAT, some_session_id, 0u, some_message_id, NULL));
}
- for (FrameList::iterator it = malformed_packets.begin(); it != malformed_packets.end(); ++it) {
+
+ // We count malformed only first time when it occurs after correct message
+ FrameList::iterator it = malformed_packets.begin();
+ ProcessPacket(**it);
+ EXPECT_EQ(RESULT_MALFORMED_OCCURS, result_code);
+ EXPECT_EQ(1u, malformed_occurs);
+ EXPECT_EQ(0u, actual_frames.size());
+ ++it;
+
+ // All next data will be one large malformed message which we've already counted
+ for (; it != malformed_packets.end(); ++it) {
ProcessPacket(**it);
EXPECT_EQ(RESULT_MALFORMED_OCCURS, result_code)
<< "Malformed version " << static_cast<int>((*it)->protocol_version());
// Stream of malformed messages is a one occurrence
- EXPECT_EQ(malformed_occurs, 1u);
+ EXPECT_EQ(0u, malformed_occurs);
// All malformed messages shall be ignored
EXPECT_EQ(0u, actual_frames.size());
}
}
// ServiceType shall be equal 0x0 (Control), 0x07 (RPC), 0x0A (PCM), 0x0B (Video), 0x0F (Bulk)
-TEST_F(IncomingDataHandlerTest, MalformedPacket_ServiceType) {
+TEST_F(IncomingDataHandlerTest, DISABLED_MalformedPacket_ServiceType) {
FrameList malformed_packets;
std::vector<uint8_t> malformed_serv_types;
for (uint8_t service_type = kControl + 1; service_type < kRpc; ++service_type) {
@@ -258,19 +268,29 @@ TEST_F(IncomingDataHandlerTest, MalformedPacket_ServiceType) {
malformed_serv_types[i], FRAME_DATA_HEART_BEAT, some_session_id, 0u,
some_message_id, NULL));
}
- for (FrameList::iterator it = malformed_packets.begin(); it != malformed_packets.end(); ++it) {
+
+ // We count malformed only first time when it occurs after correct message
+ FrameList::iterator it = malformed_packets.begin();
+ ProcessPacket(**it);
+ EXPECT_EQ(RESULT_MALFORMED_OCCURS, result_code);
+ EXPECT_EQ(1u, malformed_occurs);
+ EXPECT_EQ(0u, actual_frames.size());
+ ++it;
+
+ // All next data will be one large malformed message which we've already counted
+ for (; it != malformed_packets.end(); ++it) {
ProcessPacket(**it);
EXPECT_EQ(RESULT_MALFORMED_OCCURS, result_code)
<< "Malformed service type " << static_cast<int>((*it)->service_type());
// Stream of malformed messages is a one occurrence
- EXPECT_EQ(malformed_occurs, 1u);
+ EXPECT_EQ(0u, malformed_occurs);
// All malformed messages shall be ignored
EXPECT_EQ(0u, actual_frames.size());
}
}
// Frame type shall be 0x00 (Control), 0x01 (Single), 0x02 (First), 0x03 (Consecutive)
-TEST_F(IncomingDataHandlerTest, MalformedPacket_FrameType) {
+TEST_F(IncomingDataHandlerTest, DISABLED_MalformedPacket_FrameType) {
FrameList malformed_packets;
std::vector<uint8_t> malformed_frame_types;
for (uint8_t frame_type = FRAME_TYPE_CONSECUTIVE + 1;
@@ -283,19 +303,29 @@ TEST_F(IncomingDataHandlerTest, MalformedPacket_FrameType) {
uid1, PROTOCOL_VERSION_3, PROTECTION_OFF, malformed_frame_types[i],
kControl, FRAME_DATA_HEART_BEAT, some_session_id, 0u, some_message_id, NULL));
}
- for (FrameList::iterator it = malformed_packets.begin(); it != malformed_packets.end(); ++it) {
+
+ // We count malformed only first time when it occurs after correct message
+ FrameList::iterator it = malformed_packets.begin();
+ ProcessPacket(**it);
+ EXPECT_EQ(RESULT_MALFORMED_OCCURS, result_code);
+ EXPECT_EQ(1u, malformed_occurs);
+ EXPECT_EQ(0u, actual_frames.size());
+ ++it;
+
+ // All next data will be one large malformed message which we've already counted
+ for (; it != malformed_packets.end(); ++it) {
ProcessPacket(**it);
EXPECT_EQ(RESULT_MALFORMED_OCCURS, result_code)
<< "Malformed frame type " << static_cast<int>((*it)->service_type());
// Stream of malformed messages is a one occurrence
- EXPECT_EQ(malformed_occurs, 1u);
+ EXPECT_EQ(0u, malformed_occurs);
// All malformed messages shall be ignored
EXPECT_EQ(0u, actual_frames.size());
}
}
// For Control frames Frame info value shall be from 0x00 to 0x06 or 0xFE(Data Ack), 0xFF(HB Ack)
-TEST_F(IncomingDataHandlerTest, MalformedPacket_ControlFrame) {
+TEST_F(IncomingDataHandlerTest, DISABLED_MalformedPacket_ControlFrame) {
FrameList malformed_packets;
std::vector<uint8_t> malformed_frame_data;
for (uint8_t frame_type = FRAME_DATA_END_SERVICE_NACK + 1;
@@ -308,18 +338,29 @@ TEST_F(IncomingDataHandlerTest, MalformedPacket_ControlFrame) {
uid1, PROTOCOL_VERSION_3, PROTECTION_OFF, FRAME_TYPE_CONTROL, kControl,
malformed_frame_data[i], some_session_id, 0u, some_message_id, NULL));
}
- for (FrameList::iterator it = malformed_packets.begin(); it != malformed_packets.end(); ++it) {
+
+ // We count malformed only first time when it occurs after correct message
+ FrameList::iterator it = malformed_packets.begin();
+ ProcessPacket(**it);
+ EXPECT_EQ(RESULT_MALFORMED_OCCURS, result_code);
+ EXPECT_EQ(1u, malformed_occurs);
+ EXPECT_EQ(0u, actual_frames.size());
+ ++it;
+
+ // All next data will be one large malformed message which we've already counted
+ for (; it != malformed_packets.end(); ++it) {
ProcessPacket(**it);
EXPECT_EQ(RESULT_MALFORMED_OCCURS, result_code)
- << "Malformed Control frame with data " << static_cast<int>((*it)->frame_data());
+ << "Malformed frame type " << static_cast<int>((*it)->service_type());
// Stream of malformed messages is a one occurrence
- EXPECT_EQ(malformed_occurs, 1u);
+ EXPECT_EQ(0u, malformed_occurs);
// All malformed messages shall be ignored
EXPECT_EQ(0u, actual_frames.size());
}
}
+
// For Single and First frames Frame info value shall be equal 0x00
-TEST_F(IncomingDataHandlerTest, MalformedPacket_SingleFrame) {
+TEST_F(IncomingDataHandlerTest, DISABLED_MalformedPacket_SingleFrame) {
FrameList malformed_packets;
std::vector<uint8_t> malformed_frame_data;
for (uint8_t frame_type = FRAME_DATA_SINGLE + 1;
@@ -333,19 +374,29 @@ TEST_F(IncomingDataHandlerTest, MalformedPacket_SingleFrame) {
uid1, PROTOCOL_VERSION_3, PROTECTION_OFF, FRAME_TYPE_SINGLE, kControl,
malformed_frame_data[i], some_session_id, 0u, some_message_id, NULL));
}
- for (FrameList::iterator it = malformed_packets.begin(); it != malformed_packets.end(); ++it) {
+
+ // We count malformed only first time when it occurs after correct message
+ FrameList::iterator it = malformed_packets.begin();
+ ProcessPacket(**it);
+ EXPECT_EQ(RESULT_MALFORMED_OCCURS, result_code);
+ EXPECT_EQ(1u, malformed_occurs);
+ EXPECT_EQ(0u, actual_frames.size());
+ ++it;
+
+ // All next data will be one large malformed message which we've already counted
+ for (; it != malformed_packets.end(); ++it) {
ProcessPacket(**it);
EXPECT_EQ(RESULT_MALFORMED_OCCURS, result_code)
- << "Malformed Single frame with data " << static_cast<int>((*it)->frame_data());
+ << "Malformed frame type " << static_cast<int>((*it)->service_type());
// Stream of malformed messages is a one occurrence
- EXPECT_EQ(malformed_occurs, 1u);
+ EXPECT_EQ(0u, malformed_occurs);
// All malformed messages shall be ignored
EXPECT_EQ(0u, actual_frames.size());
}
}
// For Single and First frames Frame info value shall be equal 0x00
-TEST_F(IncomingDataHandlerTest, MalformedPacket_FirstFrame) {
+TEST_F(IncomingDataHandlerTest, DISABLED_MalformedPacket_FirstFrame) {
FrameList malformed_packets;
std::vector<uint8_t> malformed_frame_data;
for (uint8_t frame_type = FRAME_DATA_FIRST + 1;
@@ -359,12 +410,22 @@ TEST_F(IncomingDataHandlerTest, MalformedPacket_FirstFrame) {
uid1, PROTOCOL_VERSION_3, PROTECTION_OFF, FRAME_TYPE_SINGLE, kControl,
malformed_frame_data[i], some_session_id, 0u, some_message_id, NULL));
}
- for (FrameList::iterator it = malformed_packets.begin(); it != malformed_packets.end(); ++it) {
+
+ // We count malformed only first time when it occurs after correct message
+ FrameList::iterator it = malformed_packets.begin();
+ ProcessPacket(**it);
+ EXPECT_EQ(RESULT_MALFORMED_OCCURS, result_code);
+ EXPECT_EQ(1u, malformed_occurs);
+ EXPECT_EQ(0u, actual_frames.size());
+ ++it;
+
+ // All next data will be one large malformed message which we've already counted
+ for (; it != malformed_packets.end(); ++it) {
ProcessPacket(**it);
EXPECT_EQ(RESULT_MALFORMED_OCCURS, result_code)
- << "Malformed First frame with data " << static_cast<int>((*it)->frame_data());
+ << "Malformed frame type " << static_cast<int>((*it)->service_type());
// Stream of malformed messages is a one occurrence
- EXPECT_EQ(malformed_occurs, 1u);
+ EXPECT_EQ(0u, malformed_occurs);
// All malformed messages shall be ignored
EXPECT_EQ(0u, actual_frames.size());
}
@@ -494,7 +555,7 @@ TEST_F(IncomingDataHandlerTest, MalformedPacket_Mix) {
// Malformed packet 2
const uint8_t malformed_type = FRAME_TYPE_MAX_VALUE;
ProtocolPacket malformed_packet2(
- uid1, PROTOCOL_VERSION_4, PROTECTION_OFF, malformed_type,
+ uid1, PROTOCOL_VERSION_3, PROTECTION_OFF, malformed_type,
kRpc, FRAME_DATA_HEART_BEAT, some_session_id, some_data_size,
protov1_message_id, some_data);
AppendPacketToTMData(malformed_packet2);
@@ -502,7 +563,7 @@ TEST_F(IncomingDataHandlerTest, MalformedPacket_Mix) {
// Audio packet
mobile_packets.push_back(
new ProtocolPacket(
- uid1, PROTOCOL_VERSION_4, PROTECTION_OFF, FRAME_TYPE_CONTROL,
+ uid1, PROTOCOL_VERSION_3, PROTECTION_OFF, FRAME_TYPE_CONTROL,
kAudio, FRAME_DATA_HEART_BEAT, some_session_id, some_data_size,
protov1_message_id, some_data));
AppendPacketToTMData(*mobile_packets.back());
@@ -520,6 +581,216 @@ TEST_F(IncomingDataHandlerTest, MalformedPacket_Mix) {
}
}
+TEST_F(IncomingDataHandlerTest, OnePortionOfData_CorrectAndMalformed_OneMalformedCounted) {
+ // Arrange
+ ProtocolPacket correct_hb_packet_(uid1, PROTOCOL_VERSION_3, PROTECTION_OFF, FRAME_TYPE_CONTROL,
+ kControl, FRAME_DATA_HEART_BEAT, some_session_id, 0u,
+ some_message_id);
+ AppendPacketToTMData(correct_hb_packet_);
+ tm_data.insert(tm_data.end(), 12, 0xFF); // 12 bytes of malformed data
+
+ // Act
+ ProcessData(uid1, &tm_data[0], tm_data.size());
+
+ // Assert
+ EXPECT_EQ(RESULT_MALFORMED_OCCURS, result_code);
+ EXPECT_EQ(1u, malformed_occurs);
+ EXPECT_EQ(1u, actual_frames.size());
+}
+
+TEST_F(IncomingDataHandlerTest, FirstPortionOfData_MalformedAndCorrect_OneMalformedCounted) {
+ // Arrange
+ ProtocolPacket correct_hb_packet_(uid1, PROTOCOL_VERSION_3, PROTECTION_OFF, FRAME_TYPE_CONTROL,
+ kControl, FRAME_DATA_HEART_BEAT, some_session_id, 0u,
+ some_message_id);
+ tm_data.insert(tm_data.end(), 12, 0xFF); // 12 bytes of malformed data
+ AppendPacketToTMData(correct_hb_packet_);
+
+ // Act
+ ProcessData(uid1, &tm_data[0], tm_data.size());
+
+ // Assert
+ EXPECT_EQ(RESULT_MALFORMED_OCCURS, result_code);
+ EXPECT_EQ(1u, malformed_occurs);
+ EXPECT_EQ(1u, actual_frames.size());
+}
+
+TEST_F(IncomingDataHandlerTest, OnePortionOfData_CorrectMalformedCorrect_OneMalformedCounted) {
+ // Arrange
+ ProtocolPacket correct_hb_packet_(uid1, PROTOCOL_VERSION_3, PROTECTION_OFF, FRAME_TYPE_CONTROL,
+ kControl, FRAME_DATA_HEART_BEAT, some_session_id, 0u,
+ some_message_id);
+ AppendPacketToTMData(correct_hb_packet_);
+ tm_data.insert(tm_data.end(), 12, 0xFF); // 12 bytes of malformed data
+ AppendPacketToTMData(correct_hb_packet_);
+
+ // Act
+ ProcessData(uid1, &tm_data[0], tm_data.size());
+
+ // Assert
+ EXPECT_EQ(RESULT_MALFORMED_OCCURS, result_code);
+ EXPECT_EQ(1u, malformed_occurs);
+ EXPECT_EQ(2u, actual_frames.size());
+}
+
+TEST_F(IncomingDataHandlerTest, OnePortionOfData_CorrectMalformedCorrectMalformed_TwoMalformedCounted) {
+ // Arrange
+ ProtocolPacket correct_hb_packet_(uid1, PROTOCOL_VERSION_3, PROTECTION_OFF, FRAME_TYPE_CONTROL,
+ kControl, FRAME_DATA_HEART_BEAT, some_session_id, 0u,
+ some_message_id);
+ AppendPacketToTMData(correct_hb_packet_);
+ tm_data.insert(tm_data.end(), 12, 0xFF); // 12 bytes of malformed data
+ AppendPacketToTMData(correct_hb_packet_);
+ tm_data.insert(tm_data.end(), 12, 0xFF); // 12 bytes of malformed data
+
+ // Act
+ ProcessData(uid1, &tm_data[0], tm_data.size());
+
+ // Assert
+ EXPECT_EQ(RESULT_MALFORMED_OCCURS, result_code);
+ EXPECT_EQ(2u, malformed_occurs);
+ EXPECT_EQ(2u, actual_frames.size());
+}
+
+TEST_F(IncomingDataHandlerTest, OnePortionOfData_MalformedCorrectMalformedCorrect_TwoMalformedCounted) {
+ // Arrange
+ ProtocolPacket correct_hb_packet_(uid1, PROTOCOL_VERSION_3, PROTECTION_OFF, FRAME_TYPE_CONTROL,
+ kControl, FRAME_DATA_HEART_BEAT, some_session_id, 0u,
+ some_message_id);
+ tm_data.insert(tm_data.end(), 12, 0xFF); // 12 bytes of malformed data
+ AppendPacketToTMData(correct_hb_packet_);
+ tm_data.insert(tm_data.end(), 12, 0xFF); // 12 bytes of malformed data
+ AppendPacketToTMData(correct_hb_packet_);
+
+ // Act
+ ProcessData(uid1, &tm_data[0], tm_data.size());
+
+ // Assert
+ EXPECT_EQ(RESULT_MALFORMED_OCCURS, result_code);
+ EXPECT_EQ(2u, malformed_occurs);
+ EXPECT_EQ(2u, actual_frames.size());
+}
+
+TEST_F(IncomingDataHandlerTest, DISABLED_TwoPortionsOfData_CorrectMalformedANDCorrectMalformed_TwoMalformedCounted) {
+ // Arrange
+ ProtocolPacket correct_hb_packet_(uid1, PROTOCOL_VERSION_3, PROTECTION_OFF, FRAME_TYPE_CONTROL,
+ kControl, FRAME_DATA_HEART_BEAT, some_session_id, 0u,
+ some_message_id);
+ AppendPacketToTMData(correct_hb_packet_);
+ tm_data.insert(tm_data.end(), 12, 0xFF); // 12 bytes of malformed data
+
+ // Act
+ ProcessData(uid1, &tm_data[0], tm_data.size());
+
+ // Assert
+ EXPECT_EQ(RESULT_MALFORMED_OCCURS, result_code);
+ EXPECT_EQ(1u, malformed_occurs);
+ EXPECT_EQ(1u, actual_frames.size());
+
+ // Arrange
+ tm_data.clear();
+ AppendPacketToTMData(correct_hb_packet_);
+ tm_data.insert(tm_data.end(), 12, 0xFF); // 12 bytes of malformed data
+
+ // Act
+ ProcessData(uid1, &tm_data[0], tm_data.size());
+
+ // Assert
+ EXPECT_EQ(RESULT_MALFORMED_OCCURS, result_code);
+ EXPECT_EQ(1u, malformed_occurs);
+ EXPECT_EQ(1u, actual_frames.size());
+}
+
+TEST_F(IncomingDataHandlerTest, DISABLED_TwoPortionsOfData_CorrectMalformedANDMalformedCorrect_OneMalformedCounted) {
+ // Arrange
+ ProtocolPacket correct_hb_packet_(uid1, PROTOCOL_VERSION_3, PROTECTION_OFF, FRAME_TYPE_CONTROL,
+ kControl, FRAME_DATA_HEART_BEAT, some_session_id, 0u,
+ some_message_id);
+ AppendPacketToTMData(correct_hb_packet_);
+ tm_data.insert(tm_data.end(), 12, 0xFF); // 12 bytes of malformed data
+
+ // Act
+ ProcessData(uid1, &tm_data[0], tm_data.size());
+
+ // Assert
+ EXPECT_EQ(RESULT_MALFORMED_OCCURS, result_code);
+ EXPECT_EQ(1u, malformed_occurs);
+ EXPECT_EQ(1u, actual_frames.size());
+
+ // Arrange
+ tm_data.clear();
+ tm_data.insert(tm_data.end(), 12, 0xFF); // 12 bytes of malformed data
+ AppendPacketToTMData(correct_hb_packet_);
+
+ // Act
+ ProcessData(uid1, &tm_data[0], tm_data.size());
+
+ // Assert
+ EXPECT_EQ(RESULT_OK, result_code);
+ EXPECT_EQ(0u, malformed_occurs);
+ EXPECT_EQ(1u, actual_frames.size());
+}
+
+TEST_F(IncomingDataHandlerTest, TwoPortionsOfData_MalformedCorrectANDMalformedCorrect_TwoMalformedCounted) {
+ // Arrange
+ ProtocolPacket correct_hb_packet_(uid1, PROTOCOL_VERSION_3, PROTECTION_OFF, FRAME_TYPE_CONTROL,
+ kControl, FRAME_DATA_HEART_BEAT, some_session_id, 0u,
+ some_message_id);
+ tm_data.insert(tm_data.end(), 12, 0xFF); // 12 bytes of malformed data
+ AppendPacketToTMData(correct_hb_packet_);
+
+ // Act
+ ProcessData(uid1, &tm_data[0], tm_data.size());
+
+ // Assert
+ EXPECT_EQ(RESULT_MALFORMED_OCCURS, result_code);
+ EXPECT_EQ(1u, malformed_occurs);
+ EXPECT_EQ(1u, actual_frames.size());
+
+ // Arrange
+ tm_data.clear();
+ tm_data.insert(tm_data.end(), 12, 0xFF); // 12 bytes of malformed data
+ AppendPacketToTMData(correct_hb_packet_);
+
+ // Act
+ ProcessData(uid1, &tm_data[0], tm_data.size());
+
+ // Assert
+ EXPECT_EQ(RESULT_MALFORMED_OCCURS, result_code);
+ EXPECT_EQ(1u, malformed_occurs);
+ EXPECT_EQ(1u, actual_frames.size());
+}
+
+TEST_F(IncomingDataHandlerTest, TwoPortionsOfData_MalformedCorrectANDCorrectMalformed_TwoMalformedCounted) {
+ // Arrange
+ ProtocolPacket correct_hb_packet_(uid1, PROTOCOL_VERSION_3, PROTECTION_OFF, FRAME_TYPE_CONTROL,
+ kControl, FRAME_DATA_HEART_BEAT, some_session_id, 0u,
+ some_message_id);
+ tm_data.insert(tm_data.end(), 12, 0xFF); // 12 bytes of malformed data
+ AppendPacketToTMData(correct_hb_packet_);
+
+ // Act
+ ProcessData(uid1, &tm_data[0], tm_data.size());
+
+ // Assert
+ EXPECT_EQ(RESULT_MALFORMED_OCCURS, result_code);
+ EXPECT_EQ(1u, malformed_occurs);
+ EXPECT_EQ(1u, actual_frames.size());
+
+ // Arrange
+ tm_data.clear();
+ AppendPacketToTMData(correct_hb_packet_);
+ tm_data.insert(tm_data.end(), 12, 0xFF); // 12 bytes of malformed data
+
+ // Act
+ ProcessData(uid1, &tm_data[0], tm_data.size());
+
+ // Assert
+ EXPECT_EQ(RESULT_MALFORMED_OCCURS, result_code);
+ EXPECT_EQ(1u, malformed_occurs);
+ EXPECT_EQ(1u, actual_frames.size());
+}
+
// TODO(EZamakhov): add tests for handling 2+ connection data
} // namespace protocol_handler_test
diff --git a/src/components/protocol_handler/test/protocol_handler_tm_test.cc b/src/components/protocol_handler/test/protocol_handler_tm_test.cc
index 43dfcca55..4ef070c52 100644
--- a/src/components/protocol_handler/test/protocol_handler_tm_test.cc
+++ b/src/components/protocol_handler/test/protocol_handler_tm_test.cc
@@ -94,7 +94,7 @@ class ProtocolHandlerImplTest : public ::testing::Test {
void TearDown() OVERRIDE {
// Wait call methods in thread
- usleep(100000);
+ testing::Mock::AsyncVerifyAndClearExpectations(10000);
}
// Emulate connection establish
@@ -177,14 +177,15 @@ class ProtocolHandlerImplTest : public ::testing::Test {
#ifdef ENABLE_SECURITY
class OnHandshakeDoneFunctor {
public:
- OnHandshakeDoneFunctor(const uint32_t connection_key, const bool result)
- : connection_key(connection_key), result(result) {}
+ OnHandshakeDoneFunctor(const uint32_t connection_key,
+ security_manager::SSLContext::HandshakeResult error)
+ : connection_key(connection_key), result(error) {}
void operator()(security_manager::SecurityManagerListener * listener) const {
listener->OnHandshakeDone(connection_key, result);
}
private:
const uint32_t connection_key;
- const bool result;
+ const security_manager::SSLContext::HandshakeResult result;
};
#endif // ENABLE_SECURITY
@@ -492,7 +493,9 @@ TEST_F(ProtocolHandlerImplTest, SecurityEnable_StartSessionProtected_HandshakeFa
EXPECT_CALL(security_manager_mock,
AddListener(_))
// emulate handshake fail
- .WillOnce(Invoke(OnHandshakeDoneFunctor(connection_key, PROTECTION_OFF)));
+ .WillOnce(Invoke(OnHandshakeDoneFunctor(
+ connection_key,
+ security_manager::SSLContext::Handshake_Result_Fail)));
// Listener check SSLContext
EXPECT_CALL(session_observer_mock,
@@ -542,7 +545,9 @@ TEST_F(ProtocolHandlerImplTest, SecurityEnable_StartSessionProtected_HandshakeSu
EXPECT_CALL(security_manager_mock,
AddListener(_))
// emulate handshake fail
- .WillOnce(Invoke(OnHandshakeDoneFunctor(connection_key, PROTECTION_ON)));
+ .WillOnce(Invoke(OnHandshakeDoneFunctor(
+ connection_key,
+ security_manager::SSLContext::Handshake_Result_Success)));
// Listener check SSLContext
EXPECT_CALL(session_observer_mock,
@@ -597,7 +602,9 @@ TEST_F(ProtocolHandlerImplTest,
EXPECT_CALL(security_manager_mock,
AddListener(_))
// emulate handshake fail
- .WillOnce(Invoke(OnHandshakeDoneFunctor(connection_key, PROTECTION_ON)));
+ .WillOnce(Invoke(OnHandshakeDoneFunctor(
+ connection_key,
+ security_manager::SSLContext::Handshake_Result_Success)));
// Listener check SSLContext
EXPECT_CALL(session_observer_mock,
@@ -656,7 +663,9 @@ TEST_F(ProtocolHandlerImplTest,
EXPECT_CALL(security_manager_mock,
AddListener(_))
// emulate handshake fail
- .WillOnce(Invoke(OnHandshakeDoneFunctor(connection_key, PROTECTION_ON)));
+ .WillOnce(Invoke(OnHandshakeDoneFunctor(
+ connection_key,
+ security_manager::SSLContext::Handshake_Result_Success)));
// Listener check SSLContext
EXPECT_CALL(session_observer_mock,
diff --git a/src/components/protocol_handler/test/protocol_header_validator_test.cc b/src/components/protocol_handler/test/protocol_header_validator_test.cc
index 0ae791014..0f38ae98a 100644
--- a/src/components/protocol_handler/test/protocol_header_validator_test.cc
+++ b/src/components/protocol_handler/test/protocol_header_validator_test.cc
@@ -37,6 +37,10 @@
#include "utils/macro.h"
#include "protocol_handler/protocol_packet.h"
+namespace {
+ const size_t MAXIMUM_FRAME_DATA_V3_SIZE = 131072;
+}
+
namespace test {
namespace components {
namespace protocol_handler_test {
@@ -57,7 +61,7 @@ class ProtocolHeaderValidatorTest : public ::testing::Test {
TEST_F(ProtocolHeaderValidatorTest, MaxPayloadSizeSetGet) {
EXPECT_EQ(std::numeric_limits<size_t>::max(),
header_validator.max_payload_size());
- for (size_t value = 0; value < MAXIMUM_FRAME_DATA_SIZE * 2; ++value) {
+ for (size_t value = 0; value < MAXIMUM_FRAME_DATA_V3_SIZE * 2; ++value) {
header_validator.set_max_payload_size(value);
EXPECT_EQ(value, header_validator.max_payload_size());
}
@@ -180,9 +184,9 @@ TEST_F(ProtocolHeaderValidatorTest, Malformed_ControlFrame_EmptyPayload) {
PROTOCOL_VERSION_3, PROTECTION_ON, FRAME_TYPE_CONSECUTIVE, kControl,
FRAME_DATA_LAST_CONSECUTIVE, some_session_id, payload_size, some_message_id);
- for (uint32_t max_payload_size = 0; max_payload_size < MAXIMUM_FRAME_DATA_SIZE * 2;
+ for (size_t max_payload_size = 0; max_payload_size < MAXIMUM_FRAME_DATA_V3_SIZE * 2;
++max_payload_size) {
- header_validator.set_max_payload_size(MAXIMUM_FRAME_DATA_SIZE + max_payload_size);
+ header_validator.set_max_payload_size(MAXIMUM_FRAME_DATA_V3_SIZE + max_payload_size);
// For Control frames Data Size value could be zero
EXPECT_EQ(RESULT_OK, header_validator.validate(control_message_header));
@@ -192,9 +196,31 @@ TEST_F(ProtocolHeaderValidatorTest, Malformed_ControlFrame_EmptyPayload) {
}
}
-// For Control frames Data Size value shall be less than MTU header
-TEST_F(ProtocolHeaderValidatorTest, Malformed_Payload) {
- const size_t payload_size = MAXIMUM_FRAME_DATA_SIZE;
+// For Control frames Data Size value should be less than MTU header
+TEST_F(ProtocolHeaderValidatorTest, Malformed_Payload_V2) {
+ const size_t payload_size = MAXIMUM_FRAME_DATA_V2_SIZE;
+ const ProtocolPacket::ProtocolHeader control_message_header(
+ PROTOCOL_VERSION_2, PROTECTION_ON, FRAME_TYPE_CONTROL, kControl,
+ FRAME_DATA_HEART_BEAT, some_session_id, payload_size, some_message_id);
+ const ProtocolPacket::ProtocolHeader single_message_header(
+ PROTOCOL_VERSION_2, PROTECTION_ON, FRAME_TYPE_SINGLE, kControl,
+ FRAME_DATA_SINGLE, some_session_id, payload_size, some_message_id);
+ const ProtocolPacket::ProtocolHeader consecutive_message_header(
+ PROTOCOL_VERSION_2, PROTECTION_ON, FRAME_TYPE_CONSECUTIVE, kControl,
+ FRAME_DATA_LAST_CONSECUTIVE, some_session_id, payload_size, some_message_id);
+
+ for (size_t max_payload_size = 0;
+ max_payload_size < MAXIMUM_FRAME_DATA_V3_SIZE * 2;
+ ++max_payload_size) {
+ header_validator.set_max_payload_size(max_payload_size);
+ EXPECT_EQ(RESULT_OK, header_validator.validate(control_message_header));
+ EXPECT_EQ(RESULT_OK, header_validator.validate(single_message_header));
+ EXPECT_EQ(RESULT_OK, header_validator.validate(consecutive_message_header));
+ }
+}
+
+TEST_F(ProtocolHeaderValidatorTest, Malformed_Payload_V3) {
+ const size_t payload_size = MAXIMUM_FRAME_DATA_V3_SIZE;
const ProtocolPacket::ProtocolHeader control_message_header(
PROTOCOL_VERSION_3, PROTECTION_ON, FRAME_TYPE_CONTROL, kControl,
FRAME_DATA_HEART_BEAT, some_session_id, payload_size, some_message_id);
@@ -205,7 +231,8 @@ TEST_F(ProtocolHeaderValidatorTest, Malformed_Payload) {
PROTOCOL_VERSION_3, PROTECTION_ON, FRAME_TYPE_CONSECUTIVE, kControl,
FRAME_DATA_LAST_CONSECUTIVE, some_session_id, payload_size, some_message_id);
- for (uint32_t max_payload_size = 0; max_payload_size < MAXIMUM_FRAME_DATA_SIZE;
+ for (size_t max_payload_size = 0;
+ max_payload_size < MAXIMUM_FRAME_DATA_V3_SIZE;
++max_payload_size) {
header_validator.set_max_payload_size(max_payload_size);
EXPECT_EQ(RESULT_FAIL, header_validator.validate(control_message_header));
@@ -213,7 +240,30 @@ TEST_F(ProtocolHeaderValidatorTest, Malformed_Payload) {
EXPECT_EQ(RESULT_FAIL, header_validator.validate(consecutive_message_header));
}
- for (uint32_t max_payload_size = MAXIMUM_FRAME_DATA_SIZE + 1; max_payload_size < MAXIMUM_FRAME_DATA_SIZE * 2;
+ for (size_t max_payload_size = MAXIMUM_FRAME_DATA_V3_SIZE;
+ max_payload_size < MAXIMUM_FRAME_DATA_V3_SIZE * 2;
+ ++max_payload_size) {
+ header_validator.set_max_payload_size(max_payload_size);
+ EXPECT_EQ(RESULT_OK, header_validator.validate(control_message_header));
+ EXPECT_EQ(RESULT_OK, header_validator.validate(single_message_header));
+ EXPECT_EQ(RESULT_OK, header_validator.validate(consecutive_message_header));
+ }
+}
+
+TEST_F(ProtocolHeaderValidatorTest, Malformed_Payload_V3_with_V2_size) {
+ const size_t payload_size = MAXIMUM_FRAME_DATA_V2_SIZE;
+ const ProtocolPacket::ProtocolHeader control_message_header(
+ PROTOCOL_VERSION_3, PROTECTION_ON, FRAME_TYPE_CONTROL, kControl,
+ FRAME_DATA_HEART_BEAT, some_session_id, payload_size, some_message_id);
+ const ProtocolPacket::ProtocolHeader single_message_header(
+ PROTOCOL_VERSION_3, PROTECTION_ON, FRAME_TYPE_SINGLE, kControl,
+ FRAME_DATA_SINGLE, some_session_id, payload_size, some_message_id);
+ const ProtocolPacket::ProtocolHeader consecutive_message_header(
+ PROTOCOL_VERSION_3, PROTECTION_ON, FRAME_TYPE_CONSECUTIVE, kControl,
+ FRAME_DATA_LAST_CONSECUTIVE, some_session_id, payload_size, some_message_id);
+
+ for (size_t max_payload_size = 0;
+ max_payload_size < MAXIMUM_FRAME_DATA_V3_SIZE * 2;
++max_payload_size) {
header_validator.set_max_payload_size(max_payload_size);
EXPECT_EQ(RESULT_OK, header_validator.validate(control_message_header));
diff --git a/src/components/protocol_handler/test/protocol_packet_test.cc b/src/components/protocol_handler/test/protocol_packet_test.cc
new file mode 100644
index 000000000..66fbe6f0a
--- /dev/null
+++ b/src/components/protocol_handler/test/protocol_packet_test.cc
@@ -0,0 +1,201 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <gtest/gtest.h>
+#include <vector>
+#include <list>
+
+#include "utils/macro.h"
+#include "protocol_handler/protocol_packet.h"
+
+namespace test {
+namespace components {
+namespace protocol_handler_test {
+using namespace ::protocol_handler;
+
+class ProtocolPacketTest : public ::testing::Test {
+ protected:
+ void SetUp() OVERRIDE {
+ some_message_id = 0xABCDEF0;
+ some_session_id = 0xFEDCBA0;
+ some_connection_id = 10;
+ }
+ uint32_t some_message_id;
+ uint32_t some_session_id;
+ ConnectionID some_connection_id;
+};
+
+TEST_F(ProtocolPacketTest, SerializePacketWithDiffVersions) {
+ RawMessagePtr res;
+ uint8_t version = PROTOCOL_VERSION_1;
+ for (; version <= PROTOCOL_VERSION_MAX; ++version) {
+ ProtocolPacket prot_packet(
+ some_connection_id, version, PROTECTION_OFF, FRAME_TYPE_CONTROL,
+ kControl, FRAME_DATA_HEART_BEAT, some_session_id, 0u, some_message_id);
+ res = prot_packet.serializePacket();
+ EXPECT_EQ(res->protocol_version(), version);
+ EXPECT_EQ(res->service_type(), kControl);
+ EXPECT_EQ(res->connection_key(), some_connection_id);
+ if (res->protocol_version() == PROTOCOL_VERSION_1) {
+ EXPECT_EQ(res->data_size(), 8u);
+ } else {
+ EXPECT_EQ(res->data_size(), 12u);
+ }
+ }
+}
+
+// ServiceType should be equal 0x0 (Control), 0x07 (RPC), 0x0A (PCM), 0x0B
+// (Video), 0x0F (Bulk)
+TEST_F(ProtocolPacketTest, SerializePacketWithDiffServiceType) {
+ std::vector<uint8_t> serv_types;
+ serv_types.push_back(0x0);
+ serv_types.push_back(0x07);
+ serv_types.push_back(0x0A);
+ serv_types.push_back(0x0B);
+ serv_types.push_back(0x0F);
+
+ RawMessagePtr res;
+ for (size_t i = 0; i < serv_types.size(); ++i) {
+ ProtocolPacket prot_packet(some_connection_id, PROTOCOL_VERSION_3,
+ PROTECTION_OFF, FRAME_TYPE_CONTROL,
+ serv_types[i], FRAME_DATA_HEART_BEAT,
+ some_session_id, 0u, some_message_id);
+ res = prot_packet.serializePacket();
+ EXPECT_EQ(PROTOCOL_VERSION_3, res->protocol_version());
+ EXPECT_EQ(serv_types[i], res->service_type());
+ EXPECT_EQ(12u, res->data_size());
+ }
+}
+
+TEST_F(ProtocolPacketTest, SerializePacketWithWrongServiceType) {
+ std::vector<uint8_t> serv_types;
+ for (uint8_t service_type = kControl + 1; service_type < kRpc;
+ ++service_type) {
+ serv_types.push_back(service_type);
+ }
+ serv_types.push_back(0x08);
+ serv_types.push_back(0x09);
+ serv_types.push_back(0x0C);
+ serv_types.push_back(0x0D);
+ serv_types.push_back(0x0E);
+
+ RawMessagePtr res;
+ for (size_t i = 0; i < serv_types.size(); ++i) {
+ ProtocolPacket prot_packet(some_connection_id, PROTOCOL_VERSION_3,
+ PROTECTION_OFF, FRAME_TYPE_CONTROL,
+ serv_types[i], FRAME_DATA_HEART_BEAT,
+ some_session_id, 0u, some_message_id);
+ res = prot_packet.serializePacket();
+ EXPECT_EQ(PROTOCOL_VERSION_3, res->protocol_version());
+ EXPECT_EQ(kInvalidServiceType, res->service_type());
+ }
+}
+
+TEST_F(ProtocolPacketTest, SetPacketWithDiffFrameType) {
+ RawMessagePtr res;
+ uint8_t frame_type;
+ for (frame_type = FRAME_TYPE_CONTROL + 1; frame_type <= FRAME_TYPE_MAX_VALUE;
+ ++frame_type) {
+ ProtocolPacket prot_packet(
+ some_connection_id, PROTOCOL_VERSION_3, PROTECTION_OFF, frame_type,
+ kControl, FRAME_DATA_HEART_BEAT, some_session_id, 0u, some_message_id);
+ res = prot_packet.serializePacket();
+ EXPECT_EQ(PROTOCOL_VERSION_3, res->protocol_version());
+ EXPECT_EQ(kControl, res->service_type());
+ EXPECT_EQ(frame_type, prot_packet.frame_type());
+ }
+}
+
+TEST_F(ProtocolPacketTest, AppendDataToEmptyPacket) {
+ // Set version, serviceType, frameData, sessionId
+ uint8_t session_id = 1u;
+ uint8_t some_data[] = {0x0, 0x07, 0x02, session_id};
+ ProtocolPacket protocol_packet;
+ RESULT_CODE res = protocol_packet.appendData(some_data, sizeof(some_data));
+ EXPECT_EQ(RESULT_FAIL, res);
+}
+
+TEST_F(ProtocolPacketTest, SetTotalDataBytes) {
+ uint8_t new_data_size = 10u;
+ ProtocolPacket protocol_packet;
+ protocol_packet.set_total_data_bytes(new_data_size);
+
+ EXPECT_EQ(new_data_size, protocol_packet.total_data_bytes());
+}
+
+TEST_F(ProtocolPacketTest, AppendDataToPacketWithNonZeroSize) {
+ // Set version, serviceType, frameData, sessionId
+ uint8_t session_id = 1u;
+ uint8_t some_data[] = {0x0, 0x07, FRAME_TYPE_CONTROL, session_id};
+ ProtocolPacket protocol_packet;
+ protocol_packet.set_total_data_bytes(sizeof(some_data) + 1);
+ RESULT_CODE res = protocol_packet.appendData(some_data, sizeof(some_data));
+ EXPECT_EQ(RESULT_OK, res);
+
+ EXPECT_EQ(0x0, protocol_packet.data()[0]);
+ EXPECT_EQ(0x07, protocol_packet.data()[1]);
+ EXPECT_EQ(FRAME_TYPE_CONTROL, protocol_packet.data()[2]);
+ EXPECT_EQ(session_id, protocol_packet.data()[3]);
+}
+
+TEST_F(ProtocolPacketTest, SetData) {
+ uint8_t session_id = 1u;
+ uint8_t some_data[] = {0x0, 0x07, FRAME_TYPE_CONTROL, session_id};
+ ProtocolPacket protocol_packet;
+ protocol_packet.set_data(some_data, sizeof(some_data));
+
+ EXPECT_EQ(0x0, protocol_packet.data()[0]);
+ EXPECT_EQ(0x07, protocol_packet.data()[1]);
+ EXPECT_EQ(FRAME_TYPE_CONTROL, protocol_packet.data()[2]);
+ EXPECT_EQ(session_id, protocol_packet.data()[3]);
+}
+
+TEST_F(ProtocolPacketTest, DeserializeZeroPacket) {
+ uint8_t message[] = {};
+ ProtocolPacket protocol_packet;
+ RESULT_CODE res = protocol_packet.deserializePacket(message, 0);
+ EXPECT_EQ(RESULT_OK, res);
+}
+
+TEST_F(ProtocolPacketTest, DeserializeNonZeroPacket) {
+ // Set header, serviceType, frameData, sessionId
+ uint8_t session_id = 1u;
+ uint8_t some_message[] = {0x21, 0x07, 0x02, session_id};
+ ProtocolPacket protocol_packet;
+ RESULT_CODE res =
+ protocol_packet.deserializePacket(some_message, PROTOCOL_HEADER_V2_SIZE);
+ EXPECT_EQ(RESULT_OK, res);
+}
+
+} // namespace protocol_handler_test
+} // namespace components
+} // namespace test
diff --git a/src/components/protocol_handler/test/protocol_payload_test.cc b/src/components/protocol_handler/test/protocol_payload_test.cc
new file mode 100644
index 000000000..3b973e106
--- /dev/null
+++ b/src/components/protocol_handler/test/protocol_payload_test.cc
@@ -0,0 +1,270 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <gtest/gtest.h>
+#include <vector>
+
+#include "utils/macro.h"
+#include "utils/bitstream.h"
+#include "protocol_handler/protocol_payload.h"
+#include "protocol/common.h"
+
+namespace test {
+namespace components {
+namespace protocol_handler_test {
+using namespace ::protocol_handler;
+using ::utils::BitStream;
+
+void prepare_data(uint8_t* data_for_sending, ProtocolPayloadV2& message) {
+ uint8_t rpc_type_flag = message.header.rpc_type;
+ uint8_t offset = 0;
+
+ uint32_t function_id = message.header.rpc_function_id;
+ data_for_sending[offset++] = ((rpc_type_flag << 4) & 0xF0) | (function_id >> 24);
+ data_for_sending[offset++] = function_id >> 16;
+ data_for_sending[offset++] = function_id >> 8;
+ data_for_sending[offset++] = function_id;
+
+ uint32_t correlationId = message.header.correlation_id;
+ data_for_sending[offset++] = correlationId >> 24;
+ data_for_sending[offset++] = correlationId >> 16;
+ data_for_sending[offset++] = correlationId >> 8;
+ data_for_sending[offset++] = correlationId;
+
+ uint32_t jsonSize = message.header.json_size;
+ data_for_sending[offset++] = jsonSize >> 24;
+ data_for_sending[offset++] = jsonSize >> 16;
+ data_for_sending[offset++] = jsonSize >> 8;
+ data_for_sending[offset++] = jsonSize;
+
+ if (message.json.length() != 0) {
+ memcpy(data_for_sending + offset, message.json.c_str(),
+ message.json.size());
+ }
+
+ if (message.data.size() != 0) {
+ uint8_t* current_pointer = data_for_sending + offset + message.json.length();
+ u_int32_t binarySize = message.data.size();
+ for (uint32_t i = 0; i < binarySize; ++i) {
+ current_pointer[i] = message.data[i];
+ }
+ }
+}
+
+TEST(ProtocolPayloadTest, ExtractProtocolWithOnlyHeader) {
+ ProtocolPayloadV2 prot_payload_test;
+
+ prot_payload_test.header.correlation_id = 1;
+ prot_payload_test.header.rpc_function_id = 2;
+ prot_payload_test.header.json_size = 0;
+ prot_payload_test.header.rpc_type = kRpcTypeRequest;
+
+ const size_t data_for_sending_size = PROTOCOL_HEADER_V2_SIZE;
+ uint8_t* data_for_sending = new uint8_t[data_for_sending_size];
+
+ prepare_data(data_for_sending, prot_payload_test);
+
+ BitStream bs(data_for_sending, data_for_sending_size);
+
+ ProtocolPayloadV2 prot_payload;
+ Extract(&bs, &prot_payload, data_for_sending_size);
+
+ EXPECT_TRUE(bs.IsGood());
+
+ EXPECT_EQ(prot_payload_test.header.correlation_id,
+ prot_payload.header.correlation_id);
+ EXPECT_EQ(prot_payload_test.header.json_size, prot_payload.header.json_size);
+ EXPECT_EQ(prot_payload_test.header.rpc_function_id,
+ prot_payload.header.rpc_function_id);
+ EXPECT_EQ(prot_payload_test.header.rpc_type, prot_payload.header.rpc_type);
+ delete[] data_for_sending;
+}
+
+TEST(ProtocolPayloadTest, ExtractCorrectProtocolWithDataWithoutJSON) {
+ ProtocolPayloadV2 prot_payload_test;
+
+ prot_payload_test.header.correlation_id = 1;
+ prot_payload_test.header.rpc_function_id = 2;
+ prot_payload_test.header.json_size = 0;
+ prot_payload_test.header.rpc_type = kRpcTypeNotification;
+ prot_payload_test.data = {1, 2, 3};
+
+ const size_t data_for_sending_size = PROTOCOL_HEADER_V2_SIZE +
+ prot_payload_test.data.size() +
+ prot_payload_test.json.length();
+ uint8_t* data_for_sending = new uint8_t[data_for_sending_size];
+
+ prepare_data(data_for_sending, prot_payload_test);
+
+ BitStream bs(data_for_sending, data_for_sending_size);
+
+ ProtocolPayloadV2 prot_payload;
+ Extract(&bs, &prot_payload, data_for_sending_size);
+
+ EXPECT_TRUE(bs.IsGood());
+
+ EXPECT_EQ(prot_payload_test.header.correlation_id,
+ prot_payload.header.correlation_id);
+ EXPECT_EQ(prot_payload_test.header.json_size, prot_payload.header.json_size);
+ EXPECT_EQ(prot_payload_test.header.rpc_function_id,
+ prot_payload.header.rpc_function_id);
+ EXPECT_EQ(prot_payload_test.header.rpc_type, prot_payload.header.rpc_type);
+ EXPECT_EQ(prot_payload_test.data.size(), prot_payload.data.size());
+ EXPECT_EQ(prot_payload_test.data[0], prot_payload.data[0]);
+ EXPECT_EQ(prot_payload_test.data[1], prot_payload.data[1]);
+ EXPECT_EQ(prot_payload_test.data[2], prot_payload.data[2]);
+
+ delete[] data_for_sending;
+}
+
+TEST(ProtocolPayloadTest, ExtractCorrectProtocolWithoutDataWithJSON) {
+ ProtocolPayloadV2 prot_payload_test;
+
+ prot_payload_test.header.correlation_id = 1;
+ prot_payload_test.header.rpc_function_id = 2;
+
+ prot_payload_test.header.rpc_type = kRpcTypeResponse;
+
+ std::string expect_output_json_string =
+ "{\n \" : {\n \"name\" : \"\",\n\"parameters\" : \"\"\n}\n}\n";
+
+ prot_payload_test.json = expect_output_json_string;
+ prot_payload_test.header.json_size = prot_payload_test.json.length();
+
+ const size_t data_for_sending_size = PROTOCOL_HEADER_V2_SIZE +
+ prot_payload_test.data.size() +
+ prot_payload_test.json.length();
+ uint8_t *data_for_sending = new uint8_t[data_for_sending_size];
+ prepare_data(data_for_sending, prot_payload_test);
+
+ BitStream bs(data_for_sending, data_for_sending_size);
+ ProtocolPayloadV2 prot_payload;
+ Extract(&bs, &prot_payload, data_for_sending_size);
+
+ EXPECT_TRUE(bs.IsGood());
+
+ EXPECT_EQ(prot_payload_test.header.correlation_id,
+ prot_payload.header.correlation_id);
+ EXPECT_EQ(prot_payload_test.header.json_size, prot_payload.header.json_size);
+ EXPECT_EQ(prot_payload_test.header.rpc_function_id,
+ prot_payload.header.rpc_function_id);
+ EXPECT_EQ(prot_payload_test.header.rpc_type, prot_payload.header.rpc_type);
+ EXPECT_EQ(prot_payload_test.json.length(), prot_payload.json.length());
+ EXPECT_EQ(prot_payload_test.json, prot_payload.json);
+ delete[] data_for_sending;
+}
+
+TEST(ProtocolPayloadTest, ExtractCorrectProtocolWithDataWithJSON) {
+ ProtocolPayloadV2 prot_payload_test;
+
+ prot_payload_test.header.correlation_id = 1;
+ prot_payload_test.header.rpc_function_id = 2;
+ prot_payload_test.header.rpc_type = kRpcTypeRequest;
+ prot_payload_test.data = {1, 2, 3};
+
+ std::string expect_output_json_string =
+ "{\n \" : {\n \"name\" : \"\",\n\"parameters\" : \"\"\n}\n}\n";
+
+ prot_payload_test.json = expect_output_json_string;
+ prot_payload_test.header.json_size = prot_payload_test.json.length();
+
+ const size_t data_for_sending_size = PROTOCOL_HEADER_V2_SIZE +
+ prot_payload_test.data.size() +
+ prot_payload_test.json.length();
+ uint8_t* data_for_sending = new uint8_t[data_for_sending_size];
+ prepare_data(data_for_sending, prot_payload_test);
+
+ BitStream bs(data_for_sending, data_for_sending_size);
+ ProtocolPayloadV2 prot_payload;
+ Extract(&bs, &prot_payload, data_for_sending_size);
+
+ EXPECT_TRUE(bs.IsGood());
+
+ EXPECT_EQ(prot_payload_test.header.correlation_id,
+ prot_payload.header.correlation_id);
+ EXPECT_EQ(prot_payload_test.header.json_size, prot_payload.header.json_size);
+ EXPECT_EQ(prot_payload_test.header.rpc_function_id,
+ prot_payload.header.rpc_function_id);
+ EXPECT_EQ(prot_payload_test.header.rpc_type, prot_payload.header.rpc_type);
+ EXPECT_EQ(prot_payload_test.json.length(), prot_payload.json.length());
+ EXPECT_EQ(prot_payload_test.json, prot_payload.json);
+ EXPECT_EQ(prot_payload_test.data.size(), prot_payload.data.size());
+ EXPECT_EQ(prot_payload_test.data[0], prot_payload.data[0]);
+ EXPECT_EQ(prot_payload_test.data[1], prot_payload.data[1]);
+ EXPECT_EQ(prot_payload_test.data[2], prot_payload.data[2]);
+
+ delete[] data_for_sending;
+}
+
+TEST(ProtocolPayloadTest, ExtractProtocolWithJSONWithDataWithWrongPayloadSize) {
+ ProtocolPayloadV2 prot_payload_test;
+
+ prot_payload_test.header.correlation_id = 1;
+ prot_payload_test.header.rpc_function_id = 2;
+
+ prot_payload_test.header.rpc_type = kRpcTypeResponse;
+ prot_payload_test.data = {1, 2, 3};
+
+ std::string expect_output_json_string =
+ "{\n \" : {\n \"name\" : \"\",\n\"parameters\" : \"\"\n}\n}\n";
+
+ prot_payload_test.json = expect_output_json_string;
+ prot_payload_test.header.json_size = prot_payload_test.json.length();
+
+ const size_t data_for_sending_size =
+ PROTOCOL_HEADER_V2_SIZE + prot_payload_test.json.length();
+ uint8_t* data_for_sending = new uint8_t[data_for_sending_size];
+ prepare_data(data_for_sending, prot_payload_test);
+
+ BitStream bs(data_for_sending, data_for_sending_size);
+ ProtocolPayloadV2 prot_payload;
+
+ // Try extract with payload size less than size of data
+ Extract(&bs, &prot_payload, PROTOCOL_HEADER_V2_SIZE);
+
+ EXPECT_TRUE(bs.IsBad());
+
+ EXPECT_EQ(prot_payload_test.header.correlation_id,
+ prot_payload.header.correlation_id);
+ EXPECT_EQ(prot_payload_test.header.json_size, prot_payload.header.json_size);
+ EXPECT_EQ(prot_payload_test.header.rpc_function_id,
+ prot_payload.header.rpc_function_id);
+ EXPECT_EQ(prot_payload_test.header.rpc_type, prot_payload.header.rpc_type);
+ EXPECT_EQ(prot_payload_test.json.length(), prot_payload.json.length());
+ EXPECT_EQ(prot_payload_test.json, prot_payload.json);
+ EXPECT_EQ(0u, prot_payload.data.size());
+ delete[] data_for_sending;
+}
+
+} // namespace protocol_handler_test
+} // namespace components
+} // namespace test
diff --git a/src/components/resumption/CMakeLists.txt b/src/components/resumption/CMakeLists.txt
index 896998f85..b8fa277ca 100644
--- a/src/components/resumption/CMakeLists.txt
+++ b/src/components/resumption/CMakeLists.txt
@@ -1,4 +1,4 @@
-# Copyright (c) 2014, Ford Motor Company
+# Copyright (c) 2015, Ford Motor Company
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
@@ -42,3 +42,7 @@ set (SOURCES
)
add_library("Resumption" ${SOURCES})
+
+if(BUILD_TESTS)
+ add_subdirectory(test)
+endif()
diff --git a/src/components/resumption/test/CMakeLists.txt b/src/components/resumption/test/CMakeLists.txt
new file mode 100644
index 000000000..c7b7f52db
--- /dev/null
+++ b/src/components/resumption/test/CMakeLists.txt
@@ -0,0 +1,61 @@
+# Copyright (c) 2015, Ford Motor Company
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# Redistributions of source code must retain the above copyright notice, this
+# list of conditions and the following disclaimer.
+#
+# Redistributions in binary form must reproduce the above copyright notice,
+# this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided with the
+# distribution.
+#
+# Neither the name of the Ford Motor Company nor the names of its contributors
+# may be used to endorse or promote products derived from this software
+# without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+if(BUILD_TESTS)
+
+include_directories(
+ ${LOG4CXX_INCLUDE_DIRECTORY}
+ ${GMOCK_INCLUDE_DIRECTORY}
+ ${COMPONENTS_DIR}/utils/include
+ ${COMPONENTS_DIR}/resumption/include
+ ${COMPONENTS_DIR}/config_profile/include
+ ${COMPONENTS_DIR}/include
+ ${JSONCPP_INCLUDE_DIRECTORY}
+ ${CMAKE_BINARY_DIR}
+)
+
+set(LIBRARIES
+ gmock
+ ConfigProfile
+ Utils
+ Resumption
+ jsoncpp
+)
+
+set(SOURCES
+ ${COMPONENTS_DIR}/resumption/test/last_state_test.cc
+)
+
+#file(COPY smartDeviceLink_test.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
+#file(COPY app_info.dat DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
+
+create_test("resumption_test" "${SOURCES}" "${LIBRARIES}")
+
+endif()
diff --git a/src/components/resumption/test/last_state_test.cc b/src/components/resumption/test/last_state_test.cc
new file mode 100644
index 000000000..d2b7f10ce
--- /dev/null
+++ b/src/components/resumption/test/last_state_test.cc
@@ -0,0 +1,102 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "gtest/gtest.h"
+#include "resumption/last_state.h"
+#include "config_profile/profile.h"
+#include "utils/file_system.h"
+
+namespace test {
+namespace components {
+namespace resumption {
+
+using namespace ::resumption;
+using namespace ::Json;
+
+class LastStateTest : public ::testing::Test {
+ public:
+ virtual void SetUp() {
+ ASSERT_TRUE(::file_system::CreateFile("./app_info.dat"));
+ ::profile::Profile::instance()->UpdateValues();
+ }
+
+ virtual void TearDown() {
+ EXPECT_TRUE(::file_system::DeleteFile("./app_info.dat"));
+ }
+};
+
+TEST_F(LastStateTest, Basic) {
+ Value& dictionary = LastState::instance()->dictionary;
+ EXPECT_EQ("null\n", dictionary.toStyledString());
+}
+
+TEST_F(LastStateTest, SetGetData) {
+ {
+ Value& dictionary = LastState::instance()->dictionary;
+ Value bluetooth_info = dictionary["TransportManager"]["BluetoothAdapter"];
+ EXPECT_EQ("null\n", bluetooth_info.toStyledString());
+
+ Value tcp_adapter_info =
+ dictionary["TransportManager"]["TcpAdapter"]["devices"];
+ EXPECT_EQ("null\n", tcp_adapter_info.toStyledString());
+
+ Value resumption_time = dictionary["resumption"]["last_ign_off_time"];
+ EXPECT_EQ("null\n", resumption_time.toStyledString());
+
+ Value resumption_list = dictionary["resumption"]["resume_app_list"];
+ EXPECT_EQ("null\n", resumption_list.toStyledString());
+
+ Value test_value;
+ test_value["name"] = "test_device";
+
+ LastState::instance()
+ ->dictionary["TransportManager"]["TcpAdapter"]["devices"] = test_value;
+ LastState::instance()
+ ->dictionary["TransportManager"]["BluetoothAdapter"]["devices"] =
+ "bluetooth_device";
+ LastState::instance()->SaveToFileSystem();
+ }
+
+ Value& dictionary = LastState::instance()->dictionary;
+
+ Value bluetooth_info = dictionary["TransportManager"]["BluetoothAdapter"];
+ Value tcp_adapter_info = dictionary["TransportManager"]["TcpAdapter"];
+ EXPECT_EQ("{\n \"devices\" : \"bluetooth_device\"\n}\n",
+ bluetooth_info.toStyledString());
+ EXPECT_EQ(
+ "{\n \"devices\" : {\n \"name\" : \"test_device\"\n }\n}\n",
+ tcp_adapter_info.toStyledString());
+}
+
+} // namespace resumption
+} // namespace components
+} // namespace test
diff --git a/src/components/rpc_base/test/CMakeLists.txt b/src/components/rpc_base/test/CMakeLists.txt
index 583cf7c63..76cf738f4 100644
--- a/src/components/rpc_base/test/CMakeLists.txt
+++ b/src/components/rpc_base/test/CMakeLists.txt
@@ -1,4 +1,4 @@
-# Copyright (c) 2014, Ford Motor Company
+# Copyright (c) 2015, Ford Motor Company
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
@@ -28,14 +28,14 @@
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
-if(BUILD_TESTS)
-include_directories (
- ${COMPONENTS_DIR}/dbus/include
- ${COMPONENTS_DIR}/dbus/src
- ${COMPONENTS_DIR}/rpc_base/include
- ${CMAKE_SOURCE_DIR}/src/3rd_party/dbus-1.7.8
- ${GMOCK_INCLUDE_DIRECTORY}
- ${JSONCPP_INCLUDE_DIRECTORY}
+if (BUILD_TESTS)
+ include_directories (
+ ${COMPONENTS_DIR}/dbus/include
+ ${COMPONENTS_DIR}/dbus/src
+ ${COMPONENTS_DIR}/rpc_base/include
+ ${CMAKE_SOURCE_DIR}/src/3rd_party/dbus-1.7.8
+ ${GMOCK_INCLUDE_DIRECTORY}
+ ${JSONCPP_INCLUDE_DIRECTORY}
)
set(LIBRARIES
@@ -46,6 +46,7 @@ set(LIBRARIES
set(SOURCES
rpc_base_json_test.cc
rpc_base_test.cc
+ validation_report_test.cc
)
if (${HMI_DBUS_API})
diff --git a/src/components/rpc_base/test/rpc_base_json_test.cc b/src/components/rpc_base/test/rpc_base_json_test.cc
index 8c0bef930..3a536937b 100644
--- a/src/components/rpc_base/test/rpc_base_json_test.cc
+++ b/src/components/rpc_base/test/rpc_base_json_test.cc
@@ -45,10 +45,6 @@ enum TestEnum {
kInvalidValue
};
-bool IsValidEnum(TestEnum val) {
- return val == kValue0 || val == kValue1;
-}
-
bool EnumFromJsonString(const std::string& value, TestEnum* enm) {
if (value == "kValue0") {
*enm = kValue0;
diff --git a/src/components/rpc_base/test/validation_report_test.cc b/src/components/rpc_base/test/validation_report_test.cc
new file mode 100644
index 000000000..1493de395
--- /dev/null
+++ b/src/components/rpc_base/test/validation_report_test.cc
@@ -0,0 +1,156 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <string>
+#include "gtest/gtest.h"
+#include "rpc_base/validation_report.h"
+
+namespace test {
+using namespace rpc;
+
+class ValidationReportTest : public testing::Test {
+ protected:
+ static ValidationReport* report_;
+ static ValidationReport* report_2;
+ static const std::string object_name_;
+ static const std::string object_name_2;
+ static const std::string subobject_name_1;
+ static const std::string subobject_name_2;
+ static const std::string subobject_name_3;
+ static const std::string test_validation_info_;
+ static const std::string parent_object_name_;
+
+ static void SetUpTestCase() {
+ report_ = new ValidationReport(object_name_);
+ report_2 = new ValidationReport(object_name_2);
+ }
+ virtual void TearDown() { ClearReports(); }
+
+ void ClearReports() {
+ ValidationReports& temp =
+ const_cast<ValidationReports&>(report_->subobject_reports());
+ temp.clear();
+ }
+
+ void GeneratePrettyFormatResult(std::string& result, const std::string& parent_name,
+ const std::string& obj_name, const std::string& val_info) {
+ std::string temp;
+ if (obj_name[0] != '[') {
+ temp = ".";
+ } else {
+ temp = "";
+ }
+ result = parent_name + temp + obj_name + ":" + " " +
+ val_info + "\n";
+ }
+
+ void ClearValidationInfo() {
+ std::string& temp = const_cast<std::string&>(report_->validation_info());
+ temp = "";
+ }
+
+ static void TearDownTestCase() {
+ delete report_;
+ delete report_2;
+ }
+
+ void FillReports(ValidationReports& reports_) {
+ reports_.push_back(ValidationReport("test_subobject1"));
+ reports_.push_back(ValidationReport("test_subobject2"));
+ reports_.push_back(ValidationReport("test_subobject3"));
+ }
+};
+
+ValidationReport* ValidationReportTest::report_ = NULL;
+ValidationReport* ValidationReportTest::report_2 = NULL;
+const std::string ValidationReportTest::object_name_ = "test_object";
+const std::string ValidationReportTest::object_name_2 = "[test_object2]";
+const std::string ValidationReportTest::subobject_name_1 = "test_subobject1";
+const std::string ValidationReportTest::subobject_name_2 = "test_subobject2";
+const std::string ValidationReportTest::subobject_name_3 = "test_subobject3";
+const std::string ValidationReportTest::test_validation_info_ =
+ "test_validation_info";
+const std::string ValidationReportTest::parent_object_name_ = "test_parent";
+
+
+TEST_F(ValidationReportTest, Ctor_and_object_name_test_ExpectDataCorrect) {
+ EXPECT_EQ(object_name_, report_->object_name());
+}
+
+TEST_F(ValidationReportTest, Set_Get_Validation_Info_ExpectDataCorrect) {
+ report_->set_validation_info("test_validation_info");
+ EXPECT_EQ(test_validation_info_, report_->validation_info());
+ ClearValidationInfo();
+}
+
+TEST_F(ValidationReportTest, Subobject_Reports_ExpectDataCorrect) {
+ // Check before act
+ EXPECT_EQ(0u, report_->subobject_reports().size());
+ // Act
+ report_->ReportSubobject(subobject_name_1).object_name();
+ report_->ReportSubobject(subobject_name_2).object_name();
+ report_->ReportSubobject(subobject_name_3).object_name();
+ // Check after act
+ EXPECT_EQ(3u, report_->subobject_reports().size());
+}
+
+TEST_F(ValidationReportTest, ReportSubobject_ExpectDataCorrect) {
+ // Act and check
+ EXPECT_EQ(subobject_name_1,
+ report_->ReportSubobject(subobject_name_1).object_name());
+ EXPECT_EQ(subobject_name_2,
+ report_->ReportSubobject(subobject_name_2).object_name());
+ EXPECT_EQ(subobject_name_3,
+ report_->ReportSubobject(subobject_name_3).object_name());
+ // Check after act
+ EXPECT_EQ(3u, report_->subobject_reports().size());
+}
+
+TEST_F(ValidationReportTest, PrettyFormat_ExpectDataCorrect) {
+ // Arrange
+ std::string result1;
+ std::string result2;
+ report_->set_validation_info(test_validation_info_);
+ report_2->set_validation_info(test_validation_info_);
+ // Act
+ impl::PrettyFormat(*report_, parent_object_name_, &result1);
+ impl::PrettyFormat(*report_2, parent_object_name_, &result2);
+ std::string temp1;
+ GeneratePrettyFormatResult(temp1, parent_object_name_, object_name_, test_validation_info_);
+ std::string temp2;
+ GeneratePrettyFormatResult(temp2, parent_object_name_, object_name_2, test_validation_info_);
+ // Checks
+ EXPECT_EQ(temp1, result1);
+ EXPECT_EQ(temp2, result2);
+}
+
+} // namespace rpc
diff --git a/src/components/security_manager/test/CMakeLists.txt b/src/components/security_manager/test/CMakeLists.txt
index ec442e3cf..6554bb797 100644
--- a/src/components/security_manager/test/CMakeLists.txt
+++ b/src/components/security_manager/test/CMakeLists.txt
@@ -39,9 +39,9 @@ include_directories(
)
set(SOURCES
- ${COMPONENTS_DIR}/security_manager/test/crypto_manager_impl_test.cc
- ${COMPONENTS_DIR}/security_manager/test/security_manager_test.cc
- ${COMPONENTS_DIR}/security_manager/test/security_query_test.cc
+ #${COMPONENTS_DIR}/security_manager/test/crypto_manager_impl_test.cc
+ #${COMPONENTS_DIR}/security_manager/test/security_manager_test.cc
+ #${COMPONENTS_DIR}/security_manager/test/security_query_test.cc
${COMPONENTS_DIR}/security_manager/test/security_query_matcher.cc
)
diff --git a/src/components/smart_objects/test/CMakeLists.txt b/src/components/smart_objects/test/CMakeLists.txt
index 0f47b1c47..e8bc20b6b 100644
--- a/src/components/smart_objects/test/CMakeLists.txt
+++ b/src/components/smart_objects/test/CMakeLists.txt
@@ -50,7 +50,6 @@ set(SOURCES
${COMPONENTS_DIR}/smart_objects/test/SmartObjectInvalid_test.cc
${COMPONENTS_DIR}/smart_objects/test/SmartObjectStress_test.cc
${COMPONENTS_DIR}/smart_objects/test/SmartObjectUnit_test.cc
- ${COMPONENTS_DIR}/smart_objects/test/TSharedPtr_test.cc
${COMPONENTS_DIR}/smart_objects/test/smart_object_performance_test.cc
${COMPONENTS_DIR}/smart_objects/test/map_performance_test.cc
${COMPONENTS_DIR}/smart_objects/test/BoolSchemaItem_test.cc
diff --git a/src/components/smart_objects/test/NumberSchemaItem_test.cc b/src/components/smart_objects/test/NumberSchemaItem_test.cc
index 6e372593f..cc5622869 100644
--- a/src/components/smart_objects/test/NumberSchemaItem_test.cc
+++ b/src/components/smart_objects/test/NumberSchemaItem_test.cc
@@ -774,6 +774,39 @@ TEST(test_double_array_validate, test_NumberSchemaItemTest) {
EXPECT_EQ(NsSmartDeviceLink::NsSmartObjects::Errors::INVALID_VALUE,
resultType);
}
+
+TEST(test_int_double_value, test_NumberSchemaItemTest) {
+ using namespace NsSmartDeviceLink::NsSmartObjects;
+
+ ISchemaItemPtr item = TNumberSchemaItem<int>::create(
+ TSchemaItemParameter<int>(10),
+ TSchemaItemParameter<int>(100)); // No default value
+
+ SmartObject obj;
+ const double value = 10.0001;
+ obj = value;
+ ASSERT_EQ(value, obj.asDouble());
+
+ int resultType = item->validate(obj);
+ EXPECT_EQ(Errors::INVALID_VALUE, resultType);
+}
+
+TEST(test_double_int_value, DISABLED_test_NumberSchemaItemTest) {
+ using namespace NsSmartDeviceLink::NsSmartObjects;
+
+ ISchemaItemPtr item = TNumberSchemaItem<double>::create(
+ TSchemaItemParameter<double>(10.0),
+ TSchemaItemParameter<double>(100.0)); // No default value
+
+ SmartObject obj;
+ const int value = 99;
+ obj = value;
+ ASSERT_EQ(value, obj.asInt());
+
+ int resultType = item->validate(obj);
+ EXPECT_EQ(Errors::OK, resultType);
+}
+
} // namespace SchemaItem
} // namespace SmartObjects
} // namespace components
diff --git a/src/components/smart_objects/test/TSharedPtr_test.cc b/src/components/smart_objects/test/TSharedPtr_test.cc
deleted file mode 100644
index 3943d2b24..000000000
--- a/src/components/smart_objects/test/TSharedPtr_test.cc
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Copyright (c) 2014, Ford Motor Company
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided with the
- * distribution.
- *
- * Neither the name of the Ford Motor Company nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <stdlib.h>
-#include <vector>
-#include "gmock/gmock.h"
-#include "utils/shared_ptr.h"
-
-namespace test {
-namespace components {
-namespace utils {
-namespace SharedPtrTest {
-class CMockObject {
- public:
- CMockObject(int id);
- ~CMockObject(void);
- int getId(void) const;
-
- MOCK_METHOD0(destructor, void ());
-
-private:
- int mId;
-};
-
-class CExtendedMockObject : public CMockObject {
- public:
- CExtendedMockObject(int id);
-};
-} // namespace CMockObject
-} // namespace SmartObjects
-} // namespace components
-} // namespace test
-
-test::components::utils::SharedPtrTest::CMockObject::CMockObject(int id)
- : mId(id) {
-}
-
-test::components::utils::SharedPtrTest::CMockObject::~CMockObject(void) {
- destructor();
-}
-
-int test::components::utils::SharedPtrTest::CMockObject::getId(void) const {
- return mId;
-}
-
-test::components::utils::SharedPtrTest::CExtendedMockObject::CExtendedMockObject(
- int id)
- : CMockObject(id) {
-}
-
-typedef utils::SharedPtr<test::components::utils::SharedPtrTest::CMockObject> tMockObjectPtr;
-typedef utils::SharedPtr<
- test::components::utils::SharedPtrTest::CExtendedMockObject> tExtendedMockObjectPtr;
-
-TEST(SharedPtrTest, Constructor) {
- test::components::utils::SharedPtrTest::CMockObject* object1 =
- new test::components::utils::SharedPtrTest::CMockObject(1);
- test::components::utils::SharedPtrTest::CMockObject* object2 =
- new test::components::utils::SharedPtrTest::CMockObject(2);
-
- EXPECT_CALL(*object1, destructor()).Times(0);
- EXPECT_CALL(*object2, destructor()).Times(0);
-
- tMockObjectPtr p1(object1);
- ASSERT_EQ(1, p1->getId());
-
- tMockObjectPtr p2(p1);
- ASSERT_EQ(1, p2->getId());
-
- tMockObjectPtr p3 = p2;
- ASSERT_EQ(1, p3->getId());
-
- tMockObjectPtr p4 = object2;
- ASSERT_EQ(2, p4->getId());
-
- p3 = p4;
- ASSERT_EQ(2, p3->getId());
-
- EXPECT_CALL(*object1, destructor());
- EXPECT_CALL(*object2, destructor());
-}
-
-TEST(SharedPtrTest, PointerTypeCast) {
- test::components::utils::SharedPtrTest::CExtendedMockObject* object1 =
- new test::components::utils::SharedPtrTest::CExtendedMockObject(1);
- test::components::utils::SharedPtrTest::CExtendedMockObject* object2 =
- new test::components::utils::SharedPtrTest::CExtendedMockObject(2);
-
- EXPECT_CALL(*object1, destructor()).Times(0);
- EXPECT_CALL(*object2, destructor()).Times(0);
-
- tExtendedMockObjectPtr ep1(object1);
- ASSERT_EQ(1, ep1->getId());
-
- tMockObjectPtr p1(ep1);
- ASSERT_EQ(1, p1->getId());
-
- tExtendedMockObjectPtr ep2(object2);
- ASSERT_EQ(2, ep2->getId());
-
- p1 = ep2;
- ASSERT_EQ(2, p1->getId());
-
- EXPECT_CALL(*object1, destructor());
- EXPECT_CALL(*object2, destructor());
-}
-
-TEST(SharedPtrTest, AddedOperators) {
- test::components::utils::SharedPtrTest::CExtendedMockObject* object1 =
- new test::components::utils::SharedPtrTest::CExtendedMockObject(1);
- test::components::utils::SharedPtrTest::CExtendedMockObject* object2 =
- new test::components::utils::SharedPtrTest::CExtendedMockObject(2);
-
- EXPECT_CALL(*object1, destructor()).Times(0);
- EXPECT_CALL(*object2, destructor()).Times(0);
-
- tExtendedMockObjectPtr ep1(object1);
- tMockObjectPtr p1(ep1);
- tExtendedMockObjectPtr ep2(object2);
- p1 = ep2;
-
- ASSERT_EQ(2, p1->getId());
- ASSERT_EQ(2, (*p1).getId());
-
- ASSERT_FALSE(!p1);
-
- utils::SharedPtr<int> p3(new int(10));
- ASSERT_EQ(10, *p3);
- ASSERT_FALSE(!p3);
-
- utils::SharedPtr<int> p2;
- ASSERT_TRUE(!p2);
-
- p2.reset(new int);
- ASSERT_FALSE(!p2);
- *p2 = 3;
- ASSERT_EQ(3, *p2);
-
- EXPECT_CALL(*object1, destructor());
- EXPECT_CALL(*object2, destructor());
-}
-
-TEST(SharedPtrTest, StressTest) {
- const size_t cNumIterations = 1024U * 1024U;
-
- size_t objectCreated = 0U;
- size_t pointersCopied = 0U;
-
- std::vector<tMockObjectPtr> objects;
-
- for (size_t i = 0U; i < cNumIterations; ++i) {
- if ((true == objects.empty()) || (0 == rand() % 256)) {
- test::components::utils::SharedPtrTest::CMockObject* object =
- new test::components::utils::SharedPtrTest::CMockObject(0);
- EXPECT_CALL(*object, destructor());
-
- objects.push_back(object);
-
- ++objectCreated;
- } else {
- size_t objectIndex = static_cast<size_t>(rand()) % objects.size();
-
- if (rand() % 2) {
- objects.push_back(objects[objectIndex]);
-
- ++pointersCopied;
- } else {
- objects.erase(objects.begin() + objectIndex);
- }
- }
- }
- printf("%zu objects created, %zu pointers copied\n", objectCreated,
- pointersCopied);
-}
diff --git a/src/components/time_tester/CMakeLists.txt b/src/components/time_tester/CMakeLists.txt
index 4ed9e584d..24f0fa98e 100644
--- a/src/components/time_tester/CMakeLists.txt
+++ b/src/components/time_tester/CMakeLists.txt
@@ -31,7 +31,7 @@
set(TIME_TESTER_SRC_DIR ${COMPONENTS_DIR}/time_tester/src)
-include_directories (
+include_directories(
include/time_tester
${COMPONENTS_DIR}/utils/include/
${COMPONENTS_DIR}/protocol_handler/include/
@@ -49,7 +49,7 @@ include_directories (
${LOG4CXX_INCLUDE_DIRECTORY}
)
-set (SOURCES
+set(SOURCES
${TIME_TESTER_SRC_DIR}/metric_wrapper.cc
${TIME_TESTER_SRC_DIR}/time_manager.cc
${TIME_TESTER_SRC_DIR}/application_manager_observer.cc
@@ -63,3 +63,7 @@ set (SOURCES
add_library("TimeTester" ${SOURCES})
target_link_libraries("TimeTester" ${LIBRARIES})
add_dependencies("TimeTester" HMI_API MOBILE_API)
+
+if(BUILD_TESTS)
+ add_subdirectory(test)
+endif()
diff --git a/src/components/time_tester/test/CMakeLists.txt b/src/components/time_tester/test/CMakeLists.txt
new file mode 100644
index 000000000..006f6a430
--- /dev/null
+++ b/src/components/time_tester/test/CMakeLists.txt
@@ -0,0 +1,93 @@
+# Copyright (c) 2015, Ford Motor Company
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# Redistributions of source code must retain the above copyright notice, this
+# list of conditions and the following disclaimer.
+#
+# Redistributions in binary form must reproduce the above copyright notice,
+# this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided with the
+# distribution.
+#
+# Neither the name of the Ford Motor Company nor the names of its contributors
+# may be used to endorse or promote products derived from this software
+# without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+if(BUILD_TESTS)
+
+include_directories (
+ ${CMAKE_SOURCE_DIR}/src/3rd_party-static/gmock-1.7.0/include
+ ${CMAKE_SOURCE_DIR}/src/3rd_party-static/gmock-1.7.0/gtest/include
+ ${COMPONENTS_DIR}/include/utils
+ ${COMPONENTS_DIR}/include/protocol_handler
+ ${COMPONENTS_DIR}/time_tester/include
+ ${COMPONENTS_DIR}/utils/include
+ ${COMPONENTS_DIR}/protocol_handler/include
+ ${COMPONENTS_DIR}/application_manager/include
+ ${COMPONENTS_DIR}/protocol_handler/test
+ )
+
+
+set(testSources
+ #metric_wrapper_test.cc
+ #time_manager_test.cc
+ #protocol_handler_metric_test.cc
+ protocol_handler_observer_test.cc
+ #transport_manager_metric_test.cc
+ transport_manager_observer_test.cc
+ #application_manager_metric_test.cc
+ application_manager_observer_test.cc
+)
+
+set(testLibraries
+ gmock
+ TimeTester
+ jsoncpp
+ Utils
+ MediaManager
+ ProtocolHandler
+ v4_protocol_v1_2_no_extra
+ SmartObjects
+ ProtocolLibrary
+ ConfigProfile
+ connectionHandler
+ ApplicationManager
+ Resumption
+ jsoncpp
+ transport_manager
+ MediaManager
+ ProtocolHandler
+)
+
+if (BUILD_USB_SUPPORT)
+ list(APPEND testLibraries Libusb-1.0.16)
+endif()
+
+if (BUILD_BT_SUPPORT)
+ list(APPEND testLibraries bluetooth)
+endif()
+
+if (BUILD_AVAHI_SUPPORT)
+ list(APPEND testLibraries avahi-client avahi-common)
+endif()
+
+file(COPY log4cxx.properties DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
+
+create_test("time_tester_test" "${testSources}" "${testLibraries}")
+
+endif()
diff --git a/src/components/time_tester/test/application_manager_metric_test.cc b/src/components/time_tester/test/application_manager_metric_test.cc
new file mode 100644
index 000000000..7d09cc85c
--- /dev/null
+++ b/src/components/time_tester/test/application_manager_metric_test.cc
@@ -0,0 +1,118 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "gtest/gtest.h"
+#include "json_keys.h"
+#include "utils/resource_usage.h"
+#include "application_manager/smart_object_keys.h"
+#include "application_manager_metric.h"
+
+namespace test {
+namespace components {
+namespace time_tester_test {
+
+using namespace ::time_tester;
+
+TEST(ApplicationManagerMetricWrapper, grabResources) {
+ ApplicationManagerMetricWrapper metric_test;
+ EXPECT_TRUE(metric_test.grabResources());
+}
+
+TEST(ApplicationManagerMetricWrapper, GetJsonMetric) {
+ ApplicationManagerMetricWrapper metric_test;
+
+ TimevalStruct start_time;
+ start_time.tv_sec = 1;
+ start_time.tv_usec = 0;
+
+ TimevalStruct end_time;
+ end_time.tv_sec = 10;
+ end_time.tv_usec = 0;
+ metric_test.message_metric = new application_manager::AMMetricObserver::MessageMetric();
+ metric_test.message_metric->begin = start_time;
+ metric_test.message_metric->end = end_time;
+ NsSmartDeviceLink::NsSmartObjects::SmartObject obj;
+ obj["params"][application_manager::strings::correlation_id] = 11;
+ obj["params"][application_manager::strings::connection_key] = 12;
+ metric_test.message_metric->message = new NsSmartDeviceLink::NsSmartObjects::SmartObject(obj);
+ Json::Value jvalue = metric_test.GetJsonMetric();
+
+ EXPECT_EQ("null\n", jvalue[time_tester::strings::stime].toStyledString());
+ EXPECT_EQ("null\n", jvalue[time_tester::strings::utime].toStyledString());
+ EXPECT_EQ("null\n", jvalue[time_tester::strings::memory].toStyledString());
+
+ EXPECT_EQ(date_time::DateTime::getuSecs(start_time), jvalue[time_tester::strings::begin].asInt64());
+ EXPECT_EQ(date_time::DateTime::getuSecs(end_time), jvalue[time_tester::strings::end].asInt64());
+ EXPECT_EQ(obj["params"][application_manager::strings::correlation_id].asInt(), jvalue[time_tester::strings::correlation_id].asInt64());
+ EXPECT_EQ(obj["params"][application_manager::strings::connection_key].asInt(), jvalue[time_tester::strings::connection_key].asInt());
+}
+
+TEST(ApplicationManagerMetricWrapper, GetJsonMetricWithGrabResources) {
+ ApplicationManagerMetricWrapper metric_test;
+ utils::ResourseUsage* resources = utils::Resources::getCurrentResourseUsage();
+ EXPECT_TRUE(metric_test.grabResources());
+
+ TimevalStruct start_time;
+ start_time.tv_sec = 1;
+ start_time.tv_usec = 0;
+
+ TimevalStruct end_time;
+ end_time.tv_sec = 10;
+ end_time.tv_usec = 0;
+
+ metric_test.message_metric = new application_manager::AMMetricObserver::MessageMetric();
+ metric_test.message_metric->begin = start_time;
+ metric_test.message_metric->end = end_time;
+ NsSmartDeviceLink::NsSmartObjects::SmartObject obj;
+ obj["params"][application_manager::strings::correlation_id] = 11;
+ obj["params"][application_manager::strings::connection_key] = 12;
+ metric_test.message_metric->message = new NsSmartDeviceLink::NsSmartObjects::SmartObject(obj);
+ Json::Value jvalue = metric_test.GetJsonMetric();
+
+ EXPECT_EQ(date_time::DateTime::getuSecs(start_time), jvalue[time_tester::strings::begin].asInt64());
+ EXPECT_EQ(date_time::DateTime::getuSecs(end_time), jvalue[time_tester::strings::end].asInt64());
+ EXPECT_EQ(obj["params"][application_manager::strings::correlation_id].asInt(), jvalue[time_tester::strings::correlation_id].asInt64());
+ EXPECT_EQ(obj["params"][application_manager::strings::connection_key].asInt(), jvalue[time_tester::strings::connection_key].asInt());
+
+ EXPECT_EQ(date_time::DateTime::getuSecs(start_time), jvalue[time_tester::strings::begin].asInt64());
+ EXPECT_EQ(date_time::DateTime::getuSecs(end_time), jvalue[time_tester::strings::end].asInt64());
+
+ EXPECT_NEAR(resources->stime, jvalue[time_tester::strings::stime].asInt(),1);
+ EXPECT_NEAR(resources->utime, jvalue[time_tester::strings::utime].asInt(),1);
+ EXPECT_EQ(resources->memory, jvalue[time_tester::strings::memory].asInt());
+
+ delete resources;
+}
+
+} // namespace time_tester
+} // namespace components
+} // namespace test
diff --git a/src/components/time_tester/test/application_manager_observer_test.cc b/src/components/time_tester/test/application_manager_observer_test.cc
new file mode 100644
index 000000000..f63394e4f
--- /dev/null
+++ b/src/components/time_tester/test/application_manager_observer_test.cc
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "gtest/gtest.h"
+#include "include/time_manager_mock.h"
+#include "application_manager/time_metric_observer.h"
+#include "application_manager_metric.h"
+#include "application_manager_observer.h"
+#include "utils/shared_ptr.h"
+#include "time_manager.h"
+
+namespace test {
+namespace components {
+namespace time_tester_test {
+
+using namespace time_tester;
+using ::testing::_;
+
+TEST(ApplicationManagerObserver, DISABLED_CallOnMessage) {
+ TimeManagerMock time_manager_mock;
+ ApplicationManagerObserver app_observer(&time_manager_mock);
+ typedef application_manager::AMMetricObserver::MessageMetric AMMetric;
+ utils::SharedPtr<AMMetric> ptr = application_manager::AMMetricObserver::MessageMetricSharedPtr();
+ EXPECT_CALL(time_manager_mock, SendMetric(_));
+ app_observer.OnMessage(ptr);
+}
+
+} // namespace time_tester
+} // namespace components
+} // namespace test
diff --git a/src/components/time_tester/test/include/time_manager_mock.h b/src/components/time_tester/test/include/time_manager_mock.h
new file mode 100644
index 000000000..dfdfa2da7
--- /dev/null
+++ b/src/components/time_tester/test/include/time_manager_mock.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2014, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef TEST_COMPONENTS_TIME_MANAGER_INCLUDE_TIME_MANAGER_MOCK_H_
+#define TEST_COMPONENTS_TIME_MANAGER_INCLUDE_TIME_MANAGER_MOCK_H_
+
+#include <gmock/gmock.h>
+#include "time_manager.h"
+#include "metric_wrapper.h"
+namespace test {
+namespace components {
+namespace time_tester_test {
+
+using namespace time_tester;
+/*
+ * MOCK implementation of ::security_manager::SecurityManager
+ */
+class TimeManagerMock : public time_tester::TimeManager {
+ public:
+ MOCK_METHOD1(Init, void(protocol_handler::ProtocolHandlerImpl* ph));
+ MOCK_METHOD0(Stop, void());
+ MOCK_METHOD0(Start, void());
+ MOCK_METHOD1(SendMetric, void(utils::SharedPtr<MetricWrapper> metric));
+};
+} // time_tester_test
+} // components
+} // test
+#endif // TEST_COMPONENTS_TIME_MANAGER_INCLUDE_TIME_MANAGER_MOCK_H_
diff --git a/src/components/time_tester/test/log4cxx.properties b/src/components/time_tester/test/log4cxx.properties
new file mode 100644
index 000000000..68adbfa7f
--- /dev/null
+++ b/src/components/time_tester/test/log4cxx.properties
@@ -0,0 +1,19 @@
+# Only ERROR and FATAL messages are logged to console
+log4j.appender.Console=org.apache.log4j.ConsoleAppender
+log4j.appender.Console.ImmediateFlush=true
+log4j.appender.Console.layout=org.apache.log4j.PatternLayout
+log4j.appender.Console.layout.ConversionPattern=%-5p [%d{dd MMM yyyy HH:mm:ss,SSS}][%c] %m%n
+log4j.appender.Console.Threshold=DEBUG
+
+# Log for all SmartDeviceLinkCore messages
+log4j.appender.SmartDeviceLinkCoreLogFile=org.apache.log4j.FileAppender
+log4j.appender.SmartDeviceLinkCoreLogFile.File=SmartDeviceLinkCore.log
+log4j.appender.SmartDeviceLinkCoreLogFile.append=true
+log4j.appender.SmartDeviceLinkCoreLogFile.DatePattern='.' yyyy-MM-dd HH-mm
+log4j.appender.SmartDeviceLinkCoreLogFile.ImmediateFlush=true
+log4j.appender.SmartDeviceLinkCoreLogFile.layout=org.apache.log4j.PatternLayout
+log4j.appender.SmartDeviceLinkCoreLogFile.layout.ConversionPattern=%-5p [%d{dd MMM yyyy HH:mm:ss,SSS}][%c] %F:%L %M: %m%n
+
+
+# All SmartDeviceLinkCore logs
+log4j.rootLogger=ALL, Console, SmartDeviceLinkCoreLogFile
diff --git a/src/components/time_tester/test/metric_wrapper_test.cc b/src/components/time_tester/test/metric_wrapper_test.cc
new file mode 100644
index 000000000..5eddf0fb6
--- /dev/null
+++ b/src/components/time_tester/test/metric_wrapper_test.cc
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "gtest/gtest.h"
+#include "metric_wrapper.h"
+#include "json_keys.h"
+#include "json/json.h"
+#include "utils/resource_usage.h"
+
+namespace test {
+namespace components {
+namespace time_tester_test {
+
+using namespace ::time_tester;
+
+TEST(MetricWrapper, grabResources) {
+ MetricWrapper metric_test;
+ EXPECT_TRUE(metric_test.grabResources());
+}
+
+TEST(MetricWrapper, GetJsonMetricWithoutGrab) {
+ MetricWrapper metric_test;
+ Json::Value jvalue = metric_test.GetJsonMetric();
+
+ EXPECT_EQ("null\n", jvalue[strings::stime].toStyledString());
+ EXPECT_EQ("null\n", jvalue[strings::utime].toStyledString());
+ EXPECT_EQ("null\n", jvalue[strings::memory].toStyledString());
+}
+
+TEST(MetricWrapper, GetJsonMetricWithGrabResources) {
+ MetricWrapper metric_test;
+ utils::ResourseUsage* resources = utils::Resources::getCurrentResourseUsage();
+ EXPECT_TRUE(resources != NULL);
+ EXPECT_TRUE(metric_test.grabResources());
+ Json::Value jvalue = metric_test.GetJsonMetric();
+
+ EXPECT_TRUE(jvalue[strings::stime].isInt());
+ EXPECT_TRUE(jvalue[strings::utime].isInt());
+ EXPECT_TRUE(jvalue[strings::memory].isInt());
+ EXPECT_NE("null/n", jvalue[strings::stime].toStyledString());
+ EXPECT_NE("null/n", jvalue[strings::utime].toStyledString());
+ EXPECT_NE("null/n", jvalue[strings::memory].toStyledString());
+
+ EXPECT_NEAR(resources->stime, jvalue[strings::stime].asInt(),1);
+ EXPECT_NEAR(resources->utime, jvalue[strings::utime].asInt(),1);
+ EXPECT_EQ(resources->memory, jvalue[strings::memory].asInt());
+
+ delete resources;
+}
+
+} // namespace time_tester
+} // namespace components
+} // namespace test
diff --git a/src/components/time_tester/test/protocol_handler_metric_test.cc b/src/components/time_tester/test/protocol_handler_metric_test.cc
new file mode 100644
index 000000000..150e1205f
--- /dev/null
+++ b/src/components/time_tester/test/protocol_handler_metric_test.cc
@@ -0,0 +1,119 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "gtest/gtest.h"
+#include "json_keys.h"
+#include "json/json.h"
+#include "utils/resource_usage.h"
+#include "protocol_handler_metric.h"
+#include "protocol_handler/time_metric_observer.h"
+
+namespace test {
+namespace components {
+namespace time_tester_test {
+
+using namespace ::time_tester;
+
+TEST(ProtocolHandlerMetricTest, grabResources) {
+ ProtocolHandlerMecticWrapper metric_test;
+ EXPECT_TRUE(metric_test.grabResources());
+}
+
+TEST(ProtocolHandlerMetricTest, GetJsonMetric) {
+ ProtocolHandlerMecticWrapper metric_test;
+
+ TimevalStruct start_time;
+ start_time.tv_sec = 1;
+ start_time.tv_usec = 0;
+
+ TimevalStruct end_time;
+ end_time.tv_sec = 10;
+ end_time.tv_usec = 0;
+ metric_test.message_metric = new protocol_handler::PHMetricObserver::MessageMetric();
+ metric_test.message_metric->begin = start_time;
+ metric_test.message_metric->end = end_time;
+ metric_test.message_metric->message_id = 5;
+ metric_test.message_metric->connection_key = 2;
+ Json::Value jvalue = metric_test.GetJsonMetric();
+
+ EXPECT_EQ("\"ProtocolHandler\"\n", jvalue[strings::logger].toStyledString());
+ EXPECT_EQ("null\n", jvalue[strings::stime].toStyledString());
+ EXPECT_EQ("null\n", jvalue[strings::utime].toStyledString());
+ EXPECT_EQ("null\n", jvalue[strings::memory].toStyledString());
+
+ EXPECT_EQ(date_time::DateTime::getuSecs(start_time), jvalue[strings::begin].asInt64());
+ EXPECT_EQ(date_time::DateTime::getuSecs(end_time), jvalue[strings::end].asInt64());
+ EXPECT_EQ(5, jvalue[strings::message_id].asInt64());
+ EXPECT_EQ(2, jvalue[strings::connection_key].asInt());
+}
+
+TEST(ProtocolHandlerMetricTest, GetJsonMetricWithGrabResources) {
+ ProtocolHandlerMecticWrapper metric_test;
+ utils::ResourseUsage* resources = utils::Resources::getCurrentResourseUsage();
+ EXPECT_TRUE(resources != NULL);
+ EXPECT_TRUE(metric_test.grabResources());
+
+ TimevalStruct start_time;
+ start_time.tv_sec = 1;
+ start_time.tv_usec = 0;
+
+ TimevalStruct end_time;
+ end_time.tv_sec = 10;
+ end_time.tv_usec = 0;
+ metric_test.message_metric = new protocol_handler::PHMetricObserver::MessageMetric();
+ metric_test.message_metric->begin = start_time;
+ metric_test.message_metric->end = end_time;
+ metric_test.message_metric->message_id = 5;
+ metric_test.message_metric->connection_key = 2;
+ Json::Value jvalue = metric_test.GetJsonMetric();
+
+ EXPECT_TRUE(jvalue[strings::stime].isInt());
+ EXPECT_TRUE(jvalue[strings::utime].isInt());
+ EXPECT_TRUE(jvalue[strings::memory].isInt());
+ EXPECT_NE("null/n", jvalue[strings::stime].toStyledString());
+ EXPECT_NE("null/n", jvalue[strings::utime].toStyledString());
+ EXPECT_NE("null/n", jvalue[strings::memory].toStyledString());
+
+ EXPECT_EQ(date_time::DateTime::getuSecs(start_time), jvalue[strings::begin].asInt64());
+ EXPECT_EQ(date_time::DateTime::getuSecs(end_time), jvalue[strings::end].asInt64());
+ EXPECT_EQ(5, jvalue[strings::message_id].asInt64());
+ EXPECT_EQ(2, jvalue[strings::connection_key].asInt());
+
+ EXPECT_NEAR(resources->stime, jvalue[strings::stime].asInt(),1);
+ EXPECT_NEAR(resources->utime, jvalue[strings::utime].asInt(),1);
+ EXPECT_EQ(resources->memory, jvalue[strings::memory].asInt());
+ delete resources;
+}
+
+} // namespace time_tester
+} // namespace components
+} // namespace test
diff --git a/src/components/time_tester/test/protocol_handler_observer_test.cc b/src/components/time_tester/test/protocol_handler_observer_test.cc
new file mode 100644
index 000000000..8922334ae
--- /dev/null
+++ b/src/components/time_tester/test/protocol_handler_observer_test.cc
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "gtest/gtest.h"
+#include "time_manager.h"
+#include "include/time_manager_mock.h"
+#include "protocol_handler/time_metric_observer.h"
+
+namespace test {
+namespace components {
+namespace time_tester_test {
+
+using namespace time_tester;
+using ::testing::_;
+
+TEST(ProtocolHandlerObserverTest, DISABLED_MessageProcess) {
+ TimeManagerMock time_manager_mock;
+
+ ProtocolHandlerObserver pr_handler(&time_manager_mock);
+ uint32_t message_id = 1;
+ TimevalStruct start_time;
+ start_time.tv_sec = 1;
+ start_time.tv_usec = 0;
+ pr_handler.StartMessageProcess(message_id, start_time);
+
+ typedef protocol_handler::PHMetricObserver::MessageMetric MetricType;
+ utils::SharedPtr<MetricType> message_metric = new MetricType();
+ message_metric->message_id = 1;
+ EXPECT_CALL(time_manager_mock, SendMetric(_));
+ pr_handler.EndMessageProcess(message_metric);
+}
+
+TEST(ProtocolHandlerObserverTest, MessageProcessWithZeroMessageId) {
+ TimeManagerMock time_manager_mock;
+
+ ProtocolHandlerObserver pr_handler(&time_manager_mock);
+ uint32_t message_id = 0;
+ TimevalStruct start_time;
+ start_time.tv_sec = 1;
+ start_time.tv_usec = 0;
+ pr_handler.StartMessageProcess(message_id, start_time);
+
+ typedef protocol_handler::PHMetricObserver::MessageMetric MetricType;
+ utils::SharedPtr<MetricType> message_metric = new MetricType();
+ message_metric->message_id = 0;
+ EXPECT_CALL(time_manager_mock, SendMetric(_)).Times(0);
+ pr_handler.EndMessageProcess(message_metric);
+}
+
+} // namespace time_tester
+} // namespace components
+} // namespace test
diff --git a/src/components/time_tester/test/time_manager_test.cc b/src/components/time_tester/test/time_manager_test.cc
new file mode 100644
index 000000000..60f3bd681
--- /dev/null
+++ b/src/components/time_tester/test/time_manager_test.cc
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "gtest/gtest.h"
+#include "gmock/gmock.h"
+#include "time_manager.h"
+#include "protocol_handler/time_metric_observer.h"
+#include "protocol_handler.h"
+#include "include/protocol_handler_mock.h"
+
+namespace test {
+namespace components {
+namespace time_tester_test {
+
+using namespace time_tester;
+
+class StreamerMock : public Streamer {
+ public:
+ StreamerMock(TimeManager* const server)
+ : Streamer(server) {
+ is_client_connected_ = true;
+ }
+ MOCK_METHOD1(PushMessage,void(utils::SharedPtr<MetricWrapper> metric));
+};
+
+TEST(TimeManagerTest, DISABLED_MessageProcess) {
+ //TODO(AK) APPLINK-13351 Disable due to refactor TimeTester
+ protocol_handler_test::TransportManagerMock transport_manager_mock;
+ protocol_handler::ProtocolHandlerImpl protocol_handler_mock(&transport_manager_mock, 0, 0, 0, 0, 0);
+ TimeManager * time_manager = new TimeManager();
+ // Streamer will be deleted by Thread
+ StreamerMock* streamer_mock = new StreamerMock(time_manager);
+ time_manager->set_streamer(streamer_mock);
+ time_manager->Init(&protocol_handler_mock);
+ utils::SharedPtr<MetricWrapper> test_metric;
+ EXPECT_CALL(*streamer_mock, PushMessage(test_metric));
+ time_manager->SendMetric(test_metric);
+ delete time_manager;
+}
+
+} // namespace time_tester
+} // namespace components
+} // namespace test
diff --git a/src/components/time_tester/test/transport_manager_metric_test.cc b/src/components/time_tester/test/transport_manager_metric_test.cc
new file mode 100644
index 000000000..2bb09416e
--- /dev/null
+++ b/src/components/time_tester/test/transport_manager_metric_test.cc
@@ -0,0 +1,110 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "gtest/gtest.h"
+#include "json_keys.h"
+#include "json/json.h"
+#include "utils/resource_usage.h"
+#include "transport_manager_metric.h"
+#include "protocol_handler/time_metric_observer.h"
+
+namespace test {
+namespace components {
+namespace time_tester_test {
+
+using namespace ::time_tester;
+
+TEST(TransportManagerMetricWrapper, grabResources) {
+ TransportManagerMecticWrapper metric_test;
+ EXPECT_TRUE(metric_test.grabResources());
+}
+
+TEST(TransportManagerMetricWrapper, GetJsonMetric) {
+ TransportManagerMecticWrapper metric_test;
+
+ TimevalStruct start_time;
+ start_time.tv_sec = 1;
+ start_time.tv_usec = 0;
+
+ TimevalStruct end_time;
+ end_time.tv_sec = 10;
+ end_time.tv_usec = 0;
+ metric_test.message_metric = new transport_manager::TMMetricObserver::MessageMetric();
+ metric_test.message_metric->begin = start_time;
+ metric_test.message_metric->end = end_time;
+ metric_test.message_metric->data_size = 1000;
+ Json::Value jvalue = metric_test.GetJsonMetric();
+
+ EXPECT_EQ("null\n", jvalue[strings::stime].toStyledString());
+ EXPECT_EQ("null\n", jvalue[strings::utime].toStyledString());
+ EXPECT_EQ("null\n", jvalue[strings::memory].toStyledString());
+
+ EXPECT_EQ(date_time::DateTime::getuSecs(start_time), jvalue[strings::begin].asInt64());
+ EXPECT_EQ(date_time::DateTime::getuSecs(end_time), jvalue[strings::end].asInt64());
+ EXPECT_EQ(1000, jvalue[strings::data_size].asInt());
+}
+
+TEST(TransportManagerMetricWrapper, GetJsonMetricWithGrabResources) {
+ TransportManagerMecticWrapper metric_test;
+ utils::ResourseUsage* resources = utils::Resources::getCurrentResourseUsage();
+ EXPECT_TRUE(resources != NULL);
+ EXPECT_TRUE(metric_test.grabResources());
+
+ TimevalStruct start_time;
+ start_time.tv_sec = 1;
+ start_time.tv_usec = 0;
+
+ TimevalStruct end_time;
+ end_time.tv_sec = 10;
+ end_time.tv_usec = 0;
+ metric_test.message_metric = new transport_manager::TMMetricObserver::MessageMetric();
+ metric_test.message_metric->begin = start_time;
+ metric_test.message_metric->end = end_time;
+
+ metric_test.message_metric->data_size = 1000;
+ Json::Value jvalue = metric_test.GetJsonMetric();
+
+ EXPECT_EQ("\"TransportManager\"\n", jvalue[strings::logger].toStyledString());
+ EXPECT_EQ(date_time::DateTime::getuSecs(start_time), jvalue[strings::begin].asInt64());
+ EXPECT_EQ(date_time::DateTime::getuSecs(end_time), jvalue[strings::end].asInt64());
+ EXPECT_EQ(1000, jvalue[strings::data_size].asInt());
+
+ EXPECT_NEAR(resources->stime, jvalue[strings::stime].asInt(),1);
+ EXPECT_NEAR(resources->utime, jvalue[strings::utime].asInt(),1);
+ EXPECT_EQ(resources->memory, jvalue[strings::memory].asInt());
+
+ delete resources;
+}
+
+} // namespace time_tester
+} // namespace components
+} // namespace test
diff --git a/src/components/time_tester/test/transport_manager_observer_test.cc b/src/components/time_tester/test/transport_manager_observer_test.cc
new file mode 100644
index 000000000..9dcf27bd9
--- /dev/null
+++ b/src/components/time_tester/test/transport_manager_observer_test.cc
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "gtest/gtest.h"
+#include "include/time_manager_mock.h"
+#include "protocol_handler/time_metric_observer.h"
+#include "transport_manager_metric.h"
+#include "transport_manager_observer.h"
+
+namespace test {
+namespace components {
+namespace time_tester_test {
+
+using namespace time_tester;
+using ::testing::_;
+
+TEST(TransportManagerObserverTest, DISABLED_MessageProcess) {
+ TimeManagerMock time_manager_mock;
+ TransportManagerObserver tr_observer(&time_manager_mock);
+ protocol_handler::RawMessage* ptr = new ::protocol_handler::RawMessage(0, 0, NULL, 0);
+ tr_observer.StartRawMsg(ptr);
+ EXPECT_CALL(time_manager_mock, SendMetric(_));
+ tr_observer.StopRawMsg(ptr);
+ delete ptr;
+}
+
+} // namespace time_tester
+} // namespace components
+} // namespace test
diff --git a/src/components/transport_manager/test/CMakeLists.txt b/src/components/transport_manager/test/CMakeLists.txt
index 226bfa188..c38804e86 100644
--- a/src/components/transport_manager/test/CMakeLists.txt
+++ b/src/components/transport_manager/test/CMakeLists.txt
@@ -1,4 +1,4 @@
-# Copyright (c) 2014, Ford Motor Company
+# Copyright (c) 2015, Ford Motor Company
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
@@ -29,6 +29,7 @@
# POSSIBILITY OF SUCH DAMAGE.
if(BUILD_TESTS)
+set(TM_TEST_DIR ${COMPONENTS_DIR}/transport_manager/test)
include_directories(
${LOG4CXX_INCLUDE_DIRECTORY}
@@ -43,14 +44,14 @@ include_directories(
)
set(LIBRARIES
- gmock
- ConfigProfile
- transport_manager
- ApplicationManagerTest
- Utils
- ConfigProfile
- Resumption
- jsoncpp
+ gmock
+ ConfigProfile
+ transport_manager
+ Utils
+ ConfigProfile
+ ProtocolLibrary
+ Resumption
+ jsoncpp
)
if (BUILD_USB_SUPPORT)
@@ -65,20 +66,17 @@ if (BUILD_AVAHI_SUPPORT)
list(APPEND LIBRARIES avahi-client avahi-common)
endif()
-
set(SOURCES
- ${COMPONENTS_DIR}/transport_manager/test/mock_application.cc
- ${COMPONENTS_DIR}/transport_manager/test/transport_manager_test.cc
- ${COMPONENTS_DIR}/transport_manager/test/mock_connection_factory.cc
- ${COMPONENTS_DIR}/transport_manager/test/mock_connection.cc
- ${COMPONENTS_DIR}/transport_manager/test/mock_device.cc
- ${COMPONENTS_DIR}/transport_manager/test/mock_device_scanner.cc
- ${COMPONENTS_DIR}/transport_manager/test/raw_message_matcher.cc
- ${COMPONENTS_DIR}/transport_manager/test/dnssd_service_browser_test.cc
- ${COMPONENTS_DIR}/transport_manager/test/tcp_transport_adapter_test.cc
- ${COMPONENTS_DIR}/transport_manager/test/mock_transport_adapter.cc
-)
+ ${TM_TEST_DIR}/transport_manager_default_test.cc
+ #${TM_TEST_DIR}/transport_manager_impl_test.cc
+ #${TM_TEST_DIR}/dnssd_service_browser_test.cc
+ ${TM_TEST_DIR}/transport_adapter_test.cc
+ #${TM_TEST_DIR}/transport_adapter_listener_test.cc
+ ${TM_TEST_DIR}/tcp_transport_adapter_test.cc
+ ${TM_TEST_DIR}/tcp_device_test.cc
+ #${TM_TEST_DIR}/tcp_client_listener_test.cc
+)
create_test("transport_manager_test" "${SOURCES}" "${LIBRARIES}")
-
+file(COPY smartDeviceLink_test.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
endif()
diff --git a/src/components/transport_manager/test/dnssd_service_browser_test.cc b/src/components/transport_manager/test/dnssd_service_browser_test.cc
index b496be58e..6eb2ad45f 100644
--- a/src/components/transport_manager/test/dnssd_service_browser_test.cc
+++ b/src/components/transport_manager/test/dnssd_service_browser_test.cc
@@ -32,90 +32,115 @@
#include "gmock/gmock.h"
-#include <netinet/in.h>
-#include <sys/types.h>
-#include <ifaddrs.h>
-
#include "transport_manager/transport_adapter/transport_adapter_controller.h"
#include "transport_manager/tcp/dnssd_service_browser.h"
-#include "transport_manager/tcp/tcp_device.h"
namespace transport_manager {
namespace transport_adapter {
-class MockTransportAdapterController: public TransportAdapterController {
-public:
- MOCK_METHOD1(AddDevice,DeviceSptr(DeviceSptr device));
- MOCK_METHOD1(SearchDeviceDone, void(const DeviceVector& devices));
- MOCK_METHOD1(SearchDeviceFailed, void(const SearchDeviceError& error));
- MOCK_CONST_METHOD1(FindDevice, DeviceSptr(const DeviceUID& device_handle));
- MOCK_METHOD3(ConnectionCreated, void(ConnectionSPtr connection, const DeviceUID& device_handle, const ApplicationHandle& app_handle));
- MOCK_METHOD2(ConnectDone, void(const DeviceUID& device_handle, const ApplicationHandle& app_handle));
- MOCK_METHOD3(ConnectFailed, void(const DeviceUID& device_handle, const ApplicationHandle& app_handle, const ConnectError& error));
- MOCK_METHOD2(ConnectionFinished, void(const DeviceUID& device_handle, const ApplicationHandle& app_handle));
- MOCK_METHOD3(ConnectionAborted,void(const DeviceUID& device_handle, const ApplicationHandle& app_handle, const CommunicationError& error));
- MOCK_METHOD2(DisconnectDone, void(const DeviceUID& device_handle, const ApplicationHandle& app_handle));
- MOCK_METHOD3(DataReceiveDone, void(const DeviceUID& device_handle, const ApplicationHandle& app_handle, const ::protocol_handler::RawMessagePtr message));
- MOCK_METHOD3(DataReceiveFailed, void(const DeviceUID& device_handle, const ApplicationHandle& app_handle, const DataReceiveError& error));
- MOCK_METHOD3(DataSendDone, void(const DeviceUID& device_handle, const ApplicationHandle& app_handle, const ::protocol_handler::RawMessagePtr message));
- MOCK_METHOD4(DataSendFailed, void(const DeviceUID& device_handle, const ApplicationHandle& app_handle, const ::protocol_handler::RawMessagePtr message, const DataSendError& error));
- MOCK_METHOD0(FindNewApplicationsRequest, void());
- MOCK_METHOD1(ApplicationListUpdated, void(const DeviceUID& device_handle));
- MOCK_METHOD2(DeviceDisconnected, void (const DeviceUID& device_handle,const DisconnectDeviceError& error));
+class MockTransportAdapterController : public TransportAdapterController {
+ public:
+ MOCK_METHOD1(AddDevice, DeviceSptr(DeviceSptr device));
+ MOCK_METHOD1(SearchDeviceDone, void(const DeviceVector& devices));
+ MOCK_METHOD1(SearchDeviceFailed, void(const SearchDeviceError& error));
+ MOCK_CONST_METHOD1(FindDevice, DeviceSptr(const DeviceUID& device_handle));
+ MOCK_METHOD3(ConnectionCreated,
+ void(ConnectionSPtr connection, const DeviceUID& device_handle,
+ const ApplicationHandle& app_handle));
+ MOCK_METHOD2(ConnectDone, void(const DeviceUID& device_handle,
+ const ApplicationHandle& app_handle));
+ MOCK_METHOD3(ConnectFailed, void(const DeviceUID& device_handle,
+ const ApplicationHandle& app_handle,
+ const ConnectError& error));
+ MOCK_METHOD2(ConnectionFinished, void(const DeviceUID& device_handle,
+ const ApplicationHandle& app_handle));
+ MOCK_METHOD3(ConnectionAborted, void(const DeviceUID& device_handle,
+ const ApplicationHandle& app_handle,
+ const CommunicationError& error));
+ MOCK_METHOD2(DisconnectDone, void(const DeviceUID& device_handle,
+ const ApplicationHandle& app_handle));
+ MOCK_METHOD3(DataReceiveDone,
+ void(const DeviceUID& device_handle,
+ const ApplicationHandle& app_handle,
+ const ::protocol_handler::RawMessagePtr message));
+ MOCK_METHOD3(DataReceiveFailed, void(const DeviceUID& device_handle,
+ const ApplicationHandle& app_handle,
+ const DataReceiveError& error));
+ MOCK_METHOD3(DataSendDone,
+ void(const DeviceUID& device_handle,
+ const ApplicationHandle& app_handle,
+ const ::protocol_handler::RawMessagePtr message));
+ MOCK_METHOD4(DataSendFailed,
+ void(const DeviceUID& device_handle,
+ const ApplicationHandle& app_handle,
+ const ::protocol_handler::RawMessagePtr message,
+ const DataSendError& error));
+ MOCK_METHOD0(FindNewApplicationsRequest, void());
+ MOCK_METHOD0(AckDevices, void());
+ MOCK_METHOD1(ApplicationListUpdated, void(const DeviceUID& device_handle));
+ MOCK_METHOD2(DeviceDisconnected, void(const DeviceUID& device_handle,
+ const DisconnectDeviceError& error));
};
-in_addr_t GetIfaceAddress() {
- in_addr_t result = 0;
- ifaddrs* if_addrs = NULL;
-// void * tmpAddrPtr = NULL;
+TEST(DnssdServiceBrowser, DISABLED_Init) {
+ // Arrange
+ MockTransportAdapterController controller;
+ DnssdServiceBrowser dnssd_service_browser(&controller);
+ // Check values after creation. Nothing is initialized
+ EXPECT_TRUE(NULL == dnssd_service_browser.avahi_service_browser());
+ EXPECT_TRUE(NULL == dnssd_service_browser.avahi_threaded_poll());
+ EXPECT_TRUE(NULL == dnssd_service_browser.avahi_client());
+ // Act
+ const TransportAdapter::Error error = dnssd_service_browser.Init();
+ ASSERT_EQ(TransportAdapter::OK, error);
- getifaddrs(&if_addrs);
- for (ifaddrs* ifa = if_addrs; ifa != NULL; ifa = ifa->ifa_next) {
- if (ifa->ifa_addr->sa_family == AF_INET) {
- result = ((struct sockaddr_in *) ifa->ifa_addr)->sin_addr.s_addr;
- if (result != htonl(INADDR_LOOPBACK)) {
- break;
- }
- }
+ while (!dnssd_service_browser.IsInitialised()) {
+ sleep(0);
}
- if (if_addrs)
- freeifaddrs(if_addrs);
- return result;
+ ASSERT_TRUE(dnssd_service_browser.IsInitialised());
+ // Check values are initialized and threaded poll started
+ EXPECT_FALSE(NULL == dnssd_service_browser.avahi_service_browser());
+ EXPECT_FALSE(NULL == dnssd_service_browser.avahi_threaded_poll());
+ EXPECT_FALSE(NULL == dnssd_service_browser.avahi_client());
}
-static in_addr_t iface_address = GetIfaceAddress();
-MATCHER_P(HasService, service_port, ""){
-for(DeviceVector::const_iterator it = arg.begin(); it != arg.end(); ++it) {
- TcpDevice* tcp_device = dynamic_cast<TcpDevice*>(it->get());
- if(tcp_device && tcp_device->in_addr() == iface_address) {
- ApplicationList app_list = tcp_device->GetApplicationList();
- for(ApplicationList::const_iterator it = app_list.begin(); it != app_list.end(); ++it) {
- if(tcp_device->GetApplicationPort(*it) == service_port) {
- return true;
- }
- }
- }
-}
-return false;
+TEST(DnssdServiceBrowser, DISABLED_IsInitialized_ExpectFalse) {
+ // Arrange
+ MockTransportAdapterController controller;
+ DnssdServiceBrowser dnssd_service_browser(&controller);
+ // Check
+ EXPECT_FALSE(dnssd_service_browser.IsInitialised());
}
-// TODO{ALeshin} APPLINK-11090 - Infinite loop
-TEST(DnssdServiceBrowser, DISABLED_Basic) {
+TEST(DnssdServiceBrowser, DISABLED_Terminate_ExpectTerminated) {
+ // Arrange
MockTransportAdapterController controller;
-
DnssdServiceBrowser dnssd_service_browser(&controller);
- DeviceScanner& device_scanner = dnssd_service_browser;
-
- const TransportAdapter::Error error = device_scanner.Init();
+ // Init service browser and client
+ const TransportAdapter::Error error = dnssd_service_browser.Init();
ASSERT_EQ(TransportAdapter::OK, error);
- while (!device_scanner.IsInitialised()) {
+ while (!dnssd_service_browser.IsInitialised()) {
sleep(0);
}
- ASSERT_TRUE(device_scanner.IsInitialised());
-
- EXPECT_EQ(TransportAdapter::NOT_SUPPORTED, device_scanner.Scan()); //method Scan now returns only NOT_SUPPORTED value
+ ASSERT_TRUE(dnssd_service_browser.IsInitialised());
+ // Client & browser are initialized and successfully started
+ EXPECT_FALSE(NULL == dnssd_service_browser.avahi_service_browser());
+ EXPECT_FALSE(NULL == dnssd_service_browser.avahi_threaded_poll());
+ EXPECT_FALSE(NULL == dnssd_service_browser.avahi_client());
+ dnssd_service_browser.Terminate();
+ // Checks everything successfully terminated
+ EXPECT_TRUE(NULL == dnssd_service_browser.avahi_service_browser());
+ EXPECT_TRUE(NULL == dnssd_service_browser.avahi_threaded_poll());
+ EXPECT_TRUE(NULL == dnssd_service_browser.avahi_client());
+}
+TEST(DnssdServiceBrowser, DISABLED_Scan_ExpectNotSupported) {
+ // Arrange
+ MockTransportAdapterController controller;
+ DnssdServiceBrowser dnssd_service_browser(&controller);
+ // At this moment Scan() can only return NOT SUPPORTED value
+ EXPECT_EQ(TransportAdapter::NOT_SUPPORTED, dnssd_service_browser.Scan());
}
} // namespace transport_adapter
diff --git a/src/components/transport_manager/test/include/client_connection_listener_mock.h b/src/components/transport_manager/test/include/client_connection_listener_mock.h
new file mode 100644
index 000000000..009814f53
--- /dev/null
+++ b/src/components/transport_manager/test/include/client_connection_listener_mock.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_CLIENT_CONNECTION_LISTENER_MOCK_H_
+#define SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_CLIENT_CONNECTION_LISTENER_MOCK_H_
+
+#include "gmock/gmock.h"
+#include "transport_manager/transport_adapter/client_connection_listener.h"
+
+namespace test {
+namespace components {
+namespace transport_manager_test {
+
+class ClientConnectionListenerMock
+ : public ::transport_manager::transport_adapter::ClientConnectionListener {
+ public:
+ MOCK_METHOD0(
+ Init, ::transport_manager::transport_adapter::TransportAdapter::Error());
+ MOCK_METHOD0(Terminate, void());
+ MOCK_CONST_METHOD0(IsInitialised, bool());
+ MOCK_METHOD0(
+ StartListening,
+ ::transport_manager::transport_adapter::TransportAdapter::Error());
+ MOCK_METHOD0(
+ StopListening,
+ ::transport_manager::transport_adapter::TransportAdapter::Error());
+};
+
+} // namespace transport_manager_test
+} // namespace components
+} // namespace test
+
+#endif // SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_CLIENT_CONNECTION_LISTENER_MOCK_H_
diff --git a/src/components/transport_manager/test/include/connection_mock.h b/src/components/transport_manager/test/include/connection_mock.h
new file mode 100644
index 000000000..9e35e9a00
--- /dev/null
+++ b/src/components/transport_manager/test/include/connection_mock.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_CONNECTION_MOCK_H_
+#define SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_CONNECTION_MOCK_H_
+
+#include "gmock/gmock.h"
+#include "transport_manager/transport_adapter/connection.h"
+
+namespace test {
+namespace components {
+namespace transport_manager_test {
+
+using namespace ::transport_manager::transport_adapter;
+
+class ConnectionMock : public Connection {
+ public:
+ MOCK_METHOD1(SendData, TransportAdapter::Error(
+ ::protocol_handler::RawMessagePtr message));
+ MOCK_METHOD0(Disconnect, TransportAdapter::Error());
+};
+
+} // namespace transport_manager_test
+} // namespace components
+} // namespace test
+
+#endif // SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_CONNECTION_MOCK_H_
diff --git a/src/components/transport_manager/test/include/device_mock.h b/src/components/transport_manager/test/include/device_mock.h
new file mode 100644
index 000000000..53a0ca53f
--- /dev/null
+++ b/src/components/transport_manager/test/include/device_mock.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_DEVICE_MOCK_H_
+#define SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_DEVICE_MOCK_H_
+
+#include "gmock/gmock.h"
+#include "transport_manager/transport_adapter/device.h"
+#include "transport_manager/common.h"
+#include "transport_manager/tcp/tcp_device.h"
+
+namespace test {
+namespace components {
+namespace transport_manager_test {
+
+class DeviceMock : public ::transport_manager::transport_adapter::Device {
+ public:
+ DeviceMock(const std::string& name, const std::string& unique_device_id)
+ : Device(name, unique_device_id) {}
+ MOCK_CONST_METHOD1(IsSameAs, bool(const Device* other_device));
+ MOCK_CONST_METHOD0(GetApplicationList, std::vector<int>());
+ MOCK_METHOD0(Stop, void());
+};
+
+class TCPDeviceMock : public ::transport_manager::transport_adapter::TcpDevice {
+ public:
+ TCPDeviceMock(const uint32_t& in_addr_t, const std::string& name)
+ : TcpDevice(in_addr_t, name) {}
+ MOCK_CONST_METHOD1(IsSameAs, bool(const Device* other_device));
+ MOCK_CONST_METHOD0(GetApplicationList, std::vector<int>());
+ MOCK_METHOD0(Stop, void());
+ MOCK_CONST_METHOD1(
+ GetApplicationPort,
+ int(const ::transport_manager::ApplicationHandle app_handle));
+};
+
+} // namespace transport_manager_test
+} // namespace components
+} // namespace test
+
+#endif // SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_DEVICE_MOCK_H_
diff --git a/src/components/transport_manager/test/include/device_scanner_mock.h b/src/components/transport_manager/test/include/device_scanner_mock.h
new file mode 100644
index 000000000..ea98af7f2
--- /dev/null
+++ b/src/components/transport_manager/test/include/device_scanner_mock.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_DEVICE_SCANNER_MOCK_H_
+#define SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_DEVICE_SCANNER_MOCK_H_
+
+#include "gmock/gmock.h"
+#include "transport_manager/transport_adapter/device_scanner.h"
+
+namespace test {
+namespace components {
+namespace transport_manager_test {
+
+class DeviceScannerMock
+ : public ::transport_manager::transport_adapter::DeviceScanner {
+ public:
+ MOCK_METHOD0(
+ Init, ::transport_manager::transport_adapter::TransportAdapter::Error());
+ MOCK_METHOD0(
+ Scan, ::transport_manager::transport_adapter::TransportAdapter::Error());
+ MOCK_METHOD0(Terminate, void());
+ MOCK_CONST_METHOD0(IsInitialised, bool());
+};
+
+} // namespace transport_manager_test
+} // namespace components
+} // namespace test
+
+#endif // SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_DEVICE_SCANNER_MOCK_H_
diff --git a/src/components/transport_manager/test/include/mock_transport_adapter_listener.h b/src/components/transport_manager/test/include/mock_transport_adapter_listener.h
index e45564d27..5b68cadaa 100644
--- a/src/components/transport_manager/test/include/mock_transport_adapter_listener.h
+++ b/src/components/transport_manager/test/include/mock_transport_adapter_listener.h
@@ -53,6 +53,7 @@ class MockTransportAdapterListener : public TransportAdapterListener {
public:
MOCK_METHOD1(OnSearchDeviceDone,
void(const TransportAdapter* transport_adapter));
+ MOCK_METHOD0(AckDevices,void());
MOCK_METHOD2(OnSearchDeviceFailed,
void(const TransportAdapter* transport_adapter, const SearchDeviceError& error));
MOCK_METHOD1(OnFindNewApplicationsRequest,
diff --git a/src/components/transport_manager/test/include/server_connection_factory_mock.h b/src/components/transport_manager/test/include/server_connection_factory_mock.h
new file mode 100644
index 000000000..cbf922e46
--- /dev/null
+++ b/src/components/transport_manager/test/include/server_connection_factory_mock.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_SERVER_CONNECTION_FACTORY_MOCK_H_
+#define SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_SERVER_CONNECTION_FACTORY_MOCK_H_
+
+#include "gmock/gmock.h"
+#include "transport_manager/transport_adapter/server_connection_factory.h"
+
+namespace test {
+namespace components {
+namespace transport_manager_test {
+
+class ServerConnectionFactoryMock : public ::transport_manager::transport_adapter::ServerConnectionFactory {
+ public:
+ MOCK_METHOD0(Init, ::transport_manager::transport_adapter::TransportAdapter::Error());
+ MOCK_METHOD0(Terminate, void());
+ MOCK_CONST_METHOD0(IsInitialised, bool());
+ MOCK_METHOD2(CreateConnection,
+ ::transport_manager::transport_adapter::TransportAdapter::Error(const std::string&,
+ const int& app_handle));
+};
+
+} // namespace transport_manager_test
+} // namespace components
+} // namespace test
+
+#endif // SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_SERVER_CONNECTION_FACTORY_MOCK_H_
diff --git a/src/components/transport_manager/test/include/time_metric_observer_mock.h b/src/components/transport_manager/test/include/time_metric_observer_mock.h
new file mode 100644
index 000000000..5936f8c65
--- /dev/null
+++ b/src/components/transport_manager/test/include/time_metric_observer_mock.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_TIME_METRIC_OBSERVER_MOCK_H_
+#define SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_TIME_METRIC_OBSERVER_MOCK_H_
+
+#include <string>
+#include "gmock/gmock.h"
+#include "transport_manager/time_metric_observer.h"
+#include "protocol/raw_message.h"
+
+namespace test {
+namespace components {
+namespace transport_manager_test {
+
+class TMMetricObserverMock: public ::transport_manager::TMMetricObserver {
+ public:
+ MOCK_METHOD1(StartRawMsg,
+ void(const protocol_handler::RawMessage* ptr));
+ MOCK_METHOD1(StopRawMsg,
+ void(const protocol_handler::RawMessage* ptr));
+};
+} // namespace transport_manager_test
+} // namespace components
+} // namespace test
+#endif // SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_TIME_METRIC_OBSERVER_MOCK_H_
diff --git a/src/components/transport_manager/test/include/transport_adapter_controller_mock.h b/src/components/transport_manager/test/include/transport_adapter_controller_mock.h
new file mode 100644
index 000000000..c0c7155e4
--- /dev/null
+++ b/src/components/transport_manager/test/include/transport_adapter_controller_mock.h
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_TRANSPORT_ADAPTER_CONTROLLER_MOCK_H_
+#define SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_TRANSPORT_ADAPTER_CONTROLLER_MOCK_H_
+
+#include "gmock/gmock.h"
+#include "transport_manager/transport_adapter/transport_adapter_controller.h"
+
+namespace test {
+namespace components {
+namespace transport_manager {
+
+using namespace ::transport_manager::transport_adapter;
+
+class TransportAdapterControllerMock : public TransportAdapterController {
+ public:
+ MOCK_METHOD1(AddDevice, DeviceSptr(DeviceSptr device));
+ MOCK_METHOD1(SearchDeviceDone, void(DeviceVector device));
+ MOCK_METHOD1(ApplicationListUpdated,
+ ApplicationListUpdated(const DeviceUID& device_handle));
+ MOCK_METHOD0(FindNewApplicationsRequest, void());
+ MOCK_METHOD1(SearchDeviceFailed, void(const SearchDeviceError& error));
+ MOCK_CONST_METHOD1(FindDevice, DeviceSptr(const DeviceUID& device_handle));
+ MOCK_CONST_METHOD3(FindDevice, void(ConnectionSPtr connection,
+ const DeviceUID& device_handle,
+ const ApplicationHandle& app_handle));
+ MOCK_METHOD2(ConnectDone, void(const DeviceUID& device_handle,
+ const ApplicationHandle& app_handle));
+ MOCK_METHOD3(ConnectFailed, void(const DeviceUID& device_handle,
+ const ApplicationHandle& app_handle,
+ const ConnectError& error));
+ MOCK_METHOD2(ConnectionFinished, void(const DeviceUID& device_handle,
+ const ApplicationHandle& app_handle));
+ MOCK_METHOD3(ConnectionAborted, void(const DeviceUID& device_handle,
+ const ApplicationHandle& app_handle,
+ const CommunicationError& error));
+ MOCK_METHOD2(DeviceDisconnected, void(const DeviceUID& device_handle,
+ const DisconnectDeviceError& error));
+ MOCK_METHOD2(DisconnectDone, void(const DeviceUID& device_handle,
+ const ApplicationHandle& app_handle));
+ MOCK_METHOD3(DataReceiveDone,
+ void(const DeviceUID& device_handle,
+ const ApplicationHandle& app_handle,
+ ::protocol_handler::RawMessagePtr message));
+ MOCK_METHOD3(DataReceiveFailed, void(const DeviceUID& device_handle,
+ const ApplicationHandle& app_handle,
+ const DataReceiveError& error));
+ MOCK_METHOD3(DataSendDone, void(const DeviceUID& device_handle,
+ const ApplicationHandle& app_handle,
+ ::protocol_handler::RawMessagePtr message));
+ MOCK_METHOD3(DataReceiveFailed,
+ void(const DeviceUID& device_handle,
+ const ApplicationHandle& app_handle,
+ ::protocol_handler::RawMessagePtr message,
+ const DataSendError& error));
+};
+
+} // namespace transport_manager
+} // namespace components
+} // namespace test
+
+#endif // SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_TRANSPORT_ADAPTER_CONTROLLER_MOCK_H_
diff --git a/src/components/transport_manager/test/include/transport_adapter_listener_mock.h b/src/components/transport_manager/test/include/transport_adapter_listener_mock.h
new file mode 100644
index 000000000..88b5cf4b6
--- /dev/null
+++ b/src/components/transport_manager/test/include/transport_adapter_listener_mock.h
@@ -0,0 +1,123 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_TRANSPORT_ADAPTER_LISTENER_MOCK_H_
+#define SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_TRANSPORT_ADAPTER_LISTENER_MOCK_H_
+
+#include "gmock/gmock.h"
+#include "transport_manager/transport_adapter/transport_adapter_listener.h"
+
+namespace test {
+namespace components {
+namespace transport_manager_test {
+
+using namespace transport_manager;
+using transport_adapter::TransportAdapter;
+using transport_adapter::TransportAdapterListener;
+
+class TransportAdapterListenerMock : public TransportAdapterListener {
+ public:
+ MOCK_METHOD1(OnSearchDeviceDone,
+ void(const TransportAdapter* transport_adapter));
+ MOCK_METHOD2(OnSearchDeviceFailed,
+ void(const TransportAdapter* transport_adapter,
+ const SearchDeviceError& error));
+ MOCK_METHOD1(OnDeviceListUpdated,
+ void(const TransportAdapter* transport_adapter));
+ MOCK_METHOD1(OnFindNewApplicationsRequest,
+ void(const TransportAdapter* transport_adapter));
+ MOCK_METHOD3(OnConnectDone,
+ void(const TransportAdapter* transport_adapter,
+ const DeviceUID& device_handle,
+ const ApplicationHandle& app_handle));
+ MOCK_METHOD4(OnConnectFailed,
+ void(const TransportAdapter* transport_adapter,
+ const DeviceUID& device_handle,
+ const ApplicationHandle& app_handle,
+ const ConnectError& error));
+ MOCK_METHOD3(OnConnectRequested,
+ void(const TransportAdapter* transport_adapter,
+ const DeviceUID& device_handle,
+ const ApplicationHandle& app_handle));
+ MOCK_METHOD4(OnUnexpectedDisconnect,
+ void(const TransportAdapter* transport_adapter,
+ const DeviceUID& device_handle,
+ const ApplicationHandle& app_handle,
+ const CommunicationError& error));
+ MOCK_METHOD3(OnDisconnectDone,
+ void(const TransportAdapter* transport_adapter,
+ const DeviceUID& device_handle,
+ const ApplicationHandle& app_handle));
+ MOCK_METHOD4(OnDisconnectFailed,
+ void(const TransportAdapter* transport_adapter,
+ const DeviceUID& device_handle,
+ const ApplicationHandle& app_handle,
+ const DisconnectError& error));
+ MOCK_METHOD2(OnDisconnectDeviceDone,
+ void(const TransportAdapter* transport_adapter,
+ const DeviceUID& device_handle));
+ MOCK_METHOD3(OnDisconnectDeviceFailed,
+ void(const TransportAdapter* transport_adapter,
+ const DeviceUID& device_handle,
+ const DisconnectDeviceError& error));
+ MOCK_METHOD4(OnDataSendDone,
+ void(const TransportAdapter* transport_adapter,
+ const DeviceUID& device_handle,
+ const ApplicationHandle& app_handle,
+ const ::protocol_handler::RawMessagePtr data_container));
+ MOCK_METHOD5(OnDataSendFailed,
+ void(const TransportAdapter* transport_adapter,
+ const DeviceUID& device_handle,
+ const ApplicationHandle& app_handle,
+ const ::protocol_handler::RawMessagePtr data_container,
+ const DataSendError& error));
+ MOCK_METHOD4(OnDataReceiveDone,
+ void(const TransportAdapter* transport_adapter,
+ const DeviceUID& device_handle,
+ const ApplicationHandle& app_handle,
+ const ::protocol_handler::RawMessagePtr data_container));
+ MOCK_METHOD4(OnDataReceiveFailed,
+ void(const TransportAdapter* transport_adapter,
+ const DeviceUID& device_handle,
+ const ApplicationHandle& app_handle,
+ const DataReceiveError& error));
+ MOCK_METHOD3(OnCommunicationError,
+ void(const TransportAdapter* transport_adapter,
+ const DeviceUID& device_handle,
+ const ApplicationHandle& app_handle));
+};
+
+} // namespace transport_manager_test
+} // namespace components
+} // namespace test
+
+#endif // SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_TRANSPORT_ADAPTER_LISTENER_MOCK_H_
diff --git a/src/components/transport_manager/test/include/transport_adapter_mock.h b/src/components/transport_manager/test/include/transport_adapter_mock.h
new file mode 100644
index 000000000..86e044d13
--- /dev/null
+++ b/src/components/transport_manager/test/include/transport_adapter_mock.h
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_TRANSPORT_ADAPTER_MOCK_H_
+#define SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_TRANSPORT_ADAPTER_MOCK_H_
+
+#include "gmock/gmock.h"
+#include "transport_manager/transport_adapter/transport_adapter.h"
+
+namespace test {
+namespace components {
+namespace transport_manager_test {
+
+class TransportAdapterMock
+ : public ::transport_manager::transport_adapter::TransportAdapter {
+ public:
+ MOCK_CONST_METHOD0(GetDeviceType,
+ ::transport_manager::transport_adapter::DeviceType());
+ MOCK_CONST_METHOD0(GetConnectionType, ::transport_manager::ConnectionType());
+ MOCK_CONST_METHOD0(IsInitialised, bool());
+ MOCK_METHOD0(
+ Init, ::transport_manager::transport_adapter::TransportAdapter::Error());
+ MOCK_METHOD0(Terminate, void());
+ MOCK_METHOD1(
+ AddListener,
+ void(::transport_manager::transport_adapter::TransportAdapterListener*
+ listener));
+ MOCK_CONST_METHOD0(IsSearchDevicesSupported, bool());
+ MOCK_METHOD0(
+ SearchDevices,
+ ::transport_manager::transport_adapter::TransportAdapter::Error());
+ MOCK_CONST_METHOD0(IsServerOriginatedConnectSupported, bool());
+ MOCK_METHOD2(Connect,
+ ::transport_manager::transport_adapter::TransportAdapter::Error(
+ const ::transport_manager::DeviceUID& device_handle,
+ const ::transport_manager::ApplicationHandle& app_handle));
+ MOCK_METHOD1(ConnectDevice,
+ ::transport_manager::transport_adapter::TransportAdapter::Error(
+ const ::transport_manager::DeviceUID& device_handle));
+ MOCK_CONST_METHOD0(IsClientOriginatedConnectSupported, bool());
+ MOCK_METHOD0(
+ StartClientListening,
+ ::transport_manager::transport_adapter::TransportAdapter::Error());
+ MOCK_METHOD0(
+ StopClientListening,
+ ::transport_manager::transport_adapter::TransportAdapter::Error());
+ MOCK_METHOD2(Disconnect,
+ ::transport_manager::transport_adapter::TransportAdapter::Error(
+ const ::transport_manager::DeviceUID& device_handle,
+ const ::transport_manager::ApplicationHandle& app_handle));
+ MOCK_METHOD1(DisconnectDevice,
+ Error(const ::transport_manager::DeviceUID& device_handle));
+ MOCK_METHOD3(SendData,
+ ::transport_manager::transport_adapter::TransportAdapter::Error(
+ const ::transport_manager::DeviceUID& device_handle,
+ const ::transport_manager::ApplicationHandle& app_handle,
+ const protocol_handler::RawMessagePtr data));
+ MOCK_CONST_METHOD0(GetDeviceList, ::transport_manager::DeviceList());
+ MOCK_CONST_METHOD1(GetApplicationList,
+ ::transport_manager::ApplicationList(
+ const ::transport_manager::DeviceUID& device_handle));
+ MOCK_CONST_METHOD1(
+ DeviceName,
+ std::string(const ::transport_manager::DeviceUID& device_handle));
+
+#ifdef TIME_TESTER
+ MOCK_METHOD0(GetTimeMetricObserver, ::transport_manager::TMMetricObserver*());
+#endif // TIME_TESTER
+};
+
+} // namespace transport_manager_test
+} // namespace components
+} // namespace test
+
+#endif // SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_TRANSPORT_ADAPTER_MOCK_H_
diff --git a/src/components/transport_manager/test/include/transport_manager_impl_mock.h b/src/components/transport_manager/test/include/transport_manager_impl_mock.h
new file mode 100644
index 000000000..bb73f1fa4
--- /dev/null
+++ b/src/components/transport_manager/test/include/transport_manager_impl_mock.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef APPLINK_TEST_COMPONENTS_TRANSPORTMANAGER_INCLUDE_TRANSPORT_MANAGER_IMPL_MOCK_H_
+#define APPLINK_TEST_COMPONENTS_TRANSPORTMANAGER_INCLUDE_TRANSPORT_MANAGER_IMPL_MOCK_H_
+
+#include "gmock/gmock.h"
+#include "transport_manager/transport_manager_impl.h"
+
+namespace test {
+namespace components {
+namespace transport_manager {
+
+using namespace ::transport_manager;
+
+class TransportManagerImplMock : public TransportManagerImpl {
+ public:
+ MOCK_METHOD1(ReceiveEventFromDevice, int(const TransportAdapterEvent& event));
+};
+
+} // namespace transport_manager
+} // namespace components
+} // namespace test
+
+#endif // APPLINK_TEST_COMPONENTS_TRANSPORTMANAGER_INCLUDE_TRANSPORT_MANAGER_IMPL_MOCK_H_
diff --git a/src/components/transport_manager/test/include/transport_manager_listener_mock.h b/src/components/transport_manager/test/include/transport_manager_listener_mock.h
new file mode 100644
index 000000000..29758159f
--- /dev/null
+++ b/src/components/transport_manager/test/include/transport_manager_listener_mock.h
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_TRANSPORT_MANAGER_LISTENER_MOCK_H_
+#define SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_TRANSPORT_MANAGER_LISTENER_MOCK_H_
+
+#include <vector>
+#include <gmock/gmock.h>
+#include "transport_manager/transport_manager_listener.h"
+#include "protocol/raw_message.h"
+
+namespace test {
+namespace components {
+namespace transport_manager_test {
+
+using namespace transport_manager;
+using ::protocol_handler::RawMessage;
+using ::protocol_handler::RawMessagePtr;
+
+class TransportManagerListenerMock : public TransportManagerListener {
+ public:
+ MOCK_METHOD1(OnDeviceListUpdated, void(const std::vector<DeviceInfo>&));
+ MOCK_METHOD0(OnFindNewApplicationsRequest, void());
+ MOCK_METHOD1(OnDeviceFound, void(const DeviceInfo& device_info));
+ MOCK_METHOD1(OnDeviceAdded, void(const DeviceInfo& device_info));
+ MOCK_METHOD1(OnDeviceRemoved, void(const DeviceInfo& device_info));
+ MOCK_METHOD0(OnNoDeviceFound, void());
+ MOCK_METHOD0(OnScanDevicesFinished, void());
+ MOCK_METHOD1(OnScanDevicesFailed, void(const SearchDeviceError& error));
+
+ MOCK_METHOD2(OnConnectionEstablished,
+ void(const DeviceInfo& device_info,
+ const ConnectionUID& connection_id));
+ MOCK_METHOD2(OnConnectionFailed,
+ void(const DeviceInfo& device_info, const ConnectError& error));
+
+ MOCK_METHOD1(OnConnectionClosed, void(ConnectionUID connection_id));
+ MOCK_METHOD2(OnConnectionClosedFailure,
+ void(ConnectionUID connection_id, const DisconnectError& error));
+ MOCK_METHOD2(OnUnexpectedDisconnect, void(ConnectionUID connection_id,
+ const CommunicationError& error));
+ MOCK_METHOD2(OnDeviceConnectionLost,
+ void(const DeviceHandle& device,
+ const DisconnectDeviceError& error));
+ MOCK_METHOD2(OnDisconnectFailed, void(const DeviceHandle& device,
+ const DisconnectDeviceError& error));
+
+ MOCK_METHOD1(OnTMMessageReceived, void(const RawMessagePtr data_container));
+ MOCK_METHOD2(OnTMMessageReceiveFailed, void(ConnectionUID connection_id,
+ const DataReceiveError& error));
+ MOCK_METHOD1(OnTMMessageSend, void(const RawMessagePtr message));
+ MOCK_METHOD2(OnTMMessageSendFailed,
+ void(const DataSendError& error, const RawMessagePtr message));
+};
+
+} // namespace transport_manager_test
+} // namespace components
+} // namespace test
+
+#endif // SRC_COMPONENTS_TRANSPORT_MANAGER_TEST_INCLUDE_TRANSPORT_MANAGER_LISTENER_MOCK_H_
diff --git a/src/components/transport_manager/test/smartDeviceLink_test.ini b/src/components/transport_manager/test/smartDeviceLink_test.ini
new file mode 100644
index 000000000..40aeb5a01
--- /dev/null
+++ b/src/components/transport_manager/test/smartDeviceLink_test.ini
@@ -0,0 +1,55 @@
+ ; The INI-file consists of different chapters.
+; Each chapter begins with the line containing
+; the name in square brackets. Syntax:
+; [chapter]
+; The chapters consists of a set of items with a
+; assinged value. The syntax is:
+; item=value
+; All white spaces an second encounters of chapters
+; or items will be ignored.
+; Remarks start with semicolon or star as first character.
+; It is alowed for names of chapters and items to
+; contain semicolon and star. Possible syntax is:
+; [ chapter ] ;Remark
+; item = value ;Remark
+
+[HMI]
+LaunchHMI = false
+LinkToWebHMI = "HMI/index.html"
+ServerAddress = 127.0.0.1
+ServerPort = 8087
+VideoStreamingPort = 5050
+AudioStreamingPort = 5080
+
+[MAIN]
+SDLVersion =
+LogsEnabled = false
+; Contains .json/.ini files
+AppConfigFolder =
+; Contains output files, e.g. .wav
+AppStorageFolder = storage
+; Contains resourses, e.g. audio8bit.wav
+AppResourceFolder =
+
+
+UseLastState = true
+
+
+[Resumption]
+
+# Timeout in milliseconds for resumption Application HMILevel
+# and resolving conflicts in case if multiple applications initiate resumption
+ApplicationResumingTimeout = 3000
+
+# Timeout in milliseconds for periodical saving resumption persistent data
+AppSavePersistentDataTimeout = 10000
+
+# Timeout in seconds to store hmi_level for media app before ign_off
+ResumptionDelayBeforeIgn = 30;
+
+# Timeout in seconds to restore hmi_level for media app after sdl run
+ResumptionDelayAfterIgn = 30;
+
+# Resumption ctrl uses JSON if UseDBForResumption=false for store data otherwise uses DB
+UseDBForResumption = false
+
diff --git a/src/components/transport_manager/test/tcp_client_listener_test.cc b/src/components/transport_manager/test/tcp_client_listener_test.cc
new file mode 100644
index 000000000..916f8bac5
--- /dev/null
+++ b/src/components/transport_manager/test/tcp_client_listener_test.cc
@@ -0,0 +1,101 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "gtest/gtest.h"
+#include "include/transport_adapter_mock.h"
+#include "transport_manager/tcp/tcp_client_listener.h"
+#include "include/transport_manager_mock.h"
+#include "transport_manager/transport_adapter/transport_adapter_controller.h"
+#include "transport_manager/transport_adapter/device.h"
+
+namespace test {
+namespace components {
+namespace transport_manager_test {
+
+using ::testing::Return;
+using namespace ::transport_manager;
+using namespace ::transport_manager::transport_adapter;
+
+class MockTransportAdapterController: public TransportAdapterController {
+public:
+ MOCK_METHOD1(AddDevice,DeviceSptr(DeviceSptr device));
+ MOCK_METHOD0(AckDevices,void());
+ MOCK_METHOD1(SearchDeviceDone, void(const DeviceVector& devices));
+ MOCK_METHOD1(SearchDeviceFailed, void(const SearchDeviceError& error));
+ MOCK_CONST_METHOD1(FindDevice, DeviceSptr(const DeviceUID& device_handle));
+ MOCK_METHOD3(ConnectionCreated, void(ConnectionSPtr connection, const DeviceUID& device_handle, const ApplicationHandle& app_handle));
+ MOCK_METHOD2(ConnectDone, void(const DeviceUID& device_handle, const ApplicationHandle& app_handle));
+ MOCK_METHOD3(ConnectFailed, void(const DeviceUID& device_handle, const ApplicationHandle& app_handle, const ConnectError& error));
+ MOCK_METHOD2(ConnectionFinished, void(const DeviceUID& device_handle, const ApplicationHandle& app_handle));
+ MOCK_METHOD3(ConnectionAborted,void(const DeviceUID& device_handle, const ApplicationHandle& app_handle, const CommunicationError& error));
+ MOCK_METHOD2(DisconnectDone, void(const DeviceUID& device_handle, const ApplicationHandle& app_handle));
+ MOCK_METHOD3(DataReceiveDone, void(const DeviceUID& device_handle, const ApplicationHandle& app_handle, const ::protocol_handler::RawMessagePtr message));
+ MOCK_METHOD3(DataReceiveFailed, void(const DeviceUID& device_handle, const ApplicationHandle& app_handle, const DataReceiveError& error));
+ MOCK_METHOD3(DataSendDone, void(const DeviceUID& device_handle, const ApplicationHandle& app_handle, const ::protocol_handler::RawMessagePtr message));
+ MOCK_METHOD4(DataSendFailed, void(const DeviceUID& device_handle, const ApplicationHandle& app_handle, const ::protocol_handler::RawMessagePtr message, const DataSendError& error));
+ MOCK_METHOD0(FindNewApplicationsRequest, void());
+ MOCK_METHOD1(ApplicationListUpdated, void(const DeviceUID& device_handle));
+ MOCK_METHOD2(DeviceDisconnected, void (const DeviceUID& device_handle,const DisconnectDeviceError& error));
+};
+
+class TcpClientListenerTest : public ::testing::Test {
+ public:
+ TcpClientListenerTest()
+ : port_(0),
+ enable_keep_alive_(false),
+ tcp_client_listener_(&adapter_controller_mock_, port_, enable_keep_alive_) {}
+
+ protected:
+ uint16_t port_;
+ bool enable_keep_alive_;
+ MockTransportAdapterController adapter_controller_mock_;
+ TcpClientListener tcp_client_listener_;
+};
+
+TEST_F(TcpClientListenerTest, Ctor_test) {
+ EXPECT_EQ(0, tcp_client_listener_.port());
+ EXPECT_TRUE(NULL != tcp_client_listener_.thread());
+ EXPECT_EQ(-1, tcp_client_listener_.get_socket());
+}
+
+TEST_F(TcpClientListenerTest, IsInitialised) {
+ EXPECT_TRUE(tcp_client_listener_.IsInitialised());
+}
+
+TEST_F(TcpClientListenerTest, Init) {
+ EXPECT_EQ(TransportAdapter::OK, tcp_client_listener_.Init());
+}
+
+} // namespace transport_manager_test
+} // namespace components
+} // namespace test
+
diff --git a/src/components/transport_manager/test/tcp_device_test.cc b/src/components/transport_manager/test/tcp_device_test.cc
new file mode 100644
index 000000000..961ebe695
--- /dev/null
+++ b/src/components/transport_manager/test/tcp_device_test.cc
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "gtest/gtest.h"
+#include "transport_manager/tcp/tcp_device.h"
+#include "transport_manager/transport_adapter/device.h"
+
+namespace test {
+namespace components {
+namespace transport_manager_test {
+
+using namespace ::transport_manager;
+using namespace ::transport_manager::transport_adapter;
+
+class TestDevice : public Device {
+ public:
+ TestDevice(const uint32_t& in_addr, const std::string& name)
+ : Device(name, name), in_addr_(in_addr) {}
+ bool IsSameAs(const Device* other_device) const { return true; }
+ ApplicationList GetApplicationList() const {
+ ApplicationList app_list;
+ return app_list;
+ }
+ const uint32_t in_addr_;
+};
+
+TEST(TcpDeviceTest, CompareWithOtherTCPDevice) {
+ uint32_t in_addr = 10;
+ std::string name = "tcp_device";
+ TcpDevice test_tcp_device(in_addr, name);
+ TcpDevice other(in_addr, "other");
+
+ EXPECT_TRUE(test_tcp_device.IsSameAs(&other));
+}
+
+TEST(TcpDeviceTest, CompareWithOtherNotTCPDevice) {
+ uint32_t in_addr = 10;
+ std::string name = "tcp_device";
+ TcpDevice test_tcp_device(in_addr, name);
+ TestDevice other(in_addr, "other");
+
+ EXPECT_FALSE(test_tcp_device.IsSameAs(&other));
+}
+
+TEST(TcpDeviceTest, AddApplications) {
+ uint32_t in_addr = 1;
+ std::string name = "tcp_device";
+
+ TcpDevice test_tcp_device(in_addr, name);
+
+ // App will be with socket = 0, incoming = false;
+ int port = 12345;
+
+ EXPECT_EQ(1, test_tcp_device.AddDiscoveredApplication(port));
+
+ // App.incoming = true; app.port = 0;
+ int socket = 10;
+ EXPECT_EQ(2, test_tcp_device.AddIncomingApplication(socket));
+
+ ApplicationList applist = test_tcp_device.GetApplicationList();
+ ASSERT_EQ(2u, applist.size());
+ EXPECT_EQ(1, applist[0]);
+ EXPECT_EQ(2, applist[1]);
+
+ // Because incoming = false
+ EXPECT_EQ(-1, test_tcp_device.GetApplicationSocket(applist[0]));
+ EXPECT_EQ(10, test_tcp_device.GetApplicationSocket(applist[1]));
+
+ EXPECT_EQ(port, test_tcp_device.GetApplicationPort(applist[0]));
+ // Because incoming = true
+ EXPECT_EQ(-1, test_tcp_device.GetApplicationPort(applist[1]));
+}
+
+} // namespace transport_manager_test
+} // namespace components
+} // namespace test
diff --git a/src/components/transport_manager/test/tcp_transport_adapter_test.cc b/src/components/transport_manager/test/tcp_transport_adapter_test.cc
index c91736b9f..d849d94d4 100644
--- a/src/components/transport_manager/test/tcp_transport_adapter_test.cc
+++ b/src/components/transport_manager/test/tcp_transport_adapter_test.cc
@@ -30,430 +30,329 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
-#include <sys/time.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <netinet/in.h>
-
+#include "gtest/gtest.h"
#include "transport_manager/tcp/tcp_transport_adapter.h"
-#include "transport_manager/transport_adapter/transport_adapter_listener.h"
-#include "include/mock_transport_adapter_listener.h"
+#include "transport_manager/transport_adapter/connection.h"
+#include "config_profile/profile.h"
+#include "resumption/last_state.h"
#include "protocol/raw_message.h"
-#include "utils/logger.h"
-
-namespace transport_manager {
-namespace transport_adapter {
-
-using namespace ::protocol_handler;
-
-TEST(TcpAdapterBasicTest, GetDeviceType_Return_sdltcp) {
-
- //arrange
- TransportAdapter* transport_adapter = new TcpTransportAdapter(12345);
-
- // Assert
- EXPECT_EQ(TCP, transport_adapter->GetDeviceType());
-
- delete transport_adapter;
-}
-
-TEST(TcpAdapterBasicTest, isServerOriginatedConnectSupported_Return_True) {
-
- //arrange
- TransportAdapter* transport_adapter = new TcpTransportAdapter(12345);
-
- //assert
- EXPECT_TRUE(transport_adapter->IsServerOriginatedConnectSupported());
-
- delete transport_adapter;
-}
-
-TEST(TcpAdapterBasicTest, isClientOriginatedConnectSupported_Return_True) {
-
- //arrange
- TransportAdapter* transport_adapter = new TcpTransportAdapter(12345);
-
- //assert
- EXPECT_TRUE(transport_adapter->IsClientOriginatedConnectSupported());
-
- delete transport_adapter;
-}
-
-TEST(TcpAdapterBasicTest, isSearchDevicesSupported_Return_True) {
-
- //arrange
- TransportAdapter* transport_adapter = new TcpTransportAdapter(12345);
-
- //assert
- EXPECT_TRUE(transport_adapter->IsSearchDevicesSupported());
+#include "include/transport_adapter_listener_mock.h"
+#include "include/device_mock.h"
+#include "include/connection_mock.h"
- delete transport_adapter;
-}
-
-TEST(TcpAdapterBasicTest, NotInitialised_Return_BAD_STATE) {
-
- //arrange
- TransportAdapter* transport_adapter = new TcpTransportAdapter(12345);
-
- //assert
- EXPECT_EQ(TransportAdapter::BAD_STATE, transport_adapter->SearchDevices());
-
- delete transport_adapter;
-}
-
-//TODO(KKolodiy)APPLINK-11045
-TEST(TcpAdapterBasicTest, DISABLED_NotInitialised_Return_OK_InConnect) {
-
- //arrange
- TransportAdapter* transport_adapter = new TcpTransportAdapter(12345);
-
- //assert
- EXPECT_EQ(TransportAdapter::OK,
- transport_adapter->Connect(DeviceUID("xxx"), 2));
- delete transport_adapter;
-}
-
-TEST(TcpAdapterBasicTest, NotInitialised_Return_BAD_STATE_inDisconnect) {
+namespace test {
+namespace components {
+namespace transport_manager_test {
- //arrange
- TransportAdapter* transport_adapter = new TcpTransportAdapter(12345);
-
- //assert
- EXPECT_EQ(TransportAdapter::BAD_STATE,
- transport_adapter->Disconnect(DeviceUID("xxx"), 2));
- delete transport_adapter;
-}
-
-TEST(TcpAdapterBasicTest, NotInitialised_Return_BAD_STATE_in_DisconnectDevice) {
-
- //arrange
- TransportAdapter* transport_adapter = new TcpTransportAdapter(12345);
+using ::testing::Return;
+using ::testing::_;
- //assert
- EXPECT_EQ(TransportAdapter::BAD_STATE,
- transport_adapter->DisconnectDevice(DeviceUID("xxx")));
- delete transport_adapter;
-}
+using namespace ::protocol_handler;
+using namespace ::transport_manager;
+using namespace transport_manager::transport_adapter;
-class ClientTcpSocket {
+class TestTCPTransportAdapter : public TcpTransportAdapter {
public:
- bool Connect(uint16_t server_port) {
-
- socket_ = socket(AF_INET, SOCK_STREAM, 0);
- std::cout << "socket is " << socket_ << "\n\n";
- if (socket_ < 0)
- return false;
-
- struct sockaddr_in addr;
- memset((char*) &addr, 0, sizeof(addr));
- addr.sin_family = AF_INET;
- addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
- addr.sin_port = htons(server_port);
-
- if (::connect(socket_, (struct sockaddr*) &addr, sizeof(addr)) < 0)
- return false;
- else
- return true;
+ TestTCPTransportAdapter(uint16_t port) : TcpTransportAdapter(port) {
+ ::profile::Profile::instance()->config_file_name(
+ "smartDeviceLink_test.ini");
}
+ MOCK_CONST_METHOD2(FindEstablishedConnection,
+ ConnectionSPtr(const DeviceUID& device_handle,
+ const ApplicationHandle& app_handle));
+
+ MOCK_CONST_METHOD1(FindDevice, DeviceSptr(const DeviceUID& device_handle));
+ MOCK_METHOD2(Connect,
+ TransportAdapter::Error(const DeviceUID& device_handle,
+ const ApplicationHandle& app_handle));
+ void CallStore() { Store(); }
+ bool CallRestore() { return Restore(); }
+};
- bool Send(const std::string& str) {
- size_t size = str.size();
- ssize_t written = write(socket_, str.c_str(), size);
- if (written != -1) {
- size_t count = static_cast<size_t>(written);
- return count == size;
- } else {
- return false;
- }
+class TcpAdapterTest : public ::testing::Test {
+ protected:
+ static void SetUpTestCase() {
+ ::profile::Profile::instance()->config_file_name(
+ "smartDeviceLink_test.ini");
}
-
- std::string receive(size_t size) {
- char* buf = new char[size];
- ssize_t read = recv(socket_, buf, size, MSG_WAITALL);
- if (read != -1) {
- return std::string(buf, buf + read);
- } else {
- return std::string();
- }
+ virtual void SetUp() {
+ resumption::LastState::instance()->dictionary = Json::Value();
}
- void Disconnect() {
- close(socket_);
- }
+ virtual void TearDown() { resumption::LastState::destroy(); }
- private:
- uint16_t port_;
- int socket_;
+ const uint32_t port = 12345;
+ const std::string string_port = "12345";
};
-using ::testing::_;
-using ::testing::Invoke;
-
-void Disconnect(const TransportAdapter* transport_adapter,
- const DeviceUID device_handle,
- const ApplicationHandle app_handle) {
- EXPECT_EQ(
- TransportAdapter::OK,
- const_cast<TransportAdapter*>(transport_adapter)->Disconnect(
- device_handle, app_handle));
-
- std::cout << "adapter is disconnected" << "\n";
+TEST_F(TcpAdapterTest, DISABLED_StoreDataWithOneDeviceAndOneApplication) {
+ // Prepare
+ TestTCPTransportAdapter transport_adapter(port);
+ std::string uniq_id = "unique_device_name";
+ utils::SharedPtr<TCPDeviceMock> mockdev = new TCPDeviceMock(port, uniq_id);
+ transport_adapter.AddDevice(mockdev);
+
+ std::vector<std::string> devList = transport_adapter.GetDeviceList();
+ ASSERT_EQ(1u, devList.size());
+ EXPECT_EQ(uniq_id, devList[0]);
+
+ const int app_handle = 1;
+ std::vector<int> intList = {app_handle};
+ EXPECT_CALL(*mockdev, GetApplicationList()).WillOnce(Return(intList));
+
+ ConnectionSPtr mock_connection = new ConnectionMock();
+ EXPECT_CALL(transport_adapter, FindDevice(uniq_id)).WillOnce(Return(mockdev));
+ EXPECT_CALL(transport_adapter, FindEstablishedConnection(uniq_id, app_handle))
+ .WillOnce(Return(mock_connection));
+
+ EXPECT_CALL(*mockdev, GetApplicationPort(app_handle)).WillOnce(Return(port));
+
+ transport_adapter.CallStore();
+
+ // Check that value is saved
+ Json::Value& tcp_dict = resumption::LastState::instance()
+ ->dictionary["TransportManager"]["TcpAdapter"];
+
+ ASSERT_TRUE(tcp_dict.isObject());
+ ASSERT_FALSE(tcp_dict["devices"].isNull());
+ ASSERT_FALSE(tcp_dict["devices"][0]["applications"].isNull());
+ ASSERT_FALSE(tcp_dict["devices"][0]["address"].isNull());
+ EXPECT_EQ(1u, tcp_dict["devices"][0]["applications"].size());
+ EXPECT_EQ(string_port,
+ tcp_dict["devices"][0]["applications"][0]["port"].asString());
+ EXPECT_EQ(uniq_id, tcp_dict["devices"][0]["name"].asString());
}
-class TcpAdapterTest : public ::testing::Test {
- public:
- TcpAdapterTest()
- : port_(ChoosePort()),
- transport_adapter_(new TcpTransportAdapter(port_)),
- suspended_(false),
- finished_(false) {
- pthread_mutex_init(&suspend_mutex_, 0);
- pthread_cond_init(&suspend_cond_, 0);
+TEST_F(TcpAdapterTest, DISABLED_StoreDataWithSeveralDevicesAndOneApplication) {
+ // Prepare
+ TestTCPTransportAdapter transport_adapter(port);
+ const uint32_t count_dev = 10;
+ utils::SharedPtr<TCPDeviceMock> mockdev[count_dev];
+ std::string uniq_id[count_dev];
+ for (uint32_t i = 0; i < count_dev; i++) {
+ char numb[12];
+ std::snprintf(numb, 12, "%d", i);
+ uniq_id[i] = "unique_device_name" + std::string(numb);
+ mockdev[i] = new TCPDeviceMock(port, uniq_id[i]);
+ EXPECT_CALL(*(mockdev[i]), IsSameAs(_)).WillRepeatedly(Return(false));
+ transport_adapter.AddDevice(mockdev[i]);
}
- uint16_t ChoosePort() {
- return getpid() % 1000 + 3000;
- }
+ std::vector<std::string> devList = transport_adapter.GetDeviceList();
+ ASSERT_EQ(count_dev, devList.size());
+ EXPECT_EQ(uniq_id[0], devList[0]);
- virtual void SetUp() {
- const TransportAdapter::Error error = transport_adapter_->Init();
- ASSERT_EQ(TransportAdapter::OK, error);
- transport_adapter_->AddListener(&mock_dal_);
- time_t end_time = time(NULL) + 5;
- while (!transport_adapter_->IsInitialised() && time(NULL) < end_time)
- sleep(0);
- ASSERT_TRUE(transport_adapter_->IsInitialised());
- }
+ const int app_handle = 1;
+ std::vector<int> intList = {app_handle};
- virtual void TearDown() {
- transport_adapter_->StopClientListening();
- }
+ ConnectionSPtr mock_connection = new ConnectionMock();
+ for (uint32_t i = 0; i < count_dev; i++) {
+ EXPECT_CALL(transport_adapter, FindDevice(uniq_id[i]))
+ .WillOnce(Return(mockdev[i]));
+ EXPECT_CALL(*(mockdev[i]), GetApplicationList()).WillOnce(Return(intList));
- virtual ~TcpAdapterTest() {
- pthread_mutex_lock(&suspend_mutex_);
- if (!finished_)
- suspended_ = true;
- struct timeval now;
- gettimeofday(&now, NULL);
- timespec abs_time;
- abs_time.tv_sec = now.tv_sec + 1;
- abs_time.tv_nsec = now.tv_usec * 1000;
- while (suspended_) {
- if (ETIMEDOUT
- == pthread_cond_timedwait(&suspend_cond_, &suspend_mutex_,
- &abs_time)) {
- break;
- }
- }
- pthread_mutex_unlock(&suspend_mutex_);
- delete transport_adapter_;
+ EXPECT_CALL(transport_adapter,
+ FindEstablishedConnection(uniq_id[i], app_handle))
+ .WillOnce(Return(mock_connection));
- pthread_mutex_destroy(&suspend_mutex_);
- pthread_cond_destroy(&suspend_cond_);
+ EXPECT_CALL(*(mockdev[i]), GetApplicationPort(app_handle))
+ .WillOnce(Return(port));
}
-
- void wakeUp() {
- pthread_mutex_lock(&suspend_mutex_);
- finished_ = true;
- suspended_ = false;
- pthread_cond_signal(&suspend_cond_);
- pthread_mutex_unlock(&suspend_mutex_);
+ transport_adapter.CallStore();
+
+ // Check that values are saved
+ Json::Value& tcp_dict = resumption::LastState::instance()
+ ->dictionary["TransportManager"]["TcpAdapter"];
+ ASSERT_TRUE(tcp_dict.isObject());
+ ASSERT_FALSE(tcp_dict["devices"].isNull());
+ for (uint32_t i = 0; i < count_dev; i++) {
+ ASSERT_FALSE(tcp_dict["devices"][i]["applications"].isNull());
+ ASSERT_FALSE(tcp_dict["devices"][i]["address"].isNull());
+ EXPECT_EQ(1u, tcp_dict["devices"][i]["applications"].size());
+ EXPECT_EQ(string_port,
+ tcp_dict["devices"][i]["applications"][0]["port"].asString());
+ EXPECT_EQ(uniq_id[i], tcp_dict["devices"][i]["name"].asString());
}
+}
- uint16_t port() const {
- return port_;
+TEST_F(TcpAdapterTest, DISABLED_StoreDataWithSeveralDevicesAndSeveralApplications) {
+ // Prepare
+ TestTCPTransportAdapter transport_adapter(port);
+ const uint32_t count_dev = 10;
+
+ utils::SharedPtr<TCPDeviceMock> mockdev[count_dev];
+ std::string uniq_id[count_dev];
+ for (uint32_t i = 0; i < count_dev; i++) {
+ char numb[12];
+ std::snprintf(numb, 12, "%d", i);
+ uniq_id[i] = "unique_device_name" + std::string(numb);
+ mockdev[i] = new TCPDeviceMock(port, uniq_id[i]);
+ EXPECT_CALL(*(mockdev[i]), IsSameAs(_)).WillRepeatedly(Return(false));
+ transport_adapter.AddDevice(mockdev[i]);
}
- const uint16_t port_;
- TransportAdapter* transport_adapter_;
- ::test::components::transport_manager::MockTransportAdapterListener mock_dal_;
- ClientTcpSocket client_;
-
- pthread_cond_t suspend_cond_;
- pthread_mutex_t suspend_mutex_;
- bool suspended_;
- bool finished_;
-
-};
-
-class TcpAdapterTestWithListenerAutoStart : public TcpAdapterTest {
- virtual void SetUp() {
- TcpAdapterTest::SetUp();
- transport_adapter_->StartClientListening();
+ std::vector<std::string> devList = transport_adapter.GetDeviceList();
+ ASSERT_EQ(count_dev, devList.size());
+ EXPECT_EQ(uniq_id[0], devList[0]);
+
+ const uint32_t connection_count = 3;
+ const int app_handle[connection_count] = {1, 2, 3};
+ std::vector<int> intList = {app_handle[0], app_handle[1], app_handle[2]};
+ const std::string ports[connection_count] = {"11111", "67890", "98765"};
+ const int int_port[connection_count] = {11111, 67890, 98765};
+ ConnectionSPtr mock_connection = new ConnectionMock();
+ for (uint32_t i = 0; i < count_dev; i++) {
+ EXPECT_CALL(transport_adapter, FindDevice(uniq_id[i]))
+ .WillOnce(Return(mockdev[i]));
+ EXPECT_CALL(*(mockdev[i]), GetApplicationList()).WillOnce(Return(intList));
+
+ for (uint32_t j = 0; j < connection_count; j++) {
+ EXPECT_CALL(transport_adapter,
+ FindEstablishedConnection(uniq_id[i], app_handle[j]))
+ .WillOnce(Return(mock_connection));
+ EXPECT_CALL(*(mockdev[i]), GetApplicationPort(app_handle[j]))
+ .WillOnce(Return(int_port[j]));
+ }
}
-
-};
-
-MATCHER_P(ContainsMessage, str, ""){ return strlen(str) == arg->data_size() && 0 == memcmp(str, arg->data(), arg->data_size());}
-
-// TODO{ALeshin} APPLINK-11090 - transport_adapter_->IsInitialised() doesn't return true as expected
-TEST_F(TcpAdapterTestWithListenerAutoStart, DISABLED_Connect_Return_True) {
- {
- ::testing::InSequence seq;
- EXPECT_CALL(mock_dal_, OnDeviceListUpdated(_));
- EXPECT_CALL(mock_dal_, OnConnectDone(transport_adapter_, _, _)).WillOnce(
- InvokeWithoutArgs(this, &TcpAdapterTest::wakeUp));
+ transport_adapter.CallStore();
+
+ // Check that value is saved
+ Json::Value& tcp_dict = resumption::LastState::instance()
+ ->dictionary["TransportManager"]["TcpAdapter"];
+
+ ASSERT_TRUE(tcp_dict.isObject());
+ ASSERT_FALSE(tcp_dict["devices"].isNull());
+ for (uint32_t i = 0; i < count_dev; i++) {
+ ASSERT_FALSE(tcp_dict["devices"][i]["applications"].isNull());
+ ASSERT_FALSE(tcp_dict["devices"][i]["address"].isNull());
+ for (uint32_t j = 0; j < intList.size(); j++) {
+ EXPECT_EQ(ports[j],
+ tcp_dict["devices"][i]["applications"][j]["port"].asString());
+ EXPECT_EQ(uniq_id[i], tcp_dict["devices"][i]["name"].asString());
+ }
}
- EXPECT_TRUE(client_.Connect(port()));
}
-// TODO{ALeshin} APPLINK-11090 - transport_adapter_->IsInitialised() doesn't return true as expected
-TEST_F(TcpAdapterTestWithListenerAutoStart, DISABLED_SecondConnect_Return_True) {
- {
- ::testing::InSequence seq;
- EXPECT_CALL(mock_dal_, OnDeviceListUpdated(_));
- EXPECT_CALL(mock_dal_, OnConnectDone(transport_adapter_, _, _)).WillOnce(
- InvokeWithoutArgs(this, &TcpAdapterTest::wakeUp));
- }
- EXPECT_TRUE(client_.Connect(port()));
+TEST_F(TcpAdapterTest, StoreData_ConnectionNotExist_DataNotStored) {
+ // Prepare
+ TestTCPTransportAdapter transport_adapter(port);
+ std::string uniq_id = "unique_device_name";
+ utils::SharedPtr<TCPDeviceMock> mockdev = new TCPDeviceMock(port, uniq_id);
+ transport_adapter.AddDevice(mockdev);
+
+ std::vector<std::string> devList = transport_adapter.GetDeviceList();
+ ASSERT_EQ(1u, devList.size());
+ EXPECT_EQ(uniq_id, devList[0]);
+ std::vector<int> intList = {};
+ EXPECT_CALL(*mockdev, GetApplicationList()).WillOnce(Return(intList));
+
+ EXPECT_CALL(transport_adapter, FindDevice(uniq_id)).WillOnce(Return(mockdev));
+ EXPECT_CALL(transport_adapter, FindEstablishedConnection(uniq_id, _))
+ .Times(0);
+ EXPECT_CALL(*mockdev, GetApplicationPort(_)).Times(0);
+ transport_adapter.CallStore();
+
+ // Check that value is not saved
+ Json::Value& tcp_dict =
+ resumption::LastState::instance()
+ ->dictionary["TransportManager"]["TcpAdapter"]["devices"];
+ ASSERT_TRUE(tcp_dict.isNull());
}
-// TODO{ALeshin} APPLINK-11090 - transport_adapter_->IsInitialised() doesn't return true as expected
-TEST_F(TcpAdapterTestWithListenerAutoStart, DISABLED_Receive_Return_True) {
- {
- ::testing::InSequence seq;
-
- EXPECT_CALL(mock_dal_, OnDeviceListUpdated(_));
- EXPECT_CALL(mock_dal_, OnConnectDone(transport_adapter_, _, _));
-
- EXPECT_CALL(
- mock_dal_,
- OnDataReceiveDone(transport_adapter_, _, _, ContainsMessage("abcd"))).
- WillOnce(InvokeWithoutArgs(this, &TcpAdapterTest::wakeUp));
- }
- EXPECT_TRUE(client_.Connect(port()));
- EXPECT_TRUE(client_.Send("abcd"));
+TEST_F(TcpAdapterTest, RestoreData_DataNotStored) {
+ Json::Value& tcp_adapter_dictionary =
+ resumption::LastState::instance()
+ ->dictionary["TransportManager"]["TcpAdapter"];
+ tcp_adapter_dictionary = Json::Value();
+ TestTCPTransportAdapter transport_adapter(port);
+ EXPECT_CALL(transport_adapter, Connect(_, _)).Times(0);
+ EXPECT_TRUE(transport_adapter.CallRestore());
}
-struct SendHelper {
- explicit SendHelper(TransportAdapter::Error expected_error)
- : expected_error_(expected_error),
- message_(
- new RawMessage(
- 1,
- 1,
- const_cast<unsigned char*>(reinterpret_cast<const unsigned char*>("efgh")),
- 4)) {
- }
- void sendMessage(const TransportAdapter* transport_adapter,
- const DeviceUID device_handle,
- const ApplicationHandle app_handle) {
- EXPECT_EQ(
- expected_error_,
- const_cast<TransportAdapter*>(transport_adapter)->SendData(
- device_handle, app_handle, message_));
- }
- TransportAdapter::Error expected_error_;
- RawMessagePtr message_;
-};
+TEST_F(TcpAdapterTest, DISABLED_StoreDataWithOneDevice_RestoreData) {
+ TestTCPTransportAdapter transport_adapter(port);
+ std::string uniq_id = "unique_device_name";
+ utils::SharedPtr<TCPDeviceMock> mockdev = new TCPDeviceMock(port, uniq_id);
+ transport_adapter.AddDevice(mockdev);
-// TODO{ALeshin} APPLINK-11090 - transport_adapter_->IsInitialised() doesn't return true as expected
-TEST_F(TcpAdapterTestWithListenerAutoStart, DISABLED_Send_Message) {
- SendHelper helper(TransportAdapter::OK);
- {
- ::testing::InSequence seq;
-
- EXPECT_CALL(mock_dal_, OnConnectDone(transport_adapter_, _, _)).WillOnce(
- Invoke(&helper, &SendHelper::sendMessage));
- EXPECT_CALL(mock_dal_,
- OnDataSendDone(transport_adapter_, _, _, helper.message_)).WillOnce(
- InvokeWithoutArgs(this, &TcpAdapterTest::wakeUp));
- }
-
- EXPECT_TRUE(client_.Connect(port()));
- EXPECT_EQ("efgh", client_.receive(4));
-}
+ std::vector<std::string> devList = transport_adapter.GetDeviceList();
+ ASSERT_EQ(1u, devList.size());
+ EXPECT_EQ(uniq_id, devList[0]);
-TEST_F(TcpAdapterTestWithListenerAutoStart, DISABLED_DisconnectFromClient) {
- {
- ::testing::InSequence seq;
+ const int app_handle = 1;
+ std::vector<int> intList = {app_handle};
+ EXPECT_CALL(*mockdev, GetApplicationList()).WillOnce(Return(intList));
- EXPECT_CALL(mock_dal_, OnConnectDone(transport_adapter_, _, _));
- EXPECT_CALL(mock_dal_, OnUnexpectedDisconnect(transport_adapter_, _, _, _));
- EXPECT_CALL(mock_dal_, OnDisconnectDone(transport_adapter_, _, _)).WillOnce(
- InvokeWithoutArgs(this, &TcpAdapterTest::wakeUp));
- }
- EXPECT_TRUE(client_.Connect(port()));
- client_.Disconnect();
-}
+ ConnectionSPtr mock_connection = new ConnectionMock();
+ EXPECT_CALL(transport_adapter, FindDevice(uniq_id)).WillOnce(Return(mockdev));
+ EXPECT_CALL(transport_adapter, FindEstablishedConnection(uniq_id, app_handle))
+ .WillOnce(Return(mock_connection));
-TEST_F(TcpAdapterTestWithListenerAutoStart, DISABLED_DisconnectFromServer) {
- {
- ::testing::InSequence seq;
+ EXPECT_CALL(*mockdev, GetApplicationPort(app_handle)).WillOnce(Return(port));
- EXPECT_CALL(mock_dal_, OnConnectDone(transport_adapter_, _, _)).WillOnce(
- Invoke(Disconnect));
- EXPECT_CALL(mock_dal_, OnDisconnectDone(transport_adapter_, _, _)).WillOnce(
- InvokeWithoutArgs(this, &TcpAdapterTest::wakeUp));
- }
- EXPECT_TRUE(client_.Connect(port()));
+ transport_adapter.CallStore();
-}
+ EXPECT_CALL(transport_adapter, Connect(uniq_id, app_handle))
+ .WillOnce(Return(TransportAdapter::OK));
-TEST_F(TcpAdapterTestWithListenerAutoStart, DISABLED_SendToDisconnected) {
- SendHelper* helper = new SendHelper(TransportAdapter::BAD_PARAM);
- {
- ::testing::InSequence seq;
+ EXPECT_TRUE(transport_adapter.CallRestore());
- EXPECT_CALL(mock_dal_, OnConnectDone(transport_adapter_, _, _)).WillOnce(
- Invoke(Disconnect));
- EXPECT_CALL(mock_dal_, OnDisconnectDone(transport_adapter_, _, _)).WillOnce(
- ::testing::DoAll(Invoke(helper, &SendHelper::sendMessage),
- InvokeWithoutArgs(this, &TcpAdapterTest::wakeUp)));
- }
- EXPECT_TRUE(client_.Connect(port()));
+ devList = transport_adapter.GetDeviceList();
+ ASSERT_EQ(1u, devList.size());
+ EXPECT_EQ(uniq_id, devList[0]);
}
-TEST_F(TcpAdapterTestWithListenerAutoStart, DISABLED_SendFailed) {
-// static unsigned char zzz[2000000]; //message will send without fail because socket buffer can contain it
- //this test works correctly starting with number 2539009
- static unsigned char zzz[2600000];
- SendHelper* helper = new SendHelper(TransportAdapter::OK);
- helper->message_ = new RawMessage(1, 1, zzz, sizeof(zzz));
- {
- ::testing::InSequence seq;
- EXPECT_CALL(mock_dal_, OnConnectDone(transport_adapter_, _, _)).WillOnce(
- Invoke(helper, &SendHelper::sendMessage));
- EXPECT_CALL(
- mock_dal_,
- OnDataSendFailed(transport_adapter_, _, _, helper->message_, _));
- EXPECT_CALL(mock_dal_, OnDisconnectDone(transport_adapter_, _, _)).WillOnce(
- InvokeWithoutArgs(this, &TcpAdapterTest::wakeUp));
+TEST_F(TcpAdapterTest, DISABLED_StoreDataWithSeveralDevices_RestoreData) {
+ TestTCPTransportAdapter transport_adapter(port);
+ const uint32_t count_dev = 10;
+
+ utils::SharedPtr<TCPDeviceMock> mockdev[count_dev];
+ std::string uniq_id[count_dev];
+ for (uint32_t i = 0; i < count_dev; i++) {
+ char numb[12];
+ std::snprintf(numb, 12, "%d", i);
+ uniq_id[i] = "unique_device_name" + std::string(numb);
+ mockdev[i] = new TCPDeviceMock(port, uniq_id[i]);
+ EXPECT_CALL(*(mockdev[i]), IsSameAs(_)).WillRepeatedly(Return(false));
+ transport_adapter.AddDevice(mockdev[i]);
}
- EXPECT_TRUE(client_.Connect(port()));
- client_.receive(2);
- client_.Disconnect();
-}
-// TODO{ALeshin} APPLINK-11090 - transport_adapter_->IsInitialised() doesn't return true as expected
-TEST_F(TcpAdapterTest, DISABLED_StartStop) {
+ std::vector<std::string> devList = transport_adapter.GetDeviceList();
+ ASSERT_EQ(count_dev, devList.size());
+ EXPECT_EQ(uniq_id[0], devList[0]);
- //assert
- EXPECT_EQ(TransportAdapter::BAD_STATE,
- transport_adapter_->StopClientListening());
- EXPECT_TRUE(client_.Connect(port()));
- EXPECT_EQ(TransportAdapter::OK, transport_adapter_->StartClientListening());
- EXPECT_TRUE(client_.Connect(port()));
+ const int app_handle = 1;
+ std::vector<int> intList = {app_handle};
- //act
- client_.Disconnect();
+ ConnectionSPtr mock_connection = new ConnectionMock();
+ for (uint32_t i = 0; i < count_dev; i++) {
+ EXPECT_CALL(transport_adapter, FindDevice(uniq_id[i]))
+ .WillOnce(Return(mockdev[i]));
+ EXPECT_CALL(*(mockdev[i]), GetApplicationList()).WillOnce(Return(intList));
- //assert
- EXPECT_EQ(TransportAdapter::BAD_STATE,
- transport_adapter_->StartClientListening());
- EXPECT_TRUE(client_.Connect(port()));
+ EXPECT_CALL(transport_adapter,
+ FindEstablishedConnection(uniq_id[i], app_handle))
+ .WillOnce(Return(mock_connection));
- //act
- client_.Disconnect();
+ EXPECT_CALL(*(mockdev[i]), GetApplicationPort(app_handle))
+ .WillOnce(Return(port));
+ }
+ transport_adapter.CallStore();
- //assert
- EXPECT_EQ(TransportAdapter::OK, transport_adapter_->StopClientListening());
- EXPECT_TRUE(client_.Connect(port()));
+ for (uint32_t i = 0; i < count_dev; i++) {
+ EXPECT_CALL(transport_adapter, Connect(uniq_id[i], app_handle))
+ .WillOnce(Return(TransportAdapter::OK));
+ }
- //act
- wakeUp();
-}
+ EXPECT_TRUE(transport_adapter.CallRestore());
-} // namespace
-} // namespace
+ devList = transport_adapter.GetDeviceList();
+ ASSERT_EQ(count_dev, devList.size());
+ for (uint32_t i = 0; i < count_dev; i++) {
+ EXPECT_EQ(uniq_id[i], devList[i]);
+ }
+}
+} // namespace transport_manager_test
+} // namespace components
+} // namespace test
diff --git a/src/components/transport_manager/test/transport_adapter_listener_test.cc b/src/components/transport_manager/test/transport_adapter_listener_test.cc
new file mode 100644
index 000000000..4d0ff4ec2
--- /dev/null
+++ b/src/components/transport_manager/test/transport_adapter_listener_test.cc
@@ -0,0 +1,224 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "gtest/gtest.h"
+#include "include/transport_adapter_mock.h"
+#include "transport_manager/transport_adapter/transport_adapter_listener_impl.h"
+#include "include/transport_manager_mock.h"
+
+namespace test {
+namespace components {
+namespace transport_manager_test {
+
+using ::testing::Return;
+using namespace ::transport_manager;
+
+class TransportAdapterListenerTest : public ::testing::Test {
+ public:
+ TransportAdapterListenerTest()
+ : app_handle(1),
+ dev_id("device_id"),
+ transport_listener(&tr_mock, &adapter_mock) {}
+
+ protected:
+ const int app_handle;
+ const std::string dev_id;
+ TransportManagerMock tr_mock;
+ TransportAdapterMock adapter_mock;
+ TransportAdapterListenerImpl transport_listener;
+};
+
+MATCHER_P4(IsEvent, eventType, adapter, dev_id, app_id, "") {
+ TransportAdapterEvent event = arg;
+ return event.application_id == app_id && event.device_uid == dev_id &&
+ event.event_type == eventType && event.transport_adapter == adapter;
+}
+
+MATCHER_P5(IsEvent, eventType, adapter, dev_id, app_id, data, "") {
+ TransportAdapterEvent event = arg;
+ return event.application_id == app_id && event.device_uid == dev_id &&
+ event.event_type == eventType && event.transport_adapter == adapter &&
+ event.event_data == data;
+}
+
+TEST_F(TransportAdapterListenerTest, OnCommunicationError) {
+ EXPECT_CALL(
+ tr_mock,
+ ReceiveEventFromDevice(IsEvent(
+ TransportAdapterListenerImpl::EventTypeEnum::ON_COMMUNICATION_ERROR,
+ &adapter_mock, dev_id, app_handle))).WillOnce(Return(E_SUCCESS));
+ transport_listener.OnCommunicationError(&adapter_mock, dev_id, app_handle);
+}
+
+TEST_F(TransportAdapterListenerTest, OnConnectDone) {
+ EXPECT_CALL(tr_mock,
+ ReceiveEventFromDevice(IsEvent(
+ TransportAdapterListenerImpl::EventTypeEnum::ON_CONNECT_DONE,
+ &adapter_mock, dev_id, app_handle)))
+ .WillOnce(Return(E_SUCCESS));
+ transport_listener.OnConnectDone(&adapter_mock, dev_id, app_handle);
+}
+
+TEST_F(TransportAdapterListenerTest, OnConnectFailed) {
+ ConnectError er;
+
+ EXPECT_CALL(tr_mock,
+ ReceiveEventFromDevice(IsEvent(
+ TransportAdapterListenerImpl::EventTypeEnum::ON_CONNECT_FAIL,
+ &adapter_mock, dev_id, app_handle)))
+ .WillOnce(Return(E_SUCCESS));
+ transport_listener.OnConnectFailed(&adapter_mock, dev_id, app_handle, er);
+}
+
+TEST_F(TransportAdapterListenerTest, OnDataReceiveDone) {
+ ::protocol_handler::RawMessagePtr data_container;
+
+ EXPECT_CALL(tr_mock,
+ ReceiveEventFromDevice(IsEvent(
+ TransportAdapterListenerImpl::EventTypeEnum::ON_RECEIVED_DONE,
+ &adapter_mock, dev_id, app_handle, data_container)))
+ .WillOnce(Return(E_SUCCESS));
+ transport_listener.OnDataReceiveDone(&adapter_mock, dev_id, app_handle,
+ data_container);
+}
+
+TEST_F(TransportAdapterListenerTest, OnDataReceiveFailed) {
+ DataReceiveError err;
+
+ EXPECT_CALL(tr_mock,
+ ReceiveEventFromDevice(IsEvent(
+ TransportAdapterListenerImpl::EventTypeEnum::ON_RECEIVED_FAIL,
+ &adapter_mock, dev_id, app_handle)))
+ .WillOnce(Return(E_SUCCESS));
+ transport_listener.OnDataReceiveFailed(&adapter_mock, dev_id, app_handle,
+ err);
+}
+
+TEST_F(TransportAdapterListenerTest, OnDataSendDone) {
+ unsigned char data[3] = {0x20, 0x07, 0x01};
+ ::protocol_handler::RawMessagePtr data_container =
+ new ::protocol_handler::RawMessage(1, 1, data, 3);
+
+ EXPECT_CALL(tr_mock,
+ ReceiveEventFromDevice(IsEvent(
+ TransportAdapterListenerImpl::EventTypeEnum::ON_SEND_DONE,
+ &adapter_mock, dev_id, app_handle, data_container)))
+ .WillOnce(Return(E_SUCCESS));
+ transport_listener.OnDataSendDone(&adapter_mock, dev_id, app_handle,
+ data_container);
+}
+
+TEST_F(TransportAdapterListenerTest, OnDataSendFailed) {
+ unsigned char data[3] = {0x20, 0x07, 0x01};
+ ::protocol_handler::RawMessagePtr data_container =
+ new ::protocol_handler::RawMessage(1, 1, data, 3);
+ DataSendError err;
+
+ EXPECT_CALL(tr_mock,
+ ReceiveEventFromDevice(IsEvent(
+ TransportAdapterListenerImpl::EventTypeEnum::ON_SEND_FAIL,
+ &adapter_mock, dev_id, app_handle, data_container)))
+ .WillOnce(Return(E_SUCCESS));
+ transport_listener.OnDataSendFailed(&adapter_mock, dev_id, app_handle,
+ data_container, err);
+}
+
+TEST_F(TransportAdapterListenerTest, OnDeviceListUpdated) {
+ EXPECT_CALL(
+ tr_mock,
+ ReceiveEventFromDevice(IsEvent(
+ TransportAdapterListenerImpl::EventTypeEnum::ON_DEVICE_LIST_UPDATED,
+ &adapter_mock, "", 0))).WillOnce(Return(E_SUCCESS));
+ transport_listener.OnDeviceListUpdated(&adapter_mock);
+}
+
+TEST_F(TransportAdapterListenerTest, OnDisconnectDeviceDone) {
+ EXPECT_CALL(
+ tr_mock,
+ ReceiveEventFromDevice(IsEvent(
+ TransportAdapterListenerImpl::EventTypeEnum::ON_DISCONNECT_DONE,
+ &adapter_mock, dev_id, app_handle))).WillOnce(Return(E_SUCCESS));
+ transport_listener.OnDisconnectDone(&adapter_mock, dev_id, app_handle);
+}
+
+TEST_F(TransportAdapterListenerTest, OnDisconnectFailed) {
+ DisconnectError err;
+
+ EXPECT_CALL(
+ tr_mock,
+ ReceiveEventFromDevice(IsEvent(
+ TransportAdapterListenerImpl::EventTypeEnum::ON_DISCONNECT_FAIL,
+ &adapter_mock, dev_id, app_handle))).WillOnce(Return(E_SUCCESS));
+ transport_listener.OnDisconnectFailed(&adapter_mock, dev_id, app_handle, err);
+}
+
+TEST_F(TransportAdapterListenerTest, OnFindNewApplicationsRequest) {
+ EXPECT_CALL(tr_mock, ReceiveEventFromDevice(IsEvent(
+ TransportAdapterListenerImpl::EventTypeEnum::
+ ON_FIND_NEW_APPLICATIONS_REQUEST,
+ &adapter_mock, "", 0))).WillOnce(Return(E_SUCCESS));
+ transport_listener.OnFindNewApplicationsRequest(&adapter_mock);
+}
+
+TEST_F(TransportAdapterListenerTest, OnSearchDeviceDone) {
+ EXPECT_CALL(tr_mock,
+ ReceiveEventFromDevice(IsEvent(
+ TransportAdapterListenerImpl::EventTypeEnum::ON_SEARCH_DONE,
+ &adapter_mock, "", 0))).WillOnce(Return(E_SUCCESS));
+ transport_listener.OnSearchDeviceDone(&adapter_mock);
+}
+
+TEST_F(TransportAdapterListenerTest, OnSearchDeviceFailed) {
+ SearchDeviceError er;
+
+ EXPECT_CALL(tr_mock,
+ ReceiveEventFromDevice(IsEvent(
+ TransportAdapterListenerImpl::EventTypeEnum::ON_SEARCH_FAIL,
+ &adapter_mock, "", 0))).WillOnce(Return(E_SUCCESS));
+ transport_listener.OnSearchDeviceFailed(&adapter_mock, er);
+}
+
+TEST_F(TransportAdapterListenerTest, OnUnexpectedDisconnect) {
+ CommunicationError err;
+
+ EXPECT_CALL(
+ tr_mock,
+ ReceiveEventFromDevice(IsEvent(
+ TransportAdapterListenerImpl::EventTypeEnum::ON_UNEXPECTED_DISCONNECT,
+ &adapter_mock, dev_id, app_handle))).WillOnce(Return(E_SUCCESS));
+ transport_listener.OnUnexpectedDisconnect(&adapter_mock, dev_id, app_handle,
+ err);
+}
+
+} // namespace transport_manager_test
+} // namespace components
+} // namespace test
diff --git a/src/components/transport_manager/test/transport_adapter_test.cc b/src/components/transport_manager/test/transport_adapter_test.cc
new file mode 100644
index 000000000..679cd9064
--- /dev/null
+++ b/src/components/transport_manager/test/transport_adapter_test.cc
@@ -0,0 +1,743 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "gtest/gtest.h"
+#include "include/device_scanner_mock.h"
+#include "include/client_connection_listener_mock.h"
+#include "include/server_connection_factory_mock.h"
+#include "include/device_mock.h"
+#include "include/connection_mock.h"
+#include "include/transport_adapter_listener_mock.h"
+
+#include "transport_manager/transport_adapter/transport_adapter_impl.h"
+#include "transport_manager/transport_adapter/transport_adapter_listener.h"
+#include "transport_manager/transport_adapter/transport_adapter_controller.h"
+#include "transport_manager/transport_adapter/connection.h"
+#include "config_profile/profile.h"
+#include "protocol/raw_message.h"
+
+namespace test {
+namespace components {
+namespace transport_manager_test {
+
+using ::testing::Return;
+using ::testing::_;
+
+using namespace ::transport_manager;
+using namespace ::protocol_handler;
+
+
+class TestTransportAdapter : public TransportAdapterImpl {
+ public:
+ TestTransportAdapter(DeviceScanner* device_scanner,
+ ServerConnectionFactory* server_connection_factory,
+ ClientConnectionListener* client_connection_listener)
+ : TransportAdapterImpl(device_scanner, server_connection_factory,
+ client_connection_listener) {
+ }
+
+ ConnectionSPtr FindStatedConnection(const DeviceUID& device_handle,
+ const ApplicationHandle& app_handle) {
+ return this->FindEstablishedConnection(device_handle, app_handle);
+ }
+ virtual ~TestTransportAdapter(){};
+
+ virtual DeviceType GetDeviceType() const { return UNKNOWN; }
+
+ MOCK_CONST_METHOD0(Store, void());
+ MOCK_METHOD0(Restore, bool());
+};
+
+class TransportAdapterTest : public ::testing::Test {
+ protected:
+ virtual void SetUp() {
+ dev_id = "device_id";
+ uniq_id = "unique_device_id";
+ app_handle = 1;
+ }
+
+ static void SetUpTestCase() {
+ ::profile::Profile::instance()->config_file_name(
+ "smartDeviceLink_test.ini");
+ }
+
+ std::string dev_id;
+ std::string uniq_id;
+ int app_handle;
+};
+
+TEST_F(TransportAdapterTest, Init) {
+ DeviceScannerMock* dev_mock = new DeviceScannerMock();
+ ClientConnectionListenerMock* clientMock = new ClientConnectionListenerMock();
+ ServerConnectionFactoryMock* serverMock = new ServerConnectionFactoryMock();
+ TestTransportAdapter transport_adapter(dev_mock, serverMock, clientMock);
+
+ EXPECT_CALL(*dev_mock, Init()).WillOnce(Return(TransportAdapter::OK));
+ EXPECT_CALL(*clientMock, Init()).WillOnce(Return(TransportAdapter::OK));
+ EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK));
+ EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true));
+ EXPECT_EQ(TransportAdapter::OK, transport_adapter.Init());
+
+ // Expect terminate because at the end of test transport_adapter will be
+ // destroyed. That will call Terminate() for connections and device scanner.
+ EXPECT_CALL(*dev_mock, Terminate());
+ EXPECT_CALL(*clientMock, Terminate());
+ EXPECT_CALL(*serverMock, Terminate());
+}
+
+TEST_F(TransportAdapterTest, SearchDevices_WithoutScanner) {
+ ClientConnectionListenerMock* clientMock = new ClientConnectionListenerMock();
+ ServerConnectionFactoryMock* serverMock = new ServerConnectionFactoryMock();
+ TestTransportAdapter transport_adapter(NULL, serverMock, clientMock);
+
+ EXPECT_CALL(*clientMock, Init()).WillOnce(Return(TransportAdapter::OK));
+ EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK));
+ EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true));
+ EXPECT_EQ(TransportAdapter::OK, transport_adapter.Init());
+
+ EXPECT_EQ(TransportAdapter::NOT_SUPPORTED, transport_adapter.SearchDevices());
+
+ EXPECT_CALL(*clientMock, Terminate());
+ EXPECT_CALL(*serverMock, Terminate());
+}
+
+TEST_F(TransportAdapterTest, SearchDevices_DeviceNotInitialized) {
+ DeviceScannerMock* dev_mock = new DeviceScannerMock();
+ TestTransportAdapter transport_adapter(dev_mock, NULL, NULL);
+
+ EXPECT_CALL(*dev_mock, Init()).WillOnce(Return(TransportAdapter::OK));
+ EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true));
+ transport_adapter.Init();
+
+ EXPECT_CALL(*dev_mock, IsInitialised()).WillRepeatedly(Return(false));
+ EXPECT_CALL(*dev_mock, Scan()).Times(0);
+ EXPECT_EQ(TransportAdapter::BAD_STATE, transport_adapter.SearchDevices());
+ EXPECT_CALL(*dev_mock, Terminate());
+}
+
+TEST_F(TransportAdapterTest, SearchDevices_DeviceInitialized) {
+ DeviceScannerMock* dev_mock = new DeviceScannerMock();
+ TestTransportAdapter transport_adapter(dev_mock, NULL, NULL);
+
+ EXPECT_CALL(*dev_mock, Init()).WillOnce(Return(TransportAdapter::OK));
+ EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true));
+ transport_adapter.Init();
+
+ EXPECT_CALL(*dev_mock, IsInitialised()).WillOnce(Return(true));
+ EXPECT_CALL(*dev_mock, Scan()).WillRepeatedly(Return(TransportAdapter::OK));
+ EXPECT_EQ(TransportAdapter::OK, transport_adapter.SearchDevices());
+
+ EXPECT_CALL(*dev_mock, Terminate());
+}
+
+TEST_F(TransportAdapterTest, SearchDeviceDone_DeviceExisting) {
+ TestTransportAdapter transport_adapter(NULL, NULL, NULL);
+ EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true));
+ transport_adapter.Init();
+
+
+ utils::SharedPtr<DeviceMock> mockdev = new DeviceMock(dev_id, uniq_id);
+ transport_adapter.AddDevice(mockdev);
+
+ std::vector<utils::SharedPtr<Device>> devList;
+ devList.push_back(mockdev);
+
+ EXPECT_CALL(*mockdev, IsSameAs(_)).WillOnce(Return(true));
+ transport_adapter.SearchDeviceDone(devList);
+}
+
+TEST_F(TransportAdapterTest, SearchDeviceFailed) {
+ TestTransportAdapter transport_adapter(NULL, NULL, NULL);
+ EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true));
+ transport_adapter.Init();
+
+ TransportAdapterListenerMock mock_listener;
+ transport_adapter.AddListener(&mock_listener);
+
+ SearchDeviceError er;
+ EXPECT_CALL(mock_listener, OnSearchDeviceFailed(_, _));
+ transport_adapter.SearchDeviceFailed(er);
+}
+
+TEST_F(TransportAdapterTest, AddDevice) {
+ TestTransportAdapter transport_adapter(NULL, NULL, NULL);
+ EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true));
+ transport_adapter.Init();
+
+
+
+ TransportAdapterListenerMock mock_listener;
+ transport_adapter.AddListener(&mock_listener);
+
+ DeviceMock* mockdev = new DeviceMock(dev_id, uniq_id);
+
+ EXPECT_CALL(mock_listener, OnDeviceListUpdated(_));
+ transport_adapter.AddDevice(mockdev);
+}
+
+TEST_F(TransportAdapterTest, Connect_ServerNotSupported) {
+ ClientConnectionListenerMock* clientMock = new ClientConnectionListenerMock();
+ TestTransportAdapter transport_adapter(NULL, NULL, clientMock);
+
+ EXPECT_CALL(*clientMock, Init()).WillOnce(Return(TransportAdapter::OK));
+ EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true));
+ transport_adapter.Init();
+
+ int app_handle = 1;
+
+ TransportAdapter::Error res = transport_adapter.Connect(dev_id, app_handle);
+ EXPECT_EQ(TransportAdapter::NOT_SUPPORTED, res);
+
+ EXPECT_CALL(*clientMock, Terminate());
+}
+
+TEST_F(TransportAdapterTest, Connect_ServerNotInitialized) {
+ ServerConnectionFactoryMock* serverMock = new ServerConnectionFactoryMock();
+ TestTransportAdapter transport_adapter(NULL, serverMock, NULL);
+
+ EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK));
+ EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true));
+ transport_adapter.Init();
+
+
+
+ EXPECT_CALL(*serverMock, IsInitialised()).WillOnce(Return(false));
+ EXPECT_CALL(*serverMock, CreateConnection(dev_id, app_handle)).Times(0);
+ TransportAdapter::Error res = transport_adapter.Connect(dev_id, app_handle);
+ EXPECT_EQ(TransportAdapter::BAD_STATE, res);
+
+ EXPECT_CALL(*serverMock, Terminate());
+}
+
+TEST_F(TransportAdapterTest, Connect_Success) {
+ ServerConnectionFactoryMock* serverMock = new ServerConnectionFactoryMock();
+ TestTransportAdapter transport_adapter(NULL, serverMock, NULL);
+
+ EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK));
+ EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true));
+ transport_adapter.Init();
+
+
+
+ EXPECT_CALL(*serverMock, IsInitialised()).WillOnce(Return(true));
+ EXPECT_CALL(*serverMock, CreateConnection(dev_id, app_handle))
+ .WillOnce(Return(TransportAdapter::OK));
+ TransportAdapter::Error res = transport_adapter.Connect(dev_id, app_handle);
+ EXPECT_EQ(TransportAdapter::OK, res);
+
+ EXPECT_CALL(*serverMock, Terminate());
+}
+
+TEST_F(TransportAdapterTest, Connect_DeviceAddedTwice) {
+ ServerConnectionFactoryMock* serverMock = new ServerConnectionFactoryMock();
+ TestTransportAdapter transport_adapter(NULL, serverMock, NULL);
+
+ EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK));
+ EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true));
+ transport_adapter.Init();
+
+
+
+ EXPECT_CALL(*serverMock, IsInitialised()).WillOnce(Return(true));
+ EXPECT_CALL(*serverMock, CreateConnection(dev_id, app_handle))
+ .WillOnce(Return(TransportAdapter::OK));
+ TransportAdapter::Error res = transport_adapter.Connect(dev_id, app_handle);
+ EXPECT_EQ(TransportAdapter::OK, res);
+
+ EXPECT_CALL(*serverMock, IsInitialised()).WillOnce(Return(true));
+ TransportAdapter::Error newres =
+ transport_adapter.Connect(dev_id, app_handle);
+ EXPECT_EQ(TransportAdapter::ALREADY_EXISTS, newres);
+
+ EXPECT_CALL(*serverMock, Terminate());
+}
+
+TEST_F(TransportAdapterTest, ConnectDevice_ServerNotAdded_DeviceAdded) {
+ TestTransportAdapter transport_adapter(NULL, NULL, NULL);
+ EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true));
+ transport_adapter.Init();
+
+
+
+ DeviceMock* mockdev = new DeviceMock(dev_id, uniq_id);
+ transport_adapter.AddDevice(mockdev);
+
+ std::vector<std::string> devList = transport_adapter.GetDeviceList();
+ ASSERT_EQ(1u, devList.size());
+ EXPECT_EQ(uniq_id, devList[0]);
+
+ int app_handle = 1;
+ std::vector<int> intList = {app_handle};
+ EXPECT_CALL(*mockdev, GetApplicationList()).WillOnce(Return(intList));
+
+ TransportAdapter::Error res = transport_adapter.ConnectDevice(uniq_id);
+ EXPECT_EQ(TransportAdapter::FAIL, res);
+}
+
+TEST_F(TransportAdapterTest, ConnectDevice_DeviceNotAdded) {
+ ServerConnectionFactoryMock* serverMock = new ServerConnectionFactoryMock();
+ TestTransportAdapter transport_adapter(NULL, serverMock, NULL);
+
+ EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK));
+ EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true));
+ transport_adapter.Init();
+
+ std::string uniq_id = "unique_device_id";
+
+ EXPECT_CALL(*serverMock, IsInitialised()).Times(0);
+ EXPECT_CALL(*serverMock, CreateConnection(_, _)).Times(0);
+ TransportAdapter::Error res = transport_adapter.ConnectDevice(uniq_id);
+ EXPECT_EQ(TransportAdapter::BAD_PARAM, res);
+
+ EXPECT_CALL(*serverMock, Terminate());
+}
+
+TEST_F(TransportAdapterTest, ConnectDevice_DeviceAdded) {
+ ServerConnectionFactoryMock* serverMock = new ServerConnectionFactoryMock();
+ TestTransportAdapter transport_adapter(NULL, serverMock, NULL);
+
+ EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK));
+ EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true));
+ transport_adapter.Init();
+
+
+
+ DeviceMock* mockdev = new DeviceMock(dev_id, uniq_id);
+ transport_adapter.AddDevice(mockdev);
+
+ std::vector<std::string> devList = transport_adapter.GetDeviceList();
+ ASSERT_EQ(1u, devList.size());
+ EXPECT_EQ(uniq_id, devList[0]);
+
+
+ int app_handle = 1;
+ std::vector<int> intList = {app_handle};
+ EXPECT_CALL(*mockdev, GetApplicationList()).WillOnce(Return(intList));
+
+ EXPECT_CALL(*serverMock, IsInitialised()).WillOnce(Return(true));
+ EXPECT_CALL(*serverMock, CreateConnection(uniq_id, app_handle))
+ .WillOnce(Return(TransportAdapter::OK));
+ TransportAdapter::Error res = transport_adapter.ConnectDevice(uniq_id);
+ EXPECT_EQ(TransportAdapter::OK, res);
+
+ EXPECT_CALL(*serverMock, Terminate());
+}
+
+TEST_F(TransportAdapterTest, ConnectDevice_DeviceAddedTwice) {
+ ServerConnectionFactoryMock* serverMock = new ServerConnectionFactoryMock();
+ TestTransportAdapter transport_adapter(NULL, serverMock, NULL);
+
+ EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK));
+ EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true));
+ transport_adapter.Init();
+
+
+
+ DeviceMock* mockdev = new DeviceMock(dev_id, uniq_id);
+ transport_adapter.AddDevice(mockdev);
+
+ std::vector<std::string> devList = transport_adapter.GetDeviceList();
+ ASSERT_EQ(1u, devList.size());
+ EXPECT_EQ(uniq_id, devList[0]);
+
+
+ int app_handle = 1;
+ std::vector<int> intList = {app_handle};
+ EXPECT_CALL(*mockdev, GetApplicationList()).WillOnce(Return(intList));
+
+ EXPECT_CALL(*serverMock, IsInitialised()).WillOnce(Return(true));
+ EXPECT_CALL(*serverMock, CreateConnection(uniq_id, app_handle))
+ .WillOnce(Return(TransportAdapter::OK));
+ TransportAdapter::Error res = transport_adapter.ConnectDevice(uniq_id);
+ EXPECT_EQ(TransportAdapter::OK, res);
+
+ // Try to connect device second time
+
+ EXPECT_CALL(*mockdev, GetApplicationList()).WillOnce(Return(intList));
+
+ EXPECT_CALL(*serverMock, IsInitialised()).WillOnce(Return(true));
+ EXPECT_CALL(*serverMock, CreateConnection(uniq_id, app_handle)).Times(0);
+ TransportAdapter::Error newres = transport_adapter.ConnectDevice(uniq_id);
+ EXPECT_EQ(TransportAdapter::OK, newres);
+
+ EXPECT_CALL(*serverMock, Terminate());
+}
+
+TEST_F(TransportAdapterTest, Disconnect_ConnectDoneSuccess) {
+ ServerConnectionFactoryMock* serverMock = new ServerConnectionFactoryMock();
+ TestTransportAdapter transport_adapter(NULL, serverMock, NULL);
+
+ EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK));
+ EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true));
+ transport_adapter.Init();
+
+
+
+ EXPECT_CALL(*serverMock, IsInitialised()).WillOnce(Return(true));
+ EXPECT_CALL(*serverMock, CreateConnection(dev_id, app_handle))
+ .WillOnce(Return(TransportAdapter::OK));
+ TransportAdapter::Error res = transport_adapter.Connect(dev_id, app_handle);
+ EXPECT_EQ(TransportAdapter::OK, res);
+
+ ConnectionMock* mock_connection = new ConnectionMock();
+ transport_adapter.ConnectionCreated(mock_connection, dev_id, app_handle);
+
+ EXPECT_CALL(transport_adapter, Store());
+ transport_adapter.ConnectDone(dev_id, app_handle);
+
+ EXPECT_CALL(*mock_connection, Disconnect())
+ .WillOnce(Return(TransportAdapter::OK));
+ TransportAdapter::Error new_res =
+ transport_adapter.Disconnect(dev_id, app_handle);
+ EXPECT_EQ(TransportAdapter::OK, new_res);
+
+ EXPECT_CALL(*serverMock, Terminate());
+}
+
+TEST_F(TransportAdapterTest, DisconnectDevice_DeviceAddedConnectionCreated) {
+ ServerConnectionFactoryMock* serverMock = new ServerConnectionFactoryMock();
+ TestTransportAdapter transport_adapter(NULL, serverMock, NULL);
+
+ EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK));
+ EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true));
+ transport_adapter.Init();
+
+ DeviceMock* mockdev = new DeviceMock(dev_id, uniq_id);
+ transport_adapter.AddDevice(mockdev);
+
+ std::vector<std::string> devList = transport_adapter.GetDeviceList();
+ ASSERT_EQ(1u, devList.size());
+ EXPECT_EQ(uniq_id, devList[0]);
+
+
+ std::vector<int> intList = {app_handle};
+ EXPECT_CALL(*mockdev, GetApplicationList()).WillOnce(Return(intList));
+
+ EXPECT_CALL(*serverMock, IsInitialised()).WillOnce(Return(true));
+ EXPECT_CALL(*serverMock, CreateConnection(uniq_id, app_handle))
+ .WillOnce(Return(TransportAdapter::OK));
+ TransportAdapter::Error res = transport_adapter.ConnectDevice(uniq_id);
+ EXPECT_EQ(TransportAdapter::OK, res);
+
+ ConnectionMock* mock_connection = new ConnectionMock();
+ transport_adapter.ConnectionCreated(mock_connection, uniq_id, app_handle);
+
+ EXPECT_CALL(*mock_connection, Disconnect())
+ .WillOnce(Return(TransportAdapter::OK));
+
+ TransportAdapter::Error new_res = transport_adapter.DisconnectDevice(uniq_id);
+ EXPECT_EQ(TransportAdapter::OK, new_res);
+
+ EXPECT_CALL(*serverMock, Terminate());
+}
+
+TEST_F(TransportAdapterTest, DeviceDisconnected) {
+ ServerConnectionFactoryMock* serverMock = new ServerConnectionFactoryMock();
+ TestTransportAdapter transport_adapter(NULL, serverMock, NULL);
+
+ EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK));
+ EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true));
+ transport_adapter.Init();
+
+ TransportAdapterListenerMock mock_listener;
+ transport_adapter.AddListener(&mock_listener);
+
+ DeviceMock* mockdev = new DeviceMock(dev_id, uniq_id);
+ EXPECT_CALL(mock_listener, OnDeviceListUpdated(_));
+ transport_adapter.AddDevice(mockdev);
+
+ std::vector<std::string> devList = transport_adapter.GetDeviceList();
+ ASSERT_EQ(1u, devList.size());
+ EXPECT_EQ(uniq_id, devList[0]);
+
+ std::vector<int> intList = {app_handle};
+ EXPECT_CALL(*mockdev, GetApplicationList()).WillOnce(Return(intList));
+
+ EXPECT_CALL(*serverMock, IsInitialised()).WillOnce(Return(true));
+ EXPECT_CALL(*serverMock, CreateConnection(uniq_id, app_handle))
+ .WillOnce(Return(TransportAdapter::OK));
+ TransportAdapter::Error res = transport_adapter.ConnectDevice(uniq_id);
+ EXPECT_EQ(TransportAdapter::OK, res);
+
+ ConnectionMock* mock_connection = new ConnectionMock();
+ transport_adapter.ConnectionCreated(mock_connection, uniq_id, app_handle);
+
+ EXPECT_CALL(*mockdev, GetApplicationList()).WillOnce(Return(intList));
+ EXPECT_CALL(mock_listener, OnUnexpectedDisconnect(&transport_adapter, uniq_id,
+ app_handle, _));
+ EXPECT_CALL(mock_listener,
+ OnDisconnectDeviceDone(&transport_adapter, uniq_id));
+ EXPECT_CALL(mock_listener, OnDeviceListUpdated(&transport_adapter));
+ DisconnectDeviceError error;
+ transport_adapter.DeviceDisconnected(uniq_id, error);
+
+ EXPECT_CALL(*serverMock, Terminate());
+}
+
+TEST_F(TransportAdapterTest, AbortedConnectSuccess) {
+ ServerConnectionFactoryMock* serverMock = new ServerConnectionFactoryMock();
+ TestTransportAdapter transport_adapter(NULL, serverMock, NULL);
+
+ EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK));
+ EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true));
+ transport_adapter.Init();
+
+ EXPECT_CALL(*serverMock, IsInitialised()).WillOnce(Return(true));
+ EXPECT_CALL(*serverMock, CreateConnection(dev_id, app_handle))
+ .WillOnce(Return(TransportAdapter::OK));
+ TransportAdapter::Error res = transport_adapter.Connect(dev_id, app_handle);
+ EXPECT_EQ(TransportAdapter::OK, res);
+
+ TransportAdapterListenerMock mock_listener;
+ transport_adapter.AddListener(&mock_listener);
+
+ CommunicationError ce;
+ EXPECT_CALL(mock_listener, OnUnexpectedDisconnect(_, dev_id, app_handle, _));
+ transport_adapter.ConnectionAborted(dev_id, app_handle, ce);
+
+ EXPECT_CALL(*serverMock, Terminate());
+}
+
+TEST_F(TransportAdapterTest, SendData) {
+ DeviceScannerMock* dev_mock = new DeviceScannerMock();
+ ServerConnectionFactoryMock* serverMock = new ServerConnectionFactoryMock();
+ TestTransportAdapter transport_adapter(dev_mock, serverMock, NULL);
+
+ EXPECT_CALL(*dev_mock, Init()).WillOnce(Return(TransportAdapter::OK));
+ EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK));
+ EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true));
+ transport_adapter.Init();
+
+ EXPECT_CALL(*serverMock, IsInitialised()).WillOnce(Return(true));
+ EXPECT_CALL(*serverMock, CreateConnection(dev_id, app_handle))
+ .WillOnce(Return(TransportAdapter::OK));
+ TransportAdapter::Error res = transport_adapter.Connect(dev_id, app_handle);
+ EXPECT_EQ(TransportAdapter::OK, res);
+
+ ConnectionMock* mock_connection = new ConnectionMock();
+ transport_adapter.ConnectionCreated(mock_connection, dev_id, app_handle);
+
+ EXPECT_CALL(transport_adapter, Store());
+ transport_adapter.ConnectDone(dev_id, app_handle);
+
+ const unsigned int kSize = 3;
+ unsigned char data[kSize] = {0x20, 0x07, 0x01};
+ const RawMessagePtr kMessage = new RawMessage(1, 1, data, kSize);
+
+ EXPECT_CALL(*mock_connection, SendData(kMessage))
+ .WillOnce(Return(TransportAdapter::OK));
+ res = transport_adapter.SendData(dev_id, app_handle, kMessage);
+ EXPECT_EQ(TransportAdapter::OK, res);
+
+ EXPECT_CALL(*dev_mock, Terminate());
+ EXPECT_CALL(*serverMock, Terminate());
+}
+
+TEST_F(TransportAdapterTest, SendData_ConnectionNotEstablished) {
+ DeviceScannerMock* dev_mock = new DeviceScannerMock();
+ ClientConnectionListenerMock* clientMock = new ClientConnectionListenerMock();
+ ServerConnectionFactoryMock* serverMock = new ServerConnectionFactoryMock();
+ TestTransportAdapter transport_adapter(dev_mock, serverMock, clientMock);
+
+ EXPECT_CALL(*dev_mock, Init()).WillOnce(Return(TransportAdapter::OK));
+ EXPECT_CALL(*clientMock, Init()).WillOnce(Return(TransportAdapter::OK));
+ EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK));
+ EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true));
+ transport_adapter.Init();
+
+ EXPECT_CALL(*serverMock, IsInitialised()).WillOnce(Return(true));
+ EXPECT_CALL(*serverMock, CreateConnection(dev_id, app_handle))
+ .WillOnce(Return(TransportAdapter::OK));
+ TransportAdapter::Error res = transport_adapter.Connect(dev_id, app_handle);
+ EXPECT_EQ(TransportAdapter::OK, res);
+
+ ConnectionMock* mock_connection = new ConnectionMock();
+ transport_adapter.ConnectionCreated(mock_connection, dev_id, app_handle);
+
+ const unsigned int kSize = 3;
+ unsigned char data[kSize] = {0x20, 0x07, 0x01};
+ const RawMessagePtr kMessage = new RawMessage(1, 1, data, kSize);
+
+ EXPECT_CALL(*mock_connection, SendData(kMessage)).Times(0);
+ res = transport_adapter.SendData(dev_id, app_handle, kMessage);
+ EXPECT_EQ(TransportAdapter::BAD_PARAM, res);
+
+ EXPECT_CALL(*dev_mock, Terminate());
+ EXPECT_CALL(*clientMock, Terminate());
+ EXPECT_CALL(*serverMock, Terminate());
+}
+
+TEST_F(TransportAdapterTest, StartClientListening_ClientNotInitialized) {
+ DeviceScannerMock* dev_mock = new DeviceScannerMock();
+ ClientConnectionListenerMock* clientMock = new ClientConnectionListenerMock();
+ TestTransportAdapter transport_adapter(dev_mock, NULL, clientMock);
+
+ EXPECT_CALL(*dev_mock, Init()).WillOnce(Return(TransportAdapter::OK));
+ EXPECT_CALL(*clientMock, Init()).WillOnce(Return(TransportAdapter::OK));
+ EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true));
+ transport_adapter.Init();
+
+ EXPECT_CALL(*clientMock, IsInitialised()).WillOnce(Return(false));
+ EXPECT_CALL(*clientMock, StartListening()).Times(0);
+
+ TransportAdapter::Error res = transport_adapter.StartClientListening();
+ EXPECT_EQ(TransportAdapter::BAD_STATE, res);
+
+ EXPECT_CALL(*dev_mock, Terminate());
+ EXPECT_CALL(*clientMock, Terminate());
+}
+
+TEST_F(TransportAdapterTest, StartClientListening) {
+ DeviceScannerMock* dev_mock = new DeviceScannerMock();
+ ClientConnectionListenerMock* clientMock = new ClientConnectionListenerMock();
+ TestTransportAdapter transport_adapter(dev_mock, NULL, clientMock);
+
+ EXPECT_CALL(*dev_mock, Init()).WillOnce(Return(TransportAdapter::OK));
+ EXPECT_CALL(*clientMock, Init()).WillOnce(Return(TransportAdapter::OK));
+ EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true));
+ transport_adapter.Init();
+
+ EXPECT_CALL(*clientMock, IsInitialised()).WillOnce(Return(true));
+ EXPECT_CALL(*clientMock, StartListening())
+ .WillOnce(Return(TransportAdapter::OK));
+
+ TransportAdapter::Error res = transport_adapter.StartClientListening();
+ EXPECT_EQ(TransportAdapter::OK, res);
+
+ EXPECT_CALL(*dev_mock, Terminate());
+ EXPECT_CALL(*clientMock, Terminate());
+}
+
+TEST_F(TransportAdapterTest, StopClientListening_Success) {
+ DeviceScannerMock* dev_mock = new DeviceScannerMock();
+ ClientConnectionListenerMock* clientMock = new ClientConnectionListenerMock();
+ ServerConnectionFactoryMock* serverMock = new ServerConnectionFactoryMock();
+ TestTransportAdapter transport_adapter(dev_mock, serverMock, clientMock);
+
+ EXPECT_CALL(*dev_mock, Init()).WillOnce(Return(TransportAdapter::OK));
+ EXPECT_CALL(*clientMock, Init()).WillOnce(Return(TransportAdapter::OK));
+ EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK));
+ EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true));
+ transport_adapter.Init();
+
+ EXPECT_CALL(*serverMock, IsInitialised()).WillOnce(Return(true));
+ EXPECT_CALL(*serverMock, CreateConnection(dev_id, app_handle))
+ .WillOnce(Return(TransportAdapter::OK));
+ TransportAdapter::Error res = transport_adapter.Connect(dev_id, app_handle);
+ EXPECT_EQ(TransportAdapter::OK, res);
+
+ EXPECT_CALL(*clientMock, IsInitialised()).WillOnce(Return(true));
+ EXPECT_CALL(*clientMock, StopListening())
+ .WillOnce(Return(TransportAdapter::OK));
+
+ res = transport_adapter.StopClientListening();
+ EXPECT_EQ(TransportAdapter::OK, res);
+
+ EXPECT_CALL(*dev_mock, Terminate());
+ EXPECT_CALL(*clientMock, Terminate());
+ EXPECT_CALL(*serverMock, Terminate());
+}
+
+TEST_F(TransportAdapterTest, FindNewApplicationsRequest) {
+ DeviceScannerMock* dev_mock = new DeviceScannerMock();
+ ClientConnectionListenerMock* clientMock = new ClientConnectionListenerMock();
+ ServerConnectionFactoryMock* serverMock = new ServerConnectionFactoryMock();
+ TestTransportAdapter transport_adapter(dev_mock, serverMock, clientMock);
+
+ EXPECT_CALL(*dev_mock, Init()).WillOnce(Return(TransportAdapter::OK));
+ EXPECT_CALL(*clientMock, Init()).WillOnce(Return(TransportAdapter::OK));
+ EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK));
+ EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true));
+ transport_adapter.Init();
+
+ TransportAdapterListenerMock mock_listener;
+ transport_adapter.AddListener(&mock_listener);
+
+ EXPECT_CALL(mock_listener, OnFindNewApplicationsRequest(&transport_adapter));
+ transport_adapter.FindNewApplicationsRequest();
+
+ EXPECT_CALL(*dev_mock, Terminate());
+ EXPECT_CALL(*clientMock, Terminate());
+ EXPECT_CALL(*serverMock, Terminate());
+}
+
+TEST_F(TransportAdapterTest, GetDeviceAndApplicationLists) {
+ TestTransportAdapter transport_adapter(NULL, NULL, NULL);
+ EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true));
+ transport_adapter.Init();
+
+ DeviceMock* mockdev = new DeviceMock(dev_id, uniq_id);
+ transport_adapter.AddDevice(mockdev);
+
+ std::vector<std::string> devList = transport_adapter.GetDeviceList();
+ ASSERT_EQ(1u, devList.size());
+ EXPECT_EQ(uniq_id, devList[0]);
+
+ int app_handle = 1;
+ std::vector<int> intList = {app_handle};
+ EXPECT_CALL(*mockdev, GetApplicationList()).WillOnce(Return(intList));
+ std::vector<int> res = transport_adapter.GetApplicationList(uniq_id);
+ ASSERT_EQ(1u, res.size());
+ EXPECT_EQ(intList[0], res[0]);
+
+}
+
+TEST_F(TransportAdapterTest, FindEstablishedConnection) {
+ ServerConnectionFactoryMock* serverMock = new ServerConnectionFactoryMock();
+ TestTransportAdapter transport_adapter(NULL, serverMock, NULL);
+
+ EXPECT_CALL(*serverMock, Init()).WillOnce(Return(TransportAdapter::OK));
+ EXPECT_CALL(transport_adapter, Restore()).WillOnce(Return(true));
+ transport_adapter.Init();
+
+ EXPECT_CALL(*serverMock, IsInitialised()).WillOnce(Return(true));
+ EXPECT_CALL(*serverMock, CreateConnection(dev_id, app_handle))
+ .WillOnce(Return(TransportAdapter::OK));
+ TransportAdapter::Error res = transport_adapter.Connect(dev_id, app_handle);
+ EXPECT_EQ(TransportAdapter::OK, res);
+
+ ConnectionSPtr mock_connection = new ConnectionMock();
+ transport_adapter.ConnectionCreated(mock_connection, dev_id, app_handle);
+
+ EXPECT_CALL(transport_adapter, Store());
+ transport_adapter.ConnectDone(dev_id, app_handle);
+
+ ConnectionSPtr conn =
+ transport_adapter.FindStatedConnection(dev_id, app_handle);
+ EXPECT_EQ(mock_connection, conn);
+
+ EXPECT_CALL(*serverMock, Terminate());
+}
+
+} // namespace transport_manager_test
+} // namespace components
+} // namespace test
diff --git a/src/components/transport_manager/test/transport_manager_default_test.cc b/src/components/transport_manager/test/transport_manager_default_test.cc
new file mode 100644
index 000000000..4e0bd9484
--- /dev/null
+++ b/src/components/transport_manager/test/transport_manager_default_test.cc
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#include "gtest/gtest.h"
+#include "transport_manager/transport_manager.h"
+#include "transport_manager/transport_manager_default.h"
+
+namespace test {
+namespace test_transport_manager_instance {
+TEST(TestTransportManagerDefault, CreateOnlyInstance) {
+ transport_manager::TransportManager* instance =
+ transport_manager::TransportManagerDefault::instance();
+ ASSERT_EQ(instance, transport_manager::TransportManagerDefault::instance());
+ transport_manager::TransportManagerDefault::destroy();
+}
+
+} // namespace test
+} // namespace test_transport_manager_instance
diff --git a/src/components/transport_manager/test/transport_manager_impl_test.cc b/src/components/transport_manager/test/transport_manager_impl_test.cc
new file mode 100644
index 000000000..8ee1d7088
--- /dev/null
+++ b/src/components/transport_manager/test/transport_manager_impl_test.cc
@@ -0,0 +1,717 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "gtest/gtest.h"
+#include "protocol/raw_message.h"
+#include "transport_manager/common.h"
+#include "transport_manager/transport_manager_impl.h"
+
+#include "include/transport_adapter_mock.h"
+#include "include/transport_manager_listener_mock.h"
+#include "include/transport_adapter_listener_mock.h"
+#include "include/time_metric_observer_mock.h"
+
+#include "transport_manager/transport_adapter/transport_adapter_event.h"
+
+using ::testing::_;
+using ::testing::AtLeast;
+using ::testing::Return;
+
+using ::protocol_handler::RawMessage;
+using ::protocol_handler::RawMessagePtr;
+
+namespace test {
+namespace components {
+namespace transport_manager_test {
+
+using namespace ::transport_manager;
+
+class TransportManagerTest : public TransportManagerImpl {
+ public:
+ void TestHandle(TransportAdapterEvent test_event) { Handle(test_event); }
+};
+
+class TransportManagerImplTest : public ::testing::Test {
+ protected:
+ virtual void SetUp() {
+ tm.Init();
+ mock_adapter = new TransportAdapterMock();
+ tm_listener = new TransportManagerListenerMock();
+
+ EXPECT_EQ(E_SUCCESS, tm.AddEventListener(tm_listener));
+ EXPECT_CALL(*mock_adapter, AddListener(_));
+ EXPECT_CALL(*mock_adapter, IsInitialised()).WillOnce(Return(true));
+ EXPECT_EQ(::transport_manager::E_SUCCESS,
+ tm.AddTransportAdapter(mock_adapter));
+
+ device_handle_ = 1;
+ connection_key_ = 1;
+ mac_address_ = "MA:CA:DR:ES:S";
+ error_ = new BaseError();
+
+ const unsigned int version_protocol_ = 1;
+ const unsigned int kSize = 12;
+ unsigned char data[kSize] = {0x20, 0x07, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+ test_message_ =
+ new RawMessage(connection_key_, version_protocol_, data, kSize);
+ }
+
+ virtual void TearDown() { delete tm_listener; }
+
+ void HandleDeviceListUpdated();
+ void HandleConnection();
+ void HandleSendDone();
+ void HandleSendFailed();
+ void HandleSearchDone();
+ void HandleSearchFail();
+ void HandleFindNewApplicationsRequest();
+ void HandleConnectionFailed();
+ void HandleConnectionClosed();
+ void HandleDisconnectionFailed();
+ void HandleReceiveDone();
+
+ TransportManagerTest tm;
+ TransportAdapterMock* mock_adapter;
+
+ TransportManagerListenerMock* tm_listener;
+
+ const ApplicationHandle application_id = 1;
+
+ // count of connections
+ ConnectionUID connection_key_;
+ RawMessagePtr test_message_;
+ DeviceHandle device_handle_;
+ std::string mac_address_;
+
+ DeviceList dev;
+ BaseErrorPtr error_;
+};
+
+void TransportManagerImplTest::HandleDeviceListUpdated() {
+ int type = static_cast<int>(
+ TransportAdapterListenerImpl::EventTypeEnum::ON_DEVICE_LIST_UPDATED);
+ const DeviceInfo dev_info(device_handle_, mac_address_, "TestDeviceName",
+ "BTMAC");
+
+ TransportAdapterEvent test_event(type, mock_adapter, dev_info.mac_address(),
+ application_id, test_message_, error_);
+ dev.push_back(dev_info.mac_address());
+ std::vector<DeviceInfo> vector_dev_info;
+ std::vector<DeviceInfo>::iterator it = vector_dev_info.begin();
+ vector_dev_info.insert(it, dev_info);
+
+ EXPECT_CALL(*mock_adapter, GetDeviceList())
+ .Times(AtLeast(1))
+ .WillRepeatedly(Return(dev));
+ EXPECT_CALL(*mock_adapter, DeviceName(dev_info.mac_address()))
+ .Times(AtLeast(1))
+ .WillRepeatedly(Return(dev_info.name()));
+ EXPECT_CALL(*mock_adapter, GetConnectionType())
+ .Times(AtLeast(1))
+ .WillRepeatedly(Return(dev_info.connection_type()));
+
+ EXPECT_CALL(*tm_listener, OnDeviceFound(dev_info));
+ EXPECT_CALL(*tm_listener, OnDeviceAdded(dev_info));
+ EXPECT_CALL(*tm_listener, OnDeviceListUpdated(vector_dev_info));
+
+ tm.TestHandle(test_event);
+ dev.pop_back();
+}
+
+void TransportManagerImplTest::HandleConnection() {
+ int type = static_cast<int>(
+ TransportAdapterListenerImpl::EventTypeEnum::ON_CONNECT_DONE);
+ const DeviceInfo dev_info(device_handle_, mac_address_, "TestDeviceName",
+ "BTMAC");
+
+ TransportAdapterEvent test_event(type, mock_adapter, dev_info.mac_address(),
+ application_id, test_message_, error_);
+
+ EXPECT_CALL(*mock_adapter, DeviceName(dev_info.mac_address()))
+ .WillOnce(Return(dev_info.name()));
+ EXPECT_CALL(*mock_adapter, GetConnectionType())
+ .WillOnce(Return(dev_info.connection_type()));
+
+ EXPECT_CALL(*tm_listener, OnConnectionEstablished(dev_info, connection_key_));
+
+ tm.TestHandle(test_event);
+}
+
+void TransportManagerImplTest::HandleConnectionFailed() {
+ int type = static_cast<int>(
+ TransportAdapterListenerImpl::EventTypeEnum::ON_CONNECT_FAIL);
+
+ const DeviceInfo dev_info(device_handle_, mac_address_, "TestDeviceName",
+ "BTMAC");
+
+ TransportAdapterEvent test_event(type, mock_adapter, dev_info.mac_address(),
+ application_id, test_message_, error_);
+
+ EXPECT_CALL(*mock_adapter, DeviceName(dev_info.mac_address()))
+ .WillOnce(Return(dev_info.name()));
+ EXPECT_CALL(*mock_adapter, GetConnectionType())
+ .WillOnce(Return(dev_info.connection_type()));
+
+ EXPECT_CALL(*tm_listener, OnConnectionFailed(dev_info, _));
+
+ tm.TestHandle(test_event);
+}
+
+void TransportManagerImplTest::HandleSendDone() {
+ int type = static_cast<int>(
+ TransportAdapterListenerImpl::EventTypeEnum::ON_SEND_DONE);
+ TransportAdapterEvent test_event(type, mock_adapter, mac_address_,
+ application_id, test_message_, error_);
+
+ EXPECT_CALL(*tm_listener, OnTMMessageSend(test_message_));
+
+ tm.TestHandle(test_event);
+}
+
+void TransportManagerImplTest::HandleReceiveDone() {
+ int type = static_cast<int>(
+ TransportAdapterListenerImpl::EventTypeEnum::ON_RECEIVED_DONE);
+ TransportAdapterEvent test_event(type, mock_adapter, mac_address_,
+ application_id, test_message_, error_);
+
+ EXPECT_CALL(*tm_listener, OnTMMessageReceived(test_message_));
+
+ tm.TestHandle(test_event);
+}
+
+void TransportManagerImplTest::HandleSendFailed() {
+ int type = static_cast<int>(
+ TransportAdapterListenerImpl::EventTypeEnum::ON_SEND_FAIL);
+
+ TransportAdapterEvent test_event(type, mock_adapter, mac_address_,
+ application_id, test_message_, error_);
+
+ tm.TestHandle(test_event);
+}
+
+void TransportManagerImplTest::HandleSearchDone() {
+ int type = static_cast<int>(
+ TransportAdapterListenerImpl::EventTypeEnum::ON_SEARCH_DONE);
+
+ TransportAdapterEvent test_event(type, mock_adapter, mac_address_,
+ application_id, test_message_, error_);
+
+ EXPECT_CALL(*tm_listener, OnScanDevicesFinished());
+
+ tm.TestHandle(test_event);
+}
+
+void TransportManagerImplTest::HandleSearchFail() {
+ int type = static_cast<int>(
+ TransportAdapterListenerImpl::EventTypeEnum::ON_SEARCH_FAIL);
+
+ TransportAdapterEvent test_event(type, mock_adapter, mac_address_,
+ application_id, test_message_, error_);
+
+ EXPECT_CALL(*tm_listener, OnScanDevicesFailed(_));
+
+ tm.TestHandle(test_event);
+}
+
+void TransportManagerImplTest::HandleFindNewApplicationsRequest() {
+ int type = static_cast<int>(TransportAdapterListenerImpl::EventTypeEnum::
+ ON_FIND_NEW_APPLICATIONS_REQUEST);
+
+ TransportAdapterEvent test_event(type, mock_adapter, mac_address_,
+ application_id, test_message_, error_);
+
+ EXPECT_CALL(*tm_listener, OnFindNewApplicationsRequest());
+
+ tm.TestHandle(test_event);
+}
+
+void TransportManagerImplTest::HandleConnectionClosed() {
+ int type = static_cast<int>(
+ TransportAdapterListenerImpl::EventTypeEnum::ON_DISCONNECT_DONE);
+
+ TransportAdapterEvent test_event(type, mock_adapter, mac_address_,
+ application_id, test_message_, error_);
+
+ EXPECT_CALL(*tm_listener, OnConnectionClosed(application_id));
+
+ tm.TestHandle(test_event);
+}
+
+void TransportManagerImplTest::HandleDisconnectionFailed() {
+ int type = static_cast<int>(
+ TransportAdapterListenerImpl::EventTypeEnum::ON_DISCONNECT_FAIL);
+
+ TransportAdapterEvent test_event(type, mock_adapter, mac_address_,
+ application_id, test_message_, error_);
+
+ EXPECT_CALL(*tm_listener, OnDisconnectFailed(device_handle_, _));
+
+ tm.TestHandle(test_event);
+}
+
+TEST(TransportManagerTest, SearchDevices_AdaptersNotAdded) {
+ TransportManagerTest tm;
+ tm.Init();
+
+ EXPECT_EQ(E_SUCCESS, tm.SearchDevices());
+}
+
+TEST(TransportManagerTest, AddTransportAdapter) {
+ TransportManagerTest tm;
+ tm.Init();
+
+ TransportAdapterMock* mock_adapter = new TransportAdapterMock();
+ TransportManagerListenerMock* tm_listener =
+ new TransportManagerListenerMock();
+
+ EXPECT_EQ(E_SUCCESS, tm.AddEventListener(tm_listener));
+ EXPECT_CALL(*mock_adapter, AddListener(_));
+ EXPECT_CALL(*mock_adapter, IsInitialised()).WillOnce(Return(false));
+ EXPECT_CALL(*mock_adapter, Init()).WillOnce(Return(TransportAdapter::OK));
+ EXPECT_EQ(::transport_manager::E_SUCCESS,
+ tm.AddTransportAdapter(mock_adapter));
+}
+
+TEST_F(TransportManagerImplTest, AddTransportAdapterSecondTime) {
+ EXPECT_EQ(E_ADAPTER_EXISTS, tm.AddTransportAdapter(mock_adapter));
+}
+
+TEST_F(TransportManagerImplTest, ConnectDevice) {
+ HandleDeviceListUpdated();
+ EXPECT_CALL(*mock_adapter, ConnectDevice(mac_address_))
+ .WillOnce(Return(TransportAdapter::OK));
+ EXPECT_EQ(E_SUCCESS, tm.ConnectDevice(device_handle_));
+}
+
+TEST_F(TransportManagerImplTest, ConnectDevice_DeviceNotHandled) {
+ EXPECT_CALL(*mock_adapter, ConnectDevice(mac_address_)).Times(0);
+ EXPECT_EQ(E_INVALID_HANDLE, tm.ConnectDevice(device_handle_));
+}
+
+TEST_F(TransportManagerImplTest, ConnectDevice_DeviceNotConnected) {
+ HandleDeviceListUpdated();
+ EXPECT_CALL(*mock_adapter, ConnectDevice(mac_address_))
+ .WillOnce(Return(TransportAdapter::FAIL));
+ EXPECT_EQ(E_INTERNAL_ERROR, tm.ConnectDevice(device_handle_));
+}
+
+TEST_F(TransportManagerImplTest, DisconnectDevice) {
+ HandleDeviceListUpdated();
+ EXPECT_CALL(*mock_adapter, ConnectDevice(mac_address_))
+ .WillOnce(Return(TransportAdapter::OK));
+ EXPECT_EQ(E_SUCCESS, tm.ConnectDevice(device_handle_));
+
+ EXPECT_CALL(*mock_adapter, DisconnectDevice(mac_address_))
+ .WillOnce(Return(TransportAdapter::OK));
+
+ EXPECT_EQ(E_SUCCESS, tm.DisconnectDevice(device_handle_));
+}
+
+TEST_F(TransportManagerImplTest, DisconnectDevice_ConnectionFailed) {
+ HandleDeviceListUpdated();
+ EXPECT_CALL(*mock_adapter, ConnectDevice(mac_address_))
+ .WillOnce(Return(TransportAdapter::FAIL));
+ EXPECT_EQ(E_INTERNAL_ERROR, tm.ConnectDevice(device_handle_));
+
+ EXPECT_CALL(*mock_adapter, DisconnectDevice(mac_address_))
+ .WillOnce(Return(TransportAdapter::FAIL));
+
+ EXPECT_EQ(E_INTERNAL_ERROR, tm.DisconnectDevice(device_handle_));
+}
+
+TEST_F(TransportManagerImplTest, DisconnectDevice_DeviceNotConnected) {
+ EXPECT_CALL(*mock_adapter, DisconnectDevice(mac_address_)).Times(0);
+ EXPECT_EQ(E_INVALID_HANDLE, tm.DisconnectDevice(device_handle_));
+}
+
+TEST_F(TransportManagerImplTest, Disconnect) {
+ // Arrange
+ HandleConnection();
+
+ EXPECT_CALL(*mock_adapter, Disconnect(mac_address_, application_id))
+ .WillOnce(Return(TransportAdapter::OK));
+ // Assert
+ EXPECT_EQ(E_SUCCESS, tm.Disconnect(connection_key_));
+}
+
+TEST_F(TransportManagerImplTest, Disconnect_DisconnectionFailed) {
+ // Arrange
+ HandleConnection();
+
+ EXPECT_CALL(*mock_adapter, Disconnect(mac_address_, application_id))
+ .WillOnce(Return(TransportAdapter::FAIL));
+ // Assert
+ EXPECT_EQ(E_INTERNAL_ERROR, tm.Disconnect(connection_key_));
+}
+
+TEST_F(TransportManagerImplTest, Disconnect_ConnectionNotExist) {
+ EXPECT_CALL(*mock_adapter, Disconnect(mac_address_, application_id)).Times(0);
+ // Assert
+ EXPECT_EQ(E_INVALID_HANDLE, tm.Disconnect(connection_key_));
+}
+
+TEST_F(TransportManagerImplTest, Disconnect_ConnectionDoesNotExists) {
+ // Arrange
+ HandleDeviceListUpdated();
+
+ EXPECT_CALL(*mock_adapter, ConnectDevice(mac_address_))
+ .WillRepeatedly(Return(TransportAdapter::OK));
+ EXPECT_EQ(E_SUCCESS, tm.ConnectDevice(device_handle_));
+
+ EXPECT_CALL(*mock_adapter, Disconnect(mac_address_, application_id))
+ .WillRepeatedly(Return(TransportAdapter::OK));
+ // Assert
+ EXPECT_EQ(E_INVALID_HANDLE, tm.Disconnect(connection_key_));
+}
+
+TEST_F(TransportManagerImplTest, DisconnectForce) {
+ // Arrange
+ HandleConnection();
+
+ EXPECT_CALL(*mock_adapter, Disconnect(mac_address_, application_id))
+ .WillRepeatedly(Return(TransportAdapter::OK));
+ // Assert
+ EXPECT_EQ(E_SUCCESS, tm.DisconnectForce(connection_key_));
+}
+
+TEST_F(TransportManagerImplTest, DisconnectForce_) {
+ // Arrange
+ HandleConnection();
+
+ EXPECT_CALL(*mock_adapter, Disconnect(mac_address_, application_id))
+ .WillRepeatedly(Return(TransportAdapter::OK));
+ // Assert
+ EXPECT_EQ(E_SUCCESS, tm.DisconnectForce(connection_key_));
+}
+
+TEST_F(TransportManagerImplTest, SearchDevices_DeviceConnected) {
+ HandleDeviceListUpdated();
+
+ EXPECT_CALL(*mock_adapter, SearchDevices())
+ .WillOnce(Return(TransportAdapter::OK));
+ EXPECT_EQ(E_SUCCESS, tm.SearchDevices());
+
+ HandleSearchDone();
+}
+
+TEST_F(TransportManagerImplTest, SearchDevices_DeviceNotFound) {
+ HandleDeviceListUpdated();
+
+ EXPECT_CALL(*mock_adapter, SearchDevices())
+ .WillOnce(Return(TransportAdapter::FAIL));
+ EXPECT_EQ(E_ADAPTERS_FAIL, tm.SearchDevices());
+}
+
+TEST_F(TransportManagerImplTest, SearchDevices_AdapterNotSupported) {
+ HandleDeviceListUpdated();
+
+ EXPECT_CALL(*mock_adapter, SearchDevices())
+ .WillOnce(Return(TransportAdapter::NOT_SUPPORTED));
+ EXPECT_EQ(E_ADAPTERS_FAIL, tm.SearchDevices());
+}
+
+TEST_F(TransportManagerImplTest, SearchDevices_AdapterWithBadState) {
+ HandleDeviceListUpdated();
+
+ EXPECT_CALL(*mock_adapter, SearchDevices())
+ .WillOnce(Return(TransportAdapter::BAD_STATE));
+ EXPECT_EQ(E_ADAPTERS_FAIL, tm.SearchDevices());
+}
+
+TEST_F(TransportManagerImplTest, SendMessageToDevice) {
+ // Arrange
+ HandleConnection();
+
+ EXPECT_CALL(*mock_adapter,
+ SendData(mac_address_, application_id, test_message_))
+ .WillOnce(Return(TransportAdapter::OK));
+
+ EXPECT_EQ(E_SUCCESS, tm.SendMessageToDevice(test_message_));
+ testing::Mock::AsyncVerifyAndClearExpectations(10000);
+}
+
+TEST_F(TransportManagerImplTest, SendMessageToDevice_SendingFailed) {
+ // Arrange
+ HandleConnection();
+
+ TMMetricObserverMock* mock_metric_observer = new TMMetricObserverMock();
+ tm.SetTimeMetricObserver(mock_metric_observer);
+ EXPECT_CALL(*mock_metric_observer, StartRawMsg(_));
+
+ EXPECT_CALL(*mock_adapter,
+ SendData(mac_address_, application_id, test_message_))
+ .WillOnce(Return(TransportAdapter::FAIL));
+
+ EXPECT_CALL(*tm_listener, OnTMMessageSendFailed(_, test_message_));
+ EXPECT_EQ(E_SUCCESS, tm.SendMessageToDevice(test_message_));
+
+ EXPECT_CALL(*mock_metric_observer, StopRawMsg(_)).Times(0);
+
+ delete mock_metric_observer;
+ testing::Mock::AsyncVerifyAndClearExpectations(10000);
+}
+
+TEST_F(TransportManagerImplTest, SendMessageToDevice_StartTimeObserver) {
+ // Arrange
+ HandleConnection();
+
+ TMMetricObserverMock* mock_metric_observer = new TMMetricObserverMock();
+ tm.SetTimeMetricObserver(mock_metric_observer);
+ EXPECT_CALL(*mock_adapter,
+ SendData(mac_address_, application_id, test_message_))
+ .WillOnce(Return(TransportAdapter::OK));
+ EXPECT_CALL(*mock_metric_observer, StartRawMsg(_));
+
+ EXPECT_EQ(E_SUCCESS, tm.SendMessageToDevice(test_message_));
+ delete mock_metric_observer;
+ testing::Mock::AsyncVerifyAndClearExpectations(10000);
+}
+
+TEST_F(TransportManagerImplTest, SendMessageToDevice_SendDone) {
+ // Arrange
+ HandleConnection();
+
+ TMMetricObserverMock* mock_metric_observer = new TMMetricObserverMock();
+ tm.SetTimeMetricObserver(mock_metric_observer);
+ EXPECT_CALL(*mock_adapter,
+ SendData(mac_address_, application_id, test_message_))
+ .WillOnce(Return(TransportAdapter::OK));
+ EXPECT_CALL(*mock_metric_observer, StartRawMsg(_));
+
+ EXPECT_EQ(E_SUCCESS, tm.SendMessageToDevice(test_message_));
+
+ EXPECT_CALL(*mock_metric_observer, StopRawMsg(_));
+ HandleSendDone();
+
+ delete mock_metric_observer;
+ testing::Mock::AsyncVerifyAndClearExpectations(10000);
+}
+
+TEST_F(TransportManagerImplTest, SendMessageFailed_GetHandleSendFailed) {
+ // Arrange
+ HandleConnection();
+
+ TMMetricObserverMock* mock_metric_observer = new TMMetricObserverMock();
+ tm.SetTimeMetricObserver(mock_metric_observer);
+ EXPECT_CALL(*mock_metric_observer, StartRawMsg(_));
+
+ EXPECT_CALL(*mock_adapter,
+ SendData(mac_address_, application_id, test_message_))
+ .WillOnce(Return(TransportAdapter::FAIL));
+
+ EXPECT_CALL(*tm_listener, OnTMMessageSendFailed(_, test_message_));
+ EXPECT_EQ(E_SUCCESS, tm.SendMessageToDevice(test_message_));
+
+ EXPECT_CALL(*mock_metric_observer, StopRawMsg(_));
+
+ HandleSendFailed();
+ delete mock_metric_observer;
+ testing::Mock::AsyncVerifyAndClearExpectations(10000);
+}
+
+TEST_F(TransportManagerImplTest, RemoveDevice_DeviceWasAdded) {
+ // Arrange
+ HandleDeviceListUpdated();
+ EXPECT_CALL(*mock_adapter, ConnectDevice(mac_address_))
+ .WillOnce(Return(TransportAdapter::OK));
+ EXPECT_EQ(E_SUCCESS, tm.ConnectDevice(device_handle_));
+
+ // Assert
+ EXPECT_EQ(E_SUCCESS, tm.RemoveDevice(device_handle_));
+}
+
+TEST_F(TransportManagerImplTest, SetVisibilityOn_StartClientListening) {
+ EXPECT_CALL(*mock_adapter, StartClientListening())
+ .WillOnce(Return(TransportAdapter::OK));
+ EXPECT_EQ(::transport_manager::E_SUCCESS, tm.Visibility(true));
+}
+
+TEST_F(TransportManagerImplTest, SetVisibilityOff_StopClientListening) {
+ EXPECT_CALL(*mock_adapter, StopClientListening())
+ .WillOnce(Return(TransportAdapter::OK));
+ EXPECT_EQ(::transport_manager::E_SUCCESS, tm.Visibility(false));
+}
+
+TEST_F(TransportManagerImplTest, StopTransportManager) {
+ HandleDeviceListUpdated();
+ EXPECT_CALL(*mock_adapter, ConnectDevice(mac_address_))
+ .WillRepeatedly(Return(TransportAdapter::OK));
+ EXPECT_EQ(E_SUCCESS, tm.ConnectDevice(device_handle_));
+
+ EXPECT_CALL(*mock_adapter, DisconnectDevice(mac_address_))
+ .WillRepeatedly(Return(TransportAdapter::OK));
+
+ EXPECT_CALL(*mock_adapter, Terminate());
+ EXPECT_EQ(E_SUCCESS, tm.Stop());
+}
+
+TEST_F(TransportManagerImplTest, Reinit) {
+ EXPECT_CALL(*mock_adapter, Terminate());
+ EXPECT_CALL(*mock_adapter, Init()).WillOnce(Return(TransportAdapter::OK));
+ EXPECT_EQ(E_SUCCESS, tm.Reinit());
+}
+
+TEST_F(TransportManagerImplTest, Reinit_InitAdapterFailed) {
+ EXPECT_CALL(*mock_adapter, Terminate());
+ EXPECT_CALL(*mock_adapter, Init()).WillOnce(Return(TransportAdapter::FAIL));
+ EXPECT_EQ(E_ADAPTERS_FAIL, tm.Reinit());
+}
+
+TEST_F(TransportManagerImplTest, UpdateDeviceList_AddNewDevice) {
+ const DeviceInfo dev_info(device_handle_, mac_address_, "TestDeviceName",
+ "BTMAC");
+
+ dev.push_back(dev_info.mac_address());
+ std::vector<DeviceInfo> vector_dev_info;
+ std::vector<DeviceInfo>::iterator it = vector_dev_info.begin();
+ vector_dev_info.insert(it, dev_info);
+
+ EXPECT_CALL(*mock_adapter, GetDeviceList()).WillOnce(Return(dev));
+ EXPECT_CALL(*mock_adapter, DeviceName(dev_info.mac_address()))
+ .WillOnce(Return(dev_info.name()));
+ EXPECT_CALL(*mock_adapter, GetConnectionType())
+ .WillOnce(Return(dev_info.connection_type()));
+ EXPECT_CALL(*tm_listener, OnDeviceAdded(dev_info));
+
+ tm.UpdateDeviceList(mock_adapter);
+ dev.pop_back();
+}
+
+TEST_F(TransportManagerImplTest, UpdateDeviceList_RemoveDevice) {
+ const DeviceInfo dev_info(device_handle_, mac_address_, "TestDeviceName",
+ "BTMAC");
+
+ dev.push_back(dev_info.mac_address());
+ std::vector<DeviceInfo> vector_dev_info;
+ std::vector<DeviceInfo>::iterator it = vector_dev_info.begin();
+ vector_dev_info.insert(it, dev_info);
+
+ ::testing::InSequence seq;
+ EXPECT_CALL(*mock_adapter, GetDeviceList()).WillOnce(Return(dev));
+ EXPECT_CALL(*mock_adapter, GetConnectionType())
+ .WillOnce(Return(dev_info.connection_type()));
+ EXPECT_CALL(*mock_adapter, DeviceName(dev_info.mac_address()))
+ .WillOnce(Return(dev_info.name()));
+ EXPECT_CALL(*tm_listener, OnDeviceAdded(dev_info));
+ tm.UpdateDeviceList(mock_adapter);
+ dev.pop_back();
+
+ // Device list is empty now
+ EXPECT_CALL(*mock_adapter, GetDeviceList()).WillOnce(Return(dev));
+ EXPECT_CALL(*tm_listener, OnDeviceRemoved(dev_info));
+ tm.UpdateDeviceList(mock_adapter);
+}
+
+/*
+ * Tests which check correct handling and receiving events
+ */
+TEST_F(TransportManagerImplTest, ReceiveEventFromDevice_OnSearchDeviceDone) {
+ int type = static_cast<int>(
+ TransportAdapterListenerImpl::EventTypeEnum::ON_SEARCH_DONE);
+
+ TransportAdapterEvent test_event(type, mock_adapter, mac_address_,
+ application_id, test_message_, error_);
+
+ EXPECT_CALL(*tm_listener, OnScanDevicesFinished());
+
+ tm.ReceiveEventFromDevice(test_event);
+ testing::Mock::AsyncVerifyAndClearExpectations(10000);
+}
+
+TEST_F(TransportManagerImplTest, ReceiveEventFromDevice_OnSearchDeviceFail) {
+ int type = static_cast<int>(
+ TransportAdapterListenerImpl::EventTypeEnum::ON_SEARCH_FAIL);
+
+ TransportAdapterEvent test_event(type, mock_adapter, mac_address_,
+ application_id, test_message_, error_);
+
+ EXPECT_CALL(*tm_listener, OnScanDevicesFailed(_));
+
+ tm.ReceiveEventFromDevice(test_event);
+ testing::Mock::AsyncVerifyAndClearExpectations(10000);
+}
+
+TEST_F(TransportManagerImplTest, ReceiveEventFromDevice_DeviceListUpdated) {
+ int type = static_cast<int>(
+ TransportAdapterListenerImpl::EventTypeEnum::ON_DEVICE_LIST_UPDATED);
+ const DeviceInfo dev_info(device_handle_, mac_address_, "TestDeviceName",
+ "BTMAC");
+
+ TransportAdapterEvent test_event(type, mock_adapter, dev_info.mac_address(),
+ application_id, test_message_, error_);
+ dev.push_back(dev_info.mac_address());
+ std::vector<DeviceInfo> vector_dev_info;
+ std::vector<DeviceInfo>::iterator it = vector_dev_info.begin();
+ vector_dev_info.insert(it, dev_info);
+
+ EXPECT_CALL(*mock_adapter, GetDeviceList())
+ .Times(AtLeast(1))
+ .WillRepeatedly(Return(dev));
+ EXPECT_CALL(*mock_adapter, DeviceName(dev_info.mac_address()))
+ .Times(AtLeast(1))
+ .WillRepeatedly(Return(dev_info.name()));
+ EXPECT_CALL(*mock_adapter, GetConnectionType())
+ .Times(AtLeast(1))
+ .WillRepeatedly(Return(dev_info.connection_type()));
+
+ EXPECT_CALL(*tm_listener, OnDeviceFound(dev_info));
+ EXPECT_CALL(*tm_listener, OnDeviceAdded(dev_info));
+ EXPECT_CALL(*tm_listener, OnDeviceListUpdated(vector_dev_info));
+
+ tm.ReceiveEventFromDevice(test_event);
+ dev.pop_back();
+ testing::Mock::AsyncVerifyAndClearExpectations(10000);
+}
+
+TEST_F(TransportManagerImplTest, CheckEvents) {
+ HandleDeviceListUpdated();
+ HandleConnection();
+ HandleSendDone();
+ HandleSendFailed();
+ HandleSearchDone();
+ HandleSearchFail();
+ HandleFindNewApplicationsRequest();
+ HandleConnectionFailed();
+ HandleConnectionClosed();
+
+ HandleDisconnectionFailed();
+}
+
+TEST_F(TransportManagerImplTest, CheckReceiveEvent) {
+ HandleConnection();
+ HandleReceiveDone();
+}
+
+} // namespace transport_manager_test
+} // namespace components
+} // namespace test
diff --git a/src/components/utils/test/CMakeLists.txt b/src/components/utils/test/CMakeLists.txt
index c0fe38904..d194f7628 100644
--- a/src/components/utils/test/CMakeLists.txt
+++ b/src/components/utils/test/CMakeLists.txt
@@ -31,32 +31,71 @@
if(BUILD_TESTS)
include_directories (
+ ${JSONCPP_INCLUDE_DIRECTORY}
${CMAKE_SOURCE_DIR}/src/3rd_party-static/gmock-1.7.0/include
${CMAKE_SOURCE_DIR}/src/3rd_party-static/gmock-1.7.0/gtest/include
+ ${COMPONENTS_DIR}/utils/include/utils
${COMPONENTS_DIR}/include/utils
- )
+ ${COMPONENTS_DIR}/rpc_base/include
+ ${COMPONENTS_DIR}/utils/test/include
+)
set(testSources
messagemeter_test.cc
file_system_test.cc
- date_time_test.cc
+ #date_time_test.cc
system_test.cc
signals_linux_test.cc
thread_validator_test.cc
conditional_variable_test.cc
- message_queue_test.cc
+ #message_queue_test.cc
resource_usage_test.cc
bitstream_test.cc
+ prioritized_queue_test.cc
data_accessor_test.cc
lock_posix_test.cc
singleton_test.cc
#posix_thread_test.cc
stl_utils_test.cc
- timer_thread_test.cc
+ #timer_thread_test.cc
rwlock_posix_test.cc
async_runner_test.cc
+ #shared_ptr_test.cc
+ #scope_guard_test.cc
+ #atomic_object_test.cc
)
+set(testLibraries
+ gmock
+ Utils
+ Policy
+)
+
+include_directories(${COMPONENTS_DIR}/policy/src/policy/policy_table/table_struct_ext)
+
+if (CMAKE_SYSTEM_NAME STREQUAL "QNX")
+ # --- Tests for QDB Wrapper
+ list (APPEND testSources
+ # ./qdb_wrapper/sql_database_test.cc
+ # ./qdb_wrapper/sql_query_test.cc
+ )
+ file(COPY qdbserver.sh DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
+ file(COPY test-qdb.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
+ file(COPY policy.sql DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
+else ()
+ # --- Tests for SQLite Wrapper
+ find_package(Sqlite3 REQUIRED)
+ list (APPEND testSources
+ # ./sqlite_wrapper/sql_database_test.cc
+ # ./sqlite_wrapper/sql_query_test.cc
+ # generated_code_with_sqlite_test.cc
+
+ # TODO{ALeshin} APPLINK-11132 AssertTrue in SetUpTestCase() return false
+ #policy_manager_impl_stress_test.cc
+ )
+ list (APPEND testLibraries sqlite3)
+endif()
+
if (ENABLE_LOG)
list(APPEND testSources auto_trace_test.cc)
list(APPEND testSources log_message_loop_thread_test.cc)
@@ -66,11 +105,6 @@ if (BUILD_BACKTRACE_SUPPORT)
list(APPEND testSources back_trace_test.cc)
endif()
-set(testLibraries
- gmock
- Utils
-)
-
file(COPY testscript.sh DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
file(COPY log4cxx.properties DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
diff --git a/src/components/utils/test/async_runner_test.cc b/src/components/utils/test/async_runner_test.cc
index 38606c15a..e0db33bb9 100644
--- a/src/components/utils/test/async_runner_test.cc
+++ b/src/components/utils/test/async_runner_test.cc
@@ -111,7 +111,8 @@ TEST_F(AsyncRunnerTest, ASyncRunManyDelegates_ExpectSuccessfulAllDelegatesRun) {
EXPECT_EQ(kDelegatesNum_, check_value);
}
-TEST_F(AsyncRunnerTest, RunManyDelegatesAndStop_ExpectSuccessfulDelegatesStop) {
+//TODO(VVeremjova) APPLINK-12834 Sometimes delegates do not run
+TEST_F(AsyncRunnerTest, DISABLED_RunManyDelegatesAndStop_ExpectSuccessfulDelegatesStop) {
AutoLock lock(test_lock_);
// Clear global value before test
check_value = 0;
diff --git a/src/components/utils/test/atomic_object_test.cc b/src/components/utils/test/atomic_object_test.cc
new file mode 100644
index 000000000..2072b955e
--- /dev/null
+++ b/src/components/utils/test/atomic_object_test.cc
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "utils/atomic_object.h"
+#include "gtest/gtest.h"
+
+namespace test {
+namespace utils {
+
+TEST(AtomicObjectTest, Construct) {
+ sync_primitives::atomic_int var(5);
+ EXPECT_EQ(5, var);
+
+ var = 8;
+ EXPECT_EQ(8, var);
+
+ sync_primitives::atomic_bool flag = true;
+
+ EXPECT_TRUE(flag == true);
+
+ flag = false;
+ EXPECT_FALSE(flag == true);
+}
+
+} // utils
+} // test
diff --git a/src/components/utils/test/auto_trace_test.cc b/src/components/utils/test/auto_trace_test.cc
index 71e0f4376..a53f4aa1e 100644
--- a/src/components/utils/test/auto_trace_test.cc
+++ b/src/components/utils/test/auto_trace_test.cc
@@ -85,7 +85,8 @@ void DeinitLogger() {
DEINIT_LOGGER();
}
-TEST(AutoTraceTest, Basic) {
+//TODO(VVeremjova) APPLINK-12832 Logger does not write debug information in file
+TEST(AutoTraceTest, DISABLED_Basic) {
const std::string testlog =
"Test trace is working!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!";
Preconditions();
diff --git a/src/components/utils/test/date_time_test.cc b/src/components/utils/test/date_time_test.cc
index b437bdc17..db2b10182 100644
--- a/src/components/utils/test/date_time_test.cc
+++ b/src/components/utils/test/date_time_test.cc
@@ -186,9 +186,7 @@ TEST(DateTimeTest, compareTime) {
ASSERT_EQ(EQUAL, date_time::DateTime::compareTime(time1, time3));
}
-//TODO(VVeremjova) APPLINK-11051 Missing convertation microseconds in seconds
-
-TEST(DateTimeTest, DISABLED_GetSecs_UsecConvertedInSec) {
+TEST(DateTimeTest, GetSecs_UsecConvertedInSec) {
//arrange
TimevalStruct time1;
time1.tv_sec = 0;
@@ -198,7 +196,7 @@ TEST(DateTimeTest, DISABLED_GetSecs_UsecConvertedInSec) {
ASSERT_EQ(1, date_time::DateTime::getSecs(time1));
}
-TEST(DateTimeTest, DISABLED_compareTime_UsecConvertedInSec) {
+TEST(DateTimeTest, compareTime_UsecConvertedInSec) {
//arrange
TimevalStruct time1;
time1.tv_sec = 1;
@@ -214,7 +212,7 @@ TEST(DateTimeTest, DISABLED_compareTime_UsecConvertedInSec) {
ASSERT_EQ(EQUAL, date_time::DateTime::compareTime(time1, time2));
}
-TEST(DateTimeTest, DISABLED_compareEqualTime_UsecConvertedInSec) {
+TEST(DateTimeTest, compareEqualTime_UsecConvertedInSec) {
//arrange
TimevalStruct time1;
time1.tv_sec = 1;
@@ -228,7 +226,7 @@ TEST(DateTimeTest, DISABLED_compareEqualTime_UsecConvertedInSec) {
ASSERT_TRUE(date_time::DateTime::Equal(time1, time2));
}
-TEST(DateTimeTest, DISABLED_compareLessTime_UsecConvertedInSec) {
+TEST(DateTimeTest, compareLessTime_UsecConvertedInSec) {
//arrange
TimevalStruct time1;
time1.tv_sec = 1;
@@ -242,7 +240,7 @@ TEST(DateTimeTest, DISABLED_compareLessTime_UsecConvertedInSec) {
ASSERT_TRUE(date_time::DateTime::Less(time1, time2));
}
-TEST(DateTimeTest, DISABLED_compareGreaterTime_UsecConvertedInSec) {
+TEST(DateTimeTest, compareGreaterTime_UsecConvertedInSec) {
//arrange
TimevalStruct time1;
time1.tv_sec = 1;
@@ -256,7 +254,7 @@ TEST(DateTimeTest, DISABLED_compareGreaterTime_UsecConvertedInSec) {
ASSERT_TRUE(date_time::DateTime::Greater(time2, time1));
}
-TEST(DateTimeTest, DISABLED_CalculateTimeSub_UsecConvertedInSec) {
+TEST(DateTimeTest, CalculateTimeSub_UsecConvertedInSec) {
//arrange
TimevalStruct time1;
time1.tv_sec = 1;
@@ -272,7 +270,7 @@ TEST(DateTimeTest, DISABLED_CalculateTimeSub_UsecConvertedInSec) {
ASSERT_EQ(EQUAL, date_time::DateTime::compareTime(time1, time3));
}
-TEST(DateTimeTest, DISABLED_CalculateTimeDiff_UsecConvertedInSec) {
+TEST(DateTimeTest, CalculateTimeDiff_UsecConvertedInSec) {
//arrange
TimevalStruct time1;
time1.tv_sec = 2;
@@ -287,7 +285,7 @@ TEST(DateTimeTest, DISABLED_CalculateTimeDiff_UsecConvertedInSec) {
ASSERT_EQ(3000, date_time::DateTime::calculateTimeDiff(time1, time2));
}
-TEST(DateTimeTest, DISABLED_CalculateEqualTimeDiff_UsecConvertedInSec) {
+TEST(DateTimeTest, CalculateEqualTimeDiff_UsecConvertedInSec) {
//arrange
TimevalStruct time1;
time1.tv_sec = 2;
@@ -302,7 +300,7 @@ TEST(DateTimeTest, DISABLED_CalculateEqualTimeDiff_UsecConvertedInSec) {
ASSERT_EQ(0, date_time::DateTime::calculateTimeDiff(time1, time2));
}
-TEST(DateTimeTest, DISABLED_CalculateEqualTimeSub_UsecConvertedInSec) {
+TEST(DateTimeTest, CalculateEqualTimeSub_UsecConvertedInSec) {
//arrange
TimevalStruct time1;
time1.tv_sec = 3;
@@ -317,12 +315,88 @@ TEST(DateTimeTest, DISABLED_CalculateEqualTimeSub_UsecConvertedInSec) {
TimevalStruct time_expected;
time_expected.tv_sec = 0;
-
+ time_expected.tv_usec = 0;
//assert
ASSERT_EQ(EQUAL, date_time::DateTime::compareTime(time_expected, time3));
ASSERT_EQ(EQUAL, date_time::DateTime::compareTime(time_expected, time4));
}
+TEST(DateTimeTest, AddMilliseconds_SetMillisecondMultiplesSecond_ExpectChangeTime) {
+ TimevalStruct time1;
+ time1.tv_sec = 3;
+ time1.tv_usec = 0;
+ uint32_t milliseconds = 7000;
+ date_time::DateTime::AddMilliseconds(time1, milliseconds);
+ ASSERT_EQ(10, time1.tv_sec);
+ ASSERT_EQ(0, time1.tv_usec);
+}
+
+TEST(DateTimeTest, AddMilliseconds_SetMillisecondNotMultiplesSecond_ExpectChangeTime) {
+ TimevalStruct time1;
+ uint32_t milliseconds = 7500;
+ time1.tv_sec = 3;
+ time1.tv_usec = 0;
+ date_time::DateTime::AddMilliseconds(time1, milliseconds);
+ ASSERT_EQ(10, time1.tv_sec);
+ ASSERT_EQ(500000, time1.tv_usec);
+}
+
+TEST(DateTimeTest, AddMilliseconds_SetMilliSecondLessThenSeconds_ExpectChangeTime) {
+ TimevalStruct time1;
+ uint32_t milliseconds = 500;
+ time1.tv_sec = 3;
+ time1.tv_usec = 0;
+ date_time::DateTime::AddMilliseconds(time1, milliseconds);
+ ASSERT_EQ(3, time1.tv_sec);
+ ASSERT_EQ(500000, time1.tv_usec);
+}
+
+TEST(DateTimeTest, AddMilliseconds_SetMillisecondEqualNull_ExpectNotChangeTime) {
+ TimevalStruct time1;
+ uint32_t milliseconds = 0;
+ time1.tv_sec = 3;
+ time1.tv_usec = 0;
+ date_time::DateTime::AddMilliseconds(time1, milliseconds);
+ ASSERT_EQ(3, time1.tv_sec);
+ ASSERT_EQ(0, time1.tv_usec);
+}
+
+TEST(DateTimeTest, AddMilliseconds_SetOverlowMicrosecond_ExpectChangeTime) {
+ TimevalStruct time1;
+ uint32_t milliseconds = 7600;
+ time1.tv_sec = 3;
+ time1.tv_usec = 500000;
+ date_time::DateTime::AddMilliseconds(time1, milliseconds);
+ ASSERT_EQ(11, time1.tv_sec);
+ ASSERT_EQ(100000, time1.tv_usec);
+}
+
+TEST(DateTimeTest, Operator_minus_TimevalStruct_positive){
+ TimevalStruct time1;
+ TimevalStruct time2;
+ TimevalStruct time3;
+ time1.tv_sec = 3;
+ time1.tv_usec = 0;
+ time2.tv_sec = 3;
+ time2.tv_usec = 0;
+ time3.tv_sec = 2;
+ time3.tv_usec = 9000000;
+ ASSERT_EQ(0, date_time::DateTime::getSecs(time1 - time2));
+ ASSERT_EQ(8000000, date_time::DateTime::getuSecs(time3 - time1));
+}
+
+TEST(DateTimeTest, Operator_minus_TimevalStruct_negative){
+ TimevalStruct time1;
+ TimevalStruct time2;
+ time1.tv_sec = 3;
+ time1.tv_usec = 0;
+ time2.tv_sec = 2;
+ time2.tv_usec = 9000000;
+ ASSERT_NE(1, date_time::DateTime::getSecs(time1 - time2));
+ ASSERT_NE(-8000000, date_time::DateTime::getSecs(time2 - time1));
+}
+
+
} // namespace utils
} // namespace components
} // namespace test
diff --git a/src/components/utils/test/file_system_test.cc b/src/components/utils/test/file_system_test.cc
index 54a662c51..4e36608f9 100644
--- a/src/components/utils/test/file_system_test.cc
+++ b/src/components/utils/test/file_system_test.cc
@@ -759,7 +759,7 @@ TEST(FileSystemTest, WriteFileReadFile) {
std::string result;
std::string check = "test";
EXPECT_TRUE(ReadFile("./test file", result));
- EXPECT_NE(0, result.size());
+ EXPECT_NE(0u, result.size());
EXPECT_EQ(check, result);
EXPECT_TRUE(DeleteFile("./test file"));
@@ -1005,17 +1005,16 @@ TEST(FileSystemTest, GetFileModificationTime) {
EXPECT_TRUE(CreateFile("./test file"));
uint64_t modif_time = GetFileModificationTime("./test file");
- EXPECT_LE(0, modif_time);
+ EXPECT_LE(0ul, modif_time);
std::vector < uint8_t > data(1, 1);
EXPECT_TRUE(WriteBinaryFile("./test file", data));
- EXPECT_LE(0, GetFileModificationTime("./test file"));
+ EXPECT_LE(0ul, GetFileModificationTime("./test file"));
EXPECT_LE(modif_time, GetFileModificationTime("./test file"));
EXPECT_TRUE(DeleteFile("./test file"));
EXPECT_FALSE(FileExists("./test file"));
-
}
TEST(FileSystemTest, ListFiles) {
@@ -1050,7 +1049,7 @@ TEST(FileSystemTest, ListFilesIncludeSubdirectory) {
std::vector < std::string > list;
list = ListFiles("./Test directory");
EXPECT_FALSE(list.empty());
- EXPECT_EQ(1, list.size());
+ EXPECT_EQ(1u, list.size());
EXPECT_EQ("Test directory 2", list[0]);
EXPECT_TRUE(RemoveDirectory("./Test directory", true));
@@ -1073,7 +1072,7 @@ TEST(FileSystemTest, ListFilesDoesNotIncludeFilesInSubdirectory) {
std::sort(list.begin(), list.end());
EXPECT_EQ("Test directory 2", list[0]);
- EXPECT_EQ(1, list.size());
+ EXPECT_EQ(1u, list.size());
EXPECT_TRUE(RemoveDirectory("./Test directory", true));
EXPECT_FALSE(DirectoryExists("./Test directory"));
@@ -1083,7 +1082,7 @@ TEST(FileSystemTest, GetAvailableDiskSpace) {
// Get available disk space before directory with file creaction and after
uint64_t available_space = GetAvailableDiskSpace(".");
- EXPECT_NE(0, available_space);
+ EXPECT_NE(0u, available_space);
ASSERT_FALSE(DirectoryExists("./Test directory"));
CreateDirectory("./Test directory");
@@ -1110,21 +1109,21 @@ TEST(FileSystemTest, DirectorySize) {
CreateDirectory("./Test directory");
EXPECT_TRUE(DirectoryExists("./Test directory"));
// Get size of empty directory
- EXPECT_EQ(0, DirectorySize("./Test directory"));
+ EXPECT_EQ(0u, DirectorySize("./Test directory"));
EXPECT_TRUE(CreateFile("./Test directory/test file"));
// Get size of nonempty directory with empty file
- EXPECT_EQ(0, DirectorySize("./Test directory"));
+ EXPECT_EQ(0u, DirectorySize("./Test directory"));
unsigned char tmp[] = { 't', 'e', 's', 't' };
std::vector<unsigned char> data(tmp, tmp + 4);
EXPECT_TRUE(Write("./Test directory/test file", data));
// Get size of nonempty directory with nonempty file
- EXPECT_NE(0, DirectorySize("./Test directory"));
+ EXPECT_NE(0u, DirectorySize("./Test directory"));
EXPECT_TRUE(DeleteFile("./Test directory/test file"));
- EXPECT_EQ(0, DirectorySize("./Test directory"));
+ EXPECT_EQ(0u, DirectorySize("./Test directory"));
EXPECT_TRUE(RemoveDirectory("./Test directory"));
EXPECT_FALSE(DirectoryExists("./Test directory"));
}
diff --git a/src/components/utils/test/message_queue_test.cc b/src/components/utils/test/message_queue_test.cc
index fbae7a9e5..8ce7196b0 100644
--- a/src/components/utils/test/message_queue_test.cc
+++ b/src/components/utils/test/message_queue_test.cc
@@ -77,7 +77,7 @@ void MessageQueueTest::add_one_element_to_queue() {
// Thread function - removes 1 element from beginning of queue
void MessageQueueTest::extract_from_queue() {
test_queue.wait();
- test_line = test_queue.pop();
+ test_queue.pop(test_line);
pthread_exit(NULL);
}
diff --git a/src/components/utils/test/policy.sql b/src/components/utils/test/policy.sql
new file mode 100644
index 000000000..406579f6b
--- /dev/null
+++ b/src/components/utils/test/policy.sql
@@ -0,0 +1,295 @@
+BEGIN TRANSACTION;
+ CREATE TABLE IF NOT EXISTS `device`(
+ `id` VARCHAR(100) PRIMARY KEY NOT NULL,
+ `hardware` VARCHAR(45),
+ `firmware_rev` VARCHAR(45),
+ `os` VARCHAR(45),
+ `os_version` VARCHAR(45),
+ `carrier` VARCHAR(45),
+ `max_number_rfcom_ports` INTEGER ,
+ `connection_type` VARCHAR(45),
+ `unpaired` BOOL
+ );
+ CREATE TABLE IF NOT EXISTS `usage_and_error_count`(
+ `count_of_iap_buffer_full` INTEGER,
+ `count_sync_out_of_memory` INTEGER,
+ `count_of_sync_reboots` INTEGER
+ );
+ INSERT OR IGNORE INTO `usage_and_error_count` (
+ `count_of_iap_buffer_full`, `count_sync_out_of_memory`,
+ `count_of_sync_reboots`) VALUES (0, 0, 0);
+ CREATE TABLE IF NOT EXISTS `module_meta`(
+ `ccpu_version` VARCHAR(45),
+ `language` VARCHAR(45),
+ `wers_country_code` VARCHAR(45),
+ `pt_exchanged_at_odometer_x` INTEGER NOT NULL DEFAULT 0,
+ `pt_exchanged_x_days_after_epoch` INTEGER NOT NULL DEFAULT 0,
+ `ignition_cycles_since_last_exchange` INTEGER NOT NULL DEFAULT 0,
+ `vin` VARCHAR(45),
+ `flag_update_required` BOOL NOT NULL
+ );
+ INSERT OR IGNORE INTO `module_meta` (`pt_exchanged_at_odometer_x`,
+ `pt_exchanged_x_days_after_epoch`, `ignition_cycles_since_last_exchange`,
+ `flag_update_required`)
+ VALUES (0, 0, 0, 0);
+ CREATE TABLE IF NOT EXISTS `module_config`(
+ `preloaded_pt` BOOL NOT NULL,
+ `is_first_run` BOOL NOT NULL,
+ `exchange_after_x_ignition_cycles` INTEGER NOT NULL,
+ `exchange_after_x_kilometers` INTEGER NOT NULL,
+ `exchange_after_x_days` INTEGER NOT NULL,
+ `timeout_after_x_seconds` INTEGER NOT NULL,
+ `vehicle_make` VARCHAR(45),
+ `vehicle_model` VARCHAR(45),
+ `vehicle_year` VARCHAR(4)
+ );
+ INSERT OR IGNORE INTO `module_config` (`preloaded_pt`, `is_first_run`,
+ `exchange_after_x_ignition_cycles`, `exchange_after_x_kilometers`,
+ `exchange_after_x_days`, `timeout_after_x_seconds`)
+ VALUES(1, 1, 0, 0, 0, 0);
+ CREATE TABLE IF NOT EXISTS `functional_group`(
+ `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
+ `user_consent_prompt` TEXT UNIQUE ON CONFLICT REPLACE,
+ `name` VARCHAR(100) NOT NULL
+ );
+ CREATE TABLE IF NOT EXISTS `priority`(
+ `value` VARCHAR(45) PRIMARY KEY NOT NULL
+ );
+ INSERT OR IGNORE INTO `priority`(`value`) VALUES ('EMERGENCY');
+ INSERT OR IGNORE INTO `priority`(`value`) VALUES ('NAVIGATION');
+ INSERT OR IGNORE INTO `priority`(`value`) VALUES ('VOICECOMMUNICATION');
+ INSERT OR IGNORE INTO `priority`(`value`) VALUES ('COMMUNICATION');
+ INSERT OR IGNORE INTO `priority`(`value`) VALUES ('NORMAL');
+ INSERT OR IGNORE INTO `priority`(`value`) VALUES ('NONE');
+ CREATE TABLE IF NOT EXISTS `hmi_level`(
+ `value` VARCHAR(45) PRIMARY KEY NOT NULL
+ );
+ INSERT OR IGNORE INTO `hmi_level`(`value`) VALUES ('FULL');
+ INSERT OR IGNORE INTO `hmi_level`(`value`) VALUES ('LIMITED');
+ INSERT OR IGNORE INTO `hmi_level`(`value`) VALUES ('BACKGROUND');
+ INSERT OR IGNORE INTO `hmi_level`(`value`) VALUES ('NONE');
+ CREATE TABLE IF NOT EXISTS `notifications_by_priority`(
+ `priority_value` VARCHAR(45) PRIMARY KEY NOT NULL,
+ `value` INTEGER NOT NULL,
+ CONSTRAINT `fk_notifications_by_priority_priority1`
+ FOREIGN KEY(`priority_value`)
+ REFERENCES `priority`(`value`)
+ );
+ CREATE INDEX IF NOT EXISTS
+ `notifications_by_priority.fk_notifications_by_priority_priority1_idx`
+ ON `notifications_by_priority`(`priority_value`);
+ CREATE TABLE IF NOT EXISTS `language`(
+ `code` VARCHAR(25) PRIMARY KEY NOT NULL
+ );
+ CREATE TABLE IF NOT EXISTS `message_type`(
+ `name` VARCHAR(45) PRIMARY KEY NOT NULL
+ );
+ CREATE TABLE IF NOT EXISTS `version`(
+ `number` VARCHAR(45) NOT NULL
+ );
+ INSERT OR IGNORE INTO `version` (`number`) VALUES('0');
+ CREATE TABLE IF NOT EXISTS `rpc`(
+ `id` INTEGER PRIMARY KEY NOT NULL,
+ `name` VARCHAR(45) NOT NULL,
+ `parameter` VARCHAR(45),
+ `hmi_level_value` VARCHAR(45) NOT NULL,
+ `functional_group_id` INTEGER NOT NULL,
+ CONSTRAINT `fk_rpc_hmi_level1`
+ FOREIGN KEY(`hmi_level_value`)
+ REFERENCES `hmi_level`(`value`),
+ CONSTRAINT `fk_rpc_functional_group1`
+ FOREIGN KEY(`functional_group_id`)
+ REFERENCES `functional_group`(`id`)
+ );
+ CREATE INDEX IF NOT EXISTS `rpc.fk_rpc_hmi_level1_idx`
+ ON `rpc`(`hmi_level_value`);
+ CREATE INDEX IF NOT EXISTS `rpc.fk_rpc_functional_group1_idx`
+ ON `rpc`(`functional_group_id`);
+ CREATE INDEX `rpc.select_rpc_name_hmi_level`
+ ON `rpc`(`name`,`hmi_level_value`);
+ CREATE TABLE IF NOT EXISTS `application`(
+ `id` VARCHAR(45) PRIMARY KEY NOT NULL,
+ `keep_context` BOOLEAN,
+ `steal_focus` BOOLEAN,
+ `default_hmi` VARCHAR(45),
+ `priority_value` VARCHAR(45),
+ `is_revoked` BOOLEAN,
+ `is_default` BOOLEAN,
+ `is_predata` BOOLEAN,
+ `memory_kb` INTEGER NOT NULL,
+ `heart_beat_timeout_ms` INTEGER NOT NULL,
+ `certificate` VARCHAR(45),
+ CONSTRAINT `fk_application_hmi_level1`
+ FOREIGN KEY(`default_hmi`)
+ REFERENCES `hmi_level`(`value`),
+ CONSTRAINT `fk_application_priorities1`
+ FOREIGN KEY(`priority_value`)
+ REFERENCES `priority`(`value`)
+ );
+ CREATE INDEX IF NOT EXISTS `application.fk_application_hmi_level1_idx`
+ ON `application`(`default_hmi`);
+ CREATE INDEX IF NOT EXISTS `application.fk_application_priorities1_idx`
+ ON `application`(`priority_value`);
+ CREATE TABLE IF NOT EXISTS `app_group`(
+ `application_id` VARCHAR(45) NOT NULL,
+ `functional_group_id` INTEGER NOT NULL,
+ PRIMARY KEY(`application_id`,`functional_group_id`),
+ CONSTRAINT `fk_application_has_functional_group_application1`
+ FOREIGN KEY(`application_id`)
+ REFERENCES `application`(`id`),
+ CONSTRAINT `fk_application_has_functional_group_functional_group1`
+ FOREIGN KEY(`functional_group_id`)
+ REFERENCES `functional_group`(`id`)
+ );
+ CREATE INDEX IF NOT EXISTS `app_group.fk_application_has_functional_group_functional_group1_idx`
+ ON `app_group`(`functional_group_id`);
+ CREATE INDEX IF NOT EXISTS `app_group.fk_application_has_functional_group_application1_idx`
+ ON `app_group`(`application_id`);
+ CREATE TABLE IF NOT EXISTS `preconsented_group`(
+ `application_id` VARCHAR(45) NOT NULL,
+ `functional_group_id` INTEGER NOT NULL,
+ PRIMARY KEY(`application_id`,`functional_group_id`),
+ CONSTRAINT `fk_application_has_functional_group_application2`
+ FOREIGN KEY(`application_id`)
+ REFERENCES `application`(`id`),
+ CONSTRAINT `fk_application_has_functional_group_functional_group2`
+ FOREIGN KEY(`functional_group_id`)
+ REFERENCES `functional_group`(`id`)
+ );
+ CREATE INDEX IF NOT EXISTS
+ `preconsented_group.fk_application_has_functional_group_functional_group2_idx`
+ ON `preconsented_group`(`functional_group_id`);
+ CREATE INDEX IF NOT EXISTS
+ `preconsented_group.fk_application_has_functional_group_application2_idx`
+ ON `preconsented_group`(`application_id`);
+ CREATE TABLE IF NOT EXISTS `seconds_between_retry`(
+ `index` INTEGER PRIMARY KEY NOT NULL,
+ `value` INTEGER NOT NULL
+ );
+ CREATE TABLE IF NOT EXISTS `device_consent_group`(
+ `device_id` VARCHAR(100) NOT NULL,
+ `functional_group_id` INTEGER NOT NULL,
+ `is_consented` BOOL NOT NULL,
+ `input` VARCHAR(45),
+ `time_stamp` DATETIME DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY(`device_id`,`functional_group_id`),
+ CONSTRAINT `fk_device_has_functional_group_device1`
+ FOREIGN KEY(`device_id`)
+ REFERENCES `device`(`id`),
+ CONSTRAINT `fk_device_has_functional_group_functional_group1`
+ FOREIGN KEY(`functional_group_id`)
+ REFERENCES `functional_group`(`id`)
+ );
+ CREATE INDEX IF NOT EXISTS
+ `device_consent_group.fk_device_has_functional_group_functional_group1_idx`
+ ON `device_consent_group`(`functional_group_id`);
+ CREATE INDEX IF NOT EXISTS
+ `device_consent_group.fk_device_has_functional_group_device1_idx`
+ ON `device_consent_group`(`device_id`);
+ CREATE TABLE IF NOT EXISTS `app_level`(
+ `application_id` VARCHAR(45) PRIMARY KEY NOT NULL,
+ `minutes_in_hmi_full` INTEGER DEFAULT 0,
+ `minutes_in_hmi_limited` INTEGER DEFAULT 0,
+ `minutes_in_hmi_background` INTEGER DEFAULT 0,
+ `minutes_in_hmi_none` INTEGER DEFAULT 0,
+
+ `count_of_user_selections` INTEGER DEFAULT 0,
+ `count_of_rejections_sync_out_of_memory` INTEGER DEFAULT 0,
+ `count_of_rejections_nickname_mismatch` INTEGER DEFAULT 0,
+ `count_of_rejections_duplicate_name` INTEGER DEFAULT 0,
+ `count_of_rejected_rpcs_calls` INTEGER DEFAULT 0,
+ `count_of_rpcs_sent_in_hmi_none` INTEGER DEFAULT 0,
+ `count_of_removals_for_bad_behavior` INTEGER DEFAULT 0,
+ `count_of_run_attempts_while_revoked` INTEGER DEFAULT 0,
+ `app_registration_language_gui` VARCHAR(25),
+ `app_registration_language_vui` VARCHAR(25),
+ CONSTRAINT `fk_app_levels_application1`
+ FOREIGN KEY(`application_id`)
+ REFERENCES `application`(`id`),
+ CONSTRAINT `fk_app_level_language1`
+ FOREIGN KEY(`app_registration_language_gui`)
+ REFERENCES `language`(`code`),
+ CONSTRAINT `fk_app_level_language2`
+ FOREIGN KEY(`app_registration_language_vui`)
+ REFERENCES `language`(`code`)
+ );
+ CREATE INDEX IF NOT EXISTS `app_level.fk_app_levels_application1_idx`
+ ON `app_level`(`application_id`);
+ CREATE INDEX IF NOT EXISTS `app_level.fk_app_level_language1_idx`
+ ON `app_level`(`app_registration_language_gui`);
+ CREATE INDEX IF NOT EXISTS `app_level.fk_app_level_language2_idx`
+ ON `app_level`(`app_registration_language_vui`);
+ CREATE TABLE IF NOT EXISTS `nickname`(
+ `name` VARCHAR(100) NOT NULL,
+ `application_id` VARCHAR(45) NOT NULL,
+ PRIMARY KEY(`name`,`application_id`),
+ CONSTRAINT `fk_nickname_application1`
+ FOREIGN KEY(`application_id`)
+ REFERENCES `application`(`id`)
+ );
+ CREATE INDEX IF NOT EXISTS `nickname.fk_nickname_application1_idx`
+ ON `nickname`(`application_id`);
+ CREATE TABLE IF NOT EXISTS `app_type`(
+ `name` VARCHAR(50) NOT NULL,
+ `application_id` VARCHAR(45) NOT NULL,
+ PRIMARY KEY(`name`,`application_id`),
+ CONSTRAINT `fk_app_type_application1`
+ FOREIGN KEY(`application_id`)
+ REFERENCES `application`(`id`)
+ );
+ CREATE INDEX IF NOT EXISTS `app_type.fk_app_type_application1_idx`
+ ON `app_type`(`application_id`);
+ CREATE TABLE IF NOT EXISTS `consent_group`(
+ `device_id` VARCHAR(100) NOT NULL,
+ `application_id` VARCHAR(45) NOT NULL,
+ `functional_group_id` INTEGER NOT NULL,
+ `is_consented` BOOL NOT NULL,
+ `input` VARCHAR(45),
+ `time_stamp` DATETIME DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY(`application_id`,`functional_group_id`,`device_id`),
+ CONSTRAINT `fk_consent_group_device1`
+ FOREIGN KEY(`device_id`)
+ REFERENCES `device`(`id`),
+ CONSTRAINT `fk_consent_group_application1`
+ FOREIGN KEY(`application_id`)
+ REFERENCES `application`(`id`),
+ CONSTRAINT `fk_consent_group_functional_group1`
+ FOREIGN KEY(`functional_group_id`)
+ REFERENCES `functional_group`(`id`)
+ );
+ CREATE INDEX IF NOT EXISTS
+ `consent_group.fk_consent_group_device1_idx`
+ ON `device_consent_group`(`device_id`);
+ CREATE INDEX IF NOT EXISTS `consent_group.fk_consent_group_functional_group1_idx`
+ ON `consent_group`(`functional_group_id`);
+ CREATE TABLE IF NOT EXISTS `endpoint`(
+ `service` INTEGER NOT NULL,
+ `url` VARCHAR(100) NOT NULL,
+ `application_id` VARCHAR(45) NOT NULL,
+ CONSTRAINT `fk_endpoint_application1`
+ FOREIGN KEY(`application_id`)
+ REFERENCES `application`(`id`)
+ );
+ CREATE INDEX IF NOT EXISTS `endpoint.fk_endpoint_application1_idx`
+ ON `endpoint`(`application_id`);
+ CREATE TABLE IF NOT EXISTS `message`(
+ `id` INTEGER PRIMARY KEY NOT NULL,
+ `tts` TEXT,
+ `label` TEXT,
+ `line1` TEXT,
+ `line2` TEXT,
+ `textBody` TEXT,
+ `language_code` VARCHAR(25) NOT NULL,
+ `message_type_name` VARCHAR(45) NOT NULL,
+ CONSTRAINT `fk_messages_languages1`
+ FOREIGN KEY(`language_code`)
+ REFERENCES `language`(`code`),
+ CONSTRAINT `fk_message_consumer_friendly_messages1`
+ FOREIGN KEY(`message_type_name`)
+ REFERENCES `message_type`(`name`)
+ );
+ CREATE INDEX IF NOT EXISTS `message.fk_messages_languages1_idx`
+ ON `message`(`language_code`);
+ CREATE INDEX IF NOT EXISTS `message.fk_message_consumer_friendly_messages1_idx`
+ ON `message`(`message_type_name`);
+COMMIT;
diff --git a/src/components/utils/test/prioritized_queue_test.cc b/src/components/utils/test/prioritized_queue_test.cc
new file mode 100644
index 000000000..19e168cdc
--- /dev/null
+++ b/src/components/utils/test/prioritized_queue_test.cc
@@ -0,0 +1,205 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "gtest/gtest.h"
+#include "utils/prioritized_queue.h"
+
+namespace test {
+namespace components {
+namespace utils {
+
+using ::utils::PrioritizedQueue;
+
+class TestMessage {
+ public:
+ TestMessage()
+ : priority(0) {
+ }
+ TestMessage(std::string message, size_t msg_priority)
+ : msg_(message),
+ priority(msg_priority) {
+ }
+ size_t PriorityOrder() const;
+ std::string msg() const;
+ friend bool operator==(const TestMessage &msg1, const TestMessage &msg2);
+ private:
+ std::string msg_;
+ size_t priority;
+};
+
+size_t TestMessage::PriorityOrder() const {
+ return priority;
+}
+
+std::string TestMessage::msg() const {
+ return msg_;
+}
+
+bool operator==(const TestMessage &msg1, const TestMessage &msg2) {
+ return (msg1.msg() == msg2.msg()
+ && msg1.PriorityOrder() == msg2.PriorityOrder());
+}
+
+class PrioritizedQueueTest : public testing::Test {
+ protected:
+ PrioritizedQueue<TestMessage> test_queue;
+};
+
+TEST_F(PrioritizedQueueTest, DefaultCtorTest_ExpectEmptyQueueCreated) {
+ EXPECT_TRUE(test_queue.empty());
+}
+
+TEST_F(PrioritizedQueueTest, PushFourElementsTest_ExpectFourElementsAdded) {
+ // Creating 4 messages
+ TestMessage message1("Ford", 2);
+ TestMessage message2("Hello", 1);
+ TestMessage message3("Luxoft", 4);
+ TestMessage message4("from", 3);
+ // Adding created messages to Prioritized queue
+ test_queue.push(message4);
+ test_queue.push(message3);
+ test_queue.push(message1);
+ test_queue.push(message2);
+ // Expect 4 messages were added successfully
+ EXPECT_EQ(4u, test_queue.size());
+}
+
+TEST_F(PrioritizedQueueTest, AddFourElementsTest_ExpectQueueNotEmpty) {
+ // Creating 4 messages with different priorities
+ TestMessage message1("Ford", 2);
+ TestMessage message2("Hello", 1);
+ TestMessage message3("Luxoft", 4);
+ TestMessage message4("from", 3);
+ // Adding created messages to Prioritized queue
+ test_queue.push(message4);
+ test_queue.push(message3);
+ test_queue.push(message1);
+ test_queue.push(message2);
+ // Expect queue not empty
+ EXPECT_FALSE(test_queue.empty());
+}
+
+TEST_F(PrioritizedQueueTest, CheckMessageOrder_ExpectMessageWithHighestPriorityAddedFirst) {
+ // Creating 4 messages with different priorities
+ TestMessage message1("Ford", 111);
+ TestMessage message2("Hello", 21);
+ TestMessage message3("Luxoft", 14);
+ TestMessage message4("from", 4);
+ // Adding created messages to Prioritized queue. Expect queue ordered according priority
+ test_queue.push(message4);
+ test_queue.push(message3);
+ test_queue.push(message1);
+ test_queue.push(message2);
+ // Check the first message is the message with highest priority
+ EXPECT_EQ(message1, test_queue.front());
+}
+
+TEST_F(PrioritizedQueueTest, Push_AddMessagesWithEqualPriority_ExpectMessagesWithEqualPriorityAdded) {
+ // Creating 2 messages with the same priorities
+ TestMessage message1("Hello", 111);
+ TestMessage message2("Luxoft", 111);
+ // Adding created messages to Prioritized queue.
+ test_queue.push(message1);
+ test_queue.push(message2);
+ // Expect 2 messages were added successfully
+ EXPECT_EQ(2u, test_queue.size());
+}
+
+TEST_F(PrioritizedQueueTest, Pop_OneElementInPriorityQueue_ExpectQueueStillAliveWithRestMessagesWithEqualPriority) {
+ // Creating 4 messages with same priorities
+ TestMessage message1("Ford's", 111);
+ TestMessage message2("Partner", 111);
+ // Adding created messages to Prioritized queue.
+ test_queue.push(message1);
+ test_queue.push(message2);
+ // Expect 2 messages were added successfully to One element of prioritized queue
+ EXPECT_EQ(2u, test_queue.size());
+ // Extracting first element from the queue
+ EXPECT_EQ(message1, test_queue.front());
+ test_queue.pop();
+ // Check queue with the same priority messages still alive
+ EXPECT_EQ(1u, test_queue.size());
+ EXPECT_EQ(message2, test_queue.front());
+ test_queue.pop();
+ EXPECT_EQ(0u, test_queue.size());
+}
+
+TEST_F(PrioritizedQueueTest, Pop_TwoElementsInPriorityQueue_ExpectElementErasedIfOnlyOneWithConcretePriorityExist) {
+ // Creating 2 messages with same priority and 1 with different
+ TestMessage message1("Hello", 111);
+ TestMessage message2("Luxoft", 111);
+ TestMessage message3("Company", 77);
+ // Adding created messages to Prioritized queue.
+ test_queue.push(message1);
+ test_queue.push(message2);
+ test_queue.push(message3);
+ // Expect 3 messages were added successfully to Two elements of prioritized queue
+ EXPECT_EQ(3u, test_queue.size());
+ // Extracting first element from the queue
+ EXPECT_EQ(message1, test_queue.front());
+ test_queue.pop();
+ // Check queue with the same priority messages still alive
+ EXPECT_EQ(2u, test_queue.size());
+ EXPECT_EQ(message2, test_queue.front());
+ test_queue.pop();
+ EXPECT_EQ(message3, test_queue.front());
+ // Delete last element. Expect erased.
+ test_queue.pop();
+ EXPECT_EQ(0u, test_queue.size());
+}
+
+TEST_F(PrioritizedQueueTest, NotEmptyPrioritizedQueuePopElement_ExpectQueueDecreasedOneElement) {
+ // Creating 4 prioritized messages
+ TestMessage message1("Alice", 111);
+ TestMessage message2("in", 14);
+ TestMessage message3("Wonderland", 4);
+ // Adding created messages to Prioritized queue
+ test_queue.push(message2);
+ test_queue.push(message3);
+ test_queue.push(message1);
+ // Extracting first element from the queue
+ test_queue.pop();
+ // Check that one message was extracted
+ EXPECT_EQ(2u, test_queue.size());
+ // Checking if extracted message was the message with highest priority
+ // therefore now first message in queue has highest priority
+ EXPECT_EQ(message2, test_queue.front());
+ // Extracting first element from the queue
+ test_queue.pop();
+ // Checking if extracted message was the message with highest priority
+ // therefore now first message in queue has highest priority
+ EXPECT_EQ(message3, test_queue.front());
+}
+
+} // namespace utils
+} // namespace components
+} // namespace test
diff --git a/src/components/utils/test/qdbserver.sh b/src/components/utils/test/qdbserver.sh
new file mode 100755
index 000000000..3f0144106
--- /dev/null
+++ b/src/components/utils/test/qdbserver.sh
@@ -0,0 +1,6 @@
+# This script star QDB server for SDL
+# Need superuser to start qdb
+
+LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/qnx650/target/qnx6/x86/usr/lib
+export LD_LIBRARY_PATH
+/usr/sbin/qdb -c test-qdb.ini
diff --git a/src/components/utils/test/resource_usage_test.cc b/src/components/utils/test/resource_usage_test.cc
index c10bbea86..cac5dc2e3 100644
--- a/src/components/utils/test/resource_usage_test.cc
+++ b/src/components/utils/test/resource_usage_test.cc
@@ -85,16 +85,14 @@ TEST_F(ResourceUsagePrivateTest, GetProcPathTest) {
namespace test {
namespace components {
-namespace utils {
-using namespace ::utils;
+namespace utils_test {
TEST(ResourceUsageTest, SuccesfulGrabResources) {
- ResourseUsage* resources = Resources::getCurrentResourseUsage();
+ ::utils::ResourseUsage* resources = ::utils::Resources::getCurrentResourseUsage();
EXPECT_TRUE(resources != NULL);
delete resources;
-
}
-} // namespace utils
+} // namespace utils_test
} // namespace components
} // namespace test
diff --git a/src/components/utils/test/scope_guard_test.cc b/src/components/utils/test/scope_guard_test.cc
new file mode 100644
index 000000000..ac05c2828
--- /dev/null
+++ b/src/components/utils/test/scope_guard_test.cc
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "gmock/gmock.h"
+#include "utils/scope_guard.h"
+#include "utils/macro.h"
+
+namespace test {
+namespace components {
+namespace utils {
+
+using ::utils::ScopeGuard;
+using ::utils::MakeGuard;
+using ::utils::MakeObjGuard;
+using ::testing::Mock;
+
+class TestObject {
+ public:
+ MOCK_METHOD0(function_to_call, void());
+ MOCK_METHOD1(function_to_call_with_param, void(void*));
+};
+
+namespace {
+static int call_with_param_count;
+void dealloc(char* ptr) {
+ delete ptr;
+ ++call_with_param_count;
+}
+}
+
+TEST(ScopeGuardTest, CallFreeFunctionWithParam) {
+ {
+ call_with_param_count = 0;
+ char* ptr = new char;
+ ScopeGuard guard = MakeGuard(dealloc, ptr);
+ UNUSED(guard);
+ }
+ EXPECT_EQ(1, call_with_param_count);
+}
+
+TEST(ScopeGuardTest, CallObjectFunction) {
+ TestObject obj;
+ Mock::AllowLeak(&obj); // Google tests bug
+ EXPECT_CALL(obj, function_to_call()).Times(1);
+ {
+ ScopeGuard guard = MakeObjGuard(obj, &TestObject::function_to_call);
+ UNUSED(guard);
+ }
+}
+
+TEST(ScopeGuardTest, CallObjectFunctionWithParam) {
+ TestObject obj;
+ EXPECT_CALL(obj, function_to_call_with_param(&obj)).Times(1);
+ {
+ ScopeGuard guard =
+ MakeObjGuard(obj, &TestObject::function_to_call_with_param, &obj);
+ UNUSED(guard);
+ }
+}
+
+TEST(ScopeGuardTest, DismissCallFreeFunctionWithParam) {
+ {
+ call_with_param_count = 0;
+ char* ptr = new char;
+ ScopeGuard guard = MakeGuard(dealloc, ptr);
+ guard.Dismiss();
+ }
+ EXPECT_EQ(0, call_with_param_count);
+}
+
+TEST(ScopeGuardTest, DismissCallObjectFunction) {
+ TestObject obj;
+ EXPECT_CALL(obj, function_to_call()).Times(0);
+ {
+ ScopeGuard guard = MakeObjGuard(obj, &TestObject::function_to_call);
+ guard.Dismiss();
+ }
+}
+
+TEST(ScopeGuardTest, DismissCallObjectFunctionWithParam) {
+ TestObject obj;
+ EXPECT_CALL(obj, function_to_call_with_param(&obj)).Times(0);
+ {
+ ScopeGuard guard =
+ MakeObjGuard(obj, &TestObject::function_to_call_with_param, &obj);
+ guard.Dismiss();
+ }
+}
+
+} // namespace utils
+} // components
+} // namesapce test
diff --git a/src/components/utils/test/shared_ptr_test.cc b/src/components/utils/test/shared_ptr_test.cc
new file mode 100644
index 000000000..92d867fe7
--- /dev/null
+++ b/src/components/utils/test/shared_ptr_test.cc
@@ -0,0 +1,544 @@
+/*
+ * Copyright (c) 2015, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <stdlib.h>
+#include <vector>
+#include <iostream>
+#include "gmock/gmock.h"
+#include "utils/shared_ptr.h"
+
+namespace test {
+namespace components {
+namespace utils {
+namespace SharedPtrTest {
+
+class CMockObject {
+ public:
+ CMockObject(int id);
+ virtual ~CMockObject();
+ virtual int getId() const;
+
+ MOCK_METHOD0(destructor, void ());
+
+ private:
+ int mId_;
+};
+
+class CExtendedMockObject : public CMockObject {
+ public:
+ CExtendedMockObject(int id);
+};
+
+} // namespace CMockObject
+} // namespace SmartObjects
+} // namespace components
+} // namespace test
+
+using namespace test::components::utils::SharedPtrTest;
+using ::testing::NiceMock;
+
+CMockObject::CMockObject(int id)
+ : mId_(id) {
+}
+
+CMockObject::~CMockObject() {
+ destructor();
+}
+
+int CMockObject::getId() const {
+ return mId_;
+}
+
+CExtendedMockObject::CExtendedMockObject(int id)
+ : CMockObject(id) {
+}
+
+typedef utils::SharedPtr<CMockObject> tMockObjectPtr;
+typedef utils::SharedPtr<CExtendedMockObject> tExtendedMockObjectPtr;
+
+TEST(SharedPtrTest, DefaultConstructorTest) {
+ // Constructor checks
+ tMockObjectPtr p0;
+ ASSERT_EQ(0, p0.get());
+ ASSERT_FALSE(p0.valid());
+}
+
+TEST(SharedPtrTest, ConstructorWithOneParameterTest) {
+ // Arrange
+ CMockObject* object1 = new CMockObject(1);
+ EXPECT_CALL(*object1, destructor()).Times(1);
+
+ // Constructor checks
+ tMockObjectPtr p1(object1);
+ ASSERT_EQ(1, p1->getId());
+ ASSERT_EQ(1u, *(p1.get_ReferenceCounter()));
+}
+
+TEST(SharedPtrTest, CopyConstructorTest) {
+ // Arrange
+ CMockObject* object1 = new CMockObject(1);
+ EXPECT_CALL(*object1, destructor()).Times(1);
+
+ // Constructor checks
+ tMockObjectPtr p1(object1);
+ ASSERT_EQ(1, p1->getId());
+ ASSERT_EQ(1u, *(p1.get_ReferenceCounter()));
+
+ tMockObjectPtr p2(p1);
+ ASSERT_EQ(1, p2->getId());
+ ASSERT_EQ(2u, *(p2.get_ReferenceCounter()));
+ tMockObjectPtr p3 = p2;
+ ASSERT_EQ(1, p3->getId());
+ ASSERT_EQ(3u, *(p3.get_ReferenceCounter()));
+ {
+ tMockObjectPtr p4 = p3;
+ ASSERT_EQ(1, p4->getId());
+ ASSERT_EQ(4u, *(p3.get_ReferenceCounter()));
+ }
+ // Check reference counter decreased
+ ASSERT_EQ(3u, *(p3.get_ReferenceCounter()));
+}
+
+TEST(SharedPtrTest, SecondConstructorWithOneParameterTest) {
+ // Arrange
+ CExtendedMockObject* object1 = new CExtendedMockObject(2);
+ EXPECT_CALL(*object1, destructor()).Times(0);
+
+ // Constructors checks
+ tExtendedMockObjectPtr p1(object1);
+ ASSERT_EQ(2, p1->getId());
+ ASSERT_EQ(1u, *(p1.get_ReferenceCounter()));
+
+ tMockObjectPtr p2(p1);
+ ASSERT_EQ(2, p2->getId());
+ ASSERT_EQ(2u, *(p2.get_ReferenceCounter()));
+ EXPECT_CALL(*object1, destructor());
+}
+
+TEST(SharedPtrTest, AssignmentOperatorTest) {
+ // Arrange
+ CMockObject* object1 = new CMockObject(1);
+ CMockObject* object2 = new CMockObject(2);
+
+ EXPECT_CALL(*object1, destructor()).Times(0);
+ EXPECT_CALL(*object2, destructor()).Times(0);
+
+ tMockObjectPtr p1(object1);
+ ASSERT_EQ(1, p1->getId());
+ ASSERT_EQ(1u, *(p1.get_ReferenceCounter()));
+
+ tMockObjectPtr p2(object2);
+ ASSERT_EQ(2, p2->getId());
+ ASSERT_EQ(1u, *(p2.get_ReferenceCounter()));
+
+ tMockObjectPtr p3(p1);
+ ASSERT_EQ(1, p3->getId());
+ ASSERT_EQ(2u, *(p3.get_ReferenceCounter()));
+
+ tMockObjectPtr p4(p3);
+ ASSERT_EQ(1, p4->getId());
+ ASSERT_EQ(3u, *(p4.get_ReferenceCounter()));
+
+ tMockObjectPtr p5(p4);
+ ASSERT_EQ(1, p5->getId());
+ ASSERT_EQ(4u, *(p5.get_ReferenceCounter()));
+
+ p5 = p2;
+
+ // Check reference counter for new SharedPtr increased
+ ASSERT_EQ(2, p5->getId());
+ ASSERT_EQ(2u, *(p5.get_ReferenceCounter()));
+
+ // Check reference counter for old SharedPtr decreased
+ ASSERT_EQ(1, p1->getId());
+ ASSERT_EQ(3u, *(p1.get_ReferenceCounter()));
+
+ EXPECT_CALL(*object1, destructor());
+ EXPECT_CALL(*object2, destructor());
+}
+
+TEST(SharedPtrTest, SecondAssignmentOperatorTest) {
+ // Arrange
+ CMockObject* object1 = new CMockObject(1);
+ CExtendedMockObject* object2 = new CExtendedMockObject(2);
+
+ EXPECT_CALL(*object1, destructor()).Times(0);
+ EXPECT_CALL(*object2, destructor()).Times(0);
+
+ tMockObjectPtr p1(object1);
+ ASSERT_EQ(1, p1->getId());
+ ASSERT_EQ(1u, *(p1.get_ReferenceCounter()));
+
+ tExtendedMockObjectPtr p2(object2);
+ ASSERT_EQ(2, p2->getId());
+ ASSERT_EQ(1u, *(p2.get_ReferenceCounter()));
+
+ tMockObjectPtr p3(p1);
+ ASSERT_EQ(1, p3->getId());
+ ASSERT_EQ(2u, *(p3.get_ReferenceCounter()));
+
+ tMockObjectPtr p4(p3);
+ ASSERT_EQ(1, p4->getId());
+ ASSERT_EQ(3u, *(p4.get_ReferenceCounter()));
+
+ tMockObjectPtr p5(p4);
+ ASSERT_EQ(1, p5->getId());
+ ASSERT_EQ(4u, *(p5.get_ReferenceCounter()));
+ // Use assignment operator
+ p5 = p2;
+
+ // Check reference counter for new SharedPtr increased
+ ASSERT_EQ(2, p5->getId());
+ ASSERT_EQ(2u, *(p5.get_ReferenceCounter()));
+
+ // Check reference counter for old SharedPtr decreased
+ ASSERT_EQ(1, p1->getId());
+ ASSERT_EQ(3u, *(p1.get_ReferenceCounter()));
+
+ EXPECT_CALL(*object1, destructor());
+ EXPECT_CALL(*object2, destructor());
+}
+
+TEST(SharedPtrTest, EqualOperatorTest) {
+ // Arrange
+ CMockObject* object1 = new CMockObject(1);
+ CMockObject* object2 = new CMockObject(2);
+
+ EXPECT_CALL(*object1, destructor()).Times(0);
+ EXPECT_CALL(*object2, destructor()).Times(0);
+
+ tMockObjectPtr p1(object1);
+ ASSERT_EQ(1, p1->getId());
+ ASSERT_EQ(1u, *(p1.get_ReferenceCounter()));
+
+ tMockObjectPtr p2(object2);
+ ASSERT_EQ(2, p2->getId());
+ ASSERT_EQ(1u, *(p2.get_ReferenceCounter()));
+
+ tMockObjectPtr p3(p1);
+ ASSERT_EQ(1, p3->getId());
+ ASSERT_EQ(2u, *(p3.get_ReferenceCounter()));
+
+ tMockObjectPtr p4(p3);
+ ASSERT_EQ(1, p4->getId());
+ ASSERT_EQ(3u, *(p4.get_ReferenceCounter()));
+
+ tMockObjectPtr p5(p4);
+ ASSERT_EQ(1, p5->getId());
+ ASSERT_EQ(4u, *(p5.get_ReferenceCounter()));
+ // Checks
+ ASSERT_TRUE(p1 == p3);
+ ASSERT_TRUE(p1 == p4);
+ ASSERT_TRUE(p4 == p3);
+ ASSERT_FALSE(p1 == p2);
+
+ EXPECT_CALL(*object1, destructor());
+ EXPECT_CALL(*object2, destructor());
+}
+
+TEST(SharedPtrTest, LessThanOperatorTest) {
+ // Arrange
+ CMockObject* object1 = new CMockObject(1);
+ CMockObject* object2 = new CMockObject(2);
+
+ EXPECT_CALL(*object1, destructor()).Times(0);
+ EXPECT_CALL(*object2, destructor()).Times(0);
+
+ tMockObjectPtr p1(object1);
+ ASSERT_EQ(1, p1->getId());
+ ASSERT_EQ(1u, *(p1.get_ReferenceCounter()));
+
+ tMockObjectPtr p2(object2);
+ ASSERT_EQ(2, p2->getId());
+ ASSERT_EQ(1u, *(p2.get_ReferenceCounter()));
+
+ // Checks
+ if (object1 < object2) {
+ ASSERT_TRUE(p1 < p2);
+ }
+ else {
+ ASSERT_FALSE(p1 < p2);
+ }
+
+ EXPECT_CALL(*object1, destructor());
+ EXPECT_CALL(*object2, destructor());
+}
+
+TEST(SharedPtrTest, StaticPointerCastTest_DerivedToBase_ExpectCastOk) {
+ // Arrange
+ CMockObject* object1 = new CMockObject(1);
+ CExtendedMockObject* object2 = new CExtendedMockObject(2);
+
+ EXPECT_CALL(*object1, destructor()).Times(1);
+ EXPECT_CALL(*object2, destructor()).Times(0);
+
+ tMockObjectPtr p1(object1);
+ ASSERT_EQ(1, p1->getId());
+ ASSERT_EQ(1u, *(p1.get_ReferenceCounter()));
+
+ tExtendedMockObjectPtr ep1(object2);
+ ASSERT_EQ(2, ep1->getId());
+ ASSERT_EQ(1u, *(ep1.get_ReferenceCounter()));
+ // Cast from SharedPtr to Derived class to SharedPtr to Base class
+ p1 = utils::SharedPtr<CExtendedMockObject>::static_pointer_cast< CMockObject >(ep1);
+ // Checks
+ ASSERT_EQ(2, p1->getId());
+ ASSERT_EQ(2u, *(p1.get_ReferenceCounter()));
+ ASSERT_TRUE(p1 == ep1);
+
+ EXPECT_CALL(*object2, destructor());
+}
+
+TEST(SharedPtrTest, StaticPointerCastTest_BaseToDerived_ExpectCastOk) {
+ // Arrange
+ CMockObject* object1 = new CMockObject(1);
+ CExtendedMockObject* object2 = new CExtendedMockObject(2);
+
+ EXPECT_CALL(*object1, destructor()).Times(0);
+ EXPECT_CALL(*object2, destructor()).Times(1);
+
+ tMockObjectPtr p1(object1);
+ ASSERT_EQ(1, p1->getId());
+ ASSERT_EQ(1u, *(p1.get_ReferenceCounter()));
+
+ tExtendedMockObjectPtr ep1(object2);
+ ASSERT_EQ(2, ep1->getId());
+ ASSERT_EQ(1u, *(ep1.get_ReferenceCounter()));
+ // Cast from SharedPtr to Base class to SharedPtr to Derived class
+ ep1 = utils::SharedPtr<CMockObject>::static_pointer_cast<CExtendedMockObject>(p1);
+ // Checks
+ ASSERT_EQ(1, ep1->getId());
+ ASSERT_EQ(2u, *(ep1.get_ReferenceCounter()));
+ ASSERT_TRUE(p1 == ep1);
+
+ EXPECT_CALL(*object1, destructor());
+}
+
+TEST(SharedPtrTest, DynamicPointerCastTest_DerivedToBase_ExpectCastOk) {
+ // Arrange
+ CMockObject* object1 = new CMockObject(1);
+ CExtendedMockObject* object2 = new CExtendedMockObject(2);
+
+ EXPECT_CALL(*object1, destructor()).Times(1);
+ EXPECT_CALL(*object2, destructor()).Times(0);
+
+ tMockObjectPtr p1(object1);
+ ASSERT_EQ(1, p1->getId());
+ ASSERT_EQ(1u, *(p1.get_ReferenceCounter()));
+
+ tExtendedMockObjectPtr ep1(object2);
+ ASSERT_EQ(2, ep1->getId());
+ ASSERT_EQ(1u, *(ep1.get_ReferenceCounter()));
+ // Cast from SharedPtr to Derived class to SharedPtr to Base class
+ p1 = utils::SharedPtr<CExtendedMockObject>::dynamic_pointer_cast< CMockObject >(ep1);
+ // Checks
+ ASSERT_EQ(2, p1->getId());
+ ASSERT_EQ(2u, *(p1.get_ReferenceCounter()));
+ ASSERT_TRUE(p1 == ep1);
+
+ EXPECT_CALL(*object2, destructor());
+}
+
+TEST(SharedPtrTest, DynamicPointerCastTest_BaseToDerived_ExpectNullPtr) {
+ // Arrange
+ CMockObject* object1 = new CMockObject(1);
+ CExtendedMockObject* object2 = new CExtendedMockObject(2);
+
+ EXPECT_CALL(*object1, destructor()).Times(0);
+ EXPECT_CALL(*object2, destructor()).Times(1);
+
+ tMockObjectPtr p1(object1);
+ ASSERT_EQ(1, p1->getId());
+ ASSERT_EQ(1u, *(p1.get_ReferenceCounter()));
+
+ tExtendedMockObjectPtr ep1(object2);
+ ASSERT_EQ(2, ep1->getId());
+ ASSERT_EQ(1u, *(ep1.get_ReferenceCounter()));
+ // Cast from SharedPtr to Base class to SharedPtr to Derived class
+ ep1 = utils::SharedPtr<CMockObject>::dynamic_pointer_cast<CExtendedMockObject>(p1);
+ // Checks
+ ASSERT_EQ(NULL, ep1);
+
+ EXPECT_CALL(*object1, destructor());
+}
+
+TEST(SharedPtrTest, ArrowOperatorTest) {
+ // Arrange
+ CExtendedMockObject* object1 = new CExtendedMockObject(1);
+ CExtendedMockObject* object2 = new CExtendedMockObject(2);
+
+ EXPECT_CALL(*object1, destructor()).Times(1);
+ EXPECT_CALL(*object2, destructor()).Times(1);
+
+ tExtendedMockObjectPtr ep1(object1);
+ // Check
+ ASSERT_EQ(1, ep1->getId());
+
+ tMockObjectPtr p1(ep1);
+ // Check
+ ASSERT_EQ(1, p1->getId());
+
+ tExtendedMockObjectPtr ep2(object2);
+ // Check
+ ASSERT_EQ(2, ep2->getId());
+}
+
+TEST(SharedPtrTest, DereferenceOperatorTest) {
+ // Arrange
+ CExtendedMockObject* object1 = new CExtendedMockObject(1);
+ CExtendedMockObject* object2 = new CExtendedMockObject(2);
+
+ EXPECT_CALL(*object1, destructor()).Times(1);
+ EXPECT_CALL(*object2, destructor()).Times(1);
+
+ tExtendedMockObjectPtr ep1(object1);
+ // Check
+ ASSERT_EQ(1, (*ep1).getId());
+
+ tMockObjectPtr p1(ep1);
+ // Check
+ ASSERT_EQ(1, (*p1).getId());
+
+ tExtendedMockObjectPtr ep2(object2);
+ // Check
+ ASSERT_EQ(2, (*ep2).getId());
+}
+
+TEST(SharedPtrTest, BoolOperatorTest) {
+ // Arrange
+ CMockObject* object1 = new CMockObject(1);
+ tMockObjectPtr p1(object1);
+ tMockObjectPtr p2;
+
+ // Checks
+ ASSERT_TRUE(p1);
+ ASSERT_FALSE(p2);
+ EXPECT_CALL(*object1, destructor());
+}
+
+TEST(SharedPtrTest, ResetWithoutArgsTest) {
+ // Arrange
+ CMockObject* object1 = new CMockObject(1);
+ CMockObject* object2 = new CMockObject(2);
+
+ EXPECT_CALL(*object1, destructor()).Times(1);
+ EXPECT_CALL(*object2, destructor()).Times(1);
+
+ tMockObjectPtr p1(object1);
+ tMockObjectPtr p2(object2);
+ ASSERT_EQ(2, p2->getId());
+ ASSERT_EQ(1u, *(p2.get_ReferenceCounter()));
+
+ tMockObjectPtr p3(p1);
+ tMockObjectPtr p4(p3);
+ ASSERT_EQ(1, p4->getId());
+ ASSERT_EQ(3u, *(p4.get_ReferenceCounter()));
+ // Act
+ p2.reset();
+ // Check
+ EXPECT_EQ(NULL, p2.get());
+ EXPECT_EQ(1u, *(p2.get_ReferenceCounter()));
+ p4.reset();
+ // Check
+ EXPECT_EQ(NULL, p4.get());
+ EXPECT_EQ(1u, *(p4.get_ReferenceCounter()));
+}
+
+TEST(SharedPtrTest, ResetWithArgumentTest) {
+ // Arrange
+ CMockObject* object1 = new CMockObject(1);
+ CMockObject* object2 = new CMockObject(27);
+
+ EXPECT_CALL(*object1, destructor()).Times(1);
+ EXPECT_CALL(*object2, destructor()).Times(1);
+
+ tMockObjectPtr p1(object1);
+ tMockObjectPtr p3(p1);
+ tMockObjectPtr p4(p3);
+ ASSERT_EQ(1, p4->getId());
+ ASSERT_EQ(3u, *(p4.get_ReferenceCounter()));
+ // Act
+ p4.reset(object2);
+ // Check
+ EXPECT_EQ(27, (*p4).getId());
+ EXPECT_EQ(1u, *(p4.get_ReferenceCounter()));
+}
+
+TEST(SharedPtrTest, GetMethodTest_ExpectObjPointer) {
+ // Arrange
+ CMockObject* object1 = new CMockObject(1);
+ EXPECT_CALL(*object1, destructor()).Times(1);
+ tMockObjectPtr p1(object1);
+ // Check
+ ASSERT_EQ(object1, p1.get());
+}
+
+TEST(SharedPtrTest, ValidMethodTest_ExpectCorrectValidation) {
+ // Arrange
+ CMockObject* object1 = new CMockObject(1);
+ EXPECT_CALL(*object1, destructor()).Times(1);
+
+ tMockObjectPtr p1(object1);
+ tMockObjectPtr p2;
+ // Check
+ ASSERT_TRUE(p1.valid());
+ ASSERT_FALSE(p2.valid());
+}
+
+TEST(SharedPtrTest, StressTest) {
+ // Arrange
+ const size_t kNumIterations = 1024U * 1024U;
+
+ size_t objectCreated = 0U;
+ size_t pointersCopied = 0U;
+ std::vector<tMockObjectPtr> objects;
+
+ for (size_t i = 0U; i < kNumIterations; ++i) {
+ if ((true == objects.empty()) || (0 == rand() % 256)) {
+ CMockObject* object = new CMockObject(0);
+ EXPECT_CALL(*object, destructor());
+ objects.push_back(object);
+ ++objectCreated;
+ } else {
+ size_t objectIndex = static_cast<size_t>(rand()) % objects.size();
+
+ if (rand() % 2) {
+ objects.push_back(objects[objectIndex]);
+ ++pointersCopied;
+ } else {
+ objects.erase(objects.begin() + objectIndex);
+ }
+ }
+ }
+ printf("%zu objects created, %zu pointers copied\n", objectCreated,
+ pointersCopied);
+}
diff --git a/src/components/utils/test/stl_utils_test.cc b/src/components/utils/test/stl_utils_test.cc
index 62c6d9404..dfc00de98 100644
--- a/src/components/utils/test/stl_utils_test.cc
+++ b/src/components/utils/test/stl_utils_test.cc
@@ -30,6 +30,8 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
+#include <vector>
+#include <map>
#include "gtest/gtest.h"
#include "utils/stl_utils.h"
@@ -53,11 +55,11 @@ TEST(StlDeleter, DestructMapWithOneElement) {
TestMap test_map;
test_map[1] = new TestObject();
- EXPECT_EQ(1, test_map.size());
+ EXPECT_EQ(1u, test_map.size());
{
StlMapDeleter<TestMap> test_list_deleter_(&test_map);
}
- EXPECT_EQ(1, test_map.size());
+ EXPECT_EQ(1u, test_map.size());
EXPECT_EQ(NULL, test_map[1]);
}
@@ -66,11 +68,11 @@ TEST(StlDeleter, DestructMapWithSeveralElements) {
test_map[1] = new TestObject();
test_map[2] = new TestObject();
- EXPECT_EQ(2, test_map.size());
+ EXPECT_EQ(2u, test_map.size());
{
StlMapDeleter<TestMap> test_list_deleter_(&test_map);
}
- EXPECT_EQ(2, test_map.size());
+ EXPECT_EQ(2u, test_map.size());
EXPECT_EQ(NULL, test_map[1]);
EXPECT_EQ(NULL, test_map[2]);
}
@@ -79,11 +81,11 @@ TEST(StlDeleter, DestructVectorWithOneElement) {
TestVector test_vector;
test_vector.push_back(new TestObject());
- EXPECT_EQ(1, test_vector.size());
+ EXPECT_EQ(1u, test_vector.size());
{
StlCollectionDeleter<TestVector> test_list_deleter_(&test_vector);
}
- EXPECT_EQ(1, test_vector.size());
+ EXPECT_EQ(1u, test_vector.size());
EXPECT_EQ(NULL, test_vector[0]);
}
@@ -92,11 +94,11 @@ TEST(StlDeleter, DestructVectorWithSeveralElements) {
test_vector.push_back(new TestObject());
test_vector.push_back(new TestObject());
- EXPECT_EQ(2, test_vector.size());
+ EXPECT_EQ(2u, test_vector.size());
{
StlCollectionDeleter<TestVector> test_list_deleter_(&test_vector);
}
- EXPECT_EQ(2, test_vector.size());
+ EXPECT_EQ(2u, test_vector.size());
EXPECT_EQ(NULL, test_vector[0]);
EXPECT_EQ(NULL, test_vector[1]);
}
diff --git a/src/components/utils/test/test-qdb.ini b/src/components/utils/test/test-qdb.ini
new file mode 100644
index 000000000..5f8c46c0c
--- /dev/null
+++ b/src/components/utils/test/test-qdb.ini
@@ -0,0 +1,11 @@
+# This config file for QDB
+# Format see in manual of QNX
+[policy]
+Filename=policy.db
+Schema File=policy.sql
+
+[test-database]
+Filename=test-database.sqlite
+
+[test-query]
+Filename=test-query.sqlite \ No newline at end of file
diff --git a/src/components/utils/test/timer_thread_test.cc b/src/components/utils/test/timer_thread_test.cc
index be25e03b7..6a758873f 100644
--- a/src/components/utils/test/timer_thread_test.cc
+++ b/src/components/utils/test/timer_thread_test.cc
@@ -76,11 +76,10 @@ TEST_F(TimerThreadTest, StartTimerThreadWithTimeoutOneSec_ExpectSuccessfullInvok
TimerThread<TimerThreadTest> timer("Test", this, &TimerThreadTest::function,
false);
AutoLock alock(lock_);
- EXPECT_EQ(0, check_val);
- // Start timer with 1 second timeout
- timer.start(1);
+ EXPECT_EQ(0u, check_val);
+ timer.start(100);
condvar_.WaitFor(alock, wait_val);
- EXPECT_EQ(1, check_val);
+ EXPECT_EQ(1u, check_val);
}
TEST_F(TimerThreadTest, StartTimerThreadWithTimeoutOneSecInLoop_ExpectSuccessfullInvokeCallbackFuncOnEveryTimeout) {
@@ -88,9 +87,8 @@ TEST_F(TimerThreadTest, StartTimerThreadWithTimeoutOneSecInLoop_ExpectSuccessful
TimerThread<TimerThreadTest> timer("Test", this, &TimerThreadTest::function,
true);
AutoLock alock(lock_);
- EXPECT_EQ(0, check_val);
- // Start timer with 1 second timeout
- timer.start(1);
+ EXPECT_EQ(0u, check_val);
+ timer.start(100);
while (check_val < val2) {
condvar_.WaitFor(alock, wait_val);
}
@@ -103,9 +101,8 @@ TEST_F(TimerThreadTest, StopStartedTimerThreadWithTimeoutOneSecInLoop_ExpectSucc
TimerThread<TimerThreadTest> timer("Test", this, &TimerThreadTest::function,
true);
AutoLock alock(lock_);
- EXPECT_EQ(0, check_val);
- // Start timer with 1 second timeout
- timer.start(1);
+ EXPECT_EQ(0u, check_val);
+ timer.start(100);
// Stop timer on 3rd second
while (check_val < val2) {
if (check_val == val1) {
@@ -122,13 +119,12 @@ TEST_F(TimerThreadTest, ChangeTimeoutForStartedTimerThreadWithTimeoutOneSecInLoo
TimerThread<TimerThreadTest> timer("Test", this, &TimerThreadTest::function,
true);
AutoLock alock(lock_);
- EXPECT_EQ(0, check_val);
- // Start timer with 1 second timeout
- timer.start(1);
- // Change timer timeout on 3rd second
+ EXPECT_EQ(0u, check_val);
+ timer.start(100);
+ // Change timer timeout
while (check_val < val2) {
if (check_val == val1) {
- timer.updateTimeOut(2);
+ timer.updateTimeOut(200);
}
condvar_.WaitFor(alock, wait_val);
}
@@ -140,9 +136,8 @@ TEST_F(TimerThreadTest, CheckStartedTimerIsRunning_ExpectTrue) {
TimerThread<TimerThreadTest> timer("Test", this, &TimerThreadTest::function,
true);
AutoLock alock(lock_);
- EXPECT_EQ(0, check_val);
- // Start timer with 1 second timeout
- timer.start(1);
+ EXPECT_EQ(0u, check_val);
+ timer.start(100);
// Change timer timeout on 3rd second
while (check_val < val1) {
condvar_.WaitFor(alock, wait_val);