diff options
Diffstat (limited to 'src/components')
107 files changed, 2882 insertions, 2002 deletions
diff --git a/src/components/CMakeLists.txt b/src/components/CMakeLists.txt index b4063c7934..0304ce986f 100644 --- a/src/components/CMakeLists.txt +++ b/src/components/CMakeLists.txt @@ -28,38 +28,38 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -set(COMPONENTS_DIR ${CMAKE_SOURCE_DIR}/src/components) +set(COMPONENTS_DIR ${COMPONENTS_DIR} PARENT_SCOPE) -# --- HMI_API interfaces +# --- HMI, MOBILE Interfaces add_subdirectory(./interfaces) -# --- ProtocolHandler +# --- Protocol Handler add_subdirectory(./protocol) -# --- TransportManager +# --- Transport Manager add_subdirectory(./transport_manager) -# --- Policies +# --- Resumption add_subdirectory(./resumption) -# --- formatters +# --- Formatters add_subdirectory(./formatters) -# --- ProtocolHandler +# --- Protocol Handler add_subdirectory(./protocol_handler) -# --- ConnectionHandler +# --- Connection Handler add_subdirectory(./connection_handler) # --- Utils add_subdirectory(./utils) -# --- Security manager +# --- Security Manager if(ENABLE_SECURITY) add_subdirectory(./security_manager) endif() - +# --- Policy if (${EXTENDED_POLICY} STREQUAL "EXTERNAL_PROPRIETARY") add_subdirectory(./policy/policy_external/) message(STATUS "Use external policy") @@ -68,35 +68,30 @@ else() message(STATUS "Use regular policy") endif() -# --- Validated types +# --- Validated Types add_subdirectory(./rpc_base) -# --- SmartObjects +# --- Smart Objects add_subdirectory(./smart_objects) -# --- Application manager +# --- Application Manager add_subdirectory(./application_manager) # --- HMI Message Handler add_subdirectory(./hmi_message_handler) -# --- Config +# --- Config Profile add_subdirectory(./config_profile) -# --- AudioManager +# --- Media Manager add_subdirectory(./media_manager) -if (TELEMETRY_MONITOR) - add_subdirectory(./telemetry_monitor) +# --- Telemetry Monitor +if(TELEMETRY_MONITOR) + add_subdirectory(./telemetry_monitor) endif() - -if (${HMI_DBUS_API}) # --- DBus - add_subdirectory(./dbus) -endif () -if (${QT_HMI}) -# --- Qt HMI - add_subdirectory(./qt_hmi) -endif () - +if(HMI_DBUS_API) + add_subdirectory(./dbus) +endif() diff --git a/src/components/HMI/IVSU/PROPRIETARY_REQUEST~ b/src/components/HMI/IVSU/PROPRIETARY_REQUEST~ deleted file mode 100644 index e69de29bb2..0000000000 --- a/src/components/HMI/IVSU/PROPRIETARY_REQUEST~ +++ /dev/null diff --git a/src/components/application_manager/CMakeLists.txt b/src/components/application_manager/CMakeLists.txt index da68a64400..5448743136 100644 --- a/src/components/application_manager/CMakeLists.txt +++ b/src/components/application_manager/CMakeLists.txt @@ -28,6 +28,8 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/platform.cmake) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) set (AM_SOURCE_DIR ${COMPONENTS_DIR}/application_manager) set (AM_TEST_DIR ${AM_SOURCE_DIR}/test) @@ -41,23 +43,21 @@ include_directories ( ${COMPONENTS_DIR}/protocol_handler/include/ ${COMPONENTS_DIR}/smart_objects/include/ ${COMPONENTS_DIR}/hmi_message_handler/include - ${COMPONENTS_DIR}/media_manager/include/ - ${COMPONENTS_DIR}/connection_handler/include/ - ${COMPONENTS_DIR}/config_profile/include/ - ${COMPONENTS_DIR}/request_watchdog/include/ - ${COMPONENTS_DIR}/resumption/include/ - ${COMPONENTS_DIR}/app_launch/include/ - ${COMPONENTS_DIR}/rpc_base/include/ - ${COMPONENTS_DIR}/interfaces + ${COMPONENTS_DIR}/media_manager/include + ${COMPONENTS_DIR}/connection_handler/include + ${COMPONENTS_DIR}/config_profile/include + ${COMPONENTS_DIR}/request_watchdog/include + ${COMPONENTS_DIR}/resumption/include + ${COMPONENTS_DIR}/rpc_base/include ${POLICY_PATH}/include/ ${POLICY_GLOBAL_INCLUDE_PATH}/ - ${CMAKE_BINARY_DIR}/src/components/ - ${POLICY_INCLUDE_PATH}/ + ${CMAKE_BINARY_DIR}/src/components ${JSONCPP_INCLUDE_DIRECTORY} ${ENCRYPTION_INCLUDE_DIRECTORY} ${MESSAGE_BROKER_INCLUDE_DIRECTORY} ${LOG4CXX_INCLUDE_DIRECTORY} ) +MESSAGE (ERROR "${POLICY_PATH}") if (${CMAKE_SYSTEM_NAME} MATCHES "Linux") include_directories( @@ -71,48 +71,60 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "QNX") ) endif() -file (GLOB SOURCES - ${AM_SOURCE_DIR}/src/* +set (MESSAGE_HELPER_SOURCE_DIR + ${AM_SOURCE_DIR}/src/message_helper ) -set (MESSAGE_HELPER_SOURCES - ${AM_SOURCE_DIR}/src/message_helper/message_helper.cc +set (MESSAGE_HELPER_PATHS + ${MESSAGE_HELPER_SOURCE_DIR} ) +collect_sources(MESSAGE_HELPER_SOURCES "${MESSAGE_HELPER_PATHS}") -set (POLICIES_MANAGER -${AM_SOURCE_DIR}/src/policies/policy_handler.cc -${AM_SOURCE_DIR}/src/usage_statistics.cc -${AM_SOURCE_DIR}/src/policies/policy_event_observer.cc -${AM_SOURCE_DIR}/src/policies/delegates/app_permission_delegate.cc -${AM_SOURCE_DIR}/src/policies/delegates/statistics_delegate.cc + +set (POLICIES_SOURCE_DIR + ${AM_SOURCE_DIR}/src/policies ) - include_directories( - ${POLICY_PATH}/src/policy/policy_table/table_struct - ) -file (GLOB EVENT_ENGINE - ${AM_SOURCE_DIR}/src/event_engine/* +set (POLICIES_MANAGER_SOURCES + ${POLICIES_SOURCE_DIR}/policy_handler.cc + ${POLICIES_SOURCE_DIR}/policy_event_observer.cc + ${POLICIES_SOURCE_DIR}/delegates/app_permission_delegate.cc + ${POLICIES_SOURCE_DIR}/delegates/statistics_delegate.cc + ${CMAKE_CURRENT_SOURCE_DIR}/src/usage_statistics.cc ) -file (GLOB RESUMPTION - ${AM_SOURCE_DIR}/src/resumption/* +include_directories( + ${POLICY_PATH}/src/policy/policy_table/table_struct ) -file (GLOB APP_LAUNCH - ${AM_SOURCE_DIR}/src/app_launch/* +set (EVENT_ENGINE_SOURCE_DIR + ${AM_SOURCE_DIR}/src/event_engine ) +set (EVENT_ENGINE_PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include/application_manager/event_engine + ${EVENT_ENGINE_SOURCE_DIR} +) +collect_sources(EVENT_ENGINE_SOURCES "${EVENT_ENGINE_PATHS}") + set (COMMANDS_SOURCE_DIR ${AM_SOURCE_DIR}/src/commands ) +collect_sources(POLICIES_SOURCES "${POLICIES_PATHS}") -file (GLOB MOBILE_COMMANDS_SOURCES - ${COMMANDS_SOURCE_DIR}/* - ${COMMANDS_SOURCE_DIR}/mobile/* +set(MOBILE_COMMANDS_EXCLUDE_PATHS + ${COMMANDS_SOURCE_DIR}/hmi ) +set (MOBILE_COMMANDS_PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include/application_manager/commands + ${CMAKE_CURRENT_SOURCE_DIR}/include/application_manager/commands/mobile + ${COMMANDS_SOURCE_DIR} + ${COMMANDS_SOURCE_DIR}/mobile +) +collect_sources(MOBILE_COMMANDS_SOURCES "${MOBILE_COMMANDS_PATHS}" "${MOBILE_COMMANDS_EXCLUDE_PATHS}") - set (HMI_COMMANDS_SOURCES +set (HMI_COMMANDS_SOURCES ${COMMANDS_SOURCE_DIR}/hmi/request_to_hmi.cc ${COMMANDS_SOURCE_DIR}/hmi/response_from_hmi.cc ${COMMANDS_SOURCE_DIR}/hmi/request_from_hmi.cc @@ -129,8 +141,6 @@ file (GLOB MOBILE_COMMANDS_SOURCES ${COMMANDS_SOURCE_DIR}/hmi/activate_app_response.cc ${COMMANDS_SOURCE_DIR}/hmi/get_system_info_request.cc ${COMMANDS_SOURCE_DIR}/hmi/get_system_info_response.cc - ${COMMANDS_SOURCE_DIR}/hmi/decrypt_certificate_request.cc - ${COMMANDS_SOURCE_DIR}/hmi/decrypt_certificate_response.cc ${COMMANDS_SOURCE_DIR}/hmi/sdl_get_list_of_permissions_request.cc ${COMMANDS_SOURCE_DIR}/hmi/sdl_get_list_of_permissions_response.cc ${COMMANDS_SOURCE_DIR}/hmi/sdl_get_user_friendly_message_request.cc @@ -361,7 +371,20 @@ if (${HMI_DBUS_API}) set (HMI_COMMANDS_SOURCES ${HMI_COMMANDS_SOURCES} ${HMI_COMMANDS_SOURCES_DBUS}) endif (${HMI_DBUS_API}) -SET (LIBRARIES +set(EXCLUDE_PATHS + ${COMMANDS_SOURCE_DIR} + ${EVENT_ENGINE_SOURCE_DIR} + ${MESSAGE_HELPER_SOURCE_DIR} + ${POLICIES_SOURCE_DIR} +) + +set(PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src +) +collect_sources(SOURCES "${PATHS}" "${EXCLUDE_PATHS}") + +set(LIBRARIES HMI_API MOBILE_API v4_protocol_v1_2_no_extra @@ -377,15 +400,14 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Linux") list(APPEND LIBRARIES sqlite3) endif () -IF(${CMAKE_SYSTEM_NAME} MATCHES "QNX") +if (${CMAKE_SYSTEM_NAME} MATCHES "QNX") list(REMOVE_ITEM LIBRARIES dl) endif() -add_library("AMEventEngine" ${EVENT_ENGINE}) +add_library("AMEventEngine" ${EVENT_ENGINE_SOURCES}) target_link_libraries("AMEventEngine" ${LIBRARIES}) - -add_library("AMPolicyLibrary" ${POLICIES_MANAGER} ) +add_library("AMPolicyLibrary" ${POLICIES_MANAGER_SOURCES} ) target_link_libraries("AMPolicyLibrary" ${LIBRARIES} AMEventEngine) add_library("AMHMICommandsLibrary" ${HMI_COMMANDS_SOURCES}) @@ -396,18 +418,21 @@ add_library("MessageHelper" ${MESSAGE_HELPER_SOURCES}) add_library("AMMobileCommandsLibrary" ${MOBILE_COMMANDS_SOURCES} ) target_link_libraries("AMMobileCommandsLibrary" ${LIBRARIES} AMEventEngine) -add_library("ApplicationManager" ${SOURCES} ${RESUMPTION} ${APP_LAUNCH}) +add_library("ApplicationManager" ${SOURCES}) -target_link_libraries("ApplicationManager" ${LIBRARIES} AMHMICommandsLibrary - AMMobileCommandsLibrary - AMEventEngine - AMPolicyLibrary) +list(APPEND LIBRARIES + AMEventEngine + AMPolicyLibrary + AMHMICommandsLibrary + AMMobileCommandsLibrary +) if(ENABLE_LOG) - target_link_libraries("ApplicationManager" log4cxx -L${LOG4CXX_LIBS_DIRECTORY}) + list(APPEND LIBRARIES log4cxx -L${LOG4CXX_LIBS_DIRECTORY}) endif() +target_link_libraries("ApplicationManager" ${LIBRARIES}) + if(BUILD_TESTS) add_subdirectory(test) - add_subdirectory(test/message_helper) endif() diff --git a/src/components/application_manager/include/application_manager/commands/hmi/request_from_hmi.h b/src/components/application_manager/include/application_manager/commands/hmi/request_from_hmi.h index 47f4e687ce..628d3257d9 100644 --- a/src/components/application_manager/include/application_manager/commands/hmi/request_from_hmi.h +++ b/src/components/application_manager/include/application_manager/commands/hmi/request_from_hmi.h @@ -68,14 +68,24 @@ class RequestFromHMI : public CommandImpl, public event_engine::EventObserver { * @param correlation_id the correlation id for the response. * @param function_id the function id for which response will be sent * @param result_code the result code. + * @param error_message info message for error. */ void SendErrorResponse(const uint32_t correlation_id, - hmi_apis::FunctionID::eType function_id, - hmi_apis::Common_Result::eType result_code); + const hmi_apis::FunctionID::eType function_id, + const hmi_apis::Common_Result::eType result_code, + const std::string error_message); - void FillCommonParametersOfSO(smart_objects::SmartObject* message, - uint32_t correlation_id, - hmi_apis::FunctionID::eType function_id); + private: + /** + * @brief Fills common parameters for SO + * @param message Contains SO for filling + * @param correlation_id the correlation id for the response. + * @param function_id the function id for which response will be sent + */ + void FillCommonParametersOfSO( + NsSmartDeviceLink::NsSmartObjects::SmartObject& message, + const uint32_t correlation_id, + const hmi_apis::FunctionID::eType function_id); private: DISALLOW_COPY_AND_ASSIGN(RequestFromHMI); diff --git a/src/components/application_manager/include/application_manager/commands/mobile/reset_global_properties_request.h b/src/components/application_manager/include/application_manager/commands/mobile/reset_global_properties_request.h index 0053c14f3c..49e5fe34ff 100644 --- a/src/components/application_manager/include/application_manager/commands/mobile/reset_global_properties_request.h +++ b/src/components/application_manager/include/application_manager/commands/mobile/reset_global_properties_request.h @@ -108,6 +108,16 @@ class ResetGlobalPropertiesRequest : public CommandRequestImpl { application_manager::ApplicationSharedPtr const app); /* + * @brief Prepare result for sending to mobile application + * @param out_result_code contains result code for sending to mobile + * application + * @param out_response_info contains info for sending to mobile applicaion + * @return result for sending to mobile application. + */ + bool PrepareResponseParameters(mobile_apis::Result::eType& out_result_code, + std::string& out_response_info); + + /* * @brief Check if there some not delivered hmi responses exist * * @return true if all responses received @@ -124,6 +134,8 @@ class ResetGlobalPropertiesRequest : public CommandRequestImpl { hmi_apis::Common_Result::eType ui_result_; hmi_apis::Common_Result::eType tts_result_; + std::string ui_response_info_; + std::string tts_response_info_; }; } // namespace commands diff --git a/src/components/application_manager/src/app_launch/app_launch_data_json.cc b/src/components/application_manager/src/app_launch/app_launch_data_json.cc index 260dde7205..7599dcccb3 100644 --- a/src/components/application_manager/src/app_launch/app_launch_data_json.cc +++ b/src/components/application_manager/src/app_launch/app_launch_data_json.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -70,10 +70,9 @@ Json::Value& AppLaunchDataJson::GetApplicationData() const { using namespace application_manager; LOG4CXX_AUTO_TRACE(logger_); sync_primitives::AutoLock autolock(app_launch_json_lock_); - Json::Value& dictionary = last_state().dictionary; + Json::Value& dictionary = last_state().get_dictionary(); if (!dictionary.isMember(strings::app_launch)) { - last_state().dictionary[strings::app_launch] = - Json::Value(Json::objectValue); + dictionary[strings::app_launch] = Json::Value(Json::objectValue); LOG4CXX_WARN(logger_, "app_launch section is missed"); } Json::Value& app_launch = dictionary[strings::app_launch]; @@ -276,7 +275,7 @@ bool AppLaunchDataJson::DeleteOldestAppData() { bool AppLaunchDataJson::Persist() { LOG4CXX_AUTO_TRACE(logger_); sync_primitives::AutoLock autolock(app_launch_json_lock_); - last_state().SaveToFileSystem(); + last_state().SaveStateToFileSystem(); return true; } diff --git a/src/components/application_manager/src/commands/command_request_impl.cc b/src/components/application_manager/src/commands/command_request_impl.cc index 2c57773a8f..ab0a17f1fb 100644 --- a/src/components/application_manager/src/commands/command_request_impl.cc +++ b/src/components/application_manager/src/commands/command_request_impl.cc @@ -562,11 +562,11 @@ void CommandRequestImpl::RemoveDisallowedParameters() { parameters_permissions_.disallowed_params.end(); for (; it_disallowed != it_disallowed_end; ++it_disallowed) { if (params.keyExists(*it_disallowed)) { - params.erase(*it_disallowed); - removed_parameters_permissions_.disallowed_params.insert(*it_disallowed); - LOG4CXX_INFO( - logger_, - "Following parameter is disallowed by user: " << *it_disallowed); + const std::string key = *it_disallowed; + params.erase(key); + removed_parameters_permissions_.disallowed_params.insert(key); + LOG4CXX_INFO(logger_, + "Following parameter is disallowed by user: " << key); } } @@ -577,11 +577,11 @@ void CommandRequestImpl::RemoveDisallowedParameters() { parameters_permissions_.undefined_params.end(); for (; it_undefined != it_undefined_end; ++it_undefined) { if (params.keyExists(*it_undefined)) { - params.erase(*it_undefined); - removed_parameters_permissions_.undefined_params.insert(*it_undefined); - LOG4CXX_INFO( - logger_, - "Following parameter is disallowed by policy: " << *it_undefined); + const std::string key = *it_undefined; + params.erase(key); + removed_parameters_permissions_.undefined_params.insert(key); + LOG4CXX_INFO(logger_, + "Following parameter is disallowed by policy: " << key); } } diff --git a/src/components/application_manager/src/commands/hmi/navi_audio_start_stream_request.cc b/src/components/application_manager/src/commands/hmi/navi_audio_start_stream_request.cc index 1e46eab52e..0bcb26df8a 100644 --- a/src/components/application_manager/src/commands/hmi/navi_audio_start_stream_request.cc +++ b/src/components/application_manager/src/commands/hmi/navi_audio_start_stream_request.cc @@ -156,7 +156,7 @@ void AudioStartStreamRequest::RetryStartSession() { } uint32_t curr_retry_number = app->audio_stream_retry_number(); - if (curr_retry_number < retry_number_ - 1) { + if (curr_retry_number < retry_number_) { LOG4CXX_DEBUG( logger_, "Send AudioStartStream retry. retry_number = " << curr_retry_number); diff --git a/src/components/application_manager/src/commands/hmi/navi_start_stream_request.cc b/src/components/application_manager/src/commands/hmi/navi_start_stream_request.cc index 9f1c4b7902..b06c69e703 100644 --- a/src/components/application_manager/src/commands/hmi/navi_start_stream_request.cc +++ b/src/components/application_manager/src/commands/hmi/navi_start_stream_request.cc @@ -113,7 +113,7 @@ void NaviStartStreamRequest::on_event(const event_engine::Event& event) { } if (hmi_apis::Common_Result::REJECTED == code) { LOG4CXX_INFO(logger_, "StartStream response REJECTED "); - SendRequest(); + RetryStartSession(); break; } } @@ -156,7 +156,7 @@ void NaviStartStreamRequest::RetryStartSession() { } uint32_t curr_retry_number = app->video_stream_retry_number(); - if (curr_retry_number < retry_number_ - 1) { + if (curr_retry_number < retry_number_) { LOG4CXX_DEBUG( logger_, "Send NaviStartStream retry. retry_number = " << curr_retry_number); diff --git a/src/components/application_manager/src/commands/hmi/request_from_hmi.cc b/src/components/application_manager/src/commands/hmi/request_from_hmi.cc index 72469d88ce..1119e7c4fd 100644 --- a/src/components/application_manager/src/commands/hmi/request_from_hmi.cc +++ b/src/components/application_manager/src/commands/hmi/request_from_hmi.cc @@ -1,5 +1,5 @@ /* - Copyright (c) 2013, Ford Motor Company + Copyright (c) 2016, Ford Motor Company All rights reserved. Redistribution and use in source and binary forms, with or without @@ -65,9 +65,10 @@ void RequestFromHMI::SendResponse( const uint32_t correlation_id, const hmi_apis::FunctionID::eType function_id, const hmi_apis::Common_Result::eType result_code) { - smart_objects::SmartObject* message = - new smart_objects::SmartObject(smart_objects::SmartType_Map); - FillCommonParametersOfSO(message, correlation_id, function_id); + smart_objects::SmartObjectSPtr message = + ::utils::MakeShared<smart_objects::SmartObject>( + smart_objects::SmartType_Map); + FillCommonParametersOfSO(*message, correlation_id, function_id); (*message)[strings::params][strings::message_type] = MessageType::kResponse; (*message)[strings::params][hmi_response::code] = 0; (*message)[strings::msg_params][strings::success] = success; @@ -79,26 +80,28 @@ void RequestFromHMI::SendResponse( void RequestFromHMI::SendErrorResponse( const uint32_t correlation_id, const hmi_apis::FunctionID::eType function_id, - const hmi_apis::Common_Result::eType result_code) { - smart_objects::SmartObject* message = - new smart_objects::SmartObject(smart_objects::SmartType_Map); - FillCommonParametersOfSO(message, correlation_id, function_id); + const hmi_apis::Common_Result::eType result_code, + const std::string error_message) { + smart_objects::SmartObjectSPtr message = + ::utils::MakeShared<smart_objects::SmartObject>( + smart_objects::SmartType_Map); + FillCommonParametersOfSO(*message, correlation_id, function_id); (*message)[strings::params][strings::message_type] = MessageType::kErrorResponse; (*message)[strings::params][hmi_response::code] = result_code; - (*message)[strings::params][strings::error_msg] = "HMIDeactivate is active"; + (*message)[strings::params][strings::error_msg] = error_message; application_manager_.ManageHMICommand(message); } void RequestFromHMI::FillCommonParametersOfSO( - smart_objects::SmartObject* message, - uint32_t correlation_id, - hmi_apis::FunctionID::eType function_id) { - (*message)[strings::params][strings::function_id] = function_id; - (*message)[strings::params][strings::protocol_type] = hmi_protocol_type_; - (*message)[strings::params][strings::protocol_version] = protocol_version_; - (*message)[strings::params][strings::correlation_id] = correlation_id; + smart_objects::SmartObject& message, + const uint32_t correlation_id, + const hmi_apis::FunctionID::eType function_id) { + (message)[strings::params][strings::function_id] = function_id; + (message)[strings::params][strings::protocol_type] = hmi_protocol_type_; + (message)[strings::params][strings::protocol_version] = protocol_version_; + (message)[strings::params][strings::correlation_id] = correlation_id; } } // namespace commands diff --git a/src/components/application_manager/src/commands/hmi/sdl_activate_app_request.cc b/src/components/application_manager/src/commands/hmi/sdl_activate_app_request.cc index 347a3c0984..8a62ccd10a 100644 --- a/src/components/application_manager/src/commands/hmi/sdl_activate_app_request.cc +++ b/src/components/application_manager/src/commands/hmi/sdl_activate_app_request.cc @@ -153,6 +153,18 @@ void SDLActivateAppRequest::Run() { "Found application to activate. Application id is " << app_to_activate->app_id()); + if (application_manager_.state_controller().IsStateActive( + HmiState::StateID::STATE_ID_DEACTIVATE_HMI)) { + LOG4CXX_WARN(logger_, + "DeactivateHmi state is active. " + "Sends response with result code REJECTED"); + SendErrorResponse(correlation_id(), + static_cast<hmi_apis::FunctionID::eType>(function_id()), + hmi_apis::Common_Result::REJECTED, + "HMIDeactivate is active"); + return; + } + if (app_to_activate->IsRegistered()) { LOG4CXX_DEBUG(logger_, "Application is registered. Activating."); application_manager_.GetPolicyHandler().OnActivateApp(application_id, @@ -169,7 +181,8 @@ void SDLActivateAppRequest::Run() { "Can't find regular foreground app with the same " "connection id:" << device_handle); - SendResponse(false, correlation_id(), SDL_ActivateApp, NO_APPS_REGISTERED); + SendErrorResponse( + correlation_id(), SDL_ActivateApp, NO_APPS_REGISTERED, ""); return; } @@ -201,8 +214,8 @@ void SDLActivateAppRequest::onTimeOut() { using namespace hmi_apis::Common_Result; using namespace application_manager; unsubscribe_from_event(BasicCommunication_OnAppRegistered); - SendResponse( - false, correlation_id(), SDL_ActivateApp, APPLICATION_NOT_REGISTERED); + SendErrorResponse( + correlation_id(), SDL_ActivateApp, APPLICATION_NOT_REGISTERED, ""); } void SDLActivateAppRequest::on_event(const event_engine::Event& event) { diff --git a/src/components/application_manager/src/commands/mobile/create_interaction_choice_set_request.cc b/src/components/application_manager/src/commands/mobile/create_interaction_choice_set_request.cc index fa0d15252e..8876ffa2e8 100644 --- a/src/components/application_manager/src/commands/mobile/create_interaction_choice_set_request.cc +++ b/src/components/application_manager/src/commands/mobile/create_interaction_choice_set_request.cc @@ -129,23 +129,32 @@ mobile_apis::Result::eType CreateInteractionChoiceSetRequest::CheckChoiceSet( const SmartArray* choice_set = (*message_)[strings::msg_params][strings::choice_set].asArray(); - SmartArray::const_iterator choice_set_it = choice_set->begin(); + SmartArray::const_iterator current_choice_set_it = choice_set->begin(); + SmartArray::const_iterator next_choice_set_it; - for (; choice_set->end() != choice_set_it; ++choice_set_it) { + for (; choice_set->end() != current_choice_set_it; ++current_choice_set_it) { std::pair<std::set<uint32_t>::iterator, bool> ins_res = - choice_id_set.insert((*choice_set_it)[strings::choice_id].asInt()); + choice_id_set.insert( + (*current_choice_set_it)[strings::choice_id].asInt()); if (!ins_res.second) { LOG4CXX_ERROR(logger_, "Choise with ID " - << (*choice_set_it)[strings::choice_id].asInt() + << (*current_choice_set_it)[strings::choice_id].asInt() << " already exists"); return mobile_apis::Result::INVALID_ID; } - if (IsWhiteSpaceExist(*choice_set_it)) { + if (IsWhiteSpaceExist(*current_choice_set_it)) { LOG4CXX_ERROR(logger_, "Incoming choice set has contains \t\n \\t \\n"); return mobile_apis::Result::INVALID_DATA; } + for (next_choice_set_it = current_choice_set_it + 1; + choice_set->end() != next_choice_set_it; + ++next_choice_set_it) { + if (compareSynonyms(*current_choice_set_it, *next_choice_set_it)) { + return mobile_apis::Result::DUPLICATE_NAME; + } + } } return mobile_apis::Result::SUCCESS; } diff --git a/src/components/application_manager/src/commands/mobile/on_button_event_notification.cc b/src/components/application_manager/src/commands/mobile/on_button_event_notification.cc index 82836717a3..7c631d6d4b 100644 --- a/src/components/application_manager/src/commands/mobile/on_button_event_notification.cc +++ b/src/components/application_manager/src/commands/mobile/on_button_event_notification.cc @@ -94,6 +94,14 @@ void OnButtonEventNotification::Run() { return; } + if ((mobile_api::HMILevel::HMI_FULL != app->hmi_level()) && + (mobile_api::HMILevel::HMI_LIMITED != app->hmi_level())) { + LOG4CXX_WARN(logger_, + "CUSTOM_BUTTON OnButtonEvent notification is allowed only " + << "in FULL or LIMITED hmi level"); + return; + } + SendButtonEvent(app); return; } diff --git a/src/components/application_manager/src/commands/mobile/on_button_press_notification.cc b/src/components/application_manager/src/commands/mobile/on_button_press_notification.cc index c77cd9fbba..ae6658b93a 100644 --- a/src/components/application_manager/src/commands/mobile/on_button_press_notification.cc +++ b/src/components/application_manager/src/commands/mobile/on_button_press_notification.cc @@ -94,6 +94,15 @@ void OnButtonPressNotification::Run() { return; } + // Send ButtonPress notification only in HMI_FULL or HMI_LIMITED mode + if ((mobile_api::HMILevel::HMI_FULL != app->hmi_level()) && + (mobile_api::HMILevel::HMI_LIMITED != app->hmi_level())) { + LOG4CXX_WARN(logger_, + "CUSTOM_BUTTON OnButtonPress notification is allowed only " + << "in FULL or LIMITED hmi level"); + return; + } + SendButtonPress(app); return; } diff --git a/src/components/application_manager/src/commands/mobile/on_keyboard_input_notification.cc b/src/components/application_manager/src/commands/mobile/on_keyboard_input_notification.cc index 851e9f3059..427f52c12b 100644 --- a/src/components/application_manager/src/commands/mobile/on_keyboard_input_notification.cc +++ b/src/components/application_manager/src/commands/mobile/on_keyboard_input_notification.cc @@ -58,7 +58,9 @@ void OnKeyBoardInputNotification::Run() { for (; accessor.GetData().end() != it; ++it) { // if there is app with active perform interaction use it for notification ApplicationSharedPtr app = *it; - if (app->is_perform_interaction_active()) { + if (app->is_perform_interaction_active() && + (*it)->perform_interaction_layout() == + mobile_apis::LayoutMode::KEYBOARD) { LOG4CXX_INFO(logger_, "There is application with active PerformInteraction"); app_to_notify = app; diff --git a/src/components/application_manager/src/commands/mobile/perform_interaction_request.cc b/src/components/application_manager/src/commands/mobile/perform_interaction_request.cc index d094c3d80e..007440e8e6 100644 --- a/src/components/application_manager/src/commands/mobile/perform_interaction_request.cc +++ b/src/components/application_manager/src/commands/mobile/perform_interaction_request.cc @@ -205,6 +205,7 @@ void PerformInteractionRequest::Run() { app->set_perform_interaction_mode(static_cast<int32_t>(interaction_mode_)); app->set_perform_interaction_active(true); + app->set_perform_interaction_layout(interaction_layout); // increment amount of active requests ++pi_requests_count_; SendVRPerformInteractionRequest(app); diff --git a/src/components/application_manager/src/commands/mobile/reset_global_properties_request.cc b/src/components/application_manager/src/commands/mobile/reset_global_properties_request.cc index e47ed01f51..ebc0e43838 100644 --- a/src/components/application_manager/src/commands/mobile/reset_global_properties_request.cc +++ b/src/components/application_manager/src/commands/mobile/reset_global_properties_request.cc @@ -251,6 +251,7 @@ void ResetGlobalPropertiesRequest::on_event(const event_engine::Event& event) { is_ui_received_ = true; ui_result_ = static_cast<hmi_apis::Common_Result::eType>( message[strings::params][hmi_response::code].asInt()); + GetInfo(message, ui_response_info_); break; } case hmi_apis::FunctionID::TTS_SetGlobalProperties: { @@ -258,6 +259,7 @@ void ResetGlobalPropertiesRequest::on_event(const event_engine::Event& event) { is_tts_received_ = true; tts_result_ = static_cast<hmi_apis::Common_Result::eType>( message[strings::params][hmi_response::code].asInt()); + GetInfo(message, tts_response_info_); break; } default: { @@ -266,49 +268,64 @@ void ResetGlobalPropertiesRequest::on_event(const event_engine::Event& event) { } } - if (!IsPendingResponseExist()) { - bool result = - ((hmi_apis::Common_Result::SUCCESS == ui_result_) && - (hmi_apis::Common_Result::SUCCESS == tts_result_ || - hmi_apis::Common_Result::UNSUPPORTED_RESOURCE == tts_result_)) || - ((hmi_apis::Common_Result::SUCCESS == ui_result_) && - (hmi_apis::Common_Result::INVALID_ENUM == tts_result_)) || - ((hmi_apis::Common_Result::INVALID_ENUM == ui_result_) && - (hmi_apis::Common_Result::SUCCESS == tts_result_)); - - mobile_apis::Result::eType result_code; - const char* return_info = NULL; - - if (result) { - if (hmi_apis::Common_Result::UNSUPPORTED_RESOURCE == tts_result_) { - result_code = mobile_apis::Result::WARNINGS; - return_info = - std::string("Unsupported phoneme type sent in a prompt").c_str(); - } else { - result_code = static_cast<mobile_apis::Result::eType>( - std::max(ui_result_, tts_result_)); - } - } else { - result_code = static_cast<mobile_apis::Result::eType>( - std::max(ui_result_, tts_result_)); - } + if (IsPendingResponseExist()) { + LOG4CXX_DEBUG(logger_, "Waiting for remaining responses"); + return; + } - SendResponse(result, - static_cast<mobile_apis::Result::eType>(result_code), - return_info, - &(message[strings::msg_params])); + mobile_apis::Result::eType result_code = mobile_apis::Result::INVALID_ENUM; + std::string response_info; + const bool result = PrepareResponseParameters(result_code, response_info); - if (!application) { - LOG4CXX_ERROR(logger_, "NULL pointer"); - return; - } + SendResponse(result, + static_cast<mobile_apis::Result::eType>(result_code), + response_info.empty() ? NULL : response_info.c_str(), + &(message[strings::msg_params])); - if (result) { - application->UpdateHash(); - } + if (!application) { + LOG4CXX_ERROR(logger_, "NULL pointer"); + return; + } + + if (result) { + application->UpdateHash(); + } +} + +bool ResetGlobalPropertiesRequest::PrepareResponseParameters( + mobile_apis::Result::eType& out_result_code, + std::string& out_response_info) { + LOG4CXX_AUTO_TRACE(logger_); + using namespace helpers; + + bool result = false; + ResponseInfo ui_properties_info(ui_result_, HmiInterfaces::HMI_INTERFACE_UI); + ResponseInfo tts_properties_info(tts_result_, + HmiInterfaces::HMI_INTERFACE_TTS); + + HmiInterfaces::InterfaceState tts_interface_state = + application_manager_.hmi_interfaces().GetInterfaceState( + HmiInterfaces::HMI_INTERFACE_TTS); + + if (hmi_apis::Common_Result::SUCCESS == ui_result_ && + hmi_apis::Common_Result::UNSUPPORTED_RESOURCE == tts_result_ && + HmiInterfaces::STATE_AVAILABLE == tts_interface_state) { + result = true; + out_result_code = mobile_apis::Result::WARNINGS; + out_response_info = + std::string("Unsupported phoneme type sent in a prompt").c_str(); } else { - LOG4CXX_WARN(logger_, "unable to find application: " << connection_key()); + result = + PrepareResultForMobileResponse(ui_properties_info, tts_properties_info); + out_result_code = + PrepareResultCodeForResponse(ui_properties_info, tts_properties_info); + out_response_info = MergeInfos(tts_properties_info, + tts_response_info_, + ui_properties_info, + ui_response_info_); } + + return result; } bool ResetGlobalPropertiesRequest::IsPendingResponseExist() { diff --git a/src/components/application_manager/src/commands/mobile/system_request.cc b/src/components/application_manager/src/commands/mobile/system_request.cc index 0ed01e294d..74d25508e0 100644 --- a/src/components/application_manager/src/commands/mobile/system_request.cc +++ b/src/components/application_manager/src/commands/mobile/system_request.cc @@ -528,8 +528,8 @@ void SystemRequest::Run() { } if (!(mobile_apis::RequestType::HTTP == request_type && 0 == origin_file_name.compare(kIVSU))) { - LOG4CXX_DEBUG(logger_, "Binary data required. Reject"); - SendResponse(false, mobile_apis::Result::REJECTED); + LOG4CXX_DEBUG(logger_, "Binary data required. Invalid data"); + SendResponse(false, mobile_apis::Result::INVALID_DATA); return; } LOG4CXX_DEBUG(logger_, "IVSU does not require binary data. Continue"); diff --git a/src/components/application_manager/src/commands/mobile/unsubscribe_vehicle_data_request.cc b/src/components/application_manager/src/commands/mobile/unsubscribe_vehicle_data_request.cc index 6902a9d659..9b0c0a673f 100644 --- a/src/components/application_manager/src/commands/mobile/unsubscribe_vehicle_data_request.cc +++ b/src/components/application_manager/src/commands/mobile/unsubscribe_vehicle_data_request.cc @@ -1,6 +1,6 @@ /* - Copyright (c) 2013, Ford Motor Company + Copyright (c) 2017, Ford Motor Company All rights reserved. Redistribution and use in source and binary forms, with or without @@ -201,16 +201,14 @@ void UnsubscribeVehicleDataRequest::Run() { } if (is_everything_already_unsubscribed) { - mobile_apis::Result::eType result_code = - vi_already_unsubscribed_by_this_app_.size() - ? mobile_apis::Result::IGNORED - : mobile_apis::Result::SUCCESS; - - const char* info = vi_already_unsubscribed_by_this_app_.size() - ? "Already subscribed on some provided VehicleData." - : NULL; - - SendResponse(true, result_code, info, &response_params); + if (!vi_already_unsubscribed_by_this_app_.empty()) { + SendResponse(false, + mobile_apis::Result::IGNORED, + "Some provided VehicleData was not subscribed.", + &response_params); + } else { + SendResponse(true, mobile_apis::Result::SUCCESS, NULL, &response_params); + } return; } diff --git a/src/components/application_manager/src/hmi_interfaces_impl.cc b/src/components/application_manager/src/hmi_interfaces_impl.cc index 5665d0654a..8a9944bec4 100644 --- a/src/components/application_manager/src/hmi_interfaces_impl.cc +++ b/src/components/application_manager/src/hmi_interfaces_impl.cc @@ -48,10 +48,6 @@ generate_function_to_interface_convert_map() { HmiInterfaces::HMI_INTERFACE_BasicCommunication; convert_map[BasicCommunication_OnUpdateDeviceList] = HmiInterfaces::HMI_INTERFACE_BasicCommunication; - convert_map[BasicCommunication_OnPhoneCall] = - HmiInterfaces::HMI_INTERFACE_BasicCommunication; - convert_map[BasicCommunication_OnEmergencyEvent] = - HmiInterfaces::HMI_INTERFACE_BasicCommunication; convert_map[BasicCommunication_OnResumeAudioSource] = HmiInterfaces::HMI_INTERFACE_BasicCommunication; convert_map[BasicCommunication_OnSDLPersistenceComplete] = @@ -104,8 +100,6 @@ generate_function_to_interface_convert_map() { HmiInterfaces::HMI_INTERFACE_BasicCommunication; convert_map[BasicCommunication_OnIgnitionCycleOver] = HmiInterfaces::HMI_INTERFACE_BasicCommunication; - convert_map[BasicCommunication_OnDeactivateHMI] = - HmiInterfaces::HMI_INTERFACE_BasicCommunication; convert_map[BasicCommunication_OnEventChanged] = HmiInterfaces::HMI_INTERFACE_BasicCommunication; convert_map[VR_IsReady] = HmiInterfaces::HMI_INTERFACE_VR; diff --git a/src/components/application_manager/src/hmi_language_handler.cc b/src/components/application_manager/src/hmi_language_handler.cc index 7cab18ab27..4e5390a1b4 100644 --- a/src/components/application_manager/src/hmi_language_handler.cc +++ b/src/components/application_manager/src/hmi_language_handler.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -80,7 +80,8 @@ void HMILanguageHandler::set_language_for( LOG4CXX_DEBUG(logger_, "Setting language " << language << " for interface " << interface); - last_state_->dictionary[LanguagesKey][key] = language; + Json::Value& dictionary = last_state_->get_dictionary(); + dictionary[LanguagesKey][key] = language; return; } @@ -105,10 +106,11 @@ hmi_apis::Common_Language::eType HMILanguageHandler::get_language_for( return Common_Language::INVALID_ENUM; } - if (last_state_->dictionary.isMember(LanguagesKey)) { - if (last_state_->dictionary[LanguagesKey].isMember(key)) { + const Json::Value& dictionary = last_state_->get_dictionary(); + if (dictionary.isMember(LanguagesKey)) { + if (dictionary[LanguagesKey].isMember(key)) { Common_Language::eType language = static_cast<Common_Language::eType>( - last_state_->dictionary[LanguagesKey][key].asInt()); + dictionary[LanguagesKey][key].asInt()); return language; } } diff --git a/src/components/application_manager/src/hmi_state.cc b/src/components/application_manager/src/hmi_state.cc index 80628f9f33..1f05232476 100644 --- a/src/components/application_manager/src/hmi_state.cc +++ b/src/components/application_manager/src/hmi_state.cc @@ -175,7 +175,7 @@ mobile_apis::HMILevel::eType AudioSource::hmi_level() const { HMILevel::HMI_NONE)) { return parent()->hmi_level(); } - if (is_navi_app(app_id_)) { + if (is_navi_app(app_id_) || is_voice_communication_app(app_id_)) { return HMILevel::HMI_LIMITED; } return HMILevel::HMI_BACKGROUND; diff --git a/src/components/application_manager/src/resumption/resumption_data_json.cc b/src/components/application_manager/src/resumption/resumption_data_json.cc index f60f934fef..7866fc4de1 100644 --- a/src/components/application_manager/src/resumption/resumption_data_json.cc +++ b/src/components/application_manager/src/resumption/resumption_data_json.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -372,10 +372,9 @@ Json::Value& ResumptionDataJson::GetResumptionData() const { using namespace app_mngr; LOG4CXX_AUTO_TRACE(logger_); sync_primitives::AutoLock autolock(resumption_lock_); - Json::Value& dictionary = last_state().dictionary; + Json::Value& dictionary = last_state().get_dictionary(); if (!dictionary.isMember(strings::resumption)) { - last_state().dictionary[strings::resumption] = - Json::Value(Json::objectValue); + dictionary[strings::resumption] = Json::Value(Json::objectValue); LOG4CXX_WARN(logger_, "resumption section is missed"); } Json::Value& resumption = dictionary[strings::resumption]; @@ -481,7 +480,7 @@ bool ResumptionDataJson::DropAppDataResumption(const std::string& device_id, } void ResumptionDataJson::Persist() { - last_state().SaveToFileSystem(); + last_state().SaveStateToFileSystem(); } } // resumption diff --git a/src/components/application_manager/test/CMakeLists.txt b/src/components/application_manager/test/CMakeLists.txt index a7f5d8b243..84354d3f5b 100644 --- a/src/components/application_manager/test/CMakeLists.txt +++ b/src/components/application_manager/test/CMakeLists.txt @@ -28,44 +28,46 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/platform.cmake) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) + # TODO{ALeshin}: APPLINK-10792. Do not write tests which use # application manager(AM) singleton while refactoring of AM is finished. -if (BUILD_TESTS) - - include_directories( - ${GMOCK_INCLUDE_DIRECTORY} - ${CMAKE_BINARY_DIR}/src/components/ - ${COMPONENTS_DIR}/application_manager/include/ - ${COMPONENTS_DIR}/utils/include/ - ${COMPONENTS_DIR}/resumption/include/ - ${COMPONENTS_DIR}/utils/include/ - ${POLICY_PATH}/include/ - ${COMPONENTS_DIR}/media_manager/include/ - ${COMPONENTS_DIR}/security_manager/include/ - ${POLICY_PATH}/policy/test/include/ - ${POLICY_MOCK_INCLUDE_PATH}/ - ${COMPONENTS_DIR}/application_manager/test/include/ - ) - - set(testSources - ${AM_TEST_DIR}/mobile_message_handler_test.cc - ${AM_TEST_DIR}/mobile_message_handler_v1_test.cc - ${AM_TEST_DIR}/request_info_test.cc - ${AM_TEST_DIR}/request_tracker_test.cc - ${AM_TEST_DIR}/resumption_sql_queries_test.cc - ${AM_TEST_DIR}/event_engine_test.cc - ${AM_TEST_DIR}/policy_event_observer_test.cc - ${AM_TEST_DIR}/application_impl_test.cc - ${AM_TEST_DIR}/hmi_capabilities_test.cc - ${AM_TEST_DIR}/application_state_test.cc - ${AM_TEST_DIR}/usage_statistics_test.cc - ${AM_TEST_DIR}/policy_handler_test.cc - ${AM_TEST_DIR}/mock_message_helper.cc - ) - set (request_controller_SOURCES - ${AM_TEST_DIR}/request_controller/request_controller_test.cc - ) +include_directories( + ${GMOCK_INCLUDE_DIRECTORY} + ${CMAKE_BINARY_DIR}/src/components/ + ${COMPONENTS_DIR}/application_manager/include/ + ${COMPONENTS_DIR}/utils/include/ + ${COMPONENTS_DIR}/resumption/include/ + ${COMPONENTS_DIR}/utils/include/ + ${POLICY_PATH}/include/ + ${POLICY_PATH}/policy/test/include/ + ${POLICY_MOCK_INCLUDE_PATH}/ + ${COMPONENTS_DIR}/media_manager/include/ + ${COMPONENTS_DIR}/security_manager/include/ + ${COMPONENTS_DIR}/policy/test/include/ + ${COMPONENTS_DIR}/application_manager/test/include/ +) + +set(testSources + ${AM_TEST_DIR}/mobile_message_handler_test.cc + ${AM_TEST_DIR}/mobile_message_handler_v1_test.cc + ${AM_TEST_DIR}/request_info_test.cc + ${AM_TEST_DIR}/resumption_sql_queries_test.cc + ${AM_TEST_DIR}/event_engine_test.cc + ${AM_TEST_DIR}/policy_event_observer_test.cc + ${AM_TEST_DIR}/application_impl_test.cc + ${AM_TEST_DIR}/hmi_capabilities_test.cc + ${AM_TEST_DIR}/application_state_test.cc + ${AM_TEST_DIR}/usage_statistics_test.cc + ${AM_TEST_DIR}/policy_handler_test.cc + ${AM_TEST_DIR}/mock_message_helper.cc +) + +set(request_controller_SOURCES + ${AM_TEST_DIR}/request_controller/request_controller_test.cc +) set(testLibraries ApplicationManager @@ -106,72 +108,73 @@ set(test_exec_libraries Resumption ) -IF(${CMAKE_SYSTEM_NAME} MATCHES "QNX") +if (${CMAKE_SYSTEM_NAME} MATCHES "QNX") + list(REMOVE_ITEM test_exec_libraries dl) +endif() + +set(testLibraries + Utils + ApplicationManager + jsoncpp + Policy + connectionHandler + HMI_API + MOBILE_API + v4_protocol_v1_2_no_extra + SmartObjects + formatters + gmock_main + UsageStatistics + dl + ProtocolLibrary + ConfigProfile + MediaManager + Resumption + ProtocolHandler + SecurityManager +) + +if (${CMAKE_SYSTEM_NAME} MATCHES "QNX") list(REMOVE_ITEM test_exec_libraries dl) endif() - set(testLibraries - Utils - ApplicationManager - jsoncpp - Policy - connectionHandler - HMI_API - MOBILE_API - v4_protocol_v1_2_no_extra - SmartObjects - formatters - gmock_main - UsageStatistics - dl - ProtocolLibrary - ConfigProfile - MediaManager - Resumption - ProtocolHandler - SecurityManager - ) - - if (${CMAKE_SYSTEM_NAME} MATCHES "QNX") - list(REMOVE_ITEM test_exec_libraries dl) - endif() - - if (ENABLE_LOG) - list(APPEND LIBRARIES log4cxx -L${LOG4CXX_LIBS_DIRECTORY}) - list(APPEND LIBRARIES apr-1 -L${APR_LIBS_DIRECTORY}) - list(APPEND LIBRARIES aprutil-1 -L${APR_UTIL_LIBS_DIRECTORY}) - list(APPEND LIBRARIES expat -L${EXPAT_LIBS_DIRECTORY}) - endif() - - file(COPY smartDeviceLink_test2.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) - file(COPY sdl_preloaded_pt.json DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) - file(COPY sdl_pt_update.json DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) +if (ENABLE_LOG) + list(APPEND LIBRARIES log4cxx -L${LOG4CXX_LIBS_DIRECTORY}) + list(APPEND LIBRARIES apr-1 -L${APR_LIBS_DIRECTORY}) + list(APPEND LIBRARIES aprutil-1 -L${APR_UTIL_LIBS_DIRECTORY}) + list(APPEND LIBRARIES expat -L${EXPAT_LIBS_DIRECTORY}) +endif() + +file(COPY smartDeviceLink_test2.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) +file(COPY sdl_preloaded_pt.json DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) +file(COPY sdl_pt_update.json DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) add_custom_command( -OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/libPolicy.so - COMMAND ${CMAKE_COMMAND} -E - copy ${POLICY_PATH}/libPolicy.so ${CMAKE_CURRENT_BINARY_DIR}) - set(CMAKE_EXE_LINKER_FLAGS - "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath=${CMAKE_CURRENT_BINARY_DIR}") - create_test("application_manager_test" "${testSources}" "${testLibraries}" ) + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/libPolicy.so + COMMAND ${CMAKE_COMMAND} -E + copy ${POLICY_PATH}/libPolicy.so ${CMAKE_CURRENT_BINARY_DIR} +) +set(CMAKE_EXE_LINKER_FLAGS + "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath=${CMAKE_CURRENT_BINARY_DIR}" +) +create_test("application_manager_test" "${testSources}" "${testLibraries}") + # TODO [AKozoriz] : Fix not buildable tests - set(ResumptionData_SOURCES - ${AM_TEST_DIR}/resumption/resumption_data_test.cc - ${AM_TEST_DIR}/resumption/resumption_data_db_test.cc - ${AM_TEST_DIR}/resumption/resumption_data_json_test.cc - ${AM_TEST_DIR}/resumption/resume_ctrl_test.cc - ${AM_TEST_DIR}/mock_message_helper.cc - ) - - file(COPY hmi_capabilities.json DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) - file(COPY smartDeviceLink_test.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) - - file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/resumption) - file(COPY smartDeviceLink_test.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/resumption) - create_test("resumption/data_resumption_test" "${ResumptionData_SOURCES}" "${testLibraries}") - - add_subdirectory(state_controller) -endif() +set(ResumptionData_SOURCES + ${AM_TEST_DIR}/resumption/resumption_data_test.cc + ${AM_TEST_DIR}/resumption/resumption_data_db_test.cc + ${AM_TEST_DIR}/resumption/resumption_data_json_test.cc + ${AM_TEST_DIR}/resumption/resume_ctrl_test.cc + ${AM_TEST_DIR}/mock_message_helper.cc +) + +file(COPY hmi_capabilities.json DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) +file(COPY smartDeviceLink_test.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + +file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/resumption) +file(COPY smartDeviceLink_test.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/resumption) +create_test("resumption/data_resumption_test" "${ResumptionData_SOURCES}" "${testLibraries}") +add_subdirectory(state_controller) add_subdirectory(app_launch) add_subdirectory(commands) diff --git a/src/components/application_manager/test/app_launch/app_launch_data_json_test.cc b/src/components/application_manager/test/app_launch/app_launch_data_json_test.cc index 6b00365dd3..cc7d3f5814 100644 --- a/src/components/application_manager/test/app_launch/app_launch_data_json_test.cc +++ b/src/components/application_manager/test/app_launch/app_launch_data_json_test.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -39,7 +39,7 @@ #include "utils/make_shared.h" #include "utils/file_system.h" #include "utils/date_time.h" -#include "resumption/last_state.h" +#include "resumption/last_state_impl.h" #include "smart_objects/smart_object.h" #include "application_manager/smart_object_keys.h" #include "application_manager/mock_app_launch_settings.h" @@ -68,7 +68,7 @@ class AppLaunchDataJsonTest : public ::testing::Test { virtual void SetUp() { ::file_system::DeleteFile(kAppStorageFile); test_last_state_ = std::auto_ptr<resumption::LastState>( - new resumption::LastState(kAppStorageFolder, kAppInfoStorage)); + new resumption::LastStateImpl(kAppStorageFolder, kAppInfoStorage)); ASSERT_TRUE(::file_system::CreateFile(kAppStorageFile)); NiceMock<app_launch_test::MockAppLaunchSettings> mock_app_launch_settings_; diff --git a/src/components/application_manager/test/commands/CMakeLists.txt b/src/components/application_manager/test/commands/CMakeLists.txt index 068823fcfa..e5a083b5b2 100644 --- a/src/components/application_manager/test/commands/CMakeLists.txt +++ b/src/components/application_manager/test/commands/CMakeLists.txt @@ -28,7 +28,7 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -include(sources) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories( ${GMOCK_INCLUDE_DIRECTORY} diff --git a/src/components/application_manager/test/commands/mobile/add_command_request_test.cc b/src/components/application_manager/test/commands/mobile/add_command_request_test.cc index 78a6aa2f4d..567c3d32f9 100644 --- a/src/components/application_manager/test/commands/mobile/add_command_request_test.cc +++ b/src/components/application_manager/test/commands/mobile/add_command_request_test.cc @@ -57,285 +57,1055 @@ namespace mobile_commands_test { namespace add_command_request { namespace am = application_manager; - -using am::commands::AddCommandRequest; using am::commands::CommandImpl; using am::ApplicationManager; using am::commands::MessageSharedPtr; using am::ApplicationSharedPtr; using am::MockMessageHelper; using am::MockHmiInterfaces; - using ::testing::_; -using ::testing::Mock; -using ::testing::Return; -using ::testing::ReturnRef; using ::utils::SharedPtr; +using ::testing::Return; +using ::testing::Mock; +using ::testing::InSequence; +using am::commands::AddCommandRequest; +using NsSmartDeviceLink::NsSmartObjects::SmartObjectSPtr; using ::test::components::application_manager_test::MockApplication; +using am::event_engine::EventObserver; +using namespace smart_objects; namespace custom_str = utils::custom_string; namespace strings = ::application_manager::strings; +namespace mobile_result = mobile_apis::Result; namespace hmi_response = ::application_manager::hmi_response; +namespace hmi_request = ::application_manager::hmi_request; +using namespace strings; namespace { -const int32_t kCommandId = 1; +const hmi_apis::FunctionID::eType kInvalidFunctionId = + hmi_apis::FunctionID::INVALID_ENUM; const uint32_t kAppId = 1u; const uint32_t kCmdId = 1u; const uint32_t kConnectionKey = 2u; +const std::string kMenuName = "LG"; +const uint32_t kFirstParentId = 10u; +const uint32_t kSecondParentId = 1u; +const std::string kErroredVRCommand = "l\namer"; +const std::string kFirstVrCommand = "lamer"; +const std::string kSecondVrCommand = "hacker"; +const uint32_t kFirstCommandId = 10u; +const uint32_t kSecondCommandId = 11u; +const int32_t kType = 34; +const int32_t kGrammarId = 12; +const int32_t kPosition = 10; } // namespace class AddCommandRequestTest : public CommandRequestTest<CommandsTestMocks::kIsNice> { public: AddCommandRequestTest() - : mock_message_helper_(*MockMessageHelper::message_helper_mock()) - , mock_app_(CreateMockApp()) {} + : msg_(CreateMessage()) + , default_app_name_("test_default_app_name_") + , mock_message_helper_(*MockMessageHelper::message_helper_mock()) + , mock_app_(CreateMockApp()) { + Mock::VerifyAndClearExpectations(&mock_message_helper_); + EXPECT_CALL(app_mngr_, application(kConnectionKey)) + .WillRepeatedly(Return(mock_app_)); + InitGetters(); + InitBasicMessage(); + } + + ~AddCommandRequestTest() { + Mock::VerifyAndClearExpectations(&mock_message_helper_); + } protected: - MessageSharedPtr CreateFullParamsVRSO() { - MessageSharedPtr msg = CreateMessage(smart_objects::SmartType_Map); - (*msg)[strings::params][strings::connection_key] = kConnectionKey; - smart_objects::SmartObject msg_params = - smart_objects::SmartObject(smart_objects::SmartType_Map); - msg_params[strings::cmd_id] = kCmdId; - msg_params[strings::vr_commands] = - smart_objects::SmartObject(smart_objects::SmartType_Array); - msg_params[strings::vr_commands][0] = "lamer"; - msg_params[strings::type] = 34; - msg_params[strings::grammar_id] = 12; - msg_params[strings::app_id] = kAppId; - (*msg)[strings::msg_params] = msg_params; - - return msg; + void InitBasicMessage() { + (*msg_)[params][connection_key] = kConnectionKey; + (*msg_)[msg_params][app_id] = kAppId; + (*msg_)[msg_params][app_name] = default_app_name_; } - MessageSharedPtr CreateFullParamsUISO() { - MessageSharedPtr msg = CreateMessage(smart_objects::SmartType_Map); - (*msg)[am::strings::params][am::strings::connection_key] = kConnectionKey; - smart_objects::SmartObject menu_params = - smart_objects::SmartObject(smart_objects::SmartType_Map); - menu_params[am::strings::position] = 10; - menu_params[am::strings::menu_name] = "LG"; - - smart_objects::SmartObject msg_params = - smart_objects::SmartObject(smart_objects::SmartType_Map); - msg_params[am::strings::cmd_id] = kCmdId; - msg_params[am::strings::menu_params] = menu_params; - msg_params[am::strings::app_id] = kAppId; - msg_params[am::strings::cmd_icon] = 1; - msg_params[am::strings::cmd_icon][am::strings::value] = "10"; - (*msg)[am::strings::msg_params] = msg_params; - - return msg; + void InitGetters() { + ON_CALL(*mock_app_, app_id()).WillByDefault(Return(kAppId)); + ON_CALL(*mock_app_, FindCommand(kCmdId)) + .WillByDefault(Return(so_ptr_.get())); } - MessageSharedPtr CreateParamsUISOWithOutCmdIcon() { - MessageSharedPtr msg = CreateMessage(smart_objects::SmartType_Map); - (*msg)[am::strings::params][am::strings::connection_key] = kConnectionKey; - smart_objects::SmartObject menu_params = - smart_objects::SmartObject(smart_objects::SmartType_Map); - menu_params[am::strings::position] = 10; - menu_params[am::strings::menu_name] = "LG"; - - smart_objects::SmartObject msg_params = - smart_objects::SmartObject(smart_objects::SmartType_Map); - msg_params[am::strings::cmd_id] = kCmdId; - msg_params[am::strings::menu_params] = menu_params; - msg_params[am::strings::app_id] = kAppId; - (*msg)[am::strings::msg_params] = msg_params; - - return msg; + void CreateBasicParamsUIRequest() { + SmartObject menu_params = SmartObject(SmartType_Map); + menu_params[position] = kPosition; + menu_params[menu_name] = kMenuName; + SmartObject& msg_params = (*msg_)[strings::msg_params]; + msg_params[cmd_id] = kCmdId; + msg_params[strings::menu_params] = menu_params; + msg_params[cmd_icon] = 1; + msg_params[cmd_icon][value] = "10"; + msg_params[info] = "UI info"; } - void SetUp() OVERRIDE { - ON_CALL(app_mngr_, application(kConnectionKey)) - .WillByDefault(Return(mock_app_)); - ON_CALL(*mock_app_, app_id()).WillByDefault(Return(kConnectionKey)); - ON_CALL(app_mngr_, hmi_interfaces()) - .WillByDefault(ReturnRef(hmi_interfaces_)); + void CreateBasicParamsVRRequest() { + SmartObject& msg_params = (*msg_)[strings::msg_params]; + msg_params[cmd_id] = kCmdId; + msg_params[vr_commands] = SmartObject(SmartType_Array); + msg_params[vr_commands][0] = kFirstVrCommand; + msg_params[type] = kPosition; + msg_params[grammar_id] = kGrammarId; + msg_params[info] = "VR info"; } - void TearDown() OVERRIDE { - Mock::VerifyAndClearExpectations(&mock_message_helper_); + const am::CommandsMap CreateCommandsMap(SmartObject& first_command, + SmartObject& second_command) { + second_command[menu_params] = SmartObject(SmartType_Map); + second_command[menu_params][hmi_request::parent_id] = kFirstParentId; + second_command[menu_params][menu_name] = kMenuName; + second_command[vr_commands] = SmartObject(SmartType_Array); + second_command[vr_commands][0] = kSecondVrCommand; + am::CommandsMap commands_map; + commands_map.insert(std::make_pair(kFirstCommandId, &first_command)); + commands_map.insert(std::make_pair(kSecondCommandId, &second_command)); + return commands_map; } - void ResultCommandExpectations(MessageSharedPtr msg, - const std::string& info) { - EXPECT_EQ((*msg)[am::strings::msg_params][am::strings::success].asBool(), - true); - EXPECT_EQ( - (*msg)[am::strings::msg_params][am::strings::result_code].asInt(), - static_cast<int32_t>(hmi_apis::Common_Result::UNSUPPORTED_RESOURCE)); - EXPECT_EQ((*msg)[am::strings::msg_params][am::strings::info].asString(), - info); + void CheckOnTimeOutCommandDeletion( + const hmi_apis::FunctionID::eType incoming_cmd, + const hmi_apis::FunctionID::eType cmd_to_delete) { + CreateBasicParamsVRRequest(); + CreateBasicParamsUIRequest(); + SmartObject& msg_params = (*msg_)[strings::msg_params]; + msg_params[menu_params][hmi_request::parent_id] = kSecondParentId; + SmartObject& image = msg_params[cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + EXPECT_CALL(*mock_app_, FindCommand(kCmdId)) + .WillOnce(Return(so_ptr_.get())); + SmartObject first_command = SmartObject(SmartType_Map); + SmartObject second_command = SmartObject(SmartType_Map); + const am::CommandsMap commands_map = + CreateCommandsMap(first_command, second_command); + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return(DataAccessor<application_manager::CommandsMap>( + commands_map, lock_))); + so_ptr_ = utils::MakeShared<SmartObject>(SmartType_Map); + EXPECT_CALL(*mock_app_, FindSubMenu(kSecondParentId)) + .WillOnce(Return(so_ptr_.get())); + { + InSequence dummy; + EXPECT_CALL(app_mngr_, + ManageHMICommand( + HMIResultCodeIs(hmi_apis::FunctionID::UI_AddCommand))) + .WillOnce(Return(true)); + EXPECT_CALL(app_mngr_, + ManageHMICommand( + HMIResultCodeIs(hmi_apis::FunctionID::VR_AddCommand))) + .WillOnce(Return(true)); + } + EXPECT_CALL(app_mngr_, ManageMobileCommand(_, _)).Times(0); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); + Event event(incoming_cmd); + event.set_smart_object(*msg_); + request_ptr->on_event(event); + EXPECT_CALL(*mock_app_, RemoveCommand(kCmdId)); + EXPECT_CALL(app_mngr_, ManageHMICommand(HMIResultCodeIs(cmd_to_delete))) + .WillOnce(Return(true)); + SmartObjectSPtr response; + EXPECT_CALL( + mock_message_helper_, + CreateNegativeResponse(_, _, _, mobile_apis::Result::GENERIC_ERROR)) + .WillOnce(Return(response)); + EXPECT_CALL( + app_mngr_, + ManageMobileCommand(response, + am::commands::Command::CommandOrigin::ORIGIN_SDL)); + utils::SharedPtr<CommandRequestImpl> base_class_request = + static_cast<utils::SharedPtr<CommandRequestImpl> >(request_ptr); + base_class_request->onTimeOut(); } + MessageSharedPtr msg_; + SmartObjectSPtr so_ptr_; + const utils::custom_string::CustomString default_app_name_; + am::MockMessageHelper& mock_message_helper_; sync_primitives::Lock lock_; - NiceMock<MockHmiInterfaces> hmi_interfaces_; - MockMessageHelper& mock_message_helper_; MockAppPtr mock_app_; }; -TEST_F(AddCommandRequestTest, OnTimeout_GENERIC_ERROR) { - MessageSharedPtr msg = CreateMessage(smart_objects::SmartType_Map); - (*msg)[strings::msg_params][strings::result_code] = - am::mobile_api::Result::GENERIC_ERROR; - (*msg)[strings::msg_params][strings::success] = false; - (*msg)[strings::params][strings::connection_key] = kConnectionKey; +TEST_F(AddCommandRequestTest, Run_AppNotExisted_EXPECT_AppNotRegistered) { + CreateBasicParamsUIRequest(); + EXPECT_CALL(app_mngr_, application(kConnectionKey)) + .WillOnce(Return(ApplicationSharedPtr())); + EXPECT_CALL( + app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_result::APPLICATION_NOT_REGISTERED), _)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); +} + +TEST_F(AddCommandRequestTest, Run_ImageVerificationFailed_EXPECT_INVALID_DATA) { + CreateBasicParamsUIRequest(); + SmartObject& msg_params = (*msg_)[strings::msg_params]; + SmartObject& image = msg_params[cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::INVALID_DATA)); + EXPECT_CALL(app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::INVALID_DATA), _)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); +} + +TEST_F(AddCommandRequestTest, Run_MenuNameHasSyntaxError_EXPECT_INVALID_DATA) { + CreateBasicParamsUIRequest(); + SmartObject& msg_params = (*msg_)[strings::msg_params]; + msg_params[menu_params][hmi_request::parent_id] = kFirstParentId; + const std::string errored_menu_name = "L\nG"; + msg_params[menu_params][menu_name] = errored_menu_name; + SmartObject& image = msg_params[cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + EXPECT_CALL(*mock_app_, FindCommand(kCmdId)).WillOnce(Return(so_ptr_.get())); + am::CommandsMap commands_map; + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); + SmartObject parent = SmartObject(SmartType_Map); + EXPECT_CALL(*mock_app_, FindSubMenu(kFirstParentId)) + .WillOnce(Return(&parent)); + EXPECT_CALL(app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::INVALID_DATA), _)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); +} + +TEST_F(AddCommandRequestTest, + Run_VRCommandsHaveSyntaxError_EXPECT_INVALID_DATA) { + CreateBasicParamsVRRequest(); + SmartObject& msg_params = (*msg_)[strings::msg_params]; + msg_params[vr_commands][0] = kErroredVRCommand; + EXPECT_CALL(*mock_app_, FindCommand(kCmdId)).WillOnce(Return(so_ptr_.get())); + am::CommandsMap commands_map; + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); + EXPECT_CALL(app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::INVALID_DATA), _)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); +} - utils::SharedPtr<AddCommandRequest> command = +TEST_F(AddCommandRequestTest, Run_CMDIconHasError_EXPECT_INVALID_DATA) { + MessageSharedPtr msg = CreateMessage(); + SmartObject& msg_params = (*msg)[strings::msg_params]; + (*msg)[params][connection_key] = kConnectionKey; + msg_params[cmd_id] = kCmdId; + msg_params[cmd_icon] = 1; + const std::string errored_cmd_icon_value = "1\n0"; + msg_params[cmd_icon][value] = errored_cmd_icon_value; + msg_params[vr_commands][0] = kFirstVrCommand; + SmartObject& image = msg_params[cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + EXPECT_CALL(*mock_app_, FindCommand(kCmdId)).WillOnce(Return(so_ptr_.get())); + am::CommandsMap commands_map; + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); + EXPECT_CALL(app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::INVALID_DATA), _)); + utils::SharedPtr<AddCommandRequest> request_ptr = CreateCommand<AddCommandRequest>(msg); + request_ptr->Run(); +} - ON_CALL(*mock_app_, get_grammar_id()).WillByDefault(Return(kConnectionKey)); - ON_CALL(*mock_app_, RemoveCommand(_)).WillByDefault(Return()); +TEST_F(AddCommandRequestTest, Run_CommandIDAlreadyExists_EXPECT_INVALID_ID) { + CreateBasicParamsUIRequest(); + SmartObject& msg_params = (*msg_)[strings::msg_params]; + SmartObject& image = msg_params[cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + so_ptr_ = utils::MakeShared<SmartObject>(SmartType_Map); + EXPECT_CALL(*mock_app_, FindCommand(kCmdId)).WillOnce(Return(so_ptr_.get())); + EXPECT_CALL(app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::INVALID_ID), _)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); +} - EXPECT_CALL( - mock_message_helper_, - CreateNegativeResponse(_, _, _, am::mobile_api::Result::GENERIC_ERROR)) - .WillOnce(Return(msg)); +TEST_F(AddCommandRequestTest, + Run_CommandNameAlreadyExists_EXPECT_DUPLICATE_NAME) { + CreateBasicParamsUIRequest(); + SmartObject& msg_params = (*msg_)[strings::msg_params]; + msg_params[menu_params][hmi_request::parent_id] = kFirstParentId; + SmartObject& image = msg_params[cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + EXPECT_CALL(*mock_app_, FindCommand(kCmdId)).WillOnce(Return(so_ptr_.get())); + SmartObject first_command = SmartObject(SmartType_Map); + SmartObject second_command = SmartObject(SmartType_Map); + const am::CommandsMap commands_map = + CreateCommandsMap(first_command, second_command); + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); + EXPECT_CALL(app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::DUPLICATE_NAME), _)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); +} + +TEST_F(AddCommandRequestTest, + Run_CmdAndMsgParentIDsAreDifferentSubmenuNotExisted_EXPECT_INVALID_ID) { + CreateBasicParamsUIRequest(); + SmartObject& msg_params = (*msg_)[strings::msg_params]; + msg_params[menu_params][hmi_request::parent_id] = kSecondParentId; + SmartObject& image = msg_params[cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + EXPECT_CALL(*mock_app_, FindCommand(kCmdId)).WillOnce(Return(so_ptr_.get())); + SmartObject first_command = SmartObject(SmartType_Map); + SmartObject second_command = SmartObject(SmartType_Map); + const am::CommandsMap commands_map = + CreateCommandsMap(first_command, second_command); + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); + EXPECT_CALL(*mock_app_, FindSubMenu(kSecondParentId)) + .WillOnce(Return(so_ptr_.get())); + EXPECT_CALL(app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::INVALID_ID), _)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); +} + +TEST_F(AddCommandRequestTest, + Run_CmdAndMsgVrSynonymsAreTheSame_EXPECT_DUPLICATE_NAME) { + CreateBasicParamsVRRequest(); + SmartObject& msg_params = (*msg_)[strings::msg_params]; + msg_params[menu_params][hmi_request::parent_id] = kSecondParentId; + msg_params[vr_commands][0] = kSecondVrCommand; + SmartObject& image = msg_params[cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + EXPECT_CALL(*mock_app_, FindCommand(kCmdId)).WillOnce(Return(so_ptr_.get())); - MessageSharedPtr command_result; + SmartObject first_command = SmartObject(SmartType_Map); + SmartObject second_command = SmartObject(SmartType_Map); + const am::CommandsMap commands_map = + CreateCommandsMap(first_command, second_command); + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); + so_ptr_ = utils::MakeShared<SmartObject>(SmartType_Map); + EXPECT_CALL(*mock_app_, FindSubMenu(kSecondParentId)) + .WillOnce(Return(so_ptr_.get())); + EXPECT_CALL(app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::DUPLICATE_NAME), _)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); +} + +TEST_F(AddCommandRequestTest, Run_MsgDataEmpty_EXPECT_INVALID_DATA) { + MessageSharedPtr msg = CreateMessage(); + (*msg)[params][connection_key] = kConnectionKey; + SmartObject& msg_params = (*msg)[strings::msg_params]; + msg_params[app_id] = kAppId; + msg_params[cmd_id] = kCmdId; + EXPECT_CALL(*mock_app_, FindCommand(kCmdId)).WillOnce(Return(so_ptr_.get())); + EXPECT_CALL(app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::INVALID_DATA), _)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg); + request_ptr->Run(); +} + +TEST_F(AddCommandRequestTest, + Run_CmdAndMsg_UI_and_Vr_AreCorrect_EXPECT_VR_AND_UI_SENT) { + CreateBasicParamsVRRequest(); + CreateBasicParamsUIRequest(); + SmartObject& msg_params = (*msg_)[strings::msg_params]; + msg_params[menu_params][hmi_request::parent_id] = kSecondParentId; + SmartObject& image = msg_params[cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + EXPECT_CALL(*mock_app_, FindCommand(kCmdId)).WillOnce(Return(so_ptr_.get())); + SmartObject first_command = SmartObject(SmartType_Map); + SmartObject second_command = SmartObject(SmartType_Map); + const am::CommandsMap commands_map = + CreateCommandsMap(first_command, second_command); + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); + so_ptr_ = utils::MakeShared<SmartObject>(SmartType_Map); + EXPECT_CALL(*mock_app_, FindSubMenu(kSecondParentId)) + .WillOnce(Return(so_ptr_.get())); + { + InSequence dummy; + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::UI_AddCommand))) + .WillOnce(Return(true)); + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::VR_AddCommand))) + .WillOnce(Return(true)); + } + EXPECT_CALL(app_mngr_, ManageMobileCommand(_, _)).Times(0); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); +} + +TEST_F(AddCommandRequestTest, GetRunMethods_SUCCESS) { + CreateBasicParamsUIRequest(); + SmartObject& image = (*msg_)[msg_params][cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + EXPECT_CALL(*mock_app_, FindCommand(kCmdId)).WillOnce(Return(so_ptr_.get())); + EXPECT_CALL(*mock_app_, AddCommand(kCmdId, (*msg_)[msg_params])); + + am::CommandsMap commands_map; + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); EXPECT_CALL( app_mngr_, - ManageMobileCommand(_, am::commands::Command::CommandOrigin::ORIGIN_SDL)) - .WillOnce(DoAll(SaveArg<0>(&command_result), Return(true))); - - command->onTimeOut(); - EXPECT_EQ((*command_result)[strings::msg_params][strings::success].asBool(), - false); - EXPECT_EQ( - (*command_result)[strings::msg_params][strings::result_code].asInt(), - static_cast<int32_t>(am::mobile_api::Result::GENERIC_ERROR)); + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::UI_AddCommand))) + .WillOnce(Return(true)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); } -TEST_F(AddCommandRequestTest, OnEvent_VR_HmiSendSuccess_UNSUPPORTED_RESOURCE) { - MessageSharedPtr msg_vr = CreateFullParamsVRSO(); - (*msg_vr)[strings::msg_params][strings::menu_params] - [am::hmi_request::parent_id] = 10u; - (*msg_vr)[strings::msg_params][strings::menu_params][strings::menu_name] = - "menu_name"; +TEST_F(AddCommandRequestTest, OnEvent_UI_SUCCESS) { + CreateBasicParamsUIRequest(); + (*msg_)[params][hmi_response::code] = hmi_apis::Common_Result::SUCCESS; + SmartObject& image = (*msg_)[msg_params][cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + EXPECT_CALL(*mock_app_, AddCommand(kCmdId, (*msg_)[msg_params])); - utils::SharedPtr<AddCommandRequest> command = - CreateCommand<AddCommandRequest>(msg_vr); + am::CommandsMap commands_map; + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly( + Return(DataAccessor<am::CommandsMap>(commands_map, lock_))); - ON_CALL(*mock_app_, FindSubMenu(_)).WillByDefault(Return(&(*msg_vr))); - ON_CALL(hmi_interfaces_, GetInterfaceFromFunction(_)) - .WillByDefault(Return(am::HmiInterfaces::HMI_INTERFACE_VR)); - ON_CALL(hmi_interfaces_, GetInterfaceState(_)) - .WillByDefault(Return(am::HmiInterfaces::STATE_NOT_AVAILABLE)); + Event event(hmi_apis::FunctionID::UI_AddCommand); + event.set_smart_object(*msg_); + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::UI_AddCommand))) + .WillOnce(Return(true)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); + EXPECT_CALL(mock_message_helper_, + HMIToMobileResult(hmi_apis::Common_Result::SUCCESS)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + EXPECT_CALL(*mock_app_, UpdateHash()); + request_ptr->on_event(event); +} - MessageSharedPtr msg = CreateMessage(smart_objects::SmartType_Map); - (*msg)[strings::params][hmi_response::code] = - hmi_apis::Common_Result::UNSUPPORTED_RESOURCE; - (*msg)[am::strings::msg_params][am::strings::info] = - "VR is not supported by system"; - (*msg)[strings::msg_params][strings::cmd_id] = kCommandId; +TEST_F(AddCommandRequestTest, OnEvent_VR_SUCCESS) { + CreateBasicParamsVRRequest(); + MessageSharedPtr msg = CreateMessage(SmartType_Map); + (*msg)[params][hmi_response::code] = hmi_apis::Common_Result::SUCCESS; + (*msg)[msg_params][cmd_id] = kCmdId; Event event(hmi_apis::FunctionID::VR_AddCommand); event.set_smart_object(*msg); - - smart_objects::SmartObject* ptr = NULL; - ON_CALL(*mock_app_, FindCommand(kCmdId)).WillByDefault(Return(ptr)); - - ON_CALL(mock_message_helper_, HMIToMobileResult(_)) - .WillByDefault(Return(mobile_apis::Result::SUCCESS)); - - EXPECT_CALL(*mock_app_, AddCommand(kCmdId, (*msg_vr)[strings::msg_params])); + EXPECT_CALL(mock_message_helper_, + HMIToMobileResult(hmi_apis::Common_Result::SUCCESS)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + EXPECT_CALL(*mock_app_, AddCommand(kCmdId, (*msg_)[msg_params])); am::CommandsMap commands_map; - ON_CALL(*mock_app_, commands_map()) - .WillByDefault( + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly( Return(DataAccessor<am::CommandsMap>(commands_map, lock_))); - EXPECT_CALL(*mock_app_, UpdateHash()); + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::VR_AddCommand))) + .WillOnce(Return(true)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); + request_ptr->on_event(event); +} - MessageSharedPtr msg_ui(CreateMessage(smart_objects::SmartType_Map)); - (*msg_ui)[am::strings::params][am::hmi_response::code] = - hmi_apis::Common_Result::SUCCESS; +TEST_F(AddCommandRequestTest, OnTimeOut_EXPECT_VR_DeleteCommand) { + CheckOnTimeOutCommandDeletion(hmi_apis::FunctionID::VR_AddCommand, + hmi_apis::FunctionID::VR_DeleteCommand); +} + +TEST_F(AddCommandRequestTest, OnTimeOut_EXPECT_UI_DeleteCommand) { + CheckOnTimeOutCommandDeletion(hmi_apis::FunctionID::UI_AddCommand, + hmi_apis::FunctionID::UI_DeleteCommand); +} + +TEST_F(AddCommandRequestTest, OnEvent_BothSend_SUCCESS) { + MessageSharedPtr command_msg = CreateMessage(SmartType_Map); + (*command_msg)[params][connection_key] = kConnectionKey; + MessageSharedPtr event_msg = CreateMessage(SmartType_Map); + (*event_msg)[params][hmi_response::code] = hmi_apis::Common_Result::SUCCESS; + (*event_msg)[msg_params][cmd_id] = kCmdId; Event event_ui(hmi_apis::FunctionID::UI_AddCommand); - event_ui.set_smart_object(*msg_ui); + event_ui.set_smart_object(*event_msg); + + Event event_vr(hmi_apis::FunctionID::VR_AddCommand); + event_vr.set_smart_object(*event_msg); - command->Run(); - command->on_event(event_ui); + EXPECT_CALL(*mock_app_, RemoveCommand(kCmdId)).Times(0); - MessageSharedPtr vr_command_result; + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(command_msg); + request_ptr->Run(); + request_ptr->on_event(event_ui); + request_ptr->on_event(event_vr); +} + +TEST_F(AddCommandRequestTest, OnEvent_UnknownEvent_UNSUCCESS) { + EXPECT_CALL(app_mngr_, ManageMobileCommand(_, _)).Times(0); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + Event event(hmi_apis::FunctionID::INVALID_ENUM); + request_ptr->on_event(event); +} + +TEST_F(AddCommandRequestTest, OnEvent_AppNotExisted_UNSUCCESS) { + CreateBasicParamsUIRequest(); + EXPECT_CALL(app_mngr_, application(kConnectionKey)) + .WillOnce(Return(ApplicationSharedPtr())); + Event event(hmi_apis::FunctionID::UI_AddCommand); + EXPECT_CALL(app_mngr_, ManageMobileCommand(_, _)).Times(0); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->on_event(event); +} + +TEST_F(AddCommandRequestTest, + OnEvent_HmiResponseCodeIsRejected_ExpectUICommandRemoved) { + CreateBasicParamsUIRequest(); + SmartObject& params = (*msg_)[strings::params]; + params[hmi_response::code] = hmi_apis::Common_Result::REJECTED; + SmartObject& image = (*msg_)[msg_params][cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + am::CommandsMap commands_map; + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); EXPECT_CALL( app_mngr_, - ManageMobileCommand(_, am::commands::Command::CommandOrigin::ORIGIN_SDL)) - .WillOnce(DoAll(SaveArg<0>(&vr_command_result), Return(true))); - - command->on_event(event); + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::UI_AddCommand))) + .WillOnce(Return(true)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); + EXPECT_CALL(mock_message_helper_, + HMIToMobileResult(hmi_apis::Common_Result::REJECTED)) + .WillOnce(Return(mobile_apis::Result::REJECTED)); + EXPECT_CALL(*mock_app_, RemoveCommand(kCmdId)); + EXPECT_CALL(app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::REJECTED), _)); + Event event(hmi_apis::FunctionID::UI_AddCommand); + event.set_smart_object(*msg_); + request_ptr->on_event(event); +} - ResultCommandExpectations(vr_command_result, "VR is not supported by system"); +TEST_F(AddCommandRequestTest, + OnEvent_HmiResponseCodeIsWarnings_ExpectCommandUpdated) { + CreateBasicParamsVRRequest(); + CreateBasicParamsUIRequest(); + SmartObject& params = (*msg_)[strings::params]; + params[hmi_response::code] = hmi_apis::Common_Result::WARNINGS; + SmartObject& image = (*msg_)[msg_params][cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + am::CommandsMap commands_map; + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); + { + InSequence dummy; + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::UI_AddCommand))) + .WillOnce(Return(true)); + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::VR_AddCommand))) + .WillOnce(Return(true)); + } + EXPECT_CALL(app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::WARNINGS), _)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); + Event event_ui(hmi_apis::FunctionID::UI_AddCommand); + event_ui.set_smart_object(*msg_); + Event event_vr(hmi_apis::FunctionID::VR_AddCommand); + event_vr.set_smart_object(*msg_); + EXPECT_CALL(*mock_app_, UpdateHash()); + request_ptr->on_event(event_ui); + request_ptr->on_event(event_vr); } -TEST_F(AddCommandRequestTest, OnEvent_UI_HmiSendSuccess_UNSUPPORTED_RESOURCE) { - MessageSharedPtr msg_vr = CreateFullParamsUISO(); - (*msg_vr)[am::strings::msg_params][am::strings::vr_commands][0] = - "vr_command"; +TEST_F( + AddCommandRequestTest, + OnEvent_UI_HmiResponseCodeIsGenericError_VR_HmiResponseCodeIsUnsupportedResourse_ExpectCommandRemoved) { + CreateBasicParamsVRRequest(); + CreateBasicParamsUIRequest(); + SmartObject& params = (*msg_)[strings::params]; + params[hmi_response::code] = hmi_apis::Common_Result::GENERIC_ERROR; + SmartObject& image = (*msg_)[msg_params][cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + am::CommandsMap commands_map; + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); + { + InSequence dummy; + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::UI_AddCommand))) + .WillOnce(Return(true)); + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::VR_AddCommand))) + .WillOnce(Return(true)); + } + + EXPECT_CALL(mock_message_helper_, + HMIToMobileResult(hmi_apis::Common_Result::GENERIC_ERROR)) + .WillRepeatedly(Return(mobile_apis::Result::GENERIC_ERROR)); + EXPECT_CALL(*mock_app_, RemoveCommand(kCmdId)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); - utils::SharedPtr<AddCommandRequest> command = - CreateCommand<AddCommandRequest>(msg_vr); + Event event_ui(hmi_apis::FunctionID::UI_AddCommand); + event_ui.set_smart_object(*msg_); + request_ptr->on_event(event_ui); + + Event event_vr(hmi_apis::FunctionID::VR_AddCommand); + MessageSharedPtr msg_vr = CreateMessage(SmartType_Map); + (*msg_vr)[strings::params][hmi_response::code] = + hmi_apis::Common_Result::UNSUPPORTED_RESOURCE; + (*msg_vr)[msg_params][cmd_id] = kCmdId; + event_vr.set_smart_object(*msg_vr); + request_ptr->on_event(event_vr); +} + +TEST_F( + AddCommandRequestTest, + OnEvent_VR_HmiResponseCodeIsGenericError_UI_HmiResponseCodeIsUnsupportedResourse_ExpectCommandRemoved) { + CreateBasicParamsVRRequest(); + CreateBasicParamsUIRequest(); + SmartObject& params = (*msg_)[strings::params]; + params[hmi_response::code] = hmi_apis::Common_Result::GENERIC_ERROR; + SmartObject& image = (*msg_)[msg_params][cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + am::CommandsMap commands_map; + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); + { + InSequence dummy; + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::UI_AddCommand))) + .WillOnce(Return(true)); + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::VR_AddCommand))) + .WillOnce(Return(true)); + } - ON_CALL(*mock_app_, FindSubMenu(_)).WillByDefault(Return(&(*msg_vr))); + EXPECT_CALL(mock_message_helper_, + HMIToMobileResult(hmi_apis::Common_Result::GENERIC_ERROR)) + .WillRepeatedly(Return(mobile_apis::Result::GENERIC_ERROR)); + EXPECT_CALL(*mock_app_, RemoveCommand(kCmdId)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); - ON_CALL(hmi_interfaces_, GetInterfaceFromFunction(_)) - .WillByDefault(Return(am::HmiInterfaces::HMI_INTERFACE_UI)); - ON_CALL(hmi_interfaces_, - GetInterfaceState(am::HmiInterfaces::HMI_INTERFACE_UI)) - .WillByDefault(Return(am::HmiInterfaces::STATE_NOT_AVAILABLE)); - ON_CALL(hmi_interfaces_, - GetInterfaceState(am::HmiInterfaces::HMI_INTERFACE_VR)) - .WillByDefault(Return(am::HmiInterfaces::STATE_NOT_AVAILABLE)); + Event event_vr(hmi_apis::FunctionID::VR_AddCommand); + event_vr.set_smart_object(*msg_); + request_ptr->on_event(event_vr); - MessageSharedPtr msg = CreateMessage(smart_objects::SmartType_Map); - (*msg)[am::strings::params][am::hmi_response::code] = + Event event_ui(hmi_apis::FunctionID::UI_AddCommand); + MessageSharedPtr msg_ui = CreateMessage(SmartType_Map); + (*msg_ui)[strings::params][hmi_response::code] = hmi_apis::Common_Result::UNSUPPORTED_RESOURCE; - (*msg)[am::strings::msg_params][am::strings::info] = - "UI is not supported by system"; - (*msg)[am::strings::msg_params][am::strings::cmd_id] = kCommandId; + (*msg_ui)[msg_params][cmd_id] = kCmdId; + event_ui.set_smart_object(*msg_ui); + request_ptr->on_event(event_ui); +} - Event event(hmi_apis::FunctionID::UI_AddCommand); - event.set_smart_object(*msg); +TEST_F( + AddCommandRequestTest, + OnEvent_UI_VR_HmiResponseCodeIsUnsupportedResourse_UI_NotAvailableInterfaceState_ExpectCommandRemoved) { + CreateBasicParamsVRRequest(); + CreateBasicParamsUIRequest(); + SmartObject& params = (*msg_)[strings::params]; + params[hmi_response::code] = hmi_apis::Common_Result::UNSUPPORTED_RESOURCE; + SmartObject& image = (*msg_)[msg_params][cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + am::CommandsMap commands_map; + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); + { + InSequence dummy; + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::UI_AddCommand))) + .WillOnce(Return(true)); + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::VR_AddCommand))) + .WillOnce(Return(true)); + } + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); - smart_objects::SmartObject* ptr = NULL; - ON_CALL(*mock_app_, FindCommand(kCmdId)).WillByDefault(Return(ptr)); - EXPECT_EQ(NULL, ptr); + EXPECT_CALL(mock_hmi_interfaces_, + GetInterfaceState(am::HmiInterfaces::HMI_INTERFACE_UI)) + .WillRepeatedly( + Return(am::HmiInterfaces::InterfaceState::STATE_NOT_AVAILABLE)); + EXPECT_CALL(mock_hmi_interfaces_, + GetInterfaceState(am::HmiInterfaces::HMI_INTERFACE_VR)) + .WillRepeatedly(Return(am::HmiInterfaces::STATE_AVAILABLE)); + EXPECT_CALL( + app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::UNSUPPORTED_RESOURCE), _)); + EXPECT_CALL(*mock_app_, RemoveCommand(kCmdId)); + Event event_ui(hmi_apis::FunctionID::UI_AddCommand); + event_ui.set_smart_object(*msg_); + Event event_vr(hmi_apis::FunctionID::VR_AddCommand); + event_vr.set_smart_object(*msg_); + request_ptr->on_event(event_ui); + request_ptr->on_event(event_vr); +} - ON_CALL(mock_message_helper_, HMIToMobileResult(_)) - .WillByDefault(Return(mobile_apis::Result::SUCCESS)); +TEST_F( + AddCommandRequestTest, + OnEvent_UI_VR_HmiResponseCodeIsUnsupportedResourse_VR_NotAvailableInterfaceState_ExpectCommandRemoved) { + CreateBasicParamsVRRequest(); + CreateBasicParamsUIRequest(); + SmartObject& params = (*msg_)[strings::params]; + params[hmi_response::code] = hmi_apis::Common_Result::UNSUPPORTED_RESOURCE; + SmartObject& image = (*msg_)[msg_params][cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + am::CommandsMap commands_map; + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); + { + InSequence dummy; + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::UI_AddCommand))) + .WillOnce(Return(true)); + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::VR_AddCommand))) + .WillOnce(Return(true)); + } + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); - ON_CALL(mock_message_helper_, VerifyImage(_, _, _)) - .WillByDefault(Return(mobile_apis::Result::SUCCESS)); - EXPECT_CALL(*mock_app_, - AddCommand(kCmdId, (*msg_vr)[am::strings::msg_params])); + EXPECT_CALL(mock_hmi_interfaces_, + GetInterfaceState(am::HmiInterfaces::HMI_INTERFACE_UI)) + .WillRepeatedly(Return(am::HmiInterfaces::STATE_AVAILABLE)); + EXPECT_CALL(mock_hmi_interfaces_, + GetInterfaceState(am::HmiInterfaces::HMI_INTERFACE_VR)) + .WillRepeatedly( + Return(am::HmiInterfaces::InterfaceState::STATE_NOT_AVAILABLE)); + EXPECT_CALL( + app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::UNSUPPORTED_RESOURCE), _)); + EXPECT_CALL(*mock_app_, RemoveCommand(kCmdId)); + Event event_ui(hmi_apis::FunctionID::UI_AddCommand); + event_ui.set_smart_object(*msg_); + Event event_vr(hmi_apis::FunctionID::VR_AddCommand); + event_vr.set_smart_object(*msg_); + request_ptr->on_event(event_ui); + request_ptr->on_event(event_vr); +} +TEST_F( + AddCommandRequestTest, + OnEvent_UI_HmiResponseCodeIsUnsupportedResource_NotAvailableInterfaceState_ExpectCommandRemoved) { + CreateBasicParamsUIRequest(); + SmartObject& params = (*msg_)[strings::params]; + params[hmi_response::code] = hmi_apis::Common_Result::UNSUPPORTED_RESOURCE; + SmartObject& image = (*msg_)[msg_params][cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); am::CommandsMap commands_map; - ON_CALL(*mock_app_, commands_map()) - .WillByDefault( - Return(DataAccessor<am::CommandsMap>(commands_map, lock_))); + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::UI_AddCommand))) + .WillOnce(Return(true)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); + EXPECT_CALL(mock_hmi_interfaces_, + GetInterfaceState(am::HmiInterfaces::HMI_INTERFACE_UI)) + .WillRepeatedly( + Return(am::HmiInterfaces::InterfaceState::STATE_NOT_AVAILABLE)); + EXPECT_CALL(mock_hmi_interfaces_, + GetInterfaceState(am::HmiInterfaces::HMI_INTERFACE_VR)) + .WillRepeatedly( + Return(am::HmiInterfaces::InterfaceState::STATE_NOT_AVAILABLE)); + EXPECT_CALL(*mock_app_, RemoveCommand(kCmdId)); + EXPECT_CALL( + app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::UNSUPPORTED_RESOURCE), _)); + Event event(hmi_apis::FunctionID::UI_AddCommand); + event.set_smart_object(*msg_); + request_ptr->on_event(event); +} - EXPECT_CALL(*mock_app_, UpdateHash()); +TEST_F( + AddCommandRequestTest, + OnEvent_VR_HmiResponseCodeIsUnsupportedResource_NotAvailableInterfaceState_ExpectCommandRemoved) { + CreateBasicParamsVRRequest(); + SmartObject& params = (*msg_)[strings::params]; + params[hmi_response::code] = hmi_apis::Common_Result::UNSUPPORTED_RESOURCE; + am::CommandsMap commands_map; + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::VR_AddCommand))) + .WillOnce(Return(true)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); + EXPECT_CALL(mock_hmi_interfaces_, + GetInterfaceState(am::HmiInterfaces::HMI_INTERFACE_UI)) + .WillRepeatedly( + Return(am::HmiInterfaces::InterfaceState::STATE_NOT_AVAILABLE)); + EXPECT_CALL(mock_hmi_interfaces_, + GetInterfaceState(am::HmiInterfaces::HMI_INTERFACE_VR)) + .WillRepeatedly( + Return(am::HmiInterfaces::InterfaceState::STATE_NOT_AVAILABLE)); + EXPECT_CALL(*mock_app_, RemoveCommand(kCmdId)); + EXPECT_CALL( + app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::UNSUPPORTED_RESOURCE), _)); + Event event(hmi_apis::FunctionID::VR_AddCommand); + event.set_smart_object(*msg_); + request_ptr->on_event(event); +} - MessageSharedPtr msg_ui(CreateMessage(smart_objects::SmartType_Map)); - (*msg_ui)[am::strings::params][am::hmi_response::code] = - hmi_apis::Common_Result::SUCCESS; +TEST_F(AddCommandRequestTest, + OnEvent_UI_EventWithNotSuccesResponseCode_ExpectVRCommandDelete) { + CreateBasicParamsVRRequest(); + CreateBasicParamsUIRequest(); + SmartObject& params = (*msg_)[strings::params]; + params[hmi_response::code] = hmi_apis::Common_Result::SUCCESS; + SmartObject& image = (*msg_)[msg_params][cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + am::CommandsMap commands_map; + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); + { + InSequence dummy; + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::UI_AddCommand))) + .WillOnce(Return(true)); + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::VR_AddCommand))) + .WillOnce(Return(true)); + } + EXPECT_CALL(app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::GENERIC_ERROR), _)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); + MessageSharedPtr msg_ui = CreateMessage(SmartType_Map); + (*msg_ui)[strings::params][hmi_response::code] = + hmi_apis::Common_Result::ABORTED; + (*msg_ui)[msg_params][cmd_id] = kCmdId; + Event event_ui(hmi_apis::FunctionID::UI_AddCommand); + event_ui.set_smart_object(*msg_ui); Event event_vr(hmi_apis::FunctionID::VR_AddCommand); - event_vr.set_smart_object(*msg_vr); + event_vr.set_smart_object(*msg_); + EXPECT_CALL(mock_message_helper_, + HMIToMobileResult(hmi_apis::Common_Result::ABORTED)) + .WillOnce(Return(mobile_apis::Result::ABORTED)); + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::VR_DeleteCommand))) + .WillOnce(Return(true)); + EXPECT_CALL(*mock_app_, RemoveCommand(kCmdId)).Times(2); + request_ptr->on_event(event_ui); + request_ptr->on_event(event_vr); +} - command->Run(); - command->on_event(event_vr); - MessageSharedPtr ui_command_result; +TEST_F(AddCommandRequestTest, + OnEvent_UI_VR_Events_VRErrorPresent_ExpectRemoveCommand) { + CreateBasicParamsVRRequest(); + CreateBasicParamsUIRequest(); + SmartObject& params = (*msg_)[strings::params]; + params[hmi_response::code] = hmi_apis::Common_Result::SUCCESS; + SmartObject& image = (*msg_)[msg_params][cmd_icon]; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + am::CommandsMap commands_map; + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); + { + InSequence dummy; + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::UI_AddCommand))) + .WillOnce(Return(true)); + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::VR_AddCommand))) + .WillOnce(Return(true)); + } + EXPECT_CALL(app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::GENERIC_ERROR), _)); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); + EXPECT_CALL(mock_message_helper_, + HMIToMobileResult(hmi_apis::Common_Result::ABORTED)) + .WillOnce(Return(mobile_apis::Result::ABORTED)); + + Event event_ui(hmi_apis::FunctionID::UI_AddCommand); + event_ui.set_smart_object(*msg_); + request_ptr->on_event(event_ui); EXPECT_CALL( app_mngr_, - ManageMobileCommand(_, am::commands::Command::CommandOrigin::ORIGIN_SDL)) - .WillOnce(DoAll(SaveArg<0>(&ui_command_result), Return(true))); + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::UI_DeleteCommand))) + .WillOnce(Return(true)); + EXPECT_CALL(*mock_app_, RemoveCommand(kCmdId)).Times(2); + Event event_vr(hmi_apis::FunctionID::VR_AddCommand); + MessageSharedPtr msg_vr = CreateMessage(SmartType_Map); + (*msg_vr)[strings::params][hmi_response::code] = + hmi_apis::Common_Result::ABORTED; + (*msg_vr)[msg_params][cmd_id] = kCmdId; + event_vr.set_smart_object(*msg_vr); + request_ptr->on_event(event_vr); +} - command->on_event(event); +TEST_F(AddCommandRequestTest, + OnTimeOut_AppNotExisted_NoAppRemoveCommandCalled) { + CreateBasicParamsUIRequest(); + EXPECT_CALL(app_mngr_, application(kConnectionKey)) + .WillOnce(Return(ApplicationSharedPtr())); + EXPECT_CALL(*mock_app_, RemoveCommand(kCmdId)).Times(0); + SmartObjectSPtr response; + EXPECT_CALL( + mock_message_helper_, + CreateNegativeResponse(_, _, _, mobile_apis::Result::GENERIC_ERROR)) + .WillOnce(Return(response)); + EXPECT_CALL(app_mngr_, + ManageMobileCommand( + response, am::commands::Command::CommandOrigin::ORIGIN_SDL)); + utils::SharedPtr<CommandRequestImpl> base_class_request = + static_cast<utils::SharedPtr<CommandRequestImpl> >( + CreateCommand<AddCommandRequest>(msg_)); + base_class_request->onTimeOut(); +} - ResultCommandExpectations(ui_command_result, "UI is not supported by system"); +TEST_F(AddCommandRequestTest, OnTimeOut_AppRemoveCommandCalled) { + CreateBasicParamsVRRequest(); + CreateBasicParamsUIRequest(); + SmartObject& msg_params = (*msg_)[strings::msg_params]; + SmartObject& image = msg_params[cmd_icon]; + msg_params[menu_params][hmi_request::parent_id] = kSecondParentId; + EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + EXPECT_CALL(*mock_app_, FindCommand(kCmdId)).WillOnce(Return(so_ptr_.get())); + SmartObject first_command = SmartObject(SmartType_Map); + SmartObject second_command = SmartObject(SmartType_Map); + const am::CommandsMap commands_map = + CreateCommandsMap(first_command, second_command); + EXPECT_CALL(*mock_app_, commands_map()) + .WillRepeatedly(Return( + DataAccessor<application_manager::CommandsMap>(commands_map, lock_))); + so_ptr_ = utils::MakeShared<SmartObject>(SmartType_Map); + EXPECT_CALL(*mock_app_, FindSubMenu(kSecondParentId)) + .WillOnce(Return(so_ptr_.get())); + { + InSequence dummy; + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::UI_AddCommand))) + .WillOnce(Return(true)); + EXPECT_CALL( + app_mngr_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::VR_AddCommand))) + .WillOnce(Return(true)); + } + EXPECT_CALL(app_mngr_, ManageMobileCommand(_, _)).Times(0); + utils::SharedPtr<AddCommandRequest> request_ptr = + CreateCommand<AddCommandRequest>(msg_); + request_ptr->Run(); + EXPECT_CALL(*mock_app_, RemoveCommand(kCmdId)); + SmartObjectSPtr response; + EXPECT_CALL( + mock_message_helper_, + CreateNegativeResponse(_, _, _, mobile_apis::Result::GENERIC_ERROR)) + .WillOnce(Return(response)); + EXPECT_CALL(app_mngr_, + ManageMobileCommand( + response, am::commands::Command::CommandOrigin::ORIGIN_SDL)); + utils::SharedPtr<CommandRequestImpl> base_class_request = + static_cast<utils::SharedPtr<CommandRequestImpl> >(request_ptr); + base_class_request->onTimeOut(); } } // namespace add_command_test diff --git a/src/components/application_manager/test/commands/mobile/alert_request_test.cc b/src/components/application_manager/test/commands/mobile/alert_request_test.cc index e8ebcd0f60..b384cd9f11 100644 --- a/src/components/application_manager/test/commands/mobile/alert_request_test.cc +++ b/src/components/application_manager/test/commands/mobile/alert_request_test.cc @@ -210,4 +210,4 @@ TEST_F(AlertRequestTest, OnEvent_UI_HmiSendSuccess_UNSUPPORTED_RESOURCE) { } // namespace mobile_commands_test } // namespace commands_test } // namespace components -} // namespace tests +} // namespace test diff --git a/src/components/application_manager/test/commands/mobile/on_button_notification_commands_test.cc b/src/components/application_manager/test/commands/mobile/on_button_notification_commands_test.cc index 793f379286..48f4497033 100644 --- a/src/components/application_manager/test/commands/mobile/on_button_notification_commands_test.cc +++ b/src/components/application_manager/test/commands/mobile/on_button_notification_commands_test.cc @@ -227,8 +227,9 @@ TYPED_TEST(OnButtonNotificationCommandsTest, Run_CustomButton_SUCCESS) { this->template CreateCommand<Notification>(notification_msg)); typename TestFixture::MockAppPtr mock_app = this->CreateMockApp(); + ON_CALL(*mock_app, hmi_level()) + .WillByDefault(Return(mobile_apis::HMILevel::HMI_FULL)); EXPECT_CALL(this->app_mngr_, application(kAppId)).WillOnce(Return(mock_app)); - EXPECT_CALL(*mock_app, IsSubscribedToSoftButton(kCustomButtonId)) .WillOnce(Return(true)); diff --git a/src/components/application_manager/test/commands/mobile/on_keyboard_input_notification_test.cc b/src/components/application_manager/test/commands/mobile/on_keyboard_input_notification_test.cc index d8240dfb62..d56cd98904 100644 --- a/src/components/application_manager/test/commands/mobile/on_keyboard_input_notification_test.cc +++ b/src/components/application_manager/test/commands/mobile/on_keyboard_input_notification_test.cc @@ -108,6 +108,8 @@ TEST_F(OnKeyBoardInputNotificationTest, Run_ActionActive_SUCCESS) { MockAppPtr mock_app(InitAppSetDataAccessor(app_set_)); EXPECT_CALL(*mock_app, is_perform_interaction_active()).WillOnce(Return(1)); + EXPECT_CALL(*mock_app, perform_interaction_layout()) + .WillOnce(Return(mobile_apis::LayoutMode::KEYBOARD)); EXPECT_CALL(*mock_app, hmi_level()).Times(0); EXPECT_CALL(*mock_app, app_id()).WillOnce(Return(kConnectionKey)); diff --git a/src/components/application_manager/test/commands/mobile/read_did_request_test.cc b/src/components/application_manager/test/commands/mobile/read_did_request_test.cc index 111dbf4e27..334f559ae6 100644 --- a/src/components/application_manager/test/commands/mobile/read_did_request_test.cc +++ b/src/components/application_manager/test/commands/mobile/read_did_request_test.cc @@ -46,7 +46,7 @@ #include "interfaces/MOBILE_API.h" #include "interfaces/HMI_API.h" #include "application_manager/smart_object_keys.h" -#include "event_engine/event.h" +#include "application_manager/event_engine/event.h" namespace test { namespace components { diff --git a/src/components/application_manager/test/commands/mobile/send_location_request_test.cc b/src/components/application_manager/test/commands/mobile/send_location_request_test.cc new file mode 100644 index 0000000000..df412695fd --- /dev/null +++ b/src/components/application_manager/test/commands/mobile/send_location_request_test.cc @@ -0,0 +1,399 @@ +/* + * Copyright (c) 2016, 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 <stdint.h> +#include <string> + +#include "gtest/gtest.h" +#include "application_manager/commands/mobile/send_location_request.h" +#include "application_manager/mock_hmi_capabilities.h" +#include "application_manager/mock_message_helper.h" +#include "utils/shared_ptr.h" +#include "commands/command_request_test.h" + +namespace test { +namespace components { +namespace commands_test { +namespace mobile_commands_test { +namespace send_location_request { + +using application_manager::commands::MessageSharedPtr; +using application_manager::commands::SendLocationRequest; +using application_manager::MockMessageHelper; +using test::components::application_manager_test::MockHMICapabilities; +using smart_objects::SmartObject; +using utils::SharedPtr; +using testing::_; +using testing::Return; +using testing::ReturnRef; +using ::testing::Mock; + +namespace strings = application_manager::strings; +namespace hmi_response = application_manager::hmi_response; +namespace Common_TextFieldName = hmi_apis::Common_TextFieldName; + +namespace { +const uint32_t kConnectionKey = 1u; +const uint32_t kFunctionID = 2u; +const uint32_t kAppID = 3u; +const double kLongitudeDegrees = 13.4; +const std::string kLocationDescription = "Location_Description"; +const std::string kNewLine = "\\n"; +const std::string kAddressLine = "Address_Line"; +const std::string kPhoneNumber = "Phone_number"; +const std::string kCorrectAddress = "Correct address"; +const std::string kEmptyAddress = ""; +const std::string kAddressWithWrongSyntax = "Wrong Syntax\\n"; +} // namespace + +class SendLocationRequestTest + : public CommandRequestTest<CommandsTestMocks::kIsNice> { + public: + class UnwrappedSendLocationRequest : public SendLocationRequest { + public: + UnwrappedSendLocationRequest( + const MessageSharedPtr& message, + application_manager::ApplicationManager& application_manager) + : SendLocationRequest(message, application_manager) {} + + ::application_manager::CommandParametersPermissions& + get_parameters_permissions() { + return parameters_permissions_; + } + }; + + typedef SharedPtr<UnwrappedSendLocationRequest> CommandSPrt; + + SendLocationRequestTest() + : mock_message_helper_(*MockMessageHelper::message_helper_mock()) { + mock_app_ = CreateMockApp(); + disp_cap_ = utils::MakeShared<SmartObject>(smart_objects::SmartType_Map); + message_ = CreateMessage(); + command_ = CreateCommand<UnwrappedSendLocationRequest>(message_); + } + + void TearDown() OVERRIDE { + Mock::VerifyAndClearExpectations(&mock_message_helper_); + } + + void InitialSetup(MessageSharedPtr message_) { + (*message_)[strings::params][strings::connection_key] = kConnectionKey; + (*message_)[strings::params][strings::function_id] = kFunctionID; + (*message_)[strings::msg_params] = + SmartObject(smart_objects::SmartType_Map); + (*message_)[strings::msg_params][strings::address] = kCorrectAddress; + EXPECT_CALL(app_mngr_, application(kConnectionKey)) + .WillOnce(Return(mock_app_)); + + AllowMandatoryFields(); + } + + void HMICapabilitiesSetupHelper() { + EXPECT_CALL(app_mngr_, hmi_capabilities()) + .WillOnce(ReturnRef(mock_hmi_capabilities_)); + EXPECT_CALL(mock_hmi_capabilities_, is_ui_cooperating()) + .WillOnce(Return(true)); + } + + void HMICapabilitiesSetupWithArguments( + Common_TextFieldName::eType field_name) { + HMICapabilitiesSetupHelper(); + (*disp_cap_)[hmi_response::text_fields] = + SmartObject(smart_objects::SmartType_Array); + (*disp_cap_)[hmi_response::text_fields][0] = + SmartObject(smart_objects::SmartType_Map); + (*disp_cap_)[hmi_response::text_fields][0][strings::name] = field_name; + EXPECT_CALL(mock_hmi_capabilities_, display_capabilities()) + .Times(2) + .WillRepeatedly(Return(disp_cap_.get())); + } + + void FinishSetup() { + EXPECT_CALL(*mock_app_, hmi_app_id()).WillOnce(Return(kAppID)); + EXPECT_CALL(app_mngr_, + ManageHMICommand(HMIResultCodeIs( + hmi_apis::FunctionID::Navigation_SendLocation))); + } + + void FinishSetupCancelled(mobile_apis::Result::eType result) { + EXPECT_CALL(*mock_app_, hmi_app_id()).Times(0); + EXPECT_CALL(app_mngr_, ManageHMICommand(_)).Times(0); + EXPECT_CALL(app_mngr_, ManageMobileCommand(MobileResultCodeIs(result), _)); + } + + void AllowMandatoryFields() { + application_manager::CommandParametersPermissions& permissions = + command_->get_parameters_permissions(); + permissions.allowed_params.insert(strings::longitude_degrees); + permissions.allowed_params.insert(strings::latitude_degrees); + } + + MockAppPtr mock_app_; + MockHMICapabilities mock_hmi_capabilities_; + MockMessageHelper& mock_message_helper_; + SharedPtr<SmartObject> disp_cap_; + MessageSharedPtr message_; + CommandSPrt command_; +}; + +TEST_F(SendLocationRequestTest, Run_InvalidApp_Success) { + (*message_)[strings::params][strings::connection_key] = kConnectionKey; + EXPECT_CALL(app_mngr_, application(kConnectionKey)) + .WillOnce(Return(MockAppPtr())); + FinishSetupCancelled(mobile_apis::Result::APPLICATION_NOT_REGISTERED); + command_->Run(); +} + +TEST_F(SendLocationRequestTest, Run_DeliveryMode_Success) { + InitialSetup(message_); + SmartObject msg_params = (*message_)[strings::msg_params]; + msg_params[strings::delivery_mode] = SmartObject(); + (*message_)[strings::msg_params] = msg_params; + msg_params.erase(strings::delivery_mode); + FinishSetup(); + command_->Run(); +} + +TEST_F(SendLocationRequestTest, Run_LocationNameIsAllowed_Success) { + InitialSetup(message_); + (*message_)[strings::msg_params][strings::location_name] = "Location_Name"; + HMICapabilitiesSetupWithArguments(Common_TextFieldName::locationName); + FinishSetup(); + command_->Run(); +} + +TEST_F(SendLocationRequestTest, Run_LocationNameIsNotAllowed_Cancelled) { + InitialSetup(message_); + (*message_)[strings::msg_params][strings::location_name] = "Location_Name"; + HMICapabilitiesSetupWithArguments(Common_TextFieldName::INVALID_ENUM); + FinishSetupCancelled(mobile_apis::Result::UNSUPPORTED_RESOURCE); + command_->Run(); +} + +TEST_F(SendLocationRequestTest, Run_LocationNameWrongSyntax_Cancelled) { + InitialSetup(message_); + (*message_)[strings::msg_params][strings::location_name] = "Location_Name\\n"; + HMICapabilitiesSetupWithArguments(Common_TextFieldName::locationName); + FinishSetupCancelled(mobile_apis::Result::INVALID_DATA); + command_->Run(); +} + +TEST_F(SendLocationRequestTest, Run_LocationDescriptionIsAllowed_Success) { + InitialSetup(message_); + (*message_)[strings::msg_params][strings::location_description] = + kLocationDescription; + HMICapabilitiesSetupWithArguments(Common_TextFieldName::locationDescription); + FinishSetup(); + command_->Run(); +} + +TEST_F(SendLocationRequestTest, Run_LocationDescriptionIsNotAllowed_Cancelled) { + InitialSetup(message_); + (*message_)[strings::msg_params][strings::location_description] = + kLocationDescription; + HMICapabilitiesSetupWithArguments(Common_TextFieldName::INVALID_ENUM); + FinishSetupCancelled(mobile_apis::Result::UNSUPPORTED_RESOURCE); + command_->Run(); +} + +TEST_F(SendLocationRequestTest, Run_LocationDescriptionWrongSyntax_Cancelled) { + InitialSetup(message_); + (*message_)[strings::msg_params][strings::location_description] = + kLocationDescription + kNewLine; + HMICapabilitiesSetupWithArguments(Common_TextFieldName::locationDescription); + FinishSetupCancelled(mobile_apis::Result::INVALID_DATA); + command_->Run(); +} + +TEST_F(SendLocationRequestTest, Run_AddressLinesAreAllowed_Success) { + InitialSetup(message_); + (*message_)[strings::msg_params][strings::address_lines] = + SmartObject(smart_objects::SmartType_Array); + (*message_)[strings::msg_params][strings::address_lines][0] = kAddressLine; + HMICapabilitiesSetupWithArguments(Common_TextFieldName::addressLines); + FinishSetup(); + command_->Run(); +} + +TEST_F(SendLocationRequestTest, Run_AddressLinesAreNotAllowed_Cancelled) { + InitialSetup(message_); + (*message_)[strings::msg_params][strings::address_lines] = + SmartObject(smart_objects::SmartType_Array); + (*message_)[strings::msg_params][strings::address_lines][0] = kAddressLine; + HMICapabilitiesSetupWithArguments(Common_TextFieldName::INVALID_ENUM); + FinishSetupCancelled(mobile_apis::Result::UNSUPPORTED_RESOURCE); + command_->Run(); +} + +TEST_F(SendLocationRequestTest, Run_AddressLinesWrongSyntax_Cancelled) { + InitialSetup(message_); + (*message_)[strings::msg_params][strings::address_lines] = + SmartObject(smart_objects::SmartType_Array); + (*message_)[strings::msg_params][strings::address_lines][0] = + kAddressLine + kNewLine; + HMICapabilitiesSetupWithArguments(Common_TextFieldName::addressLines); + FinishSetupCancelled(mobile_apis::Result::INVALID_DATA); + command_->Run(); +} + +TEST_F(SendLocationRequestTest, Run_PhoneNumberIsAllowed_Success) { + InitialSetup(message_); + (*message_)[strings::msg_params][strings::phone_number] = kPhoneNumber; + HMICapabilitiesSetupWithArguments(Common_TextFieldName::phoneNumber); + FinishSetup(); + command_->Run(); +} + +TEST_F(SendLocationRequestTest, Run_PhoneNumberIsNotAllowed_Cancelled) { + InitialSetup(message_); + (*message_)[strings::msg_params][strings::phone_number] = kPhoneNumber; + HMICapabilitiesSetupWithArguments(Common_TextFieldName::INVALID_ENUM); + FinishSetupCancelled(mobile_apis::Result::UNSUPPORTED_RESOURCE); + command_->Run(); +} + +TEST_F(SendLocationRequestTest, Run_PhoneNumberWrongSyntax_Cancelled) { + InitialSetup(message_); + (*message_)[strings::msg_params][strings::phone_number] = + kPhoneNumber + kNewLine; + HMICapabilitiesSetupWithArguments(Common_TextFieldName::phoneNumber); + FinishSetupCancelled(mobile_apis::Result::INVALID_DATA); + command_->Run(); +} + +TEST_F(SendLocationRequestTest, Run_AddressesContainWrongSyntax_Cancelled) { + InitialSetup(message_); + (*message_)[strings::msg_params][strings::address] = + SmartObject(smart_objects::SmartType_Array); + (*message_)[strings::msg_params][strings::address]["Address 1"] = + kCorrectAddress; + (*message_)[strings::msg_params][strings::address]["Address 2"] = + kAddressWithWrongSyntax; + FinishSetupCancelled(mobile_apis::Result::INVALID_DATA); + command_->Run(); +} + +TEST_F(SendLocationRequestTest, Run_LocationImageValid_Success) { + InitialSetup(message_); + (*message_)[strings::msg_params][strings::location_image] = + SmartObject(smart_objects::SmartType_Map); + (*message_)[strings::msg_params][strings::location_image][strings::value] = + "1"; + EXPECT_CALL( + mock_message_helper_, + VerifyImage( + (*message_)[strings::msg_params][strings::location_image], _, _)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + FinishSetup(); + command_->Run(); +} + +TEST_F(SendLocationRequestTest, Run_LocationImageInvalid_Cancelled) { + InitialSetup(message_); + (*message_)[strings::msg_params][strings::location_image] = + SmartObject(smart_objects::SmartType_Map); + (*message_)[strings::msg_params][strings::location_image][strings::value] = + "1"; + EXPECT_CALL( + mock_message_helper_, + VerifyImage( + (*message_)[strings::msg_params][strings::location_image], _, _)) + .WillOnce(Return(mobile_apis::Result::ABORTED)); + FinishSetupCancelled(mobile_apis::Result::ABORTED); + command_->Run(); +} + +TEST_F(SendLocationRequestTest, Run_HMIUINotCoop_Cancelled) { + InitialSetup(message_); + (*message_)[strings::msg_params][strings::phone_number] = kPhoneNumber; + (*disp_cap_)[hmi_response::text_fields] = + SmartObject(smart_objects::SmartType_Array); + (*disp_cap_)[hmi_response::text_fields][0] = + SmartObject(smart_objects::SmartType_Map); + (*disp_cap_)[hmi_response::text_fields][0][strings::name] = + Common_TextFieldName::phoneNumber; + EXPECT_CALL(app_mngr_, hmi_capabilities()) + .WillOnce(ReturnRef(mock_hmi_capabilities_)); + EXPECT_CALL(mock_hmi_capabilities_, is_ui_cooperating()) + .WillOnce(Return(false)); + FinishSetupCancelled(mobile_apis::Result::UNSUPPORTED_RESOURCE); + command_->Run(); +} + +TEST_F(SendLocationRequestTest, OnEvent_Success) { + mobile_apis::Result::eType response_code = mobile_apis::Result::SUCCESS; + (*message_)[strings::params][hmi_response::code] = response_code; + Event event(hmi_apis::FunctionID::Navigation_SendLocation); + event.set_smart_object(*message_); + EXPECT_CALL(mock_message_helper_, + HMIToMobileResult(hmi_apis::Common_Result::SUCCESS)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + command_->on_event(event); +} + +TEST_F(SendLocationRequestTest, OnEvent_Cancelled) { + (*message_)[strings::params][hmi_response::code] = + mobile_apis::Result::SUCCESS; + Event event(hmi_apis::FunctionID::Navigation_OnWayPointChange); + event.set_smart_object(*message_); + EXPECT_CALL( + app_mngr_, + ManageMobileCommand(MobileResultCodeIs(mobile_apis::Result::SUCCESS), _)) + .Times(0); + command_->on_event(event); +} + +TEST_F(SendLocationRequestTest, Run_MandatoryParamsDisallowed_InvalidData) { + (*message_)[strings::params][strings::connection_key] = kConnectionKey; + (*message_)[strings::params][strings::function_id] = kFunctionID; + (*message_)[strings::msg_params] = SmartObject(smart_objects::SmartType_Map); + (*message_)[strings::msg_params][strings::address] = kCorrectAddress; + (*message_)[strings::msg_params][strings::longitude_degrees] = + kLongitudeDegrees; + EXPECT_CALL(app_mngr_, application(kConnectionKey)) + .WillOnce(Return(mock_app_)); + application_manager::CommandParametersPermissions& permissions = + command_->get_parameters_permissions(); + // 1st one allowed + permissions.allowed_params.insert(strings::longitude_degrees); + // 2nd one disallowed + permissions.disallowed_params.insert(strings::latitude_degrees); + EXPECT_CALL(app_mngr_, + ManageMobileCommand( + MobileResultCodeIs(mobile_apis::Result::INVALID_DATA), _)); + command_->Run(); +} + +} // namespace send_location_request +} // namespace mobile_commands_test +} // namespace commands_test +} // namespace components +} // namespace test diff --git a/src/components/application_manager/test/hmi_capabilities_test.cc b/src/components/application_manager/test/hmi_capabilities_test.cc index 164f0c20ce..0a5d6116db 100644 --- a/src/components/application_manager/test/hmi_capabilities_test.cc +++ b/src/components/application_manager/test/hmi_capabilities_test.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -45,7 +45,7 @@ #include "application_manager/mock_application_manager_settings.h" #include "application_manager/mock_event_dispatcher.h" #include "application_manager/state_controller.h" -#include "resumption/last_state.h" +#include "resumption/last_state_impl.h" #include "application_manager/resumption/resume_ctrl.h" namespace test { @@ -94,7 +94,7 @@ class HMICapabilitiesTest : public ::testing::Test { void SetCooperating(); MockApplicationManager app_mngr_; event_engine_test::MockEventDispatcher mock_event_dispatcher; - resumption::LastState last_state_; + resumption::LastStateImpl last_state_; MockApplicationManagerSettings mock_application_manager_settings_; utils::SharedPtr<HMICapabilitiesForTesting> hmi_capabilities_test; const std::string file_name_; diff --git a/src/components/application_manager/test/message_helper/CMakeLists.txt.user b/src/components/application_manager/test/message_helper/CMakeLists.txt.user deleted file mode 100755 index e7522c1793..0000000000 --- a/src/components/application_manager/test/message_helper/CMakeLists.txt.user +++ /dev/null @@ -1,189 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE QtCreatorProject> -<!-- Written by QtCreator 3.5.1, 2015-11-19T12:59:06. --> -<qtcreator> - <data> - <variable>EnvironmentId</variable> - <value type="QByteArray">{6965f0e8-9b58-4b26-8426-81354d6c3400}</value> - </data> - <data> - <variable>ProjectExplorer.Project.ActiveTarget</variable> - <value type="int">0</value> - </data> - <data> - <variable>ProjectExplorer.Project.EditorSettings</variable> - <valuemap type="QVariantMap"> - <value type="bool" key="EditorConfiguration.AutoIndent">true</value> - <value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value> - <value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value> - <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0"> - <value type="QString" key="language">Cpp</value> - <valuemap type="QVariantMap" key="value"> - <value type="QByteArray" key="CurrentPreferences">CppGlobal</value> - </valuemap> - </valuemap> - <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1"> - <value type="QString" key="language">QmlJS</value> - <valuemap type="QVariantMap" key="value"> - <value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value> - </valuemap> - </valuemap> - <value type="int" key="EditorConfiguration.CodeStyle.Count">2</value> - <value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value> - <value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value> - <value type="int" key="EditorConfiguration.IndentSize">4</value> - <value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value> - <value type="int" key="EditorConfiguration.MarginColumn">80</value> - <value type="bool" key="EditorConfiguration.MouseHiding">true</value> - <value type="bool" key="EditorConfiguration.MouseNavigation">true</value> - <value type="int" key="EditorConfiguration.PaddingMode">1</value> - <value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value> - <value type="bool" key="EditorConfiguration.ShowMargin">false</value> - <value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value> - <value type="bool" key="EditorConfiguration.SpacesForTabs">true</value> - <value type="int" key="EditorConfiguration.TabKeyBehavior">0</value> - <value type="int" key="EditorConfiguration.TabSize">8</value> - <value type="bool" key="EditorConfiguration.UseGlobal">true</value> - <value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value> - <value type="bool" key="EditorConfiguration.addFinalNewLine">true</value> - <value type="bool" key="EditorConfiguration.cleanIndentation">true</value> - <value type="bool" key="EditorConfiguration.cleanWhitespace">true</value> - <value type="bool" key="EditorConfiguration.inEntireDocument">false</value> - </valuemap> - </data> - <data> - <variable>ProjectExplorer.Project.PluginSettings</variable> - <valuemap type="QVariantMap"/> - </data> - <data> - <variable>ProjectExplorer.Project.Target.0</variable> - <valuemap type="QVariantMap"> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.5.1 GCC 64bit</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.5.1 GCC 64bit</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.55.gcc_64_kit</value> - <value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value> - <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value> - <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value> - <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0"> - <value type="bool" key="CMakeProjectManager.CMakeBuildConfiguration.UseNinja">false</value> - <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/oherasym/sdl_panasonic/src/components/application_manager/test/message_helper-build</value> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> - <value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value> - <valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets"/> - <value type="bool" key="CMakeProjectManager.MakeStep.Clean">false</value> - <value type="QString" key="CMakeProjectManager.MakeStep.MakeCommand"></value> - <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value> - </valuemap> - <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value> - </valuemap> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1"> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> - <value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments">clean</value> - <valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets"/> - <value type="bool" key="CMakeProjectManager.MakeStep.Clean">true</value> - <value type="QString" key="CMakeProjectManager.MakeStep.MakeCommand"></value> - <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value> - </valuemap> - <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value> - </valuemap> - <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value> - <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value> - <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">all</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value> - </valuemap> - <value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">1</value> - <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0"> - <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> - <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value> - </valuemap> - <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy locally</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value> - </valuemap> - <value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value> - <valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/> - <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0"> - <valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/> - <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value> - <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value> - <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value> - <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value> - <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value> - <value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value> - <value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value> - <value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value> - <value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value> - <value type="int" key="Analyzer.Valgrind.NumCallers">25</value> - <valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/> - <value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value> - <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value> - <value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value> - <value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value> - <value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value> - <valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds"> - <value type="int">0</value> - <value type="int">1</value> - <value type="int">2</value> - <value type="int">3</value> - <value type="int">4</value> - <value type="int">5</value> - <value type="int">6</value> - <value type="int">7</value> - <value type="int">8</value> - <value type="int">9</value> - <value type="int">10</value> - <value type="int">11</value> - <value type="int">12</value> - <value type="int">13</value> - <value type="int">14</value> - </valuelist> - <value type="int" key="PE.EnvironmentAspect.Base">2</value> - <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/> - <value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.Arguments"></value> - <value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.Executable"></value> - <value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.WorkingDirectory">%{buildDir}</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Custom Executable</value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> - <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.CustomExecutableRunConfiguration</value> - <value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value> - <value type="bool" key="RunConfiguration.UseCppDebugger">false</value> - <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value> - <value type="bool" key="RunConfiguration.UseMultiProcess">false</value> - <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value> - <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value> - </valuemap> - <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value> - </valuemap> - </data> - <data> - <variable>ProjectExplorer.Project.TargetCount</variable> - <value type="int">1</value> - </data> - <data> - <variable>ProjectExplorer.Project.Updater.FileVersion</variable> - <value type="int">18</value> - </data> - <data> - <variable>Version</variable> - <value type="int">18</value> - </data> -</qtcreator> 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 index 0f51d29e0e..834637fa62 100644 --- a/src/components/application_manager/test/resumption/resumption_data_json_test.cc +++ b/src/components/application_manager/test/resumption/resumption_data_json_test.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -38,7 +38,7 @@ #include "application_manager/mock_application.h" #include "application_manager/mock_resumption_data.h" #include "interfaces/MOBILE_API.h" -#include "resumption/last_state.h" +#include "resumption/last_state_impl.h" #include "application_manager/resumption_data_test.h" #include "formatters/CFormatterJsonBase.h" @@ -81,7 +81,7 @@ class ResumptionDataJsonTest : public ResumptionDataTest { } void CheckSavedJson() { - Value& dictionary = last_state_.dictionary; + Value& dictionary = last_state_.get_dictionary(); ASSERT_TRUE(dictionary[am::strings::resumption].isObject()); ASSERT_TRUE( dictionary[am::strings::resumption][am::strings::resume_app_list] @@ -97,13 +97,13 @@ class ResumptionDataJsonTest : public ResumptionDataTest { } void SetZeroIgnOff() { - Value& dictionary = last_state_.dictionary; + Value& dictionary = last_state_.get_dictionary(); Value& res = dictionary[am::strings::resumption]; res[am::strings::last_ign_off_time] = 0; - last_state_.SaveToFileSystem(); + last_state_.SaveStateToFileSystem(); } - resumption::LastState last_state_; + resumption::LastStateImpl last_state_; ResumptionDataJson res_json; }; diff --git a/src/components/config_profile/CMakeLists.txt b/src/components/config_profile/CMakeLists.txt index e441375336..9a8b37e58a 100644 --- a/src/components/config_profile/CMakeLists.txt +++ b/src/components/config_profile/CMakeLists.txt @@ -28,6 +28,7 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories ( include @@ -36,13 +37,18 @@ include_directories ( ${LOG4CXX_INCLUDE_DIRECTORY} ) -set (SOURCES - ${COMPONENTS_DIR}/config_profile/src/profile.cc - ${COMPONENTS_DIR}/config_profile/src/ini_file.cc +set(PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src ) +set(LIBRARIES + Utils +) + +collect_sources(SOURCES "${PATHS}") add_library("ConfigProfile" ${SOURCES}) -target_link_libraries("ConfigProfile" Utils) +target_link_libraries("ConfigProfile" ${LIBRARIES}) if(BUILD_TESTS) add_subdirectory(test) diff --git a/src/components/config_profile/src/ini_file.cc b/src/components/config_profile/src/ini_file.cc index d6d72060e8..1c30c8b201 100644 --- a/src/components/config_profile/src/ini_file.cc +++ b/src/components/config_profile/src/ini_file.cc @@ -188,15 +188,18 @@ char ini_write_value(const char* fname, fd = mkstemp(temp_fname); if (-1 == fd) { + fclose(rd_fp); return FALSE; } wr_fp = fdopen(fd, "w"); if (NULL == wr_fp) { unlink(temp_fname); close(fd); + fclose(rd_fp); return FALSE; } } else { + fclose(rd_fp); return FALSE; } } diff --git a/src/components/config_profile/test/CMakeLists.txt b/src/components/config_profile/test/CMakeLists.txt index 1246bff066..597be8fe00 100644 --- a/src/components/config_profile/test/CMakeLists.txt +++ b/src/components/config_profile/test/CMakeLists.txt @@ -28,23 +28,20 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -if(BUILD_TESTS) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories ( ${GMOCK_INCLUDE_DIRECTORY} ${COMPONENTS_DIR}/config_profile/include ) - -set(testSources - profile_test.cc - ini_file_test.cc -) - -set(testLibraries +set(LIBRARIES gmock ConfigProfile ) + +collect_sources(SOURCES "${CMAKE_CURRENT_SOURCE_DIR}") +create_test(config_profile_test "${SOURCES}" "${LIBRARIES}") file(COPY smartDeviceLink.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) file(COPY smartDeviceLink_test.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) @@ -52,6 +49,3 @@ file(COPY smartDeviceLink_invalid_pairs.ini DESTINATION ${CMAKE_CURRENT_BINARY_D 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/connection_handler/CMakeLists.txt b/src/components/connection_handler/CMakeLists.txt index dc1b2d24d6..2cdfec91f2 100644 --- a/src/components/connection_handler/CMakeLists.txt +++ b/src/components/connection_handler/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2014, Ford Motor Company +# Copyright (c) 2016, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,8 +28,7 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. - -set(CH_SRC_DIR ${COMPONENTS_DIR}/connection_handler/src) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories ( include @@ -39,20 +38,20 @@ include_directories ( ${LOG4CXX_INCLUDE_DIRECTORY} ) -set (SOURCES - ${CH_SRC_DIR}/connection_handler_impl.cc - ${CH_SRC_DIR}/connection.cc - ${CH_SRC_DIR}/device.cc - ${CH_SRC_DIR}/heartbeat_monitor.cc +set(PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src ) set(LIBRARIES ProtocolLibrary + encryption ) +collect_sources(SOURCES "${PATHS}") add_library(connectionHandler ${SOURCES}) -target_link_libraries(connectionHandler encryption) +target_link_libraries(connectionHandler ${LIBRARIES}) if(BUILD_TESTS) - add_subdirectory(test) + add_subdirectory(test) endif() diff --git a/src/components/connection_handler/test/CMakeLists.txt b/src/components/connection_handler/test/CMakeLists.txt index 32da4bdcd8..033a45e97d 100644 --- a/src/components/connection_handler/test/CMakeLists.txt +++ b/src/components/connection_handler/test/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ford Motor Company +# Copyright (c) 2016, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,9 +28,7 @@ # 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(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories( ${GMOCK_INCLUDE_DIRECTORY} @@ -46,15 +44,7 @@ set(LIBRARIES ProtocolHandler ) -set(SOURCES - connection_handler_impl_test.cc - connection_test.cc - device_test.cc - heart_beat_monitor_test.cc -) - -file(COPY ${appMain_DIR}/smartDeviceLink.ini DESTINATION "./") - -create_test("connection_handler_test" "${SOURCES}" "${LIBRARIES}") +collect_sources(SOURCES "${CMAKE_CURRENT_SOURCE_DIR}") +create_test(connection_handler_test "${SOURCES}" "${LIBRARIES}") -endif() +file(COPY ${CMAKE_SOURCE_DIR}/src/appMain/smartDeviceLink.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/src/components/dbus/CMakeLists.txt b/src/components/dbus/CMakeLists.txt index 7e7f2af787..cb1ce30a6d 100644 --- a/src/components/dbus/CMakeLists.txt +++ b/src/components/dbus/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2014, Ford Motor Company +# Copyright (c) 2016, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,6 +28,7 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories ( ${DBUS_INCLUDE_DIRS} @@ -40,17 +41,17 @@ include_directories ( ${CMAKE_BINARY_DIR}/src/components/ ) -set (SOURCES +set(PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_BINARY_DIR}/introspection_xml.cc ${CMAKE_CURRENT_BINARY_DIR}/message_descriptions.cc - ${CMAKE_CURRENT_SOURCE_DIR}/src/dbus_adapter.cc - ${CMAKE_CURRENT_SOURCE_DIR}/src/dbus_message.cc - ${CMAKE_CURRENT_SOURCE_DIR}/src/dbus_message_controller.cc - ${CMAKE_CURRENT_SOURCE_DIR}/src/schema.cc ) +collect_sources(SOURCES "${PATHS}") -set (LIBRARIES dbus-1 -L${DBUS_LIBS_DIRECTORY}) - +set(LIBRARIES + dbus-1 -L${DBUS_LIBS_DIRECTORY} +) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/message_descriptions.cc @@ -71,7 +72,7 @@ add_custom_command( ) add_library("DBus" ${SOURCES}) -ADD_DEPENDENCIES("DBus" Utils install-3rd_party_dbus) +add_dependecnies("DBus" Utils install-3rd_party_dbus) target_link_libraries("DBus" "${LIBRARIES}") diff --git a/src/components/dbus/test/CMakeLists.txt b/src/components/dbus/test/CMakeLists.txt index d96f2388fb..1b3df2c0e7 100644 --- a/src/components/dbus/test/CMakeLists.txt +++ b/src/components/dbus/test/CMakeLists.txt @@ -28,13 +28,20 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -if(BUILD_TESTS) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories ( ${GMOCK_INCLUDE_DIRECTORY} ${COMPONENTS_DIR}/dbus/include/ ) +#FIXME: exclude some tests +set (EXCLUDE_PATHS + test_dbus_message_controller.cc +) + +collect_sources(SOURCES "${CMAKE_CURRENT_SOURCE_DIR}" ${EXCLUDE_PATHS}) + set (LIBRARIES gmock DBus @@ -42,12 +49,4 @@ set (LIBRARIES SmartObjects ) -set(testSources - ${COMPONENTS_DIR}/dbus/test/test_schema.cc - ${COMPONENTS_DIR}/dbus/test/test_dbus_adapter.cc -) - -create_test("test_DBus_test" "${testSources}" "${LIBRARIES}") - -endif() - +create_test(test_DBus_test "${SOURCES}" "${LIBRARIES}") diff --git a/src/components/formatters/CMakeLists.txt b/src/components/formatters/CMakeLists.txt index 1858342ff3..02a337e278 100644 --- a/src/components/formatters/CMakeLists.txt +++ b/src/components/formatters/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2014, Ford Motor Company +# Copyright (c) 2016, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,8 +28,7 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. - -set(FORMATTERS_SRC_DIR ${COMPONENTS_DIR}/formatters/src) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories ( include/ @@ -41,22 +40,13 @@ include_directories ( ${COMPONENTS_DIR}/utils/include ) -set (SOURCES - ${FORMATTERS_SRC_DIR}/CSmartFactory.cc -) - -set (FORMATTER_SOURCES - ${FORMATTERS_SRC_DIR}/CFormatterJsonBase.cc - ${FORMATTERS_SRC_DIR}/CFormatterJsonSDLRPCv1.cc - ${FORMATTERS_SRC_DIR}/CFormatterJsonSDLRPCv2.cc - ${FORMATTERS_SRC_DIR}/formatter_json_rpc.cc - ${FORMATTERS_SRC_DIR}/meta_formatter.cc - ${FORMATTERS_SRC_DIR}/generic_json_formatter.cc +set(PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src ) -add_library("formatters" ${SOURCES} - ${FORMATTER_SOURCES} -) +collect_sources(SOURCES "${PATHS}") +add_library(formatters ${SOURCES}) if(BUILD_TESTS) add_subdirectory(test) diff --git a/src/components/formatters/test/CMakeLists.txt b/src/components/formatters/test/CMakeLists.txt index d245626dae..c80c3d0e40 100644 --- a/src/components/formatters/test/CMakeLists.txt +++ b/src/components/formatters/test/CMakeLists.txt @@ -29,7 +29,7 @@ # POSSIBILITY OF SUCH DAMAGE. -if(BUILD_TESTS) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories( ${GMOCK_INCLUDE_DIRECTORY} @@ -49,19 +49,15 @@ set(LIBRARIES jsoncpp ) -set(SOURCES - ${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 +set (SOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src + ${CMAKE_CURRENT_SOURCE_DIR} ) -create_test("formatters_test" "${SOURCES}" "${LIBRARIES}") +set (EXCLUDE_PATHS +) + +collect_sources(SOURCES "") +create_test(formatters_test "${SOURCES}" "${LIBRARIES}") -endif() diff --git a/src/components/hmi_message_handler/CMakeLists.txt b/src/components/hmi_message_handler/CMakeLists.txt index aa10729458..c1dfca5e67 100644 --- a/src/components/hmi_message_handler/CMakeLists.txt +++ b/src/components/hmi_message_handler/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2014, Ford Motor Company +# Copyright (c) 2016, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,6 +28,8 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/platform.cmake) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories ( include/ @@ -46,30 +48,36 @@ include_directories ( ${LOG4CXX_INCLUDE_DIRECTORY} ) -IF (HMIADAPTER STREQUAL "dbus") - set (DBUS_SOURCE ./src/dbus_message_adapter.cc) - set (DBUS_ADAPTER DBus) -ENDIF () +set(PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src +) + +if (HMIADAPTER STREQUAL "dbus") + set(EXCLUDE_PATHS) + set(DBUS_ADAPTER DBus) +else() + set(EXCLUDE_PATHS dbus_message_adapter.cc) + set(DBUS_ADAPTER) +endif () -set (SOURCES - ${COMPONENTS_DIR}/hmi_message_handler/src/hmi_message_handler_impl.cc - ${COMPONENTS_DIR}/hmi_message_handler/src/messagebroker_adapter.cc - ${COMPONENTS_DIR}/hmi_message_handler/src/hmi_message_adapter_impl.cc - ${COMPONENTS_DIR}/hmi_message_handler/src/mqueue_adapter.cc - ${DBUS_SOURCE} +list(APPEND EXCLUDE_PATHS + mqueue_adapter.cc ) +collect_sources(SOURCES "${PATHS}" "${EXCLUDE_PATHS}") + set(LIBRARIES - Utils - ${DBUS_ADAPTER} - ${RTLIB} + Utils + ${DBUS_ADAPTER} + ${RTLIB} ) add_library("HMIMessageHandler" ${SOURCES}) target_link_libraries("HMIMessageHandler" ${LIBRARIES}) if(ENABLE_LOG) - target_link_libraries("HMIMessageHandler" log4cxx -L${LOG4CXX_LIBS_DIRECTORY}) + target_link_libraries("HMIMessageHandler" log4cxx -L${LOG4CXX_LIBS_DIRECTORY}) endif() # Tests temporary are inactivated. For details please check diff --git a/src/components/hmi_message_handler/include/hmi_message_handler/hmi_message_handler_impl.h b/src/components/hmi_message_handler/include/hmi_message_handler/hmi_message_handler_impl.h index 3b829b0f27..8b238b4aa8 100644 --- a/src/components/hmi_message_handler/include/hmi_message_handler/hmi_message_handler_impl.h +++ b/src/components/hmi_message_handler/include/hmi_message_handler/hmi_message_handler_impl.h @@ -106,6 +106,14 @@ class HMIMessageHandlerImpl : public HMIMessageHandler, HMIMessageObserver* observer() const { return observer_; } + + impl::ToHmiQueue* messages_to_hmi() { + return &messages_to_hmi_; + } + + impl::FromHmiQueue* messages_from_hmi() { + return &messages_from_hmi_; + } #endif // BUILD_TESTS private: diff --git a/src/components/hmi_message_handler/src/dbus_message_adapter.cc b/src/components/hmi_message_handler/src/dbus_message_adapter.cc index daefd32de9..00f5ad6be8 100644 --- a/src/components/hmi_message_handler/src/dbus_message_adapter.cc +++ b/src/components/hmi_message_handler/src/dbus_message_adapter.cc @@ -126,8 +126,6 @@ void DBusMessageAdapter::SubscribeTo() { DBusMessageController::SubscribeTo("BasicCommunication", "OnSystemRequest"); DBusMessageController::SubscribeTo("BasicCommunication", "OnSystemInfoChanged"); - DBusMessageController::SubscribeTo("BasicCommunication", "OnPhoneCall"); - DBusMessageController::SubscribeTo("BasicCommunication", "OnEmergencyEvent"); DBusMessageController::SubscribeTo("TTS", "Started"); DBusMessageController::SubscribeTo("TTS", "Stopped"); DBusMessageController::SubscribeTo("TTS", "OnLanguageChange"); diff --git a/src/components/hmi_message_handler/src/mqueue_adapter.cc b/src/components/hmi_message_handler/src/mqueue_adapter.cc deleted file mode 100644 index 4cfebbe9e8..0000000000 --- a/src/components/hmi_message_handler/src/mqueue_adapter.cc +++ /dev/null @@ -1,143 +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 "hmi_message_handler/mqueue_adapter.h" -#include "hmi_message_handler/hmi_message_handler.h" -#include "utils/logger.h" - -namespace hmi_message_handler { - -const uint32_t kMqueueSize = 100; -const uint32_t kMqueueMessageSize = 65536; -const char* kSdlToHmiQueue = "/sdl_to_hmi"; -const char* kHmiToSdlQueue = "/hmi_to_sdl"; - -CREATE_LOGGERPTR_GLOBAL(logger_, "HMIMessageHandler") - -class ReceiverThreadDelegate : public threads::ThreadDelegate { - public: - ReceiverThreadDelegate(mqd_t mqueue_descriptor, - HMIMessageHandler* hmi_message_handler) - : mqueue_descriptor_(mqueue_descriptor) - , hmi_message_handler_(hmi_message_handler) {} - - private: - virtual void threadMain() { - while (true) { - static char buffer[kMqueueMessageSize]; - const ssize_t size = - mq_receive(mqueue_descriptor_, buffer, kMqueueMessageSize, NULL); - if (-1 == size) { - LOG4CXX_ERROR(logger_, "Message queue receive failed, error " << errno); - continue; - } - const std::string message_string(buffer, buffer + size); - LOG4CXX_DEBUG(logger_, "Message: " << message_string); - MessageSharedPointer message(new application_manager::Message( - protocol_handler::MessagePriority::kDefault)); - message->set_json_message(message_string); - message->set_protocol_version(application_manager::ProtocolVersion::kHMI); - hmi_message_handler_->OnMessageReceived(message); - } - } - - const mqd_t mqueue_descriptor_; - HMIMessageHandler* hmi_message_handler_; -}; - -MqueueAdapter::MqueueAdapter(HMIMessageHandler* hmi_message_handler) - : HMIMessageAdapterImpl(hmi_message_handler) - , sdl_to_hmi_mqueue_(-1) - , hmi_to_sdl_mqueue_(-1) - , receiver_thread_(NULL) { - mq_attr mq_attributes; - mq_attributes.mq_maxmsg = kMqueueSize; - mq_attributes.mq_msgsize = kMqueueMessageSize; - sdl_to_hmi_mqueue_ = - mq_open(kSdlToHmiQueue, O_CREAT | O_RDWR, S_IRWXU, &mq_attributes); - if (-1 == sdl_to_hmi_mqueue_) { - LOG4CXX_ERROR(logger_, - "Could not open message queue " << kSdlToHmiQueue - << ", error " << errno); - return; - } - hmi_to_sdl_mqueue_ = - mq_open(kHmiToSdlQueue, O_CREAT | O_RDWR, S_IRWXU, &mq_attributes); - if (-1 == hmi_to_sdl_mqueue_) { - LOG4CXX_ERROR(logger_, - "Could not open message queue " << kHmiToSdlQueue - << ", error " << errno); - return; - } - receiver_thread_delegate_ = - new ReceiverThreadDelegate(hmi_to_sdl_mqueue_, hmi_message_handler); - receiver_thread_ = - threads::CreateThread("MqueueAdapter", receiver_thread_delegate_); - receiver_thread_->start(); -} - -MqueueAdapter::~MqueueAdapter() { - receiver_thread_->join(); - delete receiver_thread_delegate_; - threads::DeleteThread(receiver_thread_); - if (-1 != hmi_to_sdl_mqueue_) - mq_close(hmi_to_sdl_mqueue_); - if (-1 != sdl_to_hmi_mqueue_) - mq_close(sdl_to_hmi_mqueue_); - mq_unlink(kHmiToSdlQueue); - mq_unlink(kSdlToHmiQueue); -} - -void MqueueAdapter::SendMessageToHMI(const MessageSharedPointer message) { - LOG4CXX_AUTO_TRACE(logger_); - - if (-1 == sdl_to_hmi_mqueue_) { - LOG4CXX_ERROR(logger_, "Message queue is not opened"); - return; - } - const std::string& json = message->json_message(); - if (json.size() > kMqueueMessageSize) { - LOG4CXX_ERROR(logger_, "Message size " << json.size() << " is too big"); - return; - } - const int rc = mq_send(sdl_to_hmi_mqueue_, json.c_str(), json.size(), 0); - if (0 != rc) { - LOG4CXX_ERROR(logger_, "Could not send message, error " << errno); - return; - } -} - -void MqueueAdapter::SubscribeTo() { - // empty implementation of pure virtual method, actually it's not called -} - -} // namespace hmi_message_handler diff --git a/src/components/hmi_message_handler/test/CMakeLists.txt b/src/components/hmi_message_handler/test/CMakeLists.txt index 98e9fd5653..0d7ccd9ee1 100644 --- a/src/components/hmi_message_handler/test/CMakeLists.txt +++ b/src/components/hmi_message_handler/test/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2014, Ford Motor Company +# Copyright (c) 2016, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,7 +28,8 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -if(BUILD_TESTS) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/platform.cmake) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories ( ${GMOCK_INCLUDE_DIRECTORY} @@ -36,27 +37,31 @@ include_directories ( ${COMPONENTS_DIR}/hmi_message_handler/test/include ) +if (HMIADAPTER STREQUAL "messagebroker") + set (BROKER_LIBRARIES + message_broker_client + message_broker_server + ) +endif() + +set(EXCLUDE_PATHS) + set(LIBRARIES gmock ApplicationManager HMIMessageHandler jsoncpp - MessageBrokerClient - MessageBrokerServer + ${BROKER_LIBRARIES} ConfigProfile ) -set(SOURCES -${COMPONENTS_DIR}/hmi_message_handler/test/hmi_message_handler_impl_test.cc -${COMPONENTS_DIR}/hmi_message_handler/test/hmi_message_adapter_test.cc -) - -if(${QT_HMI}) - list (APPEND SOURCES - ${COMPONENTS_DIR}/hmi_message_handler/test/mock_subscriber.cc - ${COMPONENTS_DIR}/hmi_message_handler/test/dbus_message_adapter_test.cc +if(NOT HMI_DBUS_API}) + list (APPEND EXCLUDE_PATHS + mock_subscriber.cc + dbus_message_adapter_test.cc ) endif() -create_test("hmi_message_handler_test" "${SOURCES}" "${LIBRARIES}") -endif() +collect_sources(SOURCES "${CMAKE_CURRENT_SOURCE_DIR}" "${EXCLUDE_PATHS}") + +create_test(hmi_message_handler_test "${SOURCES}" "${LIBRARIES}") diff --git a/src/components/hmi_message_handler/test/hmi_message_handler_impl_test.cc b/src/components/hmi_message_handler/test/hmi_message_handler_impl_test.cc index 06cca74ba9..a551c8a1f2 100644 --- a/src/components/hmi_message_handler/test/hmi_message_handler_impl_test.cc +++ b/src/components/hmi_message_handler/test/hmi_message_handler_impl_test.cc @@ -36,13 +36,15 @@ #include "hmi_message_handler/messagebroker_adapter.h" #include "hmi_message_handler/mock_hmi_message_observer.h" #include "hmi_message_handler/mock_hmi_message_handler_settings.h" -#include "utils/make_shared.h" +#include "hmi_message_handler/mock_hmi_message_adapter_impl.h" namespace test { namespace components { namespace hmi_message_handler_test { using ::testing::ReturnRef; +using ::testing::_; + class HMIMessageHandlerImplTest : public ::testing::Test { public: HMIMessageHandlerImplTest() @@ -63,10 +65,13 @@ class HMIMessageHandlerImplTest : public ::testing::Test { .WillByDefault(ReturnRef(stack_size)); hmi_handler_ = new hmi_message_handler::HMIMessageHandlerImpl( mock_hmi_message_handler_settings); + ASSERT_TRUE(NULL != hmi_handler_); mb_adapter_ = new hmi_message_handler::MessageBrokerAdapter( hmi_handler_, "localhost", 22); + ASSERT_TRUE(NULL != mb_adapter_); mock_hmi_message_observer_ = new hmi_message_handler::MockHMIMessageObserver(); + ASSERT_TRUE(NULL != mock_hmi_message_observer_); hmi_handler_->set_message_observer(mock_hmi_message_observer_); EXPECT_TRUE(NULL != hmi_handler_->observer()); } @@ -77,6 +82,13 @@ class HMIMessageHandlerImplTest : public ::testing::Test { delete hmi_handler_; delete mb_adapter_; } + + hmi_message_handler::MessageSharedPointer CreateMessage() { + // The ServiceType doesn't really matter + return new application_manager::Message( + protocol_handler::MessagePriority::FromServiceType( + protocol_handler::ServiceType::kInvalidServiceType)); + } }; TEST_F(HMIMessageHandlerImplTest, @@ -91,16 +103,23 @@ TEST_F(HMIMessageHandlerImplTest, TEST_F(HMIMessageHandlerImplTest, OnErrorSending_NotEmptyMessage_ExpectOnErrorSendingProceeded) { // Arrange - utils::SharedPtr<application_manager::Message> message( - utils::MakeShared<application_manager::Message>( - protocol_handler::MessagePriority::FromServiceType( - protocol_handler::ServiceType::kControl))); + utils::SharedPtr<application_manager::Message> message = CreateMessage(); EXPECT_CALL(*mock_hmi_message_observer_, OnErrorSending(message)); // Act hmi_handler_->OnErrorSending(message); } +TEST_F(HMIMessageHandlerImplTest, OnErrorSending_InvalidObserver_Cancelled) { + // Arrange + utils::SharedPtr<application_manager::Message> message = CreateMessage(); + + hmi_handler_->set_message_observer(NULL); + EXPECT_CALL(*mock_hmi_message_observer_, OnErrorSending(_)).Times(0); + // Act + hmi_handler_->OnErrorSending(message); +} + TEST_F(HMIMessageHandlerImplTest, AddHMIMessageAdapter_AddExistedAdapter_ExpectAdded) { // Check before action @@ -131,6 +150,40 @@ TEST_F(HMIMessageHandlerImplTest, RemoveHMIMessageAdapter_ExpectRemoved) { EXPECT_TRUE(hmi_handler_->message_adapters().empty()); } +// TODO(atimchenko) SDLOPEN-44 Wrong message to observer +TEST_F(HMIMessageHandlerImplTest, + DISABLED_OnMessageReceived_ValidObserver_Success) { + hmi_message_handler::MessageSharedPointer message = CreateMessage(); + EXPECT_CALL(*mock_hmi_message_observer_, OnMessageReceived(message)); + + hmi_handler_->OnMessageReceived(message); + // Wait for the message to be processed + hmi_handler_->messages_from_hmi()->WaitDumpQueue(); +} + +TEST_F(HMIMessageHandlerImplTest, OnMessageReceived_InvalidObserver_Cancelled) { + hmi_message_handler::MessageSharedPointer message = CreateMessage(); + EXPECT_CALL(*mock_hmi_message_observer_, OnMessageReceived(_)).Times(0); + // Make the observer invalid + hmi_handler_->set_message_observer(NULL); + hmi_handler_->OnMessageReceived(message); + hmi_handler_->messages_from_hmi()->WaitDumpQueue(); +} + +TEST_F(HMIMessageHandlerImplTest, SendMessageToHMI_Success) { + hmi_message_handler::MessageSharedPointer message = CreateMessage(); + + MockHMIMessageAdapterImpl message_adapter(hmi_handler_); + EXPECT_CALL(message_adapter, SendMessageToHMI(message)); + + hmi_handler_->AddHMIMessageAdapter(&message_adapter); + hmi_handler_->SendMessageToHMI(message); + + // Wait for the message to be processed + hmi_handler_->messages_to_hmi()->WaitDumpQueue(); + testing::Mock::AsyncVerifyAndClearExpectations(100); +} + } // namespace hmi_message_handler_test } // namespace components } // namespace test diff --git a/src/components/hmi_message_handler/test/mqueue_adapter_test.cc b/src/components/hmi_message_handler/test/mqueue_adapter_test.cc deleted file mode 100644 index e5c5d2a396..0000000000 --- a/src/components/hmi_message_handler/test/mqueue_adapter_test.cc +++ /dev/null @@ -1,94 +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 <gtest/gtest.h> -#include <gmock/gmock.h> - -#include "hmi_message_handler/hmi_message_handler.h" -#include "hmi_message_handler/mqueue_adapter.h" - -using hmi_message_handler::MessageSharedPointer; -using hmi_message_handler::HMIMessageHandler; -using hmi_message_handler::HMIMessageAdapter; -using hmi_message_handler::MqueueAdapter; -using application_manager::Message; - -class MockHandler : public HMIMessageHandler { - public: - MOCK_METHOD1(OnMessageReceived, void(MessageSharedPointer message)); - MOCK_METHOD1(AddHMIMessageAdapter, void(HMIMessageAdapter* adapter)); - MOCK_METHOD1(RemoveHMIMessageAdapter, void(HMIMessageAdapter* adapter)); - MOCK_METHOD1(OnErrorSending, void(MessageSharedPointer message)); - MOCK_METHOD1(SendMessageToHMI, void(MessageSharedPointer message)); -}; - -// TODO{ALeshin}: APPLINK-10846 -// TEST(MqueueAdapter, Send) { -// MockHandler handler; -// HMIMessageAdapter* adapter = new MqueueAdapter(&handler); - -// MessageSharedPointer message( -// new Message(protocol_handler::MessagePriority::kDefault)); -// message->set_json_message("{}"); -// adapter->SendMessageToHMI(message); - -// mqd_t mqd = mq_open("/sdl_to_hmi", O_RDONLY); -// ASSERT_NE(-1, mqd); -// static char buf[65536]; -// ssize_t sz = mq_receive(mqd, buf, 65536, NULL); -// ASSERT_EQ(2, sz); -// EXPECT_STREQ("{}", buf); - -// delete adapter; -//} - -// TODO{ALeshin}: APPLINK-10846 -// TEST(MqueueAdapter, Receive) { -// MockHandler handler; -// HMIMessageAdapter* adapter = new MqueueAdapter(&handler); - -// using ::testing::Property; -// using ::testing::Pointee; -// EXPECT_CALL( -// handler, -// OnMessageReceived(Property( -// &MessageSharedPointer::get, -// Pointee(Property(&Message::json_message, std::string("()")))))); - -// mqd_t mqd = mq_open("/hmi_to_sdl", O_WRONLY); -// ASSERT_NE(-1, mqd); -// const char buf[] = "()"; -// int rc = mq_send(mqd, buf, sizeof(buf) - 1, 0); -// ASSERT_EQ(0, rc); - -// delete adapter; -//} diff --git a/src/components/include/test/hmi_message_handler/mock_hmi_message_handler.h b/src/components/include/test/resumption/mock_last_state.h index 19aa92f932..419deba3cf 100644 --- a/src/components/include/test/hmi_message_handler/mock_hmi_message_handler.h +++ b/src/components/include/test/resumption/mock_last_state.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -30,25 +30,20 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#ifndef SRC_COMPONENTS_INCLUDE_TEST_HMI_MESSAGE_HANDLER_MOCK_HMI_MESSAGE_HANDLER_H_ -#define SRC_COMPONENTS_INCLUDE_TEST_HMI_MESSAGE_HANDLER_MOCK_HMI_MESSAGE_HANDLER_H_ +#ifndef SRC_COMPONENTS_INCLUDE_TEST_RESUMPTION_MOCK_LAST_STATE_H_ +#define SRC_COMPONENTS_INCLUDE_TEST_RESUMPTION_MOCK_LAST_STATE_H_ #include "gmock/gmock.h" -#include "hmi_message_handler/hmi_message_handler.h" +#include "resumption/last_state.h" -namespace test { -namespace components { -namespace hmi_message_handler_test { +namespace resumption { -using hmi_message_handler::HMIMessageAdapter; - -class MockHMIMessageHandler : public ::hmi_message_handler::HMIMessageHandler { +class MockLastState : public resumption::LastState { public: - MOCK_METHOD1(AddHMIMessageAdapter, void(HMIMessageAdapter* adapter)); - MOCK_METHOD1(RemoveHMIMessageAdapter, void(HMIMessageAdapter* adapter)); + MOCK_METHOD0(SaveStateToFileSystem, void()); + MOCK_METHOD0(get_dictionary, Json::Value&()); }; -} // namespace hmi_message_handler_test -} // namespace components -} // namespace test -#endif // SRC_COMPONENTS_INCLUDE_TEST_HMI_MESSAGE_HANDLER_MOCK_HMI_MESSAGE_HANDLER_H_ +} // resumption + +#endif // SRC_COMPONENTS_INCLUDE_TEST_RESUMPTION_MOCK_LAST_STATE_H_ diff --git a/src/components/include/utils/threads/CMakeLists.txt b/src/components/include/utils/threads/CMakeLists.txt deleted file mode 100644 index f97039c21b..0000000000 --- a/src/components/include/utils/threads/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -set(UtilsIncludeDir ${COMPONENTS_DIR/utils/include) - -include_directories ( - ${UtilsIncludeDir} -)
\ No newline at end of file diff --git a/src/components/interfaces/CMakeLists.txt b/src/components/interfaces/CMakeLists.txt index bcb47976ea..2c84e48235 100644 --- a/src/components/interfaces/CMakeLists.txt +++ b/src/components/interfaces/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2014, Ford Motor Company +# Copyright (c) 2016, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,54 +28,46 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/generators.cmake) include_directories ( - ${COMPONENTS_DIR}/utils/include/ + ${COMPONENTS_DIR}/include + ${COMPONENTS_DIR}/utils/include ${COMPONENTS_DIR}/formatters/include + ${COMPONENTS_DIR}/smart_objects/include + ${CMAKE_BINARY_DIR} ) - -GenerateInterface("v4_protocol_v1_2_no_extra.xml" "NsSmartDeviceLinkRPC::V1" "sdlrpcv1") -GenerateInterface("MOBILE_API.xml" "mobile_apis" "sdlrpcv2") - -IF (${HMI_JSON_API}) - GenerateInterface("HMI_API.xml" "hmi_apis" "jsonrpc") -ENDIF (${HMI_JSON_API}) -IF (${HMI_DBUS_API}) - set(hpp_file - "${CMAKE_CURRENT_BINARY_DIR}/QT_HMI_API.h" - "${CMAKE_CURRENT_BINARY_DIR}/QT_HMI_API_schema.h" - ) +generate_interface("v4_protocol_v1_2_no_extra.xml" "NsSmartDeviceLinkRPC::V1" "sdlrpcv1") +add_library(v4_protocol_v1_2_no_extra ${CMAKE_CURRENT_BINARY_DIR}/v4_protocol_v1_2_no_extra_schema.cc) - set(cpp_file "${CMAKE_CURRENT_BINARY_DIR}/QT_HMI_API_schema.cc") - set(full_xml_name "${CMAKE_CURRENT_SOURCE_DIR}/QT_HMI_API.xml") +generate_interface("MOBILE_API.xml" "mobile_apis" "sdlrpcv2") +add_library(MOBILE_API ${CMAKE_CURRENT_BINARY_DIR}/MOBILE_API_schema.cc) - add_custom_command( OUTPUT ${hpp_file} ${cpp_file} - COMMAND ${INTEFRACE_GENERATOR_CMD} ${full_xml_name} hmi_apis ${CMAKE_CURRENT_BINARY_DIR} "--parser-type" "jsonrpc" - DEPENDS ${INTERFACE_GENERATOR_DEPENDENCIES} ${full_xml_name} - COMMENT "Generating files:\n ${hpp_file}\n ${cpp_file}\nfrom:\n QT_HMI_API.xml ..." - VERBATIM - ) +if(HMI_JSON_API) + generate_interface("HMI_API.xml" "hmi_apis" "jsonrpc") + add_library(HMI_API ${CMAKE_CURRENT_BINARY_DIR}/HMI_API_schema.cc) +endif() - include_directories ( - ${COMPONENTS_DIR}/smart_objects/include - ${COMPONENTS_DIR}/formatters/include/ - ${CMAKE_BINARY_DIR} - ) +if(HMI_DBUS_API) + generate_interface("QT_HMI_API.xml" "hmi_apis" "jsonrpc") - add_custom_command( - OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/HMI_API.h" + add_custom_command( + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/HMI_API.h" COMMAND sed "-e" "s/QT_HMI_API/HMI_API/g" "${CMAKE_CURRENT_BINARY_DIR}/QT_HMI_API.h" > "${CMAKE_CURRENT_BINARY_DIR}/HMI_API.h" - DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/QT_HMI_API.h") - add_custom_command( - OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/HMI_API_schema.h" + DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/QT_HMI_API.h" + ) + add_custom_command( + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/HMI_API_schema.h" COMMAND sed "-e" "s/QT_HMI_API/HMI_API/g" "${CMAKE_CURRENT_BINARY_DIR}/QT_HMI_API_schema.h" > "${CMAKE_CURRENT_BINARY_DIR}/HMI_API_schema.h" - DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/QT_HMI_API_schema.h") - add_custom_command( - OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/HMI_API_schema.cc" + DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/QT_HMI_API_schema.h" + ) + add_custom_command( + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/HMI_API_schema.cc" COMMAND sed "-e" "s/QT_HMI_API/HMI_API/g" "${CMAKE_CURRENT_BINARY_DIR}/QT_HMI_API_schema.cc" > "${CMAKE_CURRENT_BINARY_DIR}/HMI_API_schema.cc" DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/QT_HMI_API_schema.cc" "${CMAKE_CURRENT_BINARY_DIR}/HMI_API_schema.h" "${CMAKE_CURRENT_BINARY_DIR}/HMI_API.h") - add_library(HMI_API "${CMAKE_CURRENT_BINARY_DIR}/HMI_API_schema.cc") -ENDIF (${HMI_DBUS_API}) + + add_library(HMI_API ${CMAKE_CURRENT_BINARY_DIR}/HMI_API_schema.cc) +endif() add_dependencies(HMI_API Utils) diff --git a/src/components/interfaces/HMI_API.xml b/src/components/interfaces/HMI_API.xml index a7b3923cb0..2182496760 100644 --- a/src/components/interfaces/HMI_API.xml +++ b/src/components/interfaces/HMI_API.xml @@ -2140,21 +2140,6 @@ <function name="OnUpdateDeviceList" messagetype="notification"> <description>Notification from HMI to SDL sent when HMI requires update of device list (i.e. when user clicks 'Change Device' button)</description> </function> - <function name="OnPhoneCall" messagetype="notification"> - <description>Sender: HMI->SDL. When: upon phone-call event started or ended</description> - <param name="isActive" type="Boolean" mandatory="true"> - <description>Must be 'true' - when the phone call is started on HMI. Must be 'false' when the phone call is ended on HMI</description> - </param> - </function> - <function name="OnEmergencyEvent" messagetype="notification"> - <description> - "Sender: HMI->SDL. Conditions: when HMI enters the mode of "911 Assist", or other rear view camera, - or something else in the future. Purpose: for SDL to change the audioStreamingState of the related apps to - NOT_AUDIBLE when "enabled:true" and back to AUDIBLE when "enabled:false"" - </description> - <param name="enabled" type="Boolean" mandatory="true"> - </param> - </function> <function name="OnResumeAudioSource" messagetype="notification"> <description>This method must be invoked by SDL to update audio state.</description> <param name="appID" type="Integer" mandatory="true"> @@ -2465,16 +2450,6 @@ <description>SUCCESS - in case the certificate is decrypted and placed to the same file from request.</description> </function> <!-- End of Policies --> - <function name="OnDeactivateHMI" messagetype="notification"> - <description> - Sender: HMI->SDL. When: in case GAL/DIO is active or disabling - </description> - <param name="isDeactivated" type="Boolean" mandatory="true"> - <description> - Must be 'true' - GAL/DIO is active. Must be 'false' when GAL/DIO is disabling - </description> - </param> - </function> <function name="OnEventChanged" messagetype="notification"> <description>Sender: HMI->SDL. When event is become active</description> <param name="eventName" type="Common.EventTypes" mandatory="true"> @@ -3424,9 +3399,9 @@ <param name="wayPointType" type="Common.WayPointType" defvalue="ALL" mandatory="false"> <description>To request for either the destination only or for all waypoints including destination</description> </param> - <param name="appID" type="Integer" mandatory="true"> - <description>ID of the application.</description> - </param> + <param name="appID" type="Integer" mandatory="true"> + <description>ID of the application.</description> + </param> </function> <function name="GetWayPoints" functionID="GetWayPointsID" messagetype="response"> <param name="appID" type="Integer" mandatory="true"> diff --git a/src/components/media_manager/CMakeLists.txt b/src/components/media_manager/CMakeLists.txt index 46146855bb..a679239033 100644 --- a/src/components/media_manager/CMakeLists.txt +++ b/src/components/media_manager/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2014, Ford Motor Company +# Copyright (c) 2016, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,63 +28,10 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/platform.cmake) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) -if (EXTENDED_MEDIA_MODE) -find_package(Gstreamer-1.0 REQUIRED) -find_package(Glib-2.0 REQUIRED) -find_package(PkgConfig) -pkg_check_modules(GLIB2 REQUIRED glib-2.0) -add_definitions(${GLIB2_CFLAGS}) -set(default_includes - ${GSTREAMER_gst_INCLUDE_DIR} - ${GSTREAMER_gstconfig_INCLUDE_DIR} - ${GLIB_glib_2_INCLUDE_DIR} -) -set(default_sources - ${COMPONENTS_DIR}/media_manager/src/audio/a2dp_source_player_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/audio/from_mic_recorder_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/audio/from_mic_to_file_recorder_thread.cc - ${COMPONENTS_DIR}/media_manager/src/audio/socket_audio_streamer_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/audio/pipe_audio_streamer_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/audio/file_audio_streamer_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/video/socket_video_streamer_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/video/pipe_video_streamer_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/video/file_video_streamer_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/streamer_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/pipe_streamer_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/socket_streamer_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/file_streamer_adapter.cc -) -set(LIBRARIES - ${GSTREAMER_gstreamer_LIBRARY} - ApplicationManager - pulse-simple - pulse - gobject-2.0 - glib-2.0 -) -else(EXTENDED_MEDIA_MODE) -set(default_includes -) - -set(default_sources - ${COMPONENTS_DIR}/media_manager/src/audio/socket_audio_streamer_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/audio/pipe_audio_streamer_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/audio/file_audio_streamer_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/video/socket_video_streamer_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/video/pipe_video_streamer_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/video/file_video_streamer_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/streamer_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/pipe_streamer_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/socket_streamer_adapter.cc - ${COMPONENTS_DIR}/media_manager/src/file_streamer_adapter.cc -) -set(LIBRARIES - ProtocolLibrary -) -endif() - -include_directories ( +include_directories( include ${COMPONENTS_DIR}/media_manager/include/audio/ ${COMPONENTS_DIR}/media_manager/include/video/ @@ -100,22 +47,60 @@ include_directories ( ${CMAKE_BINARY_DIR}/src/components/ ${POLICY_PATH}/include/ ${POLICY_GLOBAL_INCLUDE_PATH}/ - ${default_includes} ${LOG4CXX_INCLUDE_DIRECTORY} ) -set (SOURCES - ${COMPONENTS_DIR}/media_manager/src/media_adapter_impl.cc - ${COMPONENTS_DIR}/media_manager/src/audio/from_mic_recorder_listener.cc - ${COMPONENTS_DIR}/media_manager/src/audio/audio_stream_sender_thread.cc - ${COMPONENTS_DIR}/media_manager/src/streamer_listener.cc - ${COMPONENTS_DIR}/media_manager/src/media_manager_impl.cc +set(PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src ) -add_library("MediaManager" ${SOURCES} ${default_sources}) +set(EXCLUDE_PATHS + video_stream_to_file_adapter.cc +) + +set(LIBRARIES + ProtocolLibrary +) + +if(EXTENDED_MEDIA_MODE) + find_package(Gstreamer-1.0 REQUIRED) + find_package(Glib-2.0 REQUIRED) + find_package(PkgConfig) + pkg_check_modules(GLIB2 REQUIRED glib-2.0) + add_definitions(${GLIB2_CFLAGS}) + + include_directories( + ${GSTREAMER_gst_INCLUDE_DIR} + ${GSTREAMER_gstconfig_INCLUDE_DIR} + ${GLIB_glib_2_INCLUDE_DIR} + ) + list(APPEND EXCLUDE_PATHS + + ) + list(APPEND LIBRARIES + ${GSTREAMER_gstreamer_LIBRARY} + pulse-simple + pulse + gobject-2.0 + glib-2.0 + ) +else() + list(APPEND EXCLUDE_PATHS + a2dp_source_player_adapter.cc + from_mic_recorder_adapter.cc + from_mic_to_file_recorder_thread.cc + ) +endif() + +collect_sources(SOURCES "${PATHS}" "${EXCLUDE_PATHS}") +add_library("MediaManager" ${SOURCES}) target_link_libraries("MediaManager" ${LIBRARIES}) -if(BUILD_TESTS) - add_subdirectory(test) +if(ENABLE_LOG) + target_link_libraries("MediaManager" log4cxx -L${LOG4CXX_LIBS_DIRECTORY}) endif() +if(BUILD_TESTS) + add_subdirectory(test) +endif() diff --git a/src/components/media_manager/test/CMakeLists.txt b/src/components/media_manager/test/CMakeLists.txt index ede6f27f95..f5d596f681 100644 --- a/src/components/media_manager/test/CMakeLists.txt +++ b/src/components/media_manager/test/CMakeLists.txt @@ -28,7 +28,7 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -if(BUILD_TESTS) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories( ${GMOCK_INCLUDE_DIRECTORY} @@ -46,9 +46,7 @@ if(EXTENDED_MEDIA_MODE) ) endif() -set(SOURCES - ${COMPONENTS_DIR}/media_manager/test/media_manager_impl_test.cc -) +collect_sources(SOURCES "${CMAKE_CURRENT_SOURCE_DIR}") set(LIBRARIES SmartObjects @@ -74,7 +72,3 @@ create_test("media_manager_test" "${SOURCES}" "${LIBRARIES}") if(ENABLE_LOG) target_link_libraries("media_manager_test" log4cxx -L${LOG4CXX_LIBS_DIRECTORY}) endif() - -endif() - -# vim: set ts=2 sw=2 et: diff --git a/src/components/policy/policy_regular/CMakeLists.txt b/src/components/policy/policy_regular/CMakeLists.txt index 49d7b93152..6deb2cb2f4 100644 --- a/src/components/policy/policy_regular/CMakeLists.txt +++ b/src/components/policy/policy_regular/CMakeLists.txt @@ -28,12 +28,8 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -set(target Policy) -set(install_destination bin) -set(copy_destination ${CMAKE_BINARY_DIR}/src/appMain) -set(library_name ${CMAKE_SHARED_LIBRARY_PREFIX}${target}${CMAKE_SHARED_LIBRARY_SUFFIX}) - -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/") +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/platform.cmake) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories ( ${POLICY_PATH}/include @@ -45,40 +41,45 @@ include_directories ( ${LOG4CXX_INCLUDE_DIRECTORY} ) -set(SOURCES - ${POLICY_PATH}/src/policy_manager_impl.cc - ${POLICY_PATH}/src/policy_helper.cc - ${POLICY_PATH}/src/policy_table.cc - ${POLICY_PATH}/src/sql_pt_queries.cc - ${POLICY_PATH}/src/sql_pt_representation.cc - ${POLICY_PATH}/src/update_status_manager.cc - ${POLICY_PATH}/src/status.cc - ${POLICY_PATH}/src/cache_manager.cc - ${COMPONENTS_DIR}/rpc_base/src/rpc_base/rpc_base.cc +set(POLICY_TABLE_PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include/policy/policy_table + ${CMAKE_CURRENT_SOURCE_DIR}/src/policy_table ) +collect_sources(POLICY_TABLE_SOURCES "${POLICY_TABLE_PATHS}") +add_library(policy_struct ${POLICY_TABLE_SOURCES}) +target_link_libraries(policy_struct Utils) -# --- Table struct section -set(policy_struct_target policy_struct) -set(POLICY_TABLE_SOURCES - ${POLICY_PATH}/src/policy_table/enums.cc - ${POLICY_PATH}/src/policy_table/types.cc - ${POLICY_PATH}/src/policy_table/validation.cc +set(USAGE_STATISTICS_PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include/policy/usage_statistics + ${CMAKE_CURRENT_SOURCE_DIR}/src/usage_statistics ) +collect_sources(USAGE_STATISTICS_SOURCES "${USAGE_STATISTICS_PATHS}") +add_library(UsageStatistics ${USAGE_STATISTICS_SOURCES}) -add_library(${policy_struct_target} ${POLICY_TABLE_SOURCES}) -target_link_libraries(${policy_struct_target} Utils) -# --- end of Table struct section +set(EXCLUDE_PATHS + ${POLICY_TABLE_PATHS} + ${USAGE_STATISTICS_PATHS} + sql_pt_ext_queries.cc + sql_pt_ext_representation.cc +) -# --- Usage statistics section -set(USAGE_STATISTICS_SOURCES - ${POLICY_PATH}/src/usage_statistics/counter.cc +set(PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include/ + ${CMAKE_CURRENT_SOURCE_DIR}/src/ + ${COMPONENTS_DIR}/rpc_base/src/rpc_base/rpc_base.cc +) +collect_sources(SOURCES "${PATHS}" "${EXCLUDE_PATHS}") + +set(LIBRARIES + ConfigProfile + policy_struct + dbms + jsoncpp + Utils ) -add_library(UsageStatistics ${USAGE_STATISTICS_SOURCES}) -# --- end of Usage statistics section -set(LIBRARIES ConfigProfile policy_struct dbms jsoncpp Utils) if (CMAKE_SYSTEM_NAME STREQUAL "QNX") - # --- QDB Wrapper + # --- QDB Wrapper include_directories (${COMPONENTS_DIR}/utils/include/utils) else () # --- SQLite Wrapper @@ -86,22 +87,28 @@ else () list(APPEND LIBRARIES sqlite3) endif () -add_library(${target} SHARED ${SOURCES}) -target_link_libraries(${target} ${LIBRARIES} ) +add_library(Policy SHARED ${SOURCES}) +target_link_libraries(Policy ${LIBRARIES}) if(ENABLE_LOG) - target_link_libraries(${target} log4cxx -L${LOG4CXX_LIBS_DIRECTORY}) + target_link_libraries(Policy log4cxx -L${LOG4CXX_LIBS_DIRECTORY}) endif() -add_custom_target(copy_library_${target} ALL - COMMAND ${CMAKE_COMMAND} -E copy_if_different - ${CMAKE_CURRENT_BINARY_DIR}/${library_name} - ${copy_destination} - DEPENDS ${target} - COMMENT "Copying library ${library_name}") +set(LIBRARY_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}Policy${CMAKE_SHARED_LIBRARY_SUFFIX}) +set(TARGET_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/${LIBRARY_NAME}) +set(INSTALL_DESTINATION bin) +set(COPY_DESTINATION ${CMAKE_BINARY_DIR}/src/appMain) -install(TARGETS ${target} - DESTINATION ${install_destination} +add_custom_target(copy_policy_library ALL + COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${TARGET_LOCATION} + ${COPY_DESTINATION}/${LIBRARY_NAME} + DEPENDS Policy + COMMENT "Copying library ${LIBRARY_NAME}" +) + +install(TARGETS Policy + DESTINATION ${INSTALL_DESTINATION} PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE @@ -109,4 +116,4 @@ install(TARGETS ${target} if(BUILD_TESTS) add_subdirectory(test) -endif() # BUILD_TESTS +endif() diff --git a/src/components/policy/policy_regular/test/CMakeLists.txt b/src/components/policy/policy_regular/test/CMakeLists.txt index dcd6522a21..997c3637e8 100644 --- a/src/components/policy/policy_regular/test/CMakeLists.txt +++ b/src/components/policy/policy_regular/test/CMakeLists.txt @@ -28,6 +28,8 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) + include_directories( include ${COMPONENTS_DIR} @@ -41,26 +43,16 @@ include_directories( ${POLICY_MOCK_INCLUDE_PATH}/ ) -set(testLibraries +collect_sources(SOURCES "${CMAKE_CURRENT_SOURCE_DIR}") + +set(LIBRARIES gmock Utils Policy UsageStatistics ) -set(testSources - counter_test.cc - shared_library_test.cc - generated_code_test.cc - policy_manager_impl_test.cc - update_status_manager_test.cc -) - -list (APPEND testSources - sql_pt_representation_test.cc -) - -create_test("policy_test" "${testSources}" "${testLibraries}") +create_test(policy_test "${SOURCES}" "${LIBRARIES}") file(COPY valid_sdl_pt_update.json DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) file(COPY sdl_preloaded_pt.json DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/src/components/protocol/CMakeLists.txt b/src/components/protocol/CMakeLists.txt index 8524ff4f44..7d8579bdbc 100644 --- a/src/components/protocol/CMakeLists.txt +++ b/src/components/protocol/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2014, Ford Motor Company +# Copyright (c) 2016, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,18 +28,18 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories( - ./include - ${APR_INCLUDE_DIRECTORY} + ${COMPONENTS_DIR}/include + ${COMPONENTS_DIR}/utils/include ) -set(SOURCES - ${COMPONENTS_DIR}/protocol/src/raw_message.cc - ${COMPONENTS_DIR}/protocol/src/service_type.cc - ${COMPONENTS_DIR}/protocol/src/message_priority.cc - ${COMPONENTS_DIR}/protocol/src/rpc_type.cc +collect_sources(SOURCES "${CMAKE_CURRENT_SOURCE_DIR}") + +set(LIBRARIES + Utils ) add_library(ProtocolLibrary ${SOURCES}) -target_link_libraries(ProtocolLibrary Utils) +target_link_libraries(ProtocolLibrary ${LIBRARIES}) diff --git a/src/components/protocol_handler/CMakeLists.txt b/src/components/protocol_handler/CMakeLists.txt index a09a565844..559acf8956 100644 --- a/src/components/protocol_handler/CMakeLists.txt +++ b/src/components/protocol_handler/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2014, Ford Motor Company +# Copyright (c) 2016, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,6 +28,7 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories( include @@ -37,13 +38,11 @@ include_directories( ${LOG4CXX_INCLUDE_DIRECTORY} ) -set(SOURCES - ${COMPONENTS_DIR}/protocol_handler/src/incoming_data_handler.cc - ${COMPONENTS_DIR}/protocol_handler/src/protocol_handler_impl.cc - ${COMPONENTS_DIR}/protocol_handler/src/protocol_packet.cc - ${COMPONENTS_DIR}/protocol_handler/src/protocol_payload.cc - ${COMPONENTS_DIR}/protocol_handler/src/multiframe_builder.cc +set(PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src ) +collect_sources(SOURCES "${PATHS}") set(LIBRARIES ProtocolLibrary diff --git a/src/components/protocol_handler/test/CMakeLists.txt b/src/components/protocol_handler/test/CMakeLists.txt index 87d91bfd54..ca079dcc7e 100644 --- a/src/components/protocol_handler/test/CMakeLists.txt +++ b/src/components/protocol_handler/test/CMakeLists.txt @@ -28,7 +28,7 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -if (BUILD_TESTS) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories ( include @@ -38,9 +38,12 @@ include_directories ( ${COMPONENTS_DIR}/protocol_handler/test/include ${COMPONENTS_DIR}/include/protocol ${JSONCPP_INCLUDE_DIRECTORY} + ${GMOCK_INCLUDE_DIRECTORY} ) -set (LIBRARIES +collect_sources(SOURCES ${CMAKE_CURRENT_SOURCE_DIR}) + +set(LIBRARIES gmock ProtocolHandler connectionHandler @@ -49,15 +52,4 @@ set (LIBRARIES ProtocolLibrary ) -set (SOURCES - incoming_data_handler_test.cc - protocol_header_validator_test.cc - protocol_handler_tm_test.cc - protocol_packet_test.cc - protocol_payload_test.cc - multiframe_builder_test.cc -) - -create_test ("protocol_handler_test" "${SOURCES}" "${LIBRARIES}") - -endif () +create_test(protocol_handler_test "${SOURCES}" "${LIBRARIES}") diff --git a/src/components/qt_hmi/test/CMakeLists.txt b/src/components/qt_hmi/test/CMakeLists.txt index b0c48a4348..91ec2cd20c 100644 --- a/src/components/qt_hmi/test/CMakeLists.txt +++ b/src/components/qt_hmi/test/CMakeLists.txt @@ -29,8 +29,6 @@ # POSSIBILITY OF SUCH DAMAGE. -if(BUILD_TESTS) - cmake_minimum_required(VERSION 2.8.11) set(QT_HMI_TESTS_LIST @@ -67,4 +65,3 @@ foreach( file_i ${QT_HMI_TESTS_LIST}) file(COPY ${file_i} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) endforeach( file_i ) -endif()
\ No newline at end of file diff --git a/src/components/resumption/CMakeLists.txt b/src/components/resumption/CMakeLists.txt index b8fa277cae..4fb0876c0d 100644 --- a/src/components/resumption/CMakeLists.txt +++ b/src/components/resumption/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ford Motor Company +# Copyright (c) 2017, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,6 +28,7 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories ( include @@ -37,9 +38,11 @@ include_directories ( ${LOG4CXX_INCLUDE_DIRECTORY} ) -set (SOURCES - ${COMPONENTS_DIR}/resumption/src/last_state.cc +set(PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src ) +collect_sources(SOURCES "${PATHS}") add_library("Resumption" ${SOURCES}) diff --git a/src/components/resumption/include/resumption/last_state.h b/src/components/resumption/include/resumption/last_state.h index a331d9291c..3481fc9327 100644 --- a/src/components/resumption/include/resumption/last_state.h +++ b/src/components/resumption/include/resumption/last_state.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -35,7 +35,6 @@ #include <string> -#include "utils/macro.h" #include "json/json.h" namespace resumption { @@ -43,36 +42,19 @@ namespace resumption { class LastState { public: /** - * @brief Constructor - */ - LastState(const std::string& app_storage_folder, - const std::string& app_info_storage); - - /** * @brief Destructor */ - ~LastState(); + virtual ~LastState() {} /** * @brief Saving dictionary to filesystem */ - void SaveToFileSystem(); - - /** - * @brief public dictionary - */ - Json::Value dictionary; - - private: - DISALLOW_COPY_AND_ASSIGN(LastState); + virtual void SaveStateToFileSystem() = 0; /** - * @brief Load dictionary from filesystem + * @brief Get reference to dictionary */ - void LoadFromFileSystem(); - - std::string app_storage_folder_; - std::string app_info_storage_; + virtual Json::Value& get_dictionary() = 0; }; } // namespace resumption diff --git a/src/components/hmi_message_handler/include/hmi_message_handler/mqueue_adapter.h b/src/components/resumption/include/resumption/last_state_impl.h index 69634ea00e..2da3147930 100644 --- a/src/components/hmi_message_handler/include/hmi_message_handler/mqueue_adapter.h +++ b/src/components/resumption/include/resumption/last_state_impl.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -30,37 +30,54 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#ifndef SRC_COMPONENTS_HMI_MESSAGE_HANDLER_INCLUDE_HMI_MESSAGE_HANDLER_MQUEUE_ADAPTER_H_ -#define SRC_COMPONENTS_HMI_MESSAGE_HANDLER_INCLUDE_HMI_MESSAGE_HANDLER_MQUEUE_ADAPTER_H_ +#ifndef SRC_COMPONENTS_RESUMPTION_INCLUDE_RESUMPTION_LAST_STATE_IMPL_H_ +#define SRC_COMPONENTS_RESUMPTION_INCLUDE_RESUMPTION_LAST_STATE_IMPL_H_ -#include <memory> -#include <mqueue.h> -#include "utils/threads/thread.h" -#include "hmi_message_handler/hmi_message_adapter_impl.h" +#include "resumption/last_state.h" +#include "utils/macro.h" -namespace hmi_message_handler { - -class ReceiverThreadDelegate; +namespace resumption { /** - * \brief HMI message adapter for mqueue + * @brief The LastStateImpl class handles interface of last state */ -class MqueueAdapter : public HMIMessageAdapterImpl { + +class LastStateImpl : public LastState { public: - MqueueAdapter(HMIMessageHandler* hmi_message_handler); - virtual ~MqueueAdapter(); + /** + * @brief Constructor + */ + LastStateImpl(const std::string& app_storage_folder, + const std::string& app_info_storage); + + /** + * @brief Destructor + */ + ~LastStateImpl(); - protected: - virtual void SendMessageToHMI(MessageSharedPointer message); - virtual void SubscribeTo(); + /** + * @brief Saving dictionary to filesystem + */ + void SaveStateToFileSystem() OVERRIDE; + + /** + * @brief Get reference to dictionary + */ + Json::Value& get_dictionary() OVERRIDE; private: - mqd_t sdl_to_hmi_mqueue_; - mqd_t hmi_to_sdl_mqueue_; + const std::string app_storage_folder_; + const std::string app_info_storage_; + Json::Value dictionary_; + + /** + * @brief Load dictionary from filesystem + */ + void LoadStateFromFileSystem(); - ReceiverThreadDelegate* receiver_thread_delegate_; - threads::Thread* receiver_thread_; + DISALLOW_COPY_AND_ASSIGN(LastStateImpl); }; -} // namespace hmi_message_handler -#endif // SRC_COMPONENTS_HMI_MESSAGE_HANDLER_INCLUDE_HMI_MESSAGE_HANDLER_MQUEUE_ADAPTER_H_ +} // namespace resumption + +#endif // SRC_COMPONENTS_RESUMPTION_INCLUDE_RESUMPTION_LAST_STATE_IMPL_H_ diff --git a/src/components/resumption/src/last_state.cc b/src/components/resumption/src/last_state_impl.cc index c1b8534bfc..4d3fd1526c 100644 --- a/src/components/resumption/src/last_state.cc +++ b/src/components/resumption/src/last_state_impl.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -30,7 +30,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include "resumption/last_state.h" +#include "resumption/last_state_impl.h" #include "utils/file_system.h" #include "utils/logger.h" @@ -38,37 +38,41 @@ namespace resumption { CREATE_LOGGERPTR_GLOBAL(logger_, "Resumption") -LastState::LastState(const std::string& app_storage_folder, - const std::string& app_info_storage) +LastStateImpl::LastStateImpl(const std::string& app_storage_folder, + const std::string& app_info_storage) : app_storage_folder_(app_storage_folder) , app_info_storage_(app_info_storage) { - LoadFromFileSystem(); + LoadStateFromFileSystem(); LOG4CXX_AUTO_TRACE(logger_); } -LastState::~LastState() { +LastStateImpl::~LastStateImpl() { LOG4CXX_AUTO_TRACE(logger_); - SaveToFileSystem(); + SaveStateToFileSystem(); } -void LastState::SaveToFileSystem() { +void LastStateImpl::SaveStateToFileSystem() { LOG4CXX_AUTO_TRACE(logger_); - const std::string& str = dictionary.toStyledString(); + const std::string& str = dictionary_.toStyledString(); const std::vector<uint8_t> char_vector_pdata(str.begin(), str.end()); DCHECK(file_system::CreateDirectoryRecursively(app_storage_folder_)); LOG4CXX_INFO(logger_, - "LastState::SaveToFileSystem " << app_info_storage_ << str); + "LastState::SaveStateToFileSystem " << app_info_storage_ << str); DCHECK(file_system::Write(app_info_storage_, char_vector_pdata)); } -void LastState::LoadFromFileSystem() { +Json::Value& LastStateImpl::get_dictionary() { + return dictionary_; +} + +void LastStateImpl::LoadStateFromFileSystem() { std::string buffer; bool result = file_system::ReadFile(app_info_storage_, buffer); Json::Reader m_reader; - if (result && m_reader.parse(buffer, dictionary)) { + if (result && m_reader.parse(buffer, dictionary_)) { LOG4CXX_INFO(logger_, - "Valid last state was found." << dictionary.toStyledString()); + "Valid last state was found." << dictionary_.toStyledString()); return; } LOG4CXX_WARN(logger_, "No valid last state was found."); diff --git a/src/components/resumption/test/CMakeLists.txt b/src/components/resumption/test/CMakeLists.txt index 6fa1c07381..5481d5f80f 100644 --- a/src/components/resumption/test/CMakeLists.txt +++ b/src/components/resumption/test/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ford Motor Company +# Copyright (c) 2016, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,7 +28,7 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -if(BUILD_TESTS) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories( ${LOG4CXX_INCLUDE_DIRECTORY} @@ -41,22 +41,14 @@ include_directories( ${CMAKE_BINARY_DIR} ) +collect_sources(SOURCES ${CMAKE_CURRENT_SOURCE_DIR}) + set(LIBRARIES gmock ConfigProfile Utils Resumption jsoncpp - ConfigProfile ) -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() +create_test(resumption_test "${SOURCES}" "${LIBRARIES}") diff --git a/src/components/resumption/test/last_state_test.cc b/src/components/resumption/test/last_state_test.cc index 78acc68c90..15180fa12c 100644 --- a/src/components/resumption/test/last_state_test.cc +++ b/src/components/resumption/test/last_state_test.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -34,7 +34,7 @@ #include "gtest/gtest.h" -#include "resumption/last_state.h" +#include "resumption/last_state_impl.h" #include "utils/file_system.h" namespace test { @@ -69,17 +69,17 @@ class LastStateTest : public ::testing::Test { const std::string empty_dictionary_; const std::string app_info_dat_file_; - resumption::LastState last_state_; + resumption::LastStateImpl last_state_; }; TEST_F(LastStateTest, Basic) { - const Value& dictionary = last_state_.dictionary; + const Value& dictionary = last_state_.get_dictionary(); EXPECT_EQ(empty_dictionary_, dictionary.toStyledString()); } TEST_F(LastStateTest, SetGetData) { { - const Value& dictionary = last_state_.dictionary; + Value& dictionary = last_state_.get_dictionary(); const Value& bluetooth_info = dictionary["TransportManager"]["BluetoothAdapter"]; EXPECT_EQ(empty_dictionary_, bluetooth_info.toStyledString()); @@ -98,14 +98,14 @@ TEST_F(LastStateTest, SetGetData) { Value test_value; test_value["name"] = "test_device"; - last_state_.dictionary["TransportManager"]["TcpAdapter"]["devices"] = - test_value; - last_state_.dictionary["TransportManager"]["BluetoothAdapter"]["devices"] = + dictionary["TransportManager"]["TcpAdapter"]["devices"] = test_value; + + dictionary["TransportManager"]["BluetoothAdapter"]["devices"] = "bluetooth_device"; - last_state_.SaveToFileSystem(); + last_state_.SaveStateToFileSystem(); } - const Value& dictionary = last_state_.dictionary; + const Value& dictionary = last_state_.get_dictionary(); const Value& bluetooth_info = dictionary["TransportManager"]["BluetoothAdapter"]; diff --git a/src/components/rpc_base/CMakeLists.txt b/src/components/rpc_base/CMakeLists.txt index 94e67cc985..700cec72bb 100644 --- a/src/components/rpc_base/CMakeLists.txt +++ b/src/components/rpc_base/CMakeLists.txt @@ -28,31 +28,27 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. - -set(RPC_BASE_INCLUDE_DIR ${COMPONENTS_DIR}/rpc_base/include) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories( - include + ${COMPONENTS_DIR}/rpc_base/include + ${COMPONENTS_DIR}/utils/include ${JSONCPP_INCLUDE_DIRECTORY} ) -set (SOURCES - ${COMPONENTS_DIR}/rpc_base/src/rpc_base/rpc_base.cc +set(PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src ) +collect_sources(SOURCES "${PATHS}") -set (HEADERS - ${RPC_BASE_INCLUDE_DIR}/rpc_base/gtest_support.h - ${RPC_BASE_INCLUDE_DIR}/rpc_base/rpc_base_dbus_inl.h - ${RPC_BASE_INCLUDE_DIR}/rpc_base/rpc_base.h - ${RPC_BASE_INCLUDE_DIR}/rpc_base/rpc_base_inl.h - ${RPC_BASE_INCLUDE_DIR}/rpc_base/rpc_base_json_inl.h - ${RPC_BASE_INCLUDE_DIR}/rpc_base/rpc_message.h - ${RPC_BASE_INCLUDE_DIR}/rpc_base/validation_report.h +set(LIBRARIES + jsoncpp ) -add_library(rpc_base ${HEADERS} ${SOURCES}) -target_link_libraries(rpc_base jsoncpp) +add_library(rpc_base ${SOURCES}) +target_link_libraries(rpc_base ${LIBRARIES}) if(BUILD_TESTS) add_subdirectory(test) -endif()
\ No newline at end of file +endif() diff --git a/src/components/rpc_base/test/CMakeLists.txt b/src/components/rpc_base/test/CMakeLists.txt index 76cf738f46..566f0ddcde 100644 --- a/src/components/rpc_base/test/CMakeLists.txt +++ b/src/components/rpc_base/test/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ford Motor Company +# Copyright (c) 2016, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,8 +28,9 @@ # 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 ( +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) + +include_directories( ${COMPONENTS_DIR}/dbus/include ${COMPONENTS_DIR}/dbus/src ${COMPONENTS_DIR}/rpc_base/include @@ -43,20 +44,16 @@ set(LIBRARIES jsoncpp ) -set(SOURCES - rpc_base_json_test.cc - rpc_base_test.cc - validation_report_test.cc -) - -if (${HMI_DBUS_API}) - # Build dbus tests +if(${HMI_DBUS_API}) include_directories(${DBUS_INCLUDE_DIRS}) - set (LIBRARIES ${LIBRARIES} DBus) - set (SOURCES ${SOURCES} rpc_base_dbus_test.cc) -endif () - -create_test("rpc_base_test" "${SOURCES}" "${LIBRARIES}") - + list(APPEND LIBRARIES + DBus + ) +else() + set(EXCLUDE_PATHS + rpc_base_dbus_test.cc + ) endif() +collect_sources(SOURCES "${CMAKE_CURRENT_SOURCE_DIR}" "${EXCLUDE_PATHS}") +create_test(rpc_base_test "${SOURCES}" "${LIBRARIES}") diff --git a/src/components/security_manager/CMakeLists.txt b/src/components/security_manager/CMakeLists.txt index 3cc6178931..bb50ad50c9 100644 --- a/src/components/security_manager/CMakeLists.txt +++ b/src/components/security_manager/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 @@ -27,7 +27,9 @@ # 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(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories( include/ @@ -41,15 +43,22 @@ include_directories( ${APR_INCLUDE_DIRECTORY} ) -set (SOURCES - ${COMPONENTS_DIR}/security_manager/src/security_manager_impl.cc - ${COMPONENTS_DIR}/security_manager/src/security_query.cc - ${COMPONENTS_DIR}/security_manager/src/crypto_manager_impl.cc - ${COMPONENTS_DIR}/security_manager/src/ssl_context_impl.cc +set(PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src +) +collect_sources(SOURCES "${PATHS}") + +set(LIBRARIES + crypto + ssl + ProtocolHandler + jsoncpp + ProtocolLibrary ) add_library(SecurityManager ${SOURCES}) -target_link_libraries(SecurityManager crypto ssl ProtocolHandler jsoncpp ProtocolLibrary) +target_link_libraries(SecurityManager ${LIBRARIES}) if(BUILD_TESTS) add_subdirectory(test) diff --git a/src/components/security_manager/test/CMakeLists.txt b/src/components/security_manager/test/CMakeLists.txt index 6707e5ea5a..ba1fbcca8b 100644 --- a/src/components/security_manager/test/CMakeLists.txt +++ b/src/components/security_manager/test/CMakeLists.txt @@ -28,8 +28,8 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -if (BUILD_TESTS) - +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) + include_directories( ${GMOCK_INCLUDE_DIRECTORY} ${COMPONENTS_DIR}/protocol_handler/test/include @@ -39,20 +39,15 @@ include_directories( ${JSONCPP_INCLUDE_DIRECTORY} ) -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/security_query_matcher.cc - ${COMPONENTS_DIR}/security_manager/test/ssl_context_test.cc - ${COMPONENTS_DIR}/security_manager/test/ssl_certificate_handshake_test.cc - ) +collect_sources(SOURCES "${CMAKE_CURRENT_SOURCE_DIR}") set(LIBRARIES gmock ${SecurityManagerLibrary} ) +create_test (security_manager_test "${SOURCES}" "${LIBRARIES}") + set(CERT_LIST ${CMAKE_SOURCE_DIR}/mycert.pem ${CMAKE_SOURCE_DIR}/mykey.pem @@ -64,11 +59,8 @@ add_custom_target(generate_certificates WORKING_DIRECTORY ${CMAKE_BINARY_DIR} ) -foreach( file_i ${CERT_LIST}) - file(COPY ${file_i} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) -endforeach( file_i ) +foreach(CERT_ENTRY ${CERT_LIST}) + file(COPY ${CERT_ENTRY} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) +endforeach() -create_test (security_manager_test "${SOURCES}" "${LIBRARIES}") add_dependencies(security_manager_test generate_certificates) - -endif () diff --git a/src/components/smart_objects/CMakeLists.txt b/src/components/smart_objects/CMakeLists.txt index c1d599db67..339cf90ea4 100644 --- a/src/components/smart_objects/CMakeLists.txt +++ b/src/components/smart_objects/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2014, Ford Motor Company +# Copyright (c) 2016, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,28 +28,19 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) -set(SMART_OBJECTS_SRC_DIR ${COMPONENTS_DIR}/smart_objects/src) - -include_directories ( - include - ${COMPONENTS_DIR}/utils/include/ +include_directories( + ${COMPONENTS_DIR}/include + ${COMPONENTS_DIR}/smart_objects/include + ${COMPONENTS_DIR}/utils/include ) -set (SOURCES - ${SMART_OBJECTS_SRC_DIR}/smart_object.cc - ${SMART_OBJECTS_SRC_DIR}/smart_schema.cc - ${SMART_OBJECTS_SRC_DIR}/schema_item.cc - ${SMART_OBJECTS_SRC_DIR}/always_false_schema_item.cc - ${SMART_OBJECTS_SRC_DIR}/always_true_schema_item.cc - ${SMART_OBJECTS_SRC_DIR}/default_shema_item.cc - ${SMART_OBJECTS_SRC_DIR}/bool_schema_item.cc - ${SMART_OBJECTS_SRC_DIR}/number_schema_item.cc - ${SMART_OBJECTS_SRC_DIR}/enum_schema_item.cc - ${SMART_OBJECTS_SRC_DIR}/string_schema_item.cc - ${SMART_OBJECTS_SRC_DIR}/object_schema_item.cc - ${SMART_OBJECTS_SRC_DIR}/array_schema_item.cc +set(PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src ) +collect_sources(SOURCES "${PATHS}") add_library("SmartObjects" ${SOURCES}) @@ -60,4 +51,3 @@ endif() if(BUILD_TESTS) add_subdirectory(test) endif() - diff --git a/src/components/smart_objects/test/CMakeLists.txt b/src/components/smart_objects/test/CMakeLists.txt index e8bc20b6b8..e0cc37e104 100644 --- a/src/components/smart_objects/test/CMakeLists.txt +++ b/src/components/smart_objects/test/CMakeLists.txt @@ -28,8 +28,11 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) + if(BUILD_TESTS) -add_definitions(-DUNIT_TESTS) + add_definitions(-DUNIT_TESTS) +endif() include_directories ( ${GMOCK_INCLUDE_DIRECTORY} @@ -45,22 +48,10 @@ set(LIBRARIES jsoncpp ) -set(SOURCES - ${COMPONENTS_DIR}/smart_objects/test/SmartObjectDraft_test.cc - ${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/smart_object_performance_test.cc - ${COMPONENTS_DIR}/smart_objects/test/map_performance_test.cc - ${COMPONENTS_DIR}/smart_objects/test/BoolSchemaItem_test.cc - ${COMPONENTS_DIR}/smart_objects/test/NumberSchemaItem_test.cc - ${COMPONENTS_DIR}/smart_objects/test/StringSchemaItem_test.cc - ${COMPONENTS_DIR}/smart_objects/test/ArraySchemaItem_test.cc - ${COMPONENTS_DIR}/smart_objects/test/CObjectSchemaItem_test.cc - ${COMPONENTS_DIR}/smart_objects/test/AlwaysTrueSchemaItem_test.cc - ${COMPONENTS_DIR}/smart_objects/test/AlwaysFalseSchemaItem_test.cc +set(EXCLUDE_PATHS + EnumSchemaItem_test.cc + SmartObjectConvertionTime_test.cc ) -create_test("smart_object_test" "${SOURCES}" "${LIBRARIES}") - -endif() +collect_sources(SOURCES "${CMAKE_CURRENT_SOURCE_DIR}" "${EXCLUDE_PATHS}") +create_test(smart_object_test "${SOURCES}" "${LIBRARIES}") diff --git a/src/components/telemetry_monitor/CMakeLists.txt b/src/components/telemetry_monitor/CMakeLists.txt index 354badb41a..5ac90d1967 100644 --- a/src/components/telemetry_monitor/CMakeLists.txt +++ b/src/components/telemetry_monitor/CMakeLists.txt @@ -28,8 +28,7 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. - -set(TELEMETRY_MONITOR_SRC_DIR ${COMPONENTS_DIR}/telemetry_monitor/src) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories ( include @@ -51,15 +50,15 @@ include_directories ( ${LOG4CXX_INCLUDE_DIRECTORY} ) -set(SOURCES - ${TELEMETRY_MONITOR_SRC_DIR}/metric_wrapper.cc - ${TELEMETRY_MONITOR_SRC_DIR}/telemetry_monitor.cc - ${TELEMETRY_MONITOR_SRC_DIR}/application_manager_observer.cc - ${TELEMETRY_MONITOR_SRC_DIR}/transport_manager_observer.cc - ${TELEMETRY_MONITOR_SRC_DIR}/protocol_handler_observer.cc - ${TELEMETRY_MONITOR_SRC_DIR}/application_manager_metric_wrapper.cc - ${TELEMETRY_MONITOR_SRC_DIR}/transport_manager_metric_wrapper.cc - ${TELEMETRY_MONITOR_SRC_DIR}/protocol_handler_metric_wrapper.cc +set(PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src +) +collect_sources(SOURCES "${PATHS}") + +set(LIBRARIES + HMI_API + MOBILE_API ) add_library("TelemetryMonitor" ${SOURCES}) diff --git a/src/components/telemetry_monitor/test/CMakeLists.txt b/src/components/telemetry_monitor/test/CMakeLists.txt index 7d2de19854..ea2698dfb2 100644 --- a/src/components/telemetry_monitor/test/CMakeLists.txt +++ b/src/components/telemetry_monitor/test/CMakeLists.txt @@ -28,7 +28,7 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -if(BUILD_TESTS) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories( include @@ -40,20 +40,10 @@ include_directories( ${COMPONENTS_DIR}/resumption/include ${JSONCPP_INCLUDE_DIRECTORY} ) - -set(testSources - metric_wrapper_test.cc - telemetry_monitor_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 -) +collect_sources(SOURCES "${CMAKE_CURRENT_SOURCE_DIR}") -set(testLibraries +set(LIBRARIES gmock TelemetryMonitor jsoncpp @@ -68,7 +58,7 @@ set(testLibraries MessageHelper Resumption jsoncpp - transport_manager + TransportManager MediaManager ProtocolHandler connectionHandler @@ -82,8 +72,8 @@ if (BUILD_BT_SUPPORT) list(APPEND testLibraries bluetooth) endif() -file(COPY log4cxx.properties DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) +create_test("telemetry_monitor_test" "${SOURCES}" "${LIBRARIES}") + +file(COPY ${COMPONENTS_DIR}/telemetry_monitor/test/log4cxx.properties DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) -create_test("telemetry_monitor_test" "${testSources}" "${testLibraries}") -endif() diff --git a/src/components/transport_manager/CMakeLists.txt b/src/components/transport_manager/CMakeLists.txt index 49a3702896..b764345618 100644 --- a/src/components/transport_manager/CMakeLists.txt +++ b/src/components/transport_manager/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2014, Ford Motor Company +# Copyright (c) 2017, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,8 +28,8 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -set(target TransportManager) -set(TM_SRC_DIR ${COMPONENTS_DIR}/transport_manager/src) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/platform.cmake) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories ( include @@ -43,83 +43,63 @@ include_directories ( ${LIBUSB_INCLUDE_DIRECTORY} ${LOG4CXX_INCLUDE_DIRECTORY} ) -if (BUILD_BT_SUPPORT) - include_directories( - ) -endif() -set (SOURCES - ${TM_SRC_DIR}/transport_manager_impl.cc - ${TM_SRC_DIR}/transport_manager_default.cc - ${TM_SRC_DIR}/transport_adapter/transport_adapter_listener_impl.cc - ${TM_SRC_DIR}/transport_adapter/transport_adapter_impl.cc - ${TM_SRC_DIR}/tcp/tcp_transport_adapter.cc - ${TM_SRC_DIR}/transport_adapter/threaded_socket_connection.cc - ${TM_SRC_DIR}/tcp/tcp_client_listener.cc - ${TM_SRC_DIR}/tcp/tcp_device.cc - ${TM_SRC_DIR}/tcp/tcp_socket_connection.cc - ${TM_SRC_DIR}/tcp/tcp_connection_factory.cc +set(PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src +) + +set(EXCLUDE_PATHS) + +set(LIBRARIES + ProtocolLibrary ) -if (BUILD_BT_SUPPORT) - list (APPEND SOURCES - ${TM_SRC_DIR}/bluetooth/bluetooth_device_scanner.cc - ${TM_SRC_DIR}/bluetooth/bluetooth_transport_adapter.cc - ${TM_SRC_DIR}/bluetooth/bluetooth_connection_factory.cc - ${TM_SRC_DIR}/bluetooth/bluetooth_socket_connection.cc - ${TM_SRC_DIR}/bluetooth/bluetooth_device.cc +if(BUILD_BT_SUPPORT) + list(APPEND LIBRARIES + bluetooth + ) +else() + list(APPEND EXCLUDE_PATHS + ${COMPONENTS_DIR}/transport_manager/include/transport_manager/bluetooth + ${COMPONENTS_DIR}/transport_manager/src/bluetooth ) endif() -if (BUILD_USB_SUPPORT) - list (APPEND SOURCES - ${TM_SRC_DIR}/usb/usb_aoa_adapter.cc - ${TM_SRC_DIR}/usb/usb_connection_factory.cc - ${TM_SRC_DIR}/usb/usb_device_scanner.cc - ) +if(BUILD_USB_SUPPORT) if (CMAKE_SYSTEM_NAME STREQUAL "Linux") - list (APPEND SOURCES - ${TM_SRC_DIR}/usb/libusb/usb_handler.cc - ${TM_SRC_DIR}/usb/libusb/usb_connection.cc - ${TM_SRC_DIR}/usb/libusb/platform_usb_device.cc + set(EXCLUDE_PATHS + ${COMPONENTS_DIR}/transport_manager/include/transport_manager/usb/qnx + ${COMPONENTS_DIR}/transport_manager/src/usb/qnx + ) + list(APPEND LIBRARIES + Libusb-1.0.16 ) elseif(CMAKE_SYSTEM_NAME STREQUAL "QNX") - list(APPEND SOURCES - ${TM_SRC_DIR}/usb/qnx/usb_handler.cc - ${TM_SRC_DIR}/usb/qnx/usb_connection.cc - ${TM_SRC_DIR}/usb/qnx/platform_usb_device.cc + set(EXCLUDE_PATHS + ${COMPONENTS_DIR}/transport_manager/include/transport_manager/usb/libusb + ${COMPONENTS_DIR}/transport_manager/src/usb/libusb + ) + list(APPEND LIBRARIES + usbdi ) endif() -endif(BUILD_USB_SUPPORT) - - -if (CMAKE_SYSTEM_NAME STREQUAL "QNX") +else() + list(APPEND EXCLUDE_PATHS + ${COMPONENTS_DIR}/transport_manager/include/transport_manager/usb + ${COMPONENTS_DIR}/transport_manager/src/usb + ) endif() -add_library(${target} ${SOURCES}) -target_link_libraries(${target} ProtocolLibrary) +collect_sources(SOURCES "${PATHS}" "${EXCLUDE_PATHS}") -if (BUILD_USB_SUPPORT) - if (CMAKE_SYSTEM_NAME STREQUAL "QNX") - target_link_libraries(${target} usbdi) - endif() -endif(BUILD_USB_SUPPORT) +add_library("TransportManager" ${SOURCES}) +target_link_libraries("TransportManager" ${LIBRARIES}) if(ENABLE_LOG) - target_link_libraries(${target} log4cxx -L${LOG4CXX_LIBS_DIRECTORY}) -endif() - -if (BUILD_BT_SUPPORT) - target_link_libraries(${target} bluetooth) + target_link_libraries("TransportManager" log4cxx -L${LOG4CXX_LIBS_DIRECTORY}) endif() -if (CMAKE_SYSTEM_NAME STREQUAL "QNX") -endif() - -add_library("transport_manager" ${SOURCES} - ${TRANSPORT_MANAGER_SOURCES} -) - if(BUILD_TESTS) add_subdirectory(test) endif() diff --git a/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_socket_connection.h b/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_socket_connection.h index 3f524dac0f..bd8aaad571 100644 --- a/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_socket_connection.h +++ b/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_socket_connection.h @@ -2,7 +2,7 @@ * \file bluetooth_socket_connection.h * \brief BluetoothSocketConnection class header file. * - * Copyright (c) 2013, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -66,12 +66,13 @@ class BluetoothSocketConnection : public ThreadedSocketConnection { protected: /** - * @brief Establish connection. + * @brief Check if we can start the connection attempt and establish + *connection status. * - * @param error Connection error. + * @param error contains information of any error that occurred during + *connection attempt. * - * @return True - connection established. - * false - connection not established. + * @return result that states whether we successfully connected or not. */ virtual bool Establish(ConnectError** error); }; diff --git a/src/components/transport_manager/include/transport_manager/tcp/tcp_connection_factory.h b/src/components/transport_manager/include/transport_manager/tcp/tcp_connection_factory.h index 7f238e91ec..da24a4d65d 100644 --- a/src/components/transport_manager/include/transport_manager/tcp/tcp_connection_factory.h +++ b/src/components/transport_manager/include/transport_manager/tcp/tcp_connection_factory.h @@ -2,7 +2,7 @@ * \file tcp_connection_factory.h * \brief TcpConnectionFactory class header file. * - * Copyright (c) 2013, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -37,11 +37,12 @@ #define SRC_COMPONENTS_TRANSPORT_MANAGER_INCLUDE_TRANSPORT_MANAGER_TCP_TCP_CONNECTION_FACTORY_H_ #include "transport_manager/transport_adapter/server_connection_factory.h" -#include "transport_manager/transport_adapter/transport_adapter_controller.h" namespace transport_manager { namespace transport_adapter { +class TransportAdapterController; + /** * @brief Create connections. */ diff --git a/src/components/transport_manager/include/transport_manager/tcp/tcp_server_originated_socket_connection.h b/src/components/transport_manager/include/transport_manager/tcp/tcp_server_originated_socket_connection.h new file mode 100644 index 0000000000..bf38fae37e --- /dev/null +++ b/src/components/transport_manager/include/transport_manager/tcp/tcp_server_originated_socket_connection.h @@ -0,0 +1,84 @@ +/* + * \file tcp_server_originated_socket_connection.h + * \brief TcpServerOriginatedSocketConnection class header file. + * + * Copyright (c) 2017, 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_INCLUDE_TRANSPORT_MANAGER_TCP_TCP_SERVER_ORIGINATED_SOCKET_CONNECTION_H_ +#define SRC_COMPONENTS_TRANSPORT_MANAGER_INCLUDE_TRANSPORT_MANAGER_TCP_TCP_SERVER_ORIGINATED_SOCKET_CONNECTION_H_ + +#include "transport_manager/transport_adapter/threaded_socket_connection.h" + +namespace transport_manager { +namespace transport_adapter { + +class TransportAdapterController; + +/** + * @brief Class responsible for communication over sockets that originated by + * server. + */ +class TcpServerOriginatedSocketConnection : public ThreadedSocketConnection { + public: + /** + * @brief Constructor. + * + * @param device_uid Device unique identifier. + * @param app_handle Handle of application. + * @param controller Pointer to the device adapter controller. + */ + TcpServerOriginatedSocketConnection(const DeviceUID& device_uid, + const ApplicationHandle& app_handle, + TransportAdapterController* controller); + + /** + * @brief Destructor. + */ + virtual ~TcpServerOriginatedSocketConnection(); + + protected: + /** + * @brief Check if we can start the connection attempt and establish + *connection status. + * + * @param error contains information of any error that occurred during + *connection attempt. + * + * @return result that states whether we successfully connected or not. + */ + virtual bool Establish(ConnectError** error); +}; + +} // namespace transport_adapter +} // namespace transport_manager + +#endif // SRC_COMPONENTS_TRANSPORT_MANAGER_INCLUDE_TRANSPORT_MANAGER_TCP_TCP_SERVER_ORIGINATED_SOCKET_CONNECTION_H_ diff --git a/src/components/transport_manager/include/transport_manager/tcp/tcp_socket_connection.h b/src/components/transport_manager/include/transport_manager/tcp/tcp_socket_connection.h index 4d7901f4f0..a3e081e238 100644 --- a/src/components/transport_manager/include/transport_manager/tcp/tcp_socket_connection.h +++ b/src/components/transport_manager/include/transport_manager/tcp/tcp_socket_connection.h @@ -2,7 +2,7 @@ * \file tcp_socket_connection.h * \brief TcpSocketConnection class header file. * - * Copyright (c) 2013, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -36,11 +36,6 @@ #ifndef SRC_COMPONENTS_TRANSPORT_MANAGER_INCLUDE_TRANSPORT_MANAGER_TCP_TCP_SOCKET_CONNECTION_H_ #define SRC_COMPONENTS_TRANSPORT_MANAGER_INCLUDE_TRANSPORT_MANAGER_TCP_TCP_SOCKET_CONNECTION_H_ -#include <arpa/inet.h> -#include <netinet/in.h> -#include <sys/types.h> -#include <sys/socket.h> - #include "transport_manager/transport_adapter/threaded_socket_connection.h" namespace transport_manager { @@ -71,36 +66,13 @@ class TcpSocketConnection : public ThreadedSocketConnection { protected: /** - * @brief - */ - virtual bool Establish(ConnectError** error); -}; - -/** - * @brief Class responsible for communication over sockets that originated by - * server. - */ -class TcpServerOiginatedSocketConnection : public ThreadedSocketConnection { - public: - /** - * @brief Constructor. + * @brief Check if we can start the connection attempt and establish + *connection status. * - * @param device_uid Device unique identifier. - * @param app_handle Handle of application. - * @param controller Pointer to the device adapter controller. - */ - TcpServerOiginatedSocketConnection(const DeviceUID& device_uid, - const ApplicationHandle& app_handle, - TransportAdapterController* controller); - - /** - * @brief Destructor. - */ - virtual ~TcpServerOiginatedSocketConnection(); - - protected: - /** - * @brief + * @param error contains information of any error that occurred during + *connection attempt. + * + * @return result that states whether we successfully connected or not. */ virtual bool Establish(ConnectError** error); }; diff --git a/src/components/transport_manager/include/transport_manager/transport_adapter/threaded_socket_connection.h b/src/components/transport_manager/include/transport_manager/transport_adapter/threaded_socket_connection.h index ab0c5cbf85..3792b94d7c 100644 --- a/src/components/transport_manager/include/transport_manager/transport_adapter/threaded_socket_connection.h +++ b/src/components/transport_manager/include/transport_manager/transport_adapter/threaded_socket_connection.h @@ -1,7 +1,7 @@ /* * \file threaded_socket_connection.h * \brief Header for classes responsible for communication over sockets. - * Copyright (c) 2013, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -40,6 +40,7 @@ #include "transport_manager/transport_adapter/connection.h" #include "protocol/common.h" +#include "utils/atomic_object.h" #include "utils/threads/thread_delegate.h" #include "utils/lock.h" @@ -88,6 +89,15 @@ class ThreadedSocketConnection : public Connection { bool IsFramesToSendQueueEmpty() const; /** + * @brief Check if connection has been terminated. + * + * @return Information which states that connection was marked as terminated. + */ + bool IsConnectionTerminated() const { + return terminate_flag_; + } + + /** * @brief Set variable that hold socket No. */ void set_socket(int socket) { @@ -111,6 +121,15 @@ class ThreadedSocketConnection : public Connection { */ virtual ~ThreadedSocketConnection(); + /** + * @brief Check if we can start the connection attempt and establish + *connection status. + * + * @param error contains information of any error that occurred during + *connection attempt. + * + * @return result that states whether we successfully connected or not. + */ virtual bool Establish(ConnectError** error) = 0; /** @@ -134,6 +153,25 @@ class ThreadedSocketConnection : public Connection { return app_handle_; } + /** + * @brief Get variable that hold socket No. + */ + int get_socket() const { + return socket_; + } + + /** + * @brief Checks current socket value, sends shutdown and close commands for + * this socket and clear current socket value. + */ + void ShutdownAndCloseSocket(); + + /** + * @brief This method will ensure that thread has finished running and then it + * will delete this thread. + */ + void StopAndJoinThread(); + private: class SocketConnectionDelegate : public threads::ThreadDelegate { public: @@ -163,7 +201,7 @@ class ThreadedSocketConnection : public Connection { FrameQueue frames_to_send_; mutable sync_primitives::Lock frames_to_send_mutex_; - int socket_; + sync_primitives::atomic_int socket_; bool terminate_flag_; bool unexpected_disconnect_; const DeviceUID device_uid_; diff --git a/src/components/transport_manager/src/bluetooth/bluetooth_connection_factory.cc b/src/components/transport_manager/src/bluetooth/bluetooth_connection_factory.cc index bb27493701..0d8a77c88f 100644 --- a/src/components/transport_manager/src/bluetooth/bluetooth_connection_factory.cc +++ b/src/components/transport_manager/src/bluetooth/bluetooth_connection_factory.cc @@ -2,7 +2,7 @@ * \file bluetooth_connection_factory.cc * \brief BluetoothConnectionFactory class source file. * - * Copyright (c) 2013, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -33,11 +33,11 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include "transport_manager/bluetooth/bluetooth_connection_factory.h" #include "transport_manager/transport_adapter/transport_adapter_controller.h" +#include "transport_manager/bluetooth/bluetooth_connection_factory.h" #include "transport_manager/bluetooth/bluetooth_socket_connection.h" - #include "utils/logger.h" +#include "utils/make_shared.h" namespace transport_manager { namespace transport_adapter { @@ -54,17 +54,16 @@ TransportAdapter::Error BluetoothConnectionFactory::Init() { TransportAdapter::Error BluetoothConnectionFactory::CreateConnection( const DeviceUID& device_uid, const ApplicationHandle& app_handle) { - LOG4CXX_TRACE(logger_, - "enter. device_uid: " << &device_uid - << ", app_handle: " << &app_handle); - BluetoothSocketConnection* connection( - new BluetoothSocketConnection(device_uid, app_handle, controller_)); + LOG4CXX_AUTO_TRACE(logger_); + utils::SharedPtr<BluetoothSocketConnection> connection = + utils::MakeShared<BluetoothSocketConnection>( + device_uid, app_handle, controller_); + controller_->ConnectionCreated(connection, device_uid, app_handle); TransportAdapter::Error error = connection->Start(); if (TransportAdapter::OK != error) { - LOG4CXX_ERROR(logger_, "connection::Start() failed"); - delete connection; + LOG4CXX_ERROR(logger_, + "Bluetooth connection::Start() failed with error: " << error); } - LOG4CXX_TRACE(logger_, "exit with error: " << error); return error; } diff --git a/src/components/transport_manager/src/bluetooth/bluetooth_socket_connection.cc b/src/components/transport_manager/src/bluetooth/bluetooth_socket_connection.cc index 5f1eed4c5e..16960aa1d4 100644 --- a/src/components/transport_manager/src/bluetooth/bluetooth_socket_connection.cc +++ b/src/components/transport_manager/src/bluetooth/bluetooth_socket_connection.cc @@ -1,6 +1,6 @@ /* * - * Copyright (c) 2013, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -56,7 +56,9 @@ BluetoothSocketConnection::BluetoothSocketConnection( TransportAdapterController* controller) : ThreadedSocketConnection(device_uid, app_handle, controller) {} -BluetoothSocketConnection::~BluetoothSocketConnection() {} +BluetoothSocketConnection::~BluetoothSocketConnection() { + StopAndJoinThread(); +} bool BluetoothSocketConnection::Establish(ConnectError** error) { LOG4CXX_AUTO_TRACE(logger_); diff --git a/src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc b/src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc index a82c40ca15..0f83f32c60 100644 --- a/src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc +++ b/src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc @@ -2,7 +2,7 @@ * \file bluetooth_transport_adapter.cc * \brief BluetoothTransportAdapter class source file. * - * Copyright (c) 2013, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -111,7 +111,8 @@ void BluetoothTransportAdapter::Store() const { } } bluetooth_adapter_dictionary["devices"] = devices_dictionary; - last_state().dictionary["TransportManager"]["BluetoothAdapter"] = + Json::Value& dictionary = last_state().get_dictionary(); + dictionary["TransportManager"]["BluetoothAdapter"] = bluetooth_adapter_dictionary; LOG4CXX_TRACE(logger_, "exit"); } @@ -120,7 +121,7 @@ bool BluetoothTransportAdapter::Restore() { LOG4CXX_TRACE(logger_, "enter"); bool errors_occured = false; const Json::Value bluetooth_adapter_dictionary = - last_state().dictionary["TransportManager"]["BluetoothAdapter"]; + last_state().get_dictionary()["TransportManager"]["BluetoothAdapter"]; const Json::Value devices_dictionary = bluetooth_adapter_dictionary["devices"]; for (Json::Value::const_iterator i = devices_dictionary.begin(); diff --git a/src/components/transport_manager/src/tcp/tcp_client_listener.cc b/src/components/transport_manager/src/tcp/tcp_client_listener.cc index a075b1afb7..48f5dbd613 100644 --- a/src/components/transport_manager/src/tcp/tcp_client_listener.cc +++ b/src/components/transport_manager/src/tcp/tcp_client_listener.cc @@ -1,6 +1,6 @@ /* * - * Copyright (c) 2013, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -53,6 +53,7 @@ #include <sstream> #include "utils/logger.h" +#include "utils/make_shared.h" #include "utils/threads/thread.h" #include "transport_manager/transport_adapter/transport_adapter_controller.h" #include "transport_manager/tcp/tcp_device.h" @@ -222,12 +223,16 @@ void TcpClientListener::Loop() { const ApplicationHandle app_handle = tcp_device->AddIncomingApplication(connection_fd); - TcpSocketConnection* connection(new TcpSocketConnection( - device->unique_device_id(), app_handle, controller_)); + utils::SharedPtr<TcpSocketConnection> connection = + utils::MakeShared<TcpSocketConnection>( + device->unique_device_id(), app_handle, controller_); + controller_->ConnectionCreated( + connection, device->unique_device_id(), app_handle); connection->set_socket(connection_fd); const TransportAdapter::Error error = connection->Start(); - if (error != TransportAdapter::OK) { - delete connection; + if (TransportAdapter::OK != error) { + LOG4CXX_ERROR(logger_, + "TCP connection::Start() failed with error: " << error); } } } diff --git a/src/components/transport_manager/src/tcp/tcp_connection_factory.cc b/src/components/transport_manager/src/tcp/tcp_connection_factory.cc index 5b1e9af6cb..114425076a 100644 --- a/src/components/transport_manager/src/tcp/tcp_connection_factory.cc +++ b/src/components/transport_manager/src/tcp/tcp_connection_factory.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -30,10 +30,12 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include "transport_manager/transport_adapter/transport_adapter_controller.h" #include "transport_manager/tcp/tcp_connection_factory.h" -#include "transport_manager/tcp/tcp_socket_connection.h" +#include "transport_manager/tcp/tcp_server_originated_socket_connection.h" #include "utils/logger.h" +#include "utils/make_shared.h" namespace transport_manager { namespace transport_adapter { @@ -54,16 +56,17 @@ TransportAdapter::Error TcpConnectionFactory::CreateConnection( LOG4CXX_DEBUG(logger_, "DeviceUID: " << &device_uid << ", ApplicationHandle: " << &app_handle); - TcpServerOiginatedSocketConnection* connection( - new TcpServerOiginatedSocketConnection( - device_uid, app_handle, controller_)); - if (connection->Start() == TransportAdapter::OK) { - LOG4CXX_DEBUG(logger_, "TCP connection initialised"); - return TransportAdapter::OK; - } else { - LOG4CXX_ERROR(logger_, "Could not initialise TCP connection"); - return TransportAdapter::FAIL; + utils::SharedPtr<TcpServerOriginatedSocketConnection> connection = + utils::MakeShared<TcpServerOriginatedSocketConnection>( + device_uid, app_handle, controller_); + controller_->ConnectionCreated(connection, device_uid, app_handle); + const TransportAdapter::Error error = connection->Start(); + if (TransportAdapter::OK != error) { + LOG4CXX_ERROR(logger_, + "TCP ServerOriginated connection::Start() failed with error: " + << error); } + return error; } void TcpConnectionFactory::Terminate() {} diff --git a/src/components/transport_manager/src/tcp/tcp_server_originated_socket_connection.cc b/src/components/transport_manager/src/tcp/tcp_server_originated_socket_connection.cc new file mode 100644 index 0000000000..516f2d3ec4 --- /dev/null +++ b/src/components/transport_manager/src/tcp/tcp_server_originated_socket_connection.cc @@ -0,0 +1,111 @@ +/* + * + * Copyright (c) 2017, 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 "transport_manager/tcp/tcp_server_originated_socket_connection.h" +#include "transport_manager/tcp/tcp_device.h" +#include "transport_manager/transport_adapter/transport_adapter_controller.h" +#include "utils/logger.h" + +namespace transport_manager { +namespace transport_adapter { + +CREATE_LOGGERPTR_GLOBAL(logger_, "TransportManager") + +TcpServerOriginatedSocketConnection::TcpServerOriginatedSocketConnection( + const DeviceUID& device_uid, + const ApplicationHandle& app_handle, + TransportAdapterController* controller) + : ThreadedSocketConnection(device_uid, app_handle, controller) {} + +TcpServerOriginatedSocketConnection::~TcpServerOriginatedSocketConnection() { + StopAndJoinThread(); +} + +bool TcpServerOriginatedSocketConnection::Establish(ConnectError** error) { + LOG4CXX_AUTO_TRACE(logger_); + DCHECK(error); + LOG4CXX_DEBUG(logger_, "error " << error); + DeviceSptr device = controller()->FindDevice(device_handle()); + if (!device.valid()) { + LOG4CXX_ERROR(logger_, "Device " << device_handle() << " not found"); + *error = new ConnectError(); + return false; + } + TcpDevice* tcp_device = static_cast<TcpDevice*>(device.get()); + + const int port = tcp_device->GetApplicationPort(application_handle()); + if (-1 == port) { + LOG4CXX_ERROR(logger_, + "Application port for " << application_handle() + << " not found"); + *error = new ConnectError(); + return false; + } + + if (IsConnectionTerminated()) { + LOG4CXX_ERROR( + logger_, + "Connection is already terminated. Socket will not be created"); + *error = new ConnectError(); + return false; + } + + const int socket = ::socket(AF_INET, SOCK_STREAM, 0); + if (socket < 0) { + LOG4CXX_ERROR(logger_, "Failed to create socket"); + *error = new ConnectError(); + return false; + } + + struct sockaddr_in addr = {0}; + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = tcp_device->in_addr(); + addr.sin_port = htons(port); + + LOG4CXX_DEBUG(logger_, + "Connecting " << inet_ntoa(addr.sin_addr) << ":" << port); + set_socket(socket); + if (::connect(get_socket(), (struct sockaddr*)&addr, sizeof(addr)) < 0) { + LOG4CXX_ERROR(logger_, + "Failed to connect for application " << application_handle() + << ", error " << errno); + *error = new ConnectError(); + ShutdownAndCloseSocket(); + return false; + } + + return true; +} + +} // namespace transport_adapter +} // namespace transport_manager diff --git a/src/components/transport_manager/src/tcp/tcp_socket_connection.cc b/src/components/transport_manager/src/tcp/tcp_socket_connection.cc index acab9f555f..a2ef38f3cb 100644 --- a/src/components/transport_manager/src/tcp/tcp_socket_connection.cc +++ b/src/components/transport_manager/src/tcp/tcp_socket_connection.cc @@ -1,6 +1,6 @@ /* * - * Copyright (c) 2013, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -32,16 +32,9 @@ */ #include "transport_manager/tcp/tcp_socket_connection.h" - -#include <memory.h> -#include <signal.h> -#include <errno.h> -#include <unistd.h> - -#include "utils/logger.h" -#include "utils/threads/thread.h" #include "transport_manager/tcp/tcp_device.h" #include "transport_manager/transport_adapter/transport_adapter_controller.h" +#include "utils/logger.h" namespace transport_manager { namespace transport_adapter { @@ -53,65 +46,11 @@ TcpSocketConnection::TcpSocketConnection(const DeviceUID& device_uid, TransportAdapterController* controller) : ThreadedSocketConnection(device_uid, app_handle, controller) {} -TcpSocketConnection::~TcpSocketConnection() {} - -bool TcpSocketConnection::Establish(ConnectError** error) { - return true; +TcpSocketConnection::~TcpSocketConnection() { + StopAndJoinThread(); } -TcpServerOiginatedSocketConnection::TcpServerOiginatedSocketConnection( - const DeviceUID& device_uid, - const ApplicationHandle& app_handle, - TransportAdapterController* controller) - : ThreadedSocketConnection(device_uid, app_handle, controller) {} - -TcpServerOiginatedSocketConnection::~TcpServerOiginatedSocketConnection() {} - -bool TcpServerOiginatedSocketConnection::Establish(ConnectError** error) { - LOG4CXX_AUTO_TRACE(logger_); - DCHECK(error); - LOG4CXX_DEBUG(logger_, "error " << error); - DeviceSptr device = controller()->FindDevice(device_handle()); - if (!device.valid()) { - LOG4CXX_ERROR(logger_, "Device " << device_handle() << " not found"); - *error = new ConnectError(); - return false; - } - TcpDevice* tcp_device = static_cast<TcpDevice*>(device.get()); - - const int port = tcp_device->GetApplicationPort(application_handle()); - if (-1 == port) { - LOG4CXX_ERROR(logger_, - "Application port for " << application_handle() - << " not found"); - *error = new ConnectError(); - return false; - } - - const int socket = ::socket(AF_INET, SOCK_STREAM, 0); - if (socket < 0) { - LOG4CXX_ERROR(logger_, "Failed to create socket"); - *error = new ConnectError(); - return false; - } - - struct sockaddr_in addr = {0}; - addr.sin_family = AF_INET; - addr.sin_addr.s_addr = tcp_device->in_addr(); - addr.sin_port = htons(port); - - LOG4CXX_DEBUG(logger_, - "Connecting " << inet_ntoa(addr.sin_addr) << ":" << port); - if (::connect(socket, (struct sockaddr*)&addr, sizeof(addr)) < 0) { - LOG4CXX_ERROR(logger_, - "Failed to connect for application " << application_handle() - << ", error " << errno); - *error = new ConnectError(); - ::close(socket); - return false; - } - - set_socket(socket); +bool TcpSocketConnection::Establish(ConnectError** error) { return true; } diff --git a/src/components/transport_manager/src/tcp/tcp_transport_adapter.cc b/src/components/transport_manager/src/tcp/tcp_transport_adapter.cc index a389deb517..0e9e63263b 100644 --- a/src/components/transport_manager/src/tcp/tcp_transport_adapter.cc +++ b/src/components/transport_manager/src/tcp/tcp_transport_adapter.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -110,7 +110,7 @@ void TcpTransportAdapter::Store() const { } } tcp_adapter_dictionary["devices"] = devices_dictionary; - Json::Value& dictionary = last_state().dictionary; + Json::Value& dictionary = last_state().get_dictionary(); dictionary["TransportManager"]["TcpAdapter"] = tcp_adapter_dictionary; } @@ -118,7 +118,7 @@ bool TcpTransportAdapter::Restore() { LOG4CXX_AUTO_TRACE(logger_); bool errors_occurred = false; const Json::Value tcp_adapter_dictionary = - last_state().dictionary["TransportManager"]["TcpAdapter"]; + last_state().get_dictionary()["TransportManager"]["TcpAdapter"]; const Json::Value devices_dictionary = tcp_adapter_dictionary["devices"]; for (Json::Value::const_iterator i = devices_dictionary.begin(); i != devices_dictionary.end(); diff --git a/src/components/transport_manager/src/transport_adapter/threaded_socket_connection.cc b/src/components/transport_manager/src/transport_adapter/threaded_socket_connection.cc index 5e9f3d941d..081caec50a 100644 --- a/src/components/transport_manager/src/transport_adapter/threaded_socket_connection.cc +++ b/src/components/transport_manager/src/transport_adapter/threaded_socket_connection.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -70,10 +70,7 @@ ThreadedSocketConnection::ThreadedSocketConnection( ThreadedSocketConnection::~ThreadedSocketConnection() { LOG4CXX_AUTO_TRACE(logger_); - Disconnect(); - thread_->join(); - delete thread_->delegate(); - threads::DeleteThread(thread_); + DCHECK(NULL == thread_); if (-1 != read_fd_) { close(read_fd_); @@ -83,6 +80,14 @@ ThreadedSocketConnection::~ThreadedSocketConnection() { } } +void ThreadedSocketConnection::StopAndJoinThread() { + Disconnect(); + thread_->join(); + delete thread_->delegate(); + threads::DeleteThread(thread_); + thread_ = NULL; +} + void ThreadedSocketConnection::Abort() { LOG4CXX_AUTO_TRACE(logger_); unexpected_disconnect_ = true; @@ -126,7 +131,8 @@ void ThreadedSocketConnection::Finalize() { LOG4CXX_DEBUG(logger_, "not unexpected_disconnect"); controller_->ConnectionFinished(device_handle(), application_handle()); } - close(socket_); + + ShutdownAndCloseSocket(); } TransportAdapter::Error ThreadedSocketConnection::Notify() const { @@ -157,12 +163,12 @@ TransportAdapter::Error ThreadedSocketConnection::SendData( TransportAdapter::Error ThreadedSocketConnection::Disconnect() { LOG4CXX_AUTO_TRACE(logger_); terminate_flag_ = true; + ShutdownAndCloseSocket(); return Notify(); } void ThreadedSocketConnection::threadMain() { LOG4CXX_AUTO_TRACE(logger_); - controller_->ConnectionCreated(this, device_handle(), application_handle()); ConnectError* connect_error = NULL; if (!Establish(&connect_error)) { LOG4CXX_ERROR(logger_, "Connection Establish failed"); @@ -191,6 +197,22 @@ bool ThreadedSocketConnection::IsFramesToSendQueueEmpty() const { return frames_to_send_.empty(); } +void ThreadedSocketConnection::ShutdownAndCloseSocket() { + LOG4CXX_AUTO_TRACE(logger_); + const int socket = socket_; + socket_ = -1; + if (socket != -1) { + if (shutdown(socket, SHUT_RDWR) != 0) { + LOG4CXX_WARN(logger_, "Socket was unable to be shutdowned"); + } + if (close(socket) != 0) { + LOG4CXX_ERROR_WITH_ERRNO(logger_, "Failed to close socket"); + } + } else { + LOG4CXX_WARN(logger_, "Socket has been already closed or not created yet"); + } +} + void ThreadedSocketConnection::Transmit() { LOG4CXX_AUTO_TRACE(logger_); diff --git a/src/components/transport_manager/src/transport_adapter/transport_adapter_impl.cc b/src/components/transport_manager/src/transport_adapter/transport_adapter_impl.cc index f0fddfb4f5..026e53670b 100644 --- a/src/components/transport_manager/src/transport_adapter/transport_adapter_impl.cc +++ b/src/components/transport_manager/src/transport_adapter/transport_adapter_impl.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -192,6 +192,10 @@ TransportAdapter::Error TransportAdapterImpl::Connect( LOG4CXX_TRACE(logger_, "exit with BAD_STATE"); return BAD_STATE; } + if (!initialised_) { + LOG4CXX_TRACE(logger_, "exit with BAD_STATE"); + return BAD_STATE; + } connections_lock_.AcquireForWriting(); const bool already_exists = diff --git a/src/components/transport_manager/src/transport_manager_impl.cc b/src/components/transport_manager/src/transport_manager_impl.cc index 58000f5ea4..433885a606 100644 --- a/src/components/transport_manager/src/transport_manager_impl.cc +++ b/src/components/transport_manager/src/transport_manager_impl.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -413,14 +413,17 @@ int TransportManagerImpl::AddTransportAdapter( "transport_adapter_listeners_.end()"); return E_ADAPTER_EXISTS; } - transport_adapter_listeners_[transport_adapter] = - new TransportAdapterListenerImpl(this, transport_adapter); - transport_adapter->AddListener( - transport_adapter_listeners_[transport_adapter]); if (transport_adapter->IsInitialised() || transport_adapter->Init() == TransportAdapter::OK) { + transport_adapter_listeners_[transport_adapter] = + new TransportAdapterListenerImpl(this, transport_adapter); + transport_adapter->AddListener( + transport_adapter_listeners_[transport_adapter]); + transport_adapters_.push_back(transport_adapter); + } else { + delete transport_adapter; } LOG4CXX_TRACE(logger_, "exit with E_SUCCESS"); return E_SUCCESS; @@ -618,22 +621,29 @@ void TransportManagerImpl::AddConnection(const ConnectionInternal& c) { connections_.push_back(c); } +namespace { +struct ConnectionFinder { + const uint32_t id_; + ConnectionFinder(const uint32_t id) : id_(id) {} + bool operator()(const transport_manager::TransportManagerImpl::Connection& + connection) const { + return id_ == connection.id; + } +}; +} + void TransportManagerImpl::RemoveConnection( const uint32_t id, transport_adapter::TransportAdapter* transport_adapter) { LOG4CXX_AUTO_TRACE(logger_); LOG4CXX_DEBUG(logger_, "Id: " << id); sync_primitives::AutoWriteLock lock(connections_lock_); - for (std::vector<ConnectionInternal>::iterator it = connections_.begin(); - it != connections_.end(); - ++it) { - if (it->id == id) { - connections_.erase(it); - if (transport_adapter) { - transport_adapter->RemoveFinalizedConnection(it->device, - it->application); - } - break; + const std::vector<ConnectionInternal>::iterator it = std::find_if( + connections_.begin(), connections_.end(), ConnectionFinder(id)); + if (connections_.end() != it) { + if (transport_adapter) { + transport_adapter->RemoveFinalizedConnection(it->device, it->application); } + connections_.erase(it); } } diff --git a/src/components/transport_manager/src/usb/usb_connection_factory.cc b/src/components/transport_manager/src/usb/usb_connection_factory.cc index 28992d8f40..1136dfad21 100644 --- a/src/components/transport_manager/src/usb/usb_connection_factory.cc +++ b/src/components/transport_manager/src/usb/usb_connection_factory.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -34,6 +34,7 @@ #include "transport_manager/usb/usb_device.h" #include "transport_manager/transport_adapter/transport_adapter_impl.h" #include "utils/logger.h" +#include "utils/make_shared.h" #if defined(__QNXNTO__) #include "transport_manager/usb/qnx/usb_connection.h" @@ -73,15 +74,14 @@ TransportAdapter::Error UsbConnectionFactory::CreateConnection( } UsbDevice* usb_device = static_cast<UsbDevice*>(device.get()); - UsbConnection* usb_connection = new UsbConnection(device_uid, - app_handle, - controller_, - usb_handler_, - usb_device->usb_device()); - - controller_->ConnectionCreated(usb_connection, device_uid, app_handle); - - if (usb_connection->Init()) { + utils::SharedPtr<UsbConnection> connection = + utils::MakeShared<UsbConnection>(device_uid, + app_handle, + controller_, + usb_handler_, + usb_device->usb_device()); + controller_->ConnectionCreated(connection, device_uid, app_handle); + if (connection->Init()) { LOG4CXX_INFO(logger_, "USB connection initialised"); LOG4CXX_TRACE(logger_, "exit with TransportAdapter::OK. Condition: USB connection " diff --git a/src/components/transport_manager/test/CMakeLists.txt b/src/components/transport_manager/test/CMakeLists.txt index da20f1d43c..184d546f15 100644 --- a/src/components/transport_manager/test/CMakeLists.txt +++ b/src/components/transport_manager/test/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ford Motor Company +# Copyright (c) 2017, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,8 +28,7 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -if(BUILD_TESTS) -set(TM_TEST_DIR ${COMPONENTS_DIR}/transport_manager/test) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories( include @@ -42,10 +41,16 @@ include_directories( ${JSONCPP_INCLUDE_DIRECTORY} ) +set(EXCLUDE_PATHS + raw_message_matcher.cc +) + +collect_sources(SOURCES "${CMAKE_CURRENT_SOURCE_DIR}" "${EXCLUDE_PATHS}") + set(LIBRARIES gmock ConfigProfile - transport_manager + TransportManager Utils ConfigProfile ProtocolLibrary @@ -58,20 +63,11 @@ if (BUILD_USB_SUPPORT) endif() if (BUILD_BT_SUPPORT) + if (CMAKE_SYSTEM_NAME STREQUAL "Linux") list(APPEND LIBRARIES bluetooth) + endif() endif() -set(SOURCES - ${TM_TEST_DIR}/transport_manager_impl_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 - ${TM_TEST_DIR}/transport_manager_default_test.cc -) - create_test("transport_manager_test" "${SOURCES}" "${LIBRARIES}") + file(COPY smartDeviceLink_test.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) -file(COPY app_info_storage2 DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) -endif() diff --git a/src/components/transport_manager/test/app_info_storage2 b/src/components/transport_manager/test/app_info_storage2 deleted file mode 100644 index 794c8b90bc..0000000000 --- a/src/components/transport_manager/test/app_info_storage2 +++ /dev/null @@ -1,99 +0,0 @@ -{ - "TransportManager" : { - "BluetoothAdapter" : null, - "TcpAdapter" : { - "devices" : [ - { - "address" : "57.48.0.1", - "applications" : [ - { - "port" : "12345" - } - ], - "name" : "unique_device_name0" - }, - { - "address" : "57.48.0.2", - "applications" : [ - { - "port" : "12345" - } - ], - "name" : "unique_device_name1" - }, - { - "address" : "57.48.0.3", - "applications" : [ - { - "port" : "12345" - } - ], - "name" : "unique_device_name2" - }, - { - "address" : "57.48.0.4", - "applications" : [ - { - "port" : "12345" - } - ], - "name" : "unique_device_name3" - }, - { - "address" : "57.48.0.5", - "applications" : [ - { - "port" : "12345" - } - ], - "name" : "unique_device_name4" - }, - { - "address" : "57.48.0.6", - "applications" : [ - { - "port" : "12345" - } - ], - "name" : "unique_device_name5" - }, - { - "address" : "57.48.0.7", - "applications" : [ - { - "port" : "12345" - } - ], - "name" : "unique_device_name6" - }, - { - "address" : "57.48.0.8", - "applications" : [ - { - "port" : "12345" - } - ], - "name" : "unique_device_name7" - }, - { - "address" : "57.48.0.9", - "applications" : [ - { - "port" : "12345" - } - ], - "name" : "unique_device_name8" - }, - { - "address" : "57.48.0.10", - "applications" : [ - { - "port" : "12345" - } - ], - "name" : "unique_device_name9" - } - ] - } - } -} diff --git a/src/components/transport_manager/test/raw_message_matcher.cc b/src/components/transport_manager/test/raw_message_matcher.cc index 130ddc96c8..00489d7c03 100644 --- a/src/components/transport_manager/test/raw_message_matcher.cc +++ b/src/components/transport_manager/test/raw_message_matcher.cc @@ -30,8 +30,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include "include/raw_message_matcher.h" -//#include "../../include/protocol/raw_message.h" +#include "include/transport_manager/raw_message_matcher.h" namespace test { namespace components { 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 60732f0328..b8ff762f41 100644 --- a/src/components/transport_manager/test/tcp_transport_adapter_test.cc +++ b/src/components/transport_manager/test/tcp_transport_adapter_test.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -33,7 +33,7 @@ #include "gtest/gtest.h" #include "transport_manager/tcp/tcp_transport_adapter.h" #include "transport_manager/transport_adapter/connection.h" -#include "resumption/last_state.h" +#include "resumption/last_state_impl.h" #include "protocol/raw_message.h" #include "transport_manager/transport_adapter_listener_mock.h" #include "transport_manager/device_mock.h" @@ -58,7 +58,7 @@ class TcpAdapterTest : public ::testing::Test { protected: TcpAdapterTest() : last_state_("app_storage_folder", "app_info_storage") {} MockTransportManagerSettings transport_manager_settings; - resumption::LastState last_state_; + resumption::LastStateImpl last_state_; const uint32_t port = 12345; const std::string string_port = "12345"; }; @@ -90,7 +90,7 @@ TEST_F(TcpAdapterTest, StoreDataWithOneDeviceAndOneApplication) { // Check that value is saved Json::Value& tcp_dict = - last_state_.dictionary["TransportManager"]["TcpAdapter"]; + last_state_.get_dictionary()["TransportManager"]["TcpAdapter"]; ASSERT_TRUE(tcp_dict.isObject()); ASSERT_FALSE(tcp_dict["devices"].isNull()); @@ -142,7 +142,8 @@ TEST_F(TcpAdapterTest, StoreDataWithSeveralDevicesAndOneApplication) { // Check that values are saved Json::Value& tcp_dict = - last_state_.dictionary["TransportManager"]["TcpAdapter"]; + last_state_.get_dictionary()["TransportManager"]["TcpAdapter"]; + ASSERT_TRUE(tcp_dict.isObject()); ASSERT_FALSE(tcp_dict["devices"].isNull()); for (uint32_t i = 0; i < count_dev; i++) { @@ -199,7 +200,7 @@ TEST_F(TcpAdapterTest, StoreDataWithSeveralDevicesAndSeveralApplications) { // Check that value is saved Json::Value& tcp_dict = - last_state_.dictionary["TransportManager"]["TcpAdapter"]; + last_state_.get_dictionary()["TransportManager"]["TcpAdapter"]; ASSERT_TRUE(tcp_dict.isObject()); ASSERT_FALSE(tcp_dict["devices"].isNull()); @@ -236,13 +237,15 @@ TEST_F(TcpAdapterTest, StoreData_ConnectionNotExist_DataNotStored) { // Check that value is not saved Json::Value& tcp_dict = - last_state_.dictionary["TransportManager"]["TcpAdapter"]["devices"]; + last_state_.get_dictionary()["TransportManager"]["TcpAdapter"]["devices"]; + ASSERT_TRUE(tcp_dict.isNull()); } TEST_F(TcpAdapterTest, RestoreData_DataNotStored) { Json::Value& tcp_adapter_dictionary = - last_state_.dictionary["TransportManager"]["TcpAdapter"]; + last_state_.get_dictionary()["TransportManager"]["TcpAdapter"]; + tcp_adapter_dictionary = Json::Value(); MockTCPTransportAdapter transport_adapter( port, last_state_, transport_manager_settings); diff --git a/src/components/transport_manager/test/transport_adapter_test.cc b/src/components/transport_manager/test/transport_adapter_test.cc index f3d7343b24..6e845753ec 100644 --- a/src/components/transport_manager/test/transport_adapter_test.cc +++ b/src/components/transport_manager/test/transport_adapter_test.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -46,7 +46,7 @@ #include "transport_manager/transport_adapter/connection.h" #include "protocol/raw_message.h" #include "utils/make_shared.h" -#include "resumption/last_state.h" +#include "resumption/last_state_impl.h" #include "config_profile/profile.h" namespace test { @@ -74,7 +74,7 @@ class TransportAdapterTest : public ::testing::Test { } NiceMock<MockTransportManagerSettings> transport_manager_settings; - resumption::LastState last_state_; + resumption::LastStateImpl last_state_; std::string dev_id; std::string uniq_id; int app_handle; diff --git a/src/components/transport_manager/test/transport_manager_default_test.cc b/src/components/transport_manager/test/transport_manager_default_test.cc index 6d0854d2ec..e3bd0e7240 100644 --- a/src/components/transport_manager/test/transport_manager_default_test.cc +++ b/src/components/transport_manager/test/transport_manager_default_test.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -29,45 +29,83 @@ * 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" -#include "resumption/last_state.h" #include "transport_manager/mock_transport_manager_settings.h" -#include "resumption/last_state.h" +#include "resumption/mock_last_state.h" namespace test { namespace components { namespace transport_manager_test { +using ::resumption::MockLastState; using ::testing::Return; +using ::testing::ReturnRef; +using ::testing::NiceMock; + +namespace { +const std::string kDeviceName = "name"; +const std::string kDeviceAddress = "address"; +const std::string kDeviceApplications = "applications"; +const std::string kApplicationPort = "port"; +const std::string kApplicationPortValue = "12345"; +const std::string kTransportManager = "TransportManager"; +const std::string kTcpAdapter = "TcpAdapter"; +const std::string kBluetoothAdapter = "BluetoothAdapter"; +const std::string kDevices = "devices"; +} // namespace TEST(TestTransportManagerDefault, Init_LastStateNotUsed) { MockTransportManagerSettings transport_manager_settings; transport_manager::TransportManagerDefault transport_manager( transport_manager_settings); - resumption::LastState last_state("app_storage_folder", "app_info_storage2"); + + NiceMock<resumption::MockLastState> mock_last_state; + Json::Value custom_dictionary = Json::Value(); + + ON_CALL(mock_last_state, get_dictionary()) + .WillByDefault(ReturnRef(custom_dictionary)); EXPECT_CALL(transport_manager_settings, use_last_state()) .WillRepeatedly(Return(false)); EXPECT_CALL(transport_manager_settings, transport_manager_tcp_adapter_port()) .WillRepeatedly(Return(1u)); - transport_manager.Init(last_state); + + transport_manager.Init(mock_last_state); + transport_manager.Stop(); } -TEST(TestTransportManagerDefault, DISABLED_Init_LastStateUsed) { - // TODO (dcherniev) : investigate and fix SegFault issue +TEST(TestTransportManagerDefault, Init_LastStateUsed) { MockTransportManagerSettings transport_manager_settings; transport_manager::TransportManagerDefault transport_manager( transport_manager_settings); - resumption::LastState last_state("app_storage_folder", "app_info_storage2"); + + NiceMock<resumption::MockLastState> mock_last_state; + Json::Value custom_dictionary; + Json::Value tcp_device; + tcp_device[kDeviceName] = "unique_tcp_device_name"; + tcp_device[kDeviceAddress] = "57.48.0.1"; + tcp_device[kDeviceApplications][0][kApplicationPort] = kApplicationPortValue; + Json::Value bluetooth_device; + bluetooth_device[kDeviceName] = "unique_bluetooth_device_name"; + bluetooth_device[kDeviceAddress] = "57.48.0.2"; + bluetooth_device[kDeviceApplications][0][kApplicationPort] = + kApplicationPortValue; + custom_dictionary[kTransportManager][kTcpAdapter][kDevices][0] = tcp_device; + custom_dictionary[kTransportManager][kBluetoothAdapter][kDevices][0] = + bluetooth_device; + + ON_CALL(mock_last_state, get_dictionary()) + .WillByDefault(ReturnRef(custom_dictionary)); EXPECT_CALL(transport_manager_settings, use_last_state()) .WillRepeatedly(Return(true)); EXPECT_CALL(transport_manager_settings, transport_manager_tcp_adapter_port()) .WillRepeatedly(Return(1u)); - transport_manager.Init(last_state); + transport_manager.Init(mock_last_state); transport_manager.Stop(); } diff --git a/src/components/transport_manager/test/transport_manager_impl_test.cc b/src/components/transport_manager/test/transport_manager_impl_test.cc index eb02717d79..5b4e0a7704 100644 --- a/src/components/transport_manager/test/transport_manager_impl_test.cc +++ b/src/components/transport_manager/test/transport_manager_impl_test.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Ford Motor Company + * Copyright (c) 2017, Ford Motor Company * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -46,7 +46,7 @@ #include "utils/make_shared.h" #include "utils/shared_ptr.h" -#include "resumption/last_state.h" +#include "resumption/last_state_impl.h" #include "utils/make_shared.h" using ::testing::_; @@ -76,7 +76,8 @@ class TransportManagerImplTest : public ::testing::Test { , dev_info_(device_handle_, mac_address_, "TestDeviceName", "BTMAC") {} void SetUp() OVERRIDE { - resumption::LastState last_state_("app_storage_folder", "app_info_storage"); + resumption::LastStateImpl last_state_("app_storage_folder", + "app_info_storage"); tm_.Init(last_state_); mock_adapter_ = new MockTransportAdapter(); tm_listener_ = MakeShared<TransportManagerListenerMock>(); diff --git a/src/components/utils/CMakeLists.txt b/src/components/utils/CMakeLists.txt index f72d43e546..51835c125a 100644 --- a/src/components/utils/CMakeLists.txt +++ b/src/components/utils/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ford Motor Company +# Copyright (c) 2016, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,62 +28,77 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/platform.cmake) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) -set(UTILS_INCLUDE_DIR ${COMPONENTS_DIR}/utils/include) -set(UTILS_SRC_DIR ${COMPONENTS_DIR}/utils/src) +find_package(Sqlite3 REQUIRED) include_directories ( - ${UTILS_INCLUDE_DIR} + ${COMPONENTS_DIR}/utils/include ${COMPONENTS_DIR}/config_profile/include ${COMPONENTS_DIR}/media_manager/include ${COMPONENTS_DIR}/protocol_handler/include ${LOG4CXX_INCLUDE_DIRECTORY} ) -set (SOURCES - ${UTILS_SRC_DIR}/bitstream.cc - ${UTILS_SRC_DIR}/conditional_variable_posix.cc - ${UTILS_SRC_DIR}/file_system.cc - ${UTILS_SRC_DIR}/threads/posix_thread.cc - ${UTILS_SRC_DIR}/threads/thread_delegate.cc - ${UTILS_SRC_DIR}/threads/thread_validator.cc - ${UTILS_SRC_DIR}/threads/async_runner.cc - ${UTILS_SRC_DIR}/lock_posix.cc - ${UTILS_SRC_DIR}/rwlock_posix.cc - ${UTILS_SRC_DIR}/date_time.cc - ${UTILS_SRC_DIR}/signals_linux.cc - ${UTILS_SRC_DIR}/system.cc - ${UTILS_SRC_DIR}/resource_usage.cc - ${UTILS_SRC_DIR}/appenders_loader.cc - ${UTILS_SRC_DIR}/gen_hash.cc - ${UTILS_SRC_DIR}/convert_utils.cc - ${UTILS_SRC_DIR}/custom_string.cc - ${UTILS_SRC_DIR}/timer.cc +# dbms +set(DBMS_PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include/utils/sqlite_wrapper + ${CMAKE_CURRENT_SOURCE_DIR}/src/sqlite_wrapper + ${CMAKE_CURRENT_SOURCE_DIR}/include/utils/qdb_wrapper + ${CMAKE_CURRENT_SOURCE_DIR}/src/qdb_wrapper ) +set(EXCLUDE_PATHS + thread_manager.cc + pulse_thread_delegate.cc + ${DBMS_PATHS} +) + +set(LIBRARIES) + +if(NOT BUILD_BACKTRACE_SUPPORT) + list(APPEND EXCLUDE_PATHS + back_trace.cc + ) +endif() + if(ENABLE_LOG) - list(APPEND SOURCES - ${UTILS_SRC_DIR}/push_log.cc - ${UTILS_SRC_DIR}/log_message_loop_thread.cc - ${UTILS_SRC_DIR}/logger_status.cc - ${UTILS_SRC_DIR}/auto_trace.cc - ${UTILS_SRC_DIR}/logger.cc + list(APPEND LIBRARIES + log4cxx -L${LOG4CXX_LIBS_DIRECTORY} + apr-1 -L${APR_LIBS_DIRECTORY} + aprutil-1 -L${APR_UTIL_LIBS_DIRECTORY} + ConfigProfile + ) +else() + list(APPEND EXCLUDE_PATHS + push_log.cc + log_message_loop_thread.cc + logger_status.cc + auto_trace.cc + logger.cc ) endif() -if (BUILD_BACKTRACE_SUPPORT) - list(APPEND SOURCES - ${UTILS_SRC_DIR}/back_trace.cc - ) +if(NOT BUILD_BT_SUPPORT) + list(APPEND EXCLUDE_PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include/utils/bluetooth + ${CMAKE_CURRENT_SOURCE_DIR}/src/bluetooth + ) endif() -if (CMAKE_SYSTEM_NAME STREQUAL "QNX") - list(APPEND SOURCES - ${UTILS_SRC_DIR}/threads/pulse_thread_delegate.cc +if (NOT CMAKE_SYSTEM_NAME STREQUAL "QNX") + list(APPEND EXCLUDE_PATHS + pulse_thread_delegate.cc ) endif() -add_library("Utils" ${SOURCES}) +set(PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src +) + +collect_sources(SOURCES "${PATHS}" "${EXCLUDE_PATHS}") if (CMAKE_SYSTEM_NAME STREQUAL "QNX") # --- QDB Wrapper @@ -94,26 +109,16 @@ else () endif () if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") - list(APPEND LIBRARIES dl) + list(APPEND LIBRARIES dl pthread ${RTLIB}) endif() +add_library("Utils" ${SOURCES}) +target_link_libraries("Utils" ${LIBRARIES}) if(ENABLE_LOG) - list(APPEND LIBRARIES log4cxx -L${LOG4CXX_LIBS_DIRECTORY}) - list(APPEND LIBRARIES apr-1 -L${APR_LIBS_DIRECTORY}) - list(APPEND LIBRARIES aprutil-1 -L${APR_UTIL_LIBS_DIRECTORY}) - list(APPEND LIBRARIES ConfigProfile) - - ADD_DEPENDENCIES(Utils install-3rd_party_logger) + add_dependencies("Utils" install-3rd_party_logger) endif() -if(CMAKE_SYSTEM_NAME STREQUAL "Linux") - target_link_libraries("Utils" pthread ${RTLIB}) -endif() - -target_link_libraries("Utils" ${LIBRARIES}) - - if(BUILD_TESTS) add_subdirectory(test) endif() diff --git a/src/components/utils/src/signals_linux.cc b/src/components/utils/src/signals_posix.cc index 274c254716..274c254716 100644 --- a/src/components/utils/src/signals_linux.cc +++ b/src/components/utils/src/signals_posix.cc diff --git a/src/components/utils/src/threads/posix_thread.cc b/src/components/utils/src/threads/thread_posix.cc index 51e59fa108..51e59fa108 100644 --- a/src/components/utils/src/threads/posix_thread.cc +++ b/src/components/utils/src/threads/thread_posix.cc diff --git a/src/components/utils/test/CMakeLists.txt b/src/components/utils/test/CMakeLists.txt index e457e5901e..f6bd24ff09 100644 --- a/src/components/utils/test/CMakeLists.txt +++ b/src/components/utils/test/CMakeLists.txt @@ -28,7 +28,8 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -if(BUILD_TESTS) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/platform.cmake) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/sources.cmake) include_directories ( ${JSONCPP_INCLUDE_DIRECTORY} @@ -39,74 +40,61 @@ include_directories ( ${POLICY_PATH}/include ) -set(testSources - messagemeter_test.cc - file_system_test.cc - date_time_test.cc - system_test.cc - thread_validator_test.cc - conditional_variable_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 - rwlock_posix_test.cc - async_runner_test.cc - shared_ptr_test.cc - scope_guard_test.cc - atomic_object_test.cc - message_loop_thread_test.cc - custom_string_test.cc - timer_test.cc +set(EXCLUDE_PATHS + qdb_wrapper + test_generator ) -set(testLibraries - gmock - Utils - Policy - ConfigProfile -) +if(NOT ENABLE_LOG) + list(APPEND EXCLUDE_PATHS + auto_trace_test.cc + log_message_loop_thread_test.cc + ) +endif() + +if(NOT BUILD_BACKTRACE_SUPPORT) + list(APPEND EXCLUDE_PATHS + back_trace_test.cc + ) +endif() 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 + # exclude tests for SQLite wrapper + list (APPEND EXCLUDE_PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/sqlite_wrapper ) 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 + # exclude tests for QDB wrapper + list (APPEND EXCLUDE_PATHS + ${CMAKE_CURRENT_SOURCE_DIR}/qdb_wrapper ) list (APPEND testLibraries sqlite3) endif() -if (ENABLE_LOG) - list(APPEND testSources auto_trace_test.cc) - list(APPEND testSources log_message_loop_thread_test.cc) -endif() +# exclude some tests +list(APPEND EXCLUDE_PATHS + generated_code_with_sqlite_test.cc + posix_thread_test.cc + resource_usage_test.cc +) -if (BUILD_BACKTRACE_SUPPORT) - list(APPEND testSources back_trace_test.cc) -endif() +collect_sources(SOURCES "${CMAKE_CURRENT_SOURCE_DIR}" "${EXCLUDE_PATHS}") + +set(LIBRARIES + gmock + Utils + Policy + ConfigProfile +) + +create_test(utils_test "${SOURCES}" "${LIBRARIES}") file(COPY testscript.sh DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) file(COPY log4cxx.properties DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) file(COPY smartDeviceLink.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) -create_test("utils_test" "${testSources}" "${testLibraries}") - add_subdirectory(test_generator) - -endif() diff --git a/src/components/utils/test/test_generator/CMakeLists.txt b/src/components/utils/test/test_generator/CMakeLists.txt index d649f927a5..5a7f939659 100644 --- a/src/components/utils/test/test_generator/CMakeLists.txt +++ b/src/components/utils/test/test_generator/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Ford Motor Company +# Copyright (c) 2016, Ford Motor Company # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -28,38 +28,35 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -if(BUILD_TESTS) +include(${CMAKE_SOURCE_DIR}/tools/cmake/helpers/generators.cmake) 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 ${CMAKE_SOURCE_DIR}/tools/interfaceGenerator ${CMAKE_CURRENT_BINARY_DIR} ${COMPONENTS_DIR}/utils/include/utils ${COMPONENTS_DIR}/include/utils + ${JSONCPP_INCLUDE_DIRECTORY} + ${GMOCK_INCLUDE_DIRECTORY} ) -set(full_xml_name "${CMAKE_SOURCE_DIR}/src/components/interfaces/MOBILE_API.xml") - -add_custom_target( generate_version - COMMAND ${INTEFRACE_GENERATOR_CMD} ${full_xml_name} "mobile_apis" - ${CMAKE_CURRENT_BINARY_DIR} "--parser-type" "sdlrpcv2" - DEPENDS ${INTERFACE_GENERATOR_DEPENDENCIES} ${full_xml_name} - VERBATIM - ) +set(XML_NAME ${CMAKE_SOURCE_DIR}/src/components/interfaces/MOBILE_API.xml) +add_custom_target(generate_version + COMMAND ${INTEFRACE_GENERATOR_CMD} ${XML_NAME} "mobile_apis" + ${CMAKE_CURRENT_BINARY_DIR} "--parser-type" "sdlrpcv2" + DEPENDS ${INTERFACE_GENERATOR_DEPENDENCIES} ${XML_NAME} + VERBATIM +) -set(testLibraries +set(LIBRARIES gmock Utils ) -set(testSources +set(SOURCES generated_msg_version_test.cc ) -file(COPY ${full_xml_name} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) -create_test("generator_test" "${testSources}" "${testLibraries}") -add_dependencies("generator_test" generate_version) +create_test(generator_test "${SOURCES}" "${LIBRARIES}") +file(COPY ${XML_NAME} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) -endif() +add_dependencies("generator_test" generate_version) |