From 979492b415698d1bba26efbfd5d9ee08bbb01147 Mon Sep 17 00:00:00 2001 From: "Yana Chernysheva (GitHub)" <59469418+ychernysheva@users.noreply.github.com> Date: Mon, 24 Aug 2020 19:28:25 +0300 Subject: Add check for result codes from HMI IsReady response (#3433) * Add check for result code and minor changes to related responses * Update corresponding unit tests * Add other successful result codes Co-authored-by: Dmitriy Boltovskiy --- .../src/commands/rc_command_request.cc | 2 +- .../test/commands/hmi/rc_is_ready_request_test.cc | 74 ++++++++++++++++++---- .../mobile/subscribe_vehicle_data_request.cc | 11 ++-- .../mobile/unsubscribe_vehicle_data_request.cc | 2 +- .../src/commands/command_request_impl.cc | 4 +- .../src/commands/request_to_hmi.cc | 53 ++++++++++++++-- 6 files changed, 120 insertions(+), 26 deletions(-) diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/rc_command_request.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/rc_command_request.cc index fc342a6d86..98f168c015 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/rc_command_request.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/rc_command_request.cc @@ -137,7 +137,7 @@ void RCCommandRequest::Run() { LOG4CXX_WARN(logger_, "HMI interface RC is not available"); SendResponse(false, mobile_apis::Result::UNSUPPORTED_RESOURCE, - "Remote control is not supported by system"); + "RC is not supported by system"); return; } LOG4CXX_TRACE(logger_, "RC interface is available!"); diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/rc_is_ready_request_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/rc_is_ready_request_test.cc index b569ecb83f..cb90859018 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/rc_is_ready_request_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/rc_is_ready_request_test.cc @@ -56,7 +56,6 @@ namespace am = ::application_manager; using am::commands::MessageSharedPtr; using am::event_engine::Event; using sdl_rpc_plugin::commands::RCIsReadyRequest; - typedef std::shared_ptr RCIsReadyRequestPtr; class RCIsReadyRequestTest @@ -102,15 +101,23 @@ class RCIsReadyRequestTest EXPECT_CALL(mock_rpc_service_, ManageHMICommand(capabilities, _)); } - void PrepareEvent(bool is_message_contain_param, - Event& event, - bool is_rc_cooperating_available = false) { + MessageSharedPtr CreateResultMessage( + bool is_rc_cooperating_available, + hmi_apis::Common_Result::eType result_code = + hmi_apis::Common_Result::INVALID_ENUM) { MessageSharedPtr msg = CreateMessage(smart_objects::SmartType_Map); - if (is_message_contain_param) { - (*msg)[am::strings::msg_params][am::strings::available] = - is_rc_cooperating_available; + (*msg)[am::strings::msg_params][am::strings::available] = + is_rc_cooperating_available; + if (hmi_apis::Common_Result::INVALID_ENUM != result_code) { + (*msg)[am::strings::params][am::hmi_response::code] = result_code; } - event.set_smart_object(*msg); + return msg; + } + + MessageSharedPtr CreateErrorMessage() { + MessageSharedPtr msg = CreateMessage(smart_objects::SmartType_Map); + (*msg)[am::strings::params][am::strings::error_msg] = true; + return msg; } void HMICapabilitiesExpectations() { @@ -128,8 +135,11 @@ TEST_F(RCIsReadyRequestTest, Run_NoKeyAvailableInMessage_HmiInterfacesIgnored) { const bool is_send_message_to_hmi = true; const bool is_message_contain_param = false; Event event(hmi_apis::FunctionID::RC_IsReady); - PrepareEvent(is_message_contain_param, event); + + MessageSharedPtr msg = CreateMessage(smart_objects::SmartType_Map); + event.set_smart_object(*msg); HMICapabilitiesExpectations(); + SetUpExpectations(is_rc_cooperating_available, is_send_message_to_hmi, is_message_contain_param, @@ -142,7 +152,8 @@ TEST_F(RCIsReadyRequestTest, Run_KeyAvailableEqualToFalse_StateNotAvailable) { const bool is_send_message_to_hmi = false; const bool is_message_contain_param = true; Event event(hmi_apis::FunctionID::RC_IsReady); - PrepareEvent(is_message_contain_param, event); + MessageSharedPtr msg = CreateResultMessage(is_rc_cooperating_available); + event.set_smart_object(*msg); SetUpExpectations(is_rc_cooperating_available, is_send_message_to_hmi, is_message_contain_param, @@ -150,13 +161,20 @@ TEST_F(RCIsReadyRequestTest, Run_KeyAvailableEqualToFalse_StateNotAvailable) { command_->on_event(event); } -TEST_F(RCIsReadyRequestTest, Run_KeyAvailableEqualToTrue_StateAvailable) { +TEST_F(RCIsReadyRequestTest, + Run_KeyAvailableEqualToTrueResultCodeSuccess_StateAvailable) { const bool is_rc_cooperating_available = true; const bool is_send_message_to_hmi = true; const bool is_message_contain_param = true; + const hmi_apis::Common_Result::eType result_code = + hmi_apis::Common_Result::SUCCESS; Event event(hmi_apis::FunctionID::RC_IsReady); - PrepareEvent(is_message_contain_param, event, is_rc_cooperating_available); + + MessageSharedPtr msg = + CreateResultMessage(is_rc_cooperating_available, result_code); + event.set_smart_object(*msg); HMICapabilitiesExpectations(); + SetUpExpectations(is_rc_cooperating_available, is_send_message_to_hmi, is_message_contain_param, @@ -164,6 +182,38 @@ TEST_F(RCIsReadyRequestTest, Run_KeyAvailableEqualToTrue_StateAvailable) { command_->on_event(event); } +TEST_F(RCIsReadyRequestTest, + Run_KeyAvailableEqualToTrueResultCodeUnsuccess_StateNotAvailable) { + const bool is_rc_cooperating_available = false; + const bool is_send_message_to_hmi = false; + const bool is_message_contain_param = true; + const hmi_apis::Common_Result::eType result_code = + hmi_apis::Common_Result::GENERIC_ERROR; + Event event(hmi_apis::FunctionID::RC_IsReady); + MessageSharedPtr msg = + CreateResultMessage(is_rc_cooperating_available, result_code); + event.set_smart_object(*msg); + SetUpExpectations(is_rc_cooperating_available, + is_send_message_to_hmi, + is_message_contain_param, + am::HmiInterfaces::STATE_NOT_AVAILABLE); + command_->on_event(event); +} + +TEST_F(RCIsReadyRequestTest, Run_ErrorMessage_StateNotAvailable) { + const bool is_rc_cooperating_available = false; + const bool is_send_message_to_hmi = false; + const bool is_message_contain_param = true; + Event event(hmi_apis::FunctionID::RC_IsReady); + MessageSharedPtr msg = CreateErrorMessage(); + event.set_smart_object(*msg); + SetUpExpectations(is_rc_cooperating_available, + is_send_message_to_hmi, + is_message_contain_param, + am::HmiInterfaces::STATE_NOT_AVAILABLE); + command_->on_event(event); +} + TEST_F(RCIsReadyRequestTest, Run_HMIDoestRespond_SendMessageToHMIByTimeout) { HMICapabilitiesExpectations(); ExpectSendMessagesToHMI(); diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/mobile/subscribe_vehicle_data_request.cc b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/mobile/subscribe_vehicle_data_request.cc index 36d972d5fd..29818232c0 100644 --- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/mobile/subscribe_vehicle_data_request.cc +++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/mobile/subscribe_vehicle_data_request.cc @@ -287,8 +287,8 @@ void SubscribeVehicleDataRequest::CheckVISubscriptions( smart_objects::SmartObject& out_response_params, smart_objects::SmartObject& out_request_params, bool& out_result) { - const bool is_interface_not_available = - (HmiInterfaces::STATE_NOT_AVAILABLE == + const bool is_interface_available = + (HmiInterfaces::STATE_NOT_AVAILABLE != application_manager_.hmi_interfaces().GetInterfaceState( HmiInterfaces::HMI_INTERFACE_VehicleInfo)); @@ -355,7 +355,7 @@ void SubscribeVehicleDataRequest::CheckVISubscriptions( VehicleInfoSubscriptions::size_type items_to_subscribe = 0; auto item_names = (*message_)[strings::msg_params].enumerate(); - if (!is_interface_not_available) { + if (is_interface_available) { for (const auto& name : item_names) { auto enabled = (*message_)[strings::msg_params][name].asBool(); if (!enabled) { @@ -386,6 +386,9 @@ void SubscribeVehicleDataRequest::CheckVISubscriptions( if (0 == items_to_subscribe) { if (HasDisallowedParams()) { out_result_code = mobile_apis::Result::DISALLOWED; + } else if (!is_interface_available) { + out_result_code = mobile_apis::Result::UNSUPPORTED_RESOURCE; + out_info = "VehicleInfo is not supported by system"; } else { out_result_code = mobile_apis::Result::INVALID_DATA; out_info = "No data in the request"; @@ -394,7 +397,7 @@ void SubscribeVehicleDataRequest::CheckVISubscriptions( return; } - if (0 == subscribed_items && !is_interface_not_available) { + if (0 == subscribed_items && is_interface_available) { out_result_code = mobile_apis::Result::IGNORED; out_info = "Already subscribed on provided VehicleData."; out_result = false; diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/mobile/unsubscribe_vehicle_data_request.cc b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/mobile/unsubscribe_vehicle_data_request.cc index 32d63f0c35..fccf56ecf5 100644 --- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/mobile/unsubscribe_vehicle_data_request.cc +++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/mobile/unsubscribe_vehicle_data_request.cc @@ -153,7 +153,7 @@ void UnsubscribeVehicleDataRequest::Run() { if (0 == unsubscribed_items) { SendResponse(false, mobile_apis::Result::IGNORED, - "Was not subscribed on any VehicleData.", + "Some provided VehicleData was not subscribed.", &response_params_); return; } 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 d20039bf70..e770a4e07f 100644 --- a/src/components/application_manager/src/commands/command_request_impl.cc +++ b/src/components/application_manager/src/commands/command_request_impl.cc @@ -92,13 +92,13 @@ const std::string CreateInfoForUnsupportedResult( return "UI is not supported by system"; } case (HmiInterfaces::InterfaceID::HMI_INTERFACE_Navigation): { - return "Navi is not supported by system"; + return "Navigation is not supported by system"; } case (HmiInterfaces::InterfaceID::HMI_INTERFACE_VehicleInfo): { return "VehicleInfo is not supported by system"; } case (HmiInterfaces::InterfaceID::HMI_INTERFACE_RC): { - return "Remote control is not supported by system"; + return "RC is not supported by system"; } default: #ifdef ENABLE_LOG diff --git a/src/components/application_manager/src/commands/request_to_hmi.cc b/src/components/application_manager/src/commands/request_to_hmi.cc index ac34d091af..db191eadb3 100644 --- a/src/components/application_manager/src/commands/request_to_hmi.cc +++ b/src/components/application_manager/src/commands/request_to_hmi.cc @@ -33,6 +33,7 @@ #include "application_manager/commands/request_to_hmi.h" #include "application_manager/message_helper.h" #include "application_manager/rpc_service.h" +#include "utils/helpers.h" namespace application_manager { @@ -77,19 +78,59 @@ bool CheckAvailabilityHMIInterfaces(ApplicationManager& application_manager, return HmiInterfaces::STATE_NOT_AVAILABLE != state; } +bool IsResponseCodeSuccess( + const smart_objects::SmartObject& response_from_hmi) { + auto response_code = static_cast( + response_from_hmi[strings::params][hmi_response::code].asInt()); + + using helpers::Compare; + using helpers::EQ; + using helpers::ONE; + + const bool is_result_success = + Compare( + response_code, + hmi_apis::Common_Result::SUCCESS, + hmi_apis::Common_Result::WARNINGS, + hmi_apis::Common_Result::WRONG_LANGUAGE, + hmi_apis::Common_Result::RETRY, + hmi_apis::Common_Result::SAVED); + return is_result_success; +} + bool ChangeInterfaceState(ApplicationManager& application_manager, const smart_objects::SmartObject& response_from_hmi, HmiInterfaces::InterfaceID interface) { if (response_from_hmi[strings::msg_params].keyExists(strings::available)) { const bool is_available = response_from_hmi[strings::msg_params][strings::available].asBool(); - const HmiInterfaces::InterfaceState interface_state = - is_available ? HmiInterfaces::STATE_AVAILABLE - : HmiInterfaces::STATE_NOT_AVAILABLE; - application_manager.hmi_interfaces().SetInterfaceState(interface, - interface_state); - return is_available; + + if (!is_available) { + application_manager.hmi_interfaces().SetInterfaceState( + interface, HmiInterfaces::STATE_NOT_AVAILABLE); + return false; + } + + // Process response with result + if (response_from_hmi[strings::params].keyExists(hmi_response::code) && + !IsResponseCodeSuccess(response_from_hmi)) { + application_manager.hmi_interfaces().SetInterfaceState( + interface, HmiInterfaces::STATE_NOT_AVAILABLE); + return false; + } + + application_manager.hmi_interfaces().SetInterfaceState( + interface, HmiInterfaces::STATE_AVAILABLE); + return true; } + + // Process response with error + if (response_from_hmi[strings::params].keyExists(strings::error_msg)) { + application_manager.hmi_interfaces().SetInterfaceState( + interface, HmiInterfaces::STATE_NOT_AVAILABLE); + return false; + } + return false; } -- cgit v1.2.1