diff options
author | Shobhit Adlakha <ShobhitAd@users.noreply.github.com> | 2019-08-16 13:50:43 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-08-16 13:50:43 -0400 |
commit | c6e9a9bb55b14571d1f389c75b515a2c1c102f95 (patch) | |
tree | 23a9b965edd3138e5c2b98e4926fb484f7a90753 | |
parent | fcdd7f70417a2c685795c9062177b225eb9d2183 (diff) | |
parent | dd2ec05bc1995a4cfa49fa1dd629ac5f4e28573d (diff) | |
download | sdl_core-c6e9a9bb55b14571d1f389c75b515a2c1c102f95.tar.gz |
Merge pull request #2960 from smartdevicelink/feature/same_app_from_multiple_devices
Support running the same app from multiple devices at the same time
45 files changed, 1754 insertions, 938 deletions
diff --git a/src/components/application_manager/include/application_manager/application_manager_impl.h b/src/components/application_manager/include/application_manager/application_manager_impl.h index c34affbf13..add099f975 100644 --- a/src/components/application_manager/include/application_manager/application_manager_impl.h +++ b/src/components/application_manager/include/application_manager/application_manager_impl.h @@ -517,32 +517,6 @@ class ApplicationManagerImpl bool IsApplicationForbidden(uint32_t connection_key, const std::string& mobile_app_id); - struct ApplicationsAppIdSorter { - bool operator()(const ApplicationSharedPtr lhs, - const ApplicationSharedPtr rhs) { - return lhs->app_id() < rhs->app_id(); - } - }; - - struct ApplicationsMobileAppIdSorter { - bool operator()(const ApplicationSharedPtr lhs, - const ApplicationSharedPtr rhs) { - if (lhs->policy_app_id() == rhs->policy_app_id()) { - return lhs->device() < rhs->device(); - } - return lhs->policy_app_id() < rhs->policy_app_id(); - } - }; - - // typedef for Applications list - typedef std::set<ApplicationSharedPtr, ApplicationsAppIdSorter> ApplictionSet; - - // typedef for Applications list iterator - typedef ApplictionSet::iterator ApplictionSetIt; - - // typedef for Applications list const iterator - typedef ApplictionSet::const_iterator ApplictionSetConstIt; - /** * @brief Notification from PolicyHandler about PTU. * Compares AppHMIType between saved in app and received from PTU. If they are @@ -1065,10 +1039,12 @@ class ApplicationManagerImpl * @brief IsAppInReconnectMode check if application belongs to session * affected by transport switching at the moment by checking internal * waiting list prepared on switching start + * @param device_id device identifier * @param policy_app_id Application id * @return True if application is in the waiting list, otherwise - false */ - bool IsAppInReconnectMode(const std::string& policy_app_id) const FINAL; + bool IsAppInReconnectMode(const connection_handler::DeviceHandle& device_id, + const std::string& policy_app_id) const FINAL; bool IsStopping() const OVERRIDE { return is_stopping_; diff --git a/src/components/application_manager/include/application_manager/policies/policy_handler.h b/src/components/application_manager/include/application_manager/policies/policy_handler.h index 917f8be559..3422a2a2d2 100644 --- a/src/components/application_manager/include/application_manager/policies/policy_handler.h +++ b/src/components/application_manager/include/application_manager/policies/policy_handler.h @@ -87,11 +87,14 @@ class PolicyHandler : public PolicyHandlerInterface, bool ReceiveMessageFromSDK(const std::string& file, const BinaryMessage& pt_string) OVERRIDE; bool UnloadPolicyLibrary() OVERRIDE; - virtual void OnPermissionsUpdated(const std::string& policy_app_id, + + virtual void OnPermissionsUpdated(const std::string& device_id, + const std::string& policy_app_id, const Permissions& permissions, const HMILevel& default_hmi) OVERRIDE; - virtual void OnPermissionsUpdated(const std::string& policy_app_id, + virtual void OnPermissionsUpdated(const std::string& device_id, + const std::string& policy_app_id, const Permissions& permissions) OVERRIDE; #ifdef EXTERNAL_PROPRIETARY_MODE @@ -115,10 +118,12 @@ class PolicyHandler : public PolicyHandlerInterface, /** * @brief Sets HMI default type for specified application + * @param device_handle device identifier * @param application_id ID application * @param app_types list of HMI types */ - void SetDefaultHmiTypes(const std::string& application_id, + void SetDefaultHmiTypes(const transport_manager::DeviceHandle& device_handle, + const std::string& application_id, const smart_objects::SmartObject* app_types) OVERRIDE; /** @@ -177,7 +182,8 @@ class PolicyHandler : public PolicyHandlerInterface, bool GetModuleTypes(const std::string& policy_app_id, std::vector<std::string>* modules) const OVERRIDE; - bool GetDefaultHmi(const std::string& policy_app_id, + bool GetDefaultHmi(const std::string& device_id, + const std::string& policy_app_id, std::string* default_hmi) const OVERRIDE; bool GetInitialAppData(const std::string& application_id, StringArray* nicknames = NULL, @@ -250,7 +256,8 @@ class PolicyHandler : public PolicyHandlerInterface, */ void OnIgnitionCycleOver() OVERRIDE; - void OnPendingPermissionChange(const std::string& policy_app_id) OVERRIDE; + void OnPendingPermissionChange(const std::string& device_id, + const std::string& policy_app_id) OVERRIDE; /** * Initializes PT exchange at user request @@ -337,9 +344,11 @@ class PolicyHandler : public PolicyHandlerInterface, /** * @brief Update currently used device id in policies manager for given * application + * @param device_handle device identifier * @param policy_app_id Application id */ std::string OnCurrentDeviceIdUpdateRequired( + const transport_manager::DeviceHandle& device_handle, const std::string& policy_app_id) OVERRIDE; /** @@ -503,6 +512,7 @@ class PolicyHandler : public PolicyHandlerInterface, virtual void SendOnAppPermissionsChanged( const AppPermissions& permissions, + const std::string& device_id, const std::string& policy_app_id) const OVERRIDE; virtual void OnPTExchangeNeeded() OVERRIDE; @@ -512,11 +522,13 @@ class PolicyHandler : public PolicyHandlerInterface, /** * @brief Allows to add new or update existed application during * registration process + * @param device_id device identifier * @param application_id The policy aplication id. * @param hmi_types list of hmi types * @return function that will notify update manager about new application */ StatusNotifier AddApplication( + const std::string& device_id, const std::string& application_id, const rpc::policy_table_interface_base::AppHmiTypes& hmi_types) OVERRIDE; @@ -560,17 +572,21 @@ class PolicyHandler : public PolicyHandlerInterface, * succesfully registered on mobile device. * It will send OnAppPermissionSend notification and will try to start PTU. * + * @param device_id device identifier * @param application_id registered application. */ - void OnAppRegisteredOnMobile(const std::string& application_id) OVERRIDE; + void OnAppRegisteredOnMobile(const std::string& device_id, + const std::string& application_id) OVERRIDE; /** * @brief Checks if certain request type is allowed for application + * @param device_handle device identifier * @param policy_app_id Unique applicaion id * @param type Request type * @return true, if allowed, otherwise - false */ bool IsRequestTypeAllowed( + const transport_manager::DeviceHandle& device_handle, const std::string& policy_app_id, mobile_apis::RequestType::eType type) const OVERRIDE; @@ -602,10 +618,12 @@ class PolicyHandler : public PolicyHandlerInterface, /** * @brief Gets application request types + * @param device_id device identifier * @param policy_app_id Unique application id * @return request types */ const std::vector<std::string> GetAppRequestTypes( + const transport_manager::DeviceHandle& device_id, const std::string& policy_app_id) const OVERRIDE; /** @@ -725,7 +743,7 @@ class PolicyHandler : public PolicyHandlerInterface, void UpdateHMILevel(application_manager::ApplicationSharedPtr app, mobile_apis::HMILevel::eType level); std::vector<std::string> GetDevicesIds( - const std::string& policy_app_id) OVERRIDE; + const std::string& policy_app_id) const OVERRIDE; /** * @brief Sets days after epoch on successful policy update diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/change_registration_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/change_registration_request.h index 01f20a68e3..f9f780b84b 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/change_registration_request.h +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/change_registration_request.h @@ -123,11 +123,12 @@ class ChangeRegistrationRequest /** * @brief Check parameters (name, vr) for * coincidence with already known parameters of registered applications - * + * @param device_id device identifier * @return SUCCESS if there is no coincidence of app.name/VR synonyms, * otherwise appropriate error code returns */ - mobile_apis::Result::eType CheckCoincidence(); + mobile_apis::Result::eType CheckCoincidence( + const connection_handler::DeviceHandle& device_id); /** * @brief Checks if requested name is allowed by policy diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/register_app_interface_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/register_app_interface_request.h index 8a80db9cdf..c894b355d6 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/register_app_interface_request.h +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/register_app_interface_request.h @@ -215,9 +215,23 @@ class RegisterAppInterfaceRequest */ bool IsApplicationSwitched(); + /** + * @brief Information about given Connection Key. + * @param key Unique key used by other components as session identifier + * @param device_id device identifier. + * @param mac_address uniq address + * @return false in case of error or true in case of success + */ + bool GetDataOnSessionKey( + const uint32_t key, + connection_handler::DeviceHandle* device_id = nullptr, + std::string* mac_address = nullptr) const; + private: std::string response_info_; mobile_apis::Result::eType result_code_; + connection_handler::DeviceHandle device_handle_; + std::string device_id_; policy::PolicyHandlerInterface& GetPolicyHandler(); DISALLOW_COPY_AND_ASSIGN(RegisterAppInterfaceRequest); diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/cancel_interaction_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/cancel_interaction_request.cc index d9a7eccddf..82e0703da1 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/cancel_interaction_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/cancel_interaction_request.cc @@ -61,12 +61,13 @@ void CancelInteractionRequest::Run() { auto function_id = static_cast<mobile_apis::FunctionID::eType>( (*message_)[strings::msg_params][strings::func_id].asInt()); - if (helpers::Compare<mobile_apis::FunctionID::eType, helpers::NEQ, helpers::ALL>( - function_id, - mobile_apis::FunctionID::PerformInteractionID, - mobile_apis::FunctionID::AlertID, - mobile_apis::FunctionID::ScrollableMessageID, - mobile_apis::FunctionID::SliderID)) { + if (helpers:: + Compare<mobile_apis::FunctionID::eType, helpers::NEQ, helpers::ALL>( + function_id, + mobile_apis::FunctionID::PerformInteractionID, + mobile_apis::FunctionID::AlertID, + mobile_apis::FunctionID::ScrollableMessageID, + mobile_apis::FunctionID::SliderID)) { LOG4CXX_ERROR(logger_, "Bad function ID" << function_id); SendResponse(false, mobile_apis::Result::INVALID_ID); return; diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/change_registration_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/change_registration_request.cc index ef81babdd6..8940ea3f59 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/change_registration_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/change_registration_request.cc @@ -49,7 +49,7 @@ struct IsSameNickname { } private: - const custom_str::CustomString& app_id_; + const custom_str::CustomString app_id_; }; } // namespace @@ -160,7 +160,7 @@ void ChangeRegistrationRequest::Run() { return; } - if (mobile_apis::Result::SUCCESS != CheckCoincidence()) { + if (mobile_apis::Result::SUCCESS != CheckCoincidence(app->device())) { SendResponse(false, mobile_apis::Result::DUPLICATE_NAME); return; } @@ -578,36 +578,46 @@ bool ChangeRegistrationRequest::IsWhiteSpaceExist() { return false; } -mobile_apis::Result::eType ChangeRegistrationRequest::CheckCoincidence() { +mobile_apis::Result::eType ChangeRegistrationRequest::CheckCoincidence( + const connection_handler::DeviceHandle& device_id) { LOG4CXX_AUTO_TRACE(logger_); const smart_objects::SmartObject& msg_params = (*message_)[strings::msg_params]; - ApplicationSet accessor = application_manager_.applications().GetData(); + auto compare_tts_name = [](const smart_objects::SmartObject& obj_1, + const smart_objects::SmartObject& obj_2) { + return obj_1[application_manager::strings::text] + .asCustomString() + .CompareIgnoreCase( + obj_2[application_manager::strings::text].asCustomString()); + }; + + const auto& accessor = application_manager_.applications().GetData(); custom_str::CustomString app_name; - uint32_t app_id = connection_key(); + const uint32_t app_id = connection_key(); if (msg_params.keyExists(strings::app_name)) { app_name = msg_params[strings::app_name].asCustomString(); } - ApplicationSetConstIt it = accessor.begin(); - for (; accessor.end() != it; ++it) { - if (app_id == (*it)->app_id()) { + for (const auto& app : accessor) { + if (app->device() != device_id) { + continue; + } + + if (app->app_id() == app_id) { continue; } - const custom_str::CustomString& cur_name = (*it)->name(); + const auto& cur_name = app->name(); if (msg_params.keyExists(strings::app_name)) { if (app_name.CompareIgnoreCase(cur_name)) { LOG4CXX_ERROR(logger_, "Application name is known already."); return mobile_apis::Result::DUPLICATE_NAME; } - - const smart_objects::SmartObject* vr = (*it)->vr_synonyms(); - const std::vector<smart_objects::SmartObject>* curr_vr = NULL; - if (NULL != vr) { - curr_vr = vr->asArray(); + const auto vr = app->vr_synonyms(); + if (vr) { + const auto curr_vr = vr->asArray(); CoincidencePredicateVR v(app_name); if (0 != std::count_if(curr_vr->begin(), curr_vr->end(), v)) { @@ -617,18 +627,37 @@ mobile_apis::Result::eType ChangeRegistrationRequest::CheckCoincidence() { } } - // vr check + // VR check if (msg_params.keyExists(strings::vr_synonyms)) { - const std::vector<smart_objects::SmartObject>* new_vr = - msg_params[strings::vr_synonyms].asArray(); + const auto new_vr = msg_params[strings::vr_synonyms].asArray(); CoincidencePredicateVR v(cur_name); if (0 != std::count_if(new_vr->begin(), new_vr->end(), v)) { LOG4CXX_ERROR(logger_, "vr_synonyms duplicated with app_name ."); return mobile_apis::Result::DUPLICATE_NAME; } - } // end vr check - } // application for end + } // End vr check + + // TTS check + if (msg_params.keyExists(strings::tts_name) && app->tts_name()) { + const auto tts_array = msg_params[strings::tts_name].asArray(); + const auto tts_curr = app->tts_name()->asArray(); + const auto& it_tts = std::find_first_of(tts_array->begin(), + tts_array->end(), + tts_curr->begin(), + tts_curr->end(), + compare_tts_name); + if (it_tts != tts_array->end()) { + LOG4CXX_ERROR( + logger_, + "TTS name: " + << (*it_tts)[strings::text].asCustomString().AsMBString() + << " is known already"); + return mobile_apis::Result::DUPLICATE_NAME; + } + } // End tts check + + } // Application for end return mobile_apis::Result::SUCCESS; } diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_system_request_notification.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_system_request_notification.cc index a85dec10bb..fc99bb323c 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_system_request_notification.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_system_request_notification.cc @@ -86,8 +86,8 @@ void OnSystemRequestNotification::Run() { static_cast<rpc::policy_table_interface_base::RequestType>( request_type)); - if (!policy_handler.IsRequestTypeAllowed(app->policy_app_id(), - request_type)) { + if (!policy_handler.IsRequestTypeAllowed( + app->device(), app->policy_app_id(), request_type)) { LOG4CXX_WARN(logger_, "Request type " << stringified_request_type << " is not allowed by policies"); diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc index 701002ed65..f0da4ebbab 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc @@ -164,7 +164,7 @@ struct IsSameNickname { } private: - const custom_str::CustomString& app_id_; + const custom_str::CustomString app_id_; }; } // namespace @@ -184,13 +184,14 @@ RegisterAppInterfaceRequest::RegisterAppInterfaceRequest( rpc_service, hmi_capabilities, policy_handler) - , result_code_(mobile_apis::Result::INVALID_ENUM) {} + , result_code_(mobile_apis::Result::INVALID_ENUM) + , device_handle_(0) {} RegisterAppInterfaceRequest::~RegisterAppInterfaceRequest() {} bool RegisterAppInterfaceRequest::Init() { LOG4CXX_AUTO_TRACE(logger_); - return true; + return GetDataOnSessionKey(connection_key(), &device_handle_, &device_id_); } void RegisterAppInterfaceRequest::Run() { @@ -224,20 +225,25 @@ void RegisterAppInterfaceRequest::Run() { return; } + LOG4CXX_DEBUG( + logger_, + "device_handle: " << device_handle_ << " device_id: " << device_id_); + if (IsApplicationSwitched()) { return; } + // Cache the original app ID (for legacy behavior) + const auto policy_app_id = + application_manager_.GetCorrectMobileIDFromMessage(message_); + ApplicationSharedPtr application = - application_manager_.application(connection_key()); + application_manager_.application(device_id_, policy_app_id); if (application) { SendResponse(false, mobile_apis::Result::APPLICATION_REGISTERED_ALREADY); return; } - // cache the original app ID (for legacy behavior) - const std::string policy_app_id = - application_manager_.GetCorrectMobileIDFromMessage(message_); const smart_objects::SmartObject& msg_params = (*message_)[strings::msg_params]; @@ -842,14 +848,15 @@ void RegisterAppInterfaceRequest::SendRegisterAppInterfaceResponseToMobile( } } policy::StatusNotifier notify_upd_manager = GetPolicyHandler().AddApplication( - application->policy_app_id(), hmi_types); + application->mac_address(), application->policy_app_id(), hmi_types); response_params[strings::icon_resumed] = file_system::FileExists(application->app_icon_path()); SendResponse(true, result_code, add_info.c_str(), &response_params); if (msg_params.keyExists(strings::app_hmi_type)) { - GetPolicyHandler().SetDefaultHmiTypes(application->policy_app_id(), + GetPolicyHandler().SetDefaultHmiTypes(application->device(), + application->policy_app_id(), &(msg_params[strings::app_hmi_type])); } @@ -863,7 +870,8 @@ void RegisterAppInterfaceRequest::SendRegisterAppInterfaceResponseToMobile( // Start PTU after successfull registration // Sends OnPermissionChange notification to mobile right after RAI response // and HMI level set-up - GetPolicyHandler().OnAppRegisteredOnMobile(application->policy_app_id()); + GetPolicyHandler().OnAppRegisteredOnMobile(application->mac_address(), + application->policy_app_id()); if (result_code != mobile_apis::Result::RESUME_FAILED) { resumer.StartResumption(application, hash_id); @@ -968,48 +976,72 @@ mobile_apis::Result::eType RegisterAppInterfaceRequest::CheckCoincidence( const smart_objects::SmartObject& msg_params = (*message_)[strings::msg_params]; - ApplicationSet accessor = application_manager_.applications().GetData(); + auto compare_tts_name = [](const smart_objects::SmartObject& obj_1, + const smart_objects::SmartObject& obj_2) { + return obj_1[application_manager::strings::text] + .asCustomString() + .CompareIgnoreCase( + obj_2[application_manager::strings::text].asCustomString()); + }; - ApplicationSetConstIt it = accessor.begin(); - const custom_str::CustomString& app_name = - msg_params[strings::app_name].asCustomString(); + const auto& accessor = application_manager_.applications().GetData(); + const auto& app_name = msg_params[strings::app_name].asCustomString(); - for (; accessor.end() != it; ++it) { - // name check - const custom_str::CustomString& cur_name = (*it)->name(); + for (const auto& app : accessor) { + if (app->device() != device_handle_) { + continue; + } + // Name check + const auto& cur_name = app->name(); if (app_name.CompareIgnoreCase(cur_name)) { LOG4CXX_ERROR(logger_, "Application name is known already."); - out_duplicate_apps.push_back(*it); + out_duplicate_apps.push_back(app); continue; } - - const smart_objects::SmartObject* vr = (*it)->vr_synonyms(); - const std::vector<smart_objects::SmartObject>* curr_vr = NULL; - if (NULL != vr) { - curr_vr = vr->asArray(); + const auto vr = app->vr_synonyms(); + if (vr) { + const auto curr_vr = vr->asArray(); CoincidencePredicateVR v(app_name); if (0 != std::count_if(curr_vr->begin(), curr_vr->end(), v)) { LOG4CXX_ERROR(logger_, "Application name is known already."); - out_duplicate_apps.push_back(*it); + out_duplicate_apps.push_back(app); continue; } } - // vr check + // VR check if (msg_params.keyExists(strings::vr_synonyms)) { - const std::vector<smart_objects::SmartObject>* new_vr = - msg_params[strings::vr_synonyms].asArray(); + const auto new_vr = msg_params[strings::vr_synonyms].asArray(); CoincidencePredicateVR v(cur_name); if (0 != std::count_if(new_vr->begin(), new_vr->end(), v)) { LOG4CXX_ERROR(logger_, "vr_synonyms duplicated with app_name ."); - out_duplicate_apps.push_back(*it); + out_duplicate_apps.push_back(app); continue; } - } // end vr check + } // End vr check + + // TTS check + if (msg_params.keyExists(strings::tts_name) && app->tts_name()) { + const auto tts_array = msg_params[strings::tts_name].asArray(); + const auto tts_curr = app->tts_name()->asArray(); + const auto& it_tts = std::find_first_of(tts_array->begin(), + tts_array->end(), + tts_curr->begin(), + tts_curr->end(), + compare_tts_name); + if (it_tts != tts_array->end()) { + LOG4CXX_ERROR( + logger_, + "TTS name: " + << (*it_tts)[strings::text].asCustomString().AsMBString() + << " is known already"); + return mobile_apis::Result::DUPLICATE_NAME; + } + } // End tts check - } // application for end + } // Application for end if (!out_duplicate_apps.empty()) { return mobile_apis::Result::DUPLICATE_NAME; @@ -1138,14 +1170,19 @@ bool RegisterAppInterfaceRequest::IsApplicationWithSameAppIdRegistered() { const custom_string::CustomString mobile_app_id( application_manager_.GetCorrectMobileIDFromMessage(message_)); - const ApplicationSet& applications = - application_manager_.applications().GetData(); - - ApplicationSetConstIt it = applications.begin(); - ApplicationSetConstIt it_end = applications.end(); - - for (; it != it_end; ++it) { - if (mobile_app_id.CompareIgnoreCase((*it)->policy_app_id().c_str())) { + const auto& applications = application_manager_.applications().GetData(); + + for (const auto& app : applications) { + if (mobile_app_id.CompareIgnoreCase(app->policy_app_id().c_str())) { + if (app->device() != device_handle_) { + LOG4CXX_DEBUG(logger_, + "These policy_app_id equal, but applications have " + "different device id" + << " mobile_app_id: " << mobile_app_id.c_str() + << " device_handle: " << device_handle_ + << " device_handle: " << app->device()); + continue; + } return true; } } @@ -1330,7 +1367,7 @@ bool RegisterAppInterfaceRequest::IsApplicationSwitched() { LOG4CXX_DEBUG(logger_, "Looking for application id " << policy_app_id); - auto app = application_manager_.application_by_policy_id(policy_app_id); + auto app = application_manager_.application(device_id_, policy_app_id); if (!app) { LOG4CXX_DEBUG( @@ -1341,12 +1378,13 @@ bool RegisterAppInterfaceRequest::IsApplicationSwitched() { LOG4CXX_DEBUG(logger_, "Application with policy id " << policy_app_id << " is found."); - if (!application_manager_.IsAppInReconnectMode(policy_app_id)) { + if (!application_manager_.IsAppInReconnectMode(device_handle_, + policy_app_id)) { LOG4CXX_DEBUG( logger_, "Policy id " << policy_app_id << " is not found in reconnection list."); SendResponse(false, mobile_apis::Result::APPLICATION_REGISTERED_ALREADY); - return false; + return true; } LOG4CXX_DEBUG(logger_, "Application is found in reconnection list."); @@ -1372,6 +1410,51 @@ bool RegisterAppInterfaceRequest::IsApplicationSwitched() { return true; } +bool RegisterAppInterfaceRequest::GetDataOnSessionKey( + const uint32_t key, + connection_handler::DeviceHandle* device_id, + std::string* mac_address) const { + LOG4CXX_AUTO_TRACE(logger_); + + if ((nullptr == mac_address) && (nullptr == device_id)) { + LOG4CXX_ERROR(logger_, + "Can't get data on session key because device id and mac " + "address are empty."); + return false; + } + + connection_handler::DeviceHandle device_handle = 0; + auto& connect_handler = application_manager_.connection_handler(); + + auto result = connect_handler.GetDataOnSessionKey( + connection_key(), nullptr, nullptr, &device_handle); + + if (result) { + LOG4CXX_DEBUG( + logger_, + "Failed to get device info for connection key: " << connection_key()); + return false; + } + + if (mac_address) { + result = connect_handler.get_session_observer().GetDataOnDeviceID( + device_handle, nullptr, nullptr, mac_address, nullptr); + } + + if (result) { + LOG4CXX_DEBUG(logger_, + "Failed get unique address info for connection key: " + << connection_key()); + return false; + } + + if (device_id) { + *device_id = device_handle; + } + + return true; +} + policy::PolicyHandlerInterface& RegisterAppInterfaceRequest::GetPolicyHandler() { return policy_handler_; diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/system_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/system_request.cc index e70433f29b..9be5a270f5 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/system_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/system_request.cc @@ -470,8 +470,8 @@ void SystemRequest::Run() { static_cast<rpc::policy_table_interface_base::RequestType>( request_type)); - if (!policy_handler.IsRequestTypeAllowed(application->policy_app_id(), - request_type)) { + if (!policy_handler.IsRequestTypeAllowed( + application->device(), application->policy_app_id(), request_type)) { LOG4CXX_ERROR(logger_, "RequestType " << stringified_request_type << " is DISALLOWED by policies"); diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_system_request_notification_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_system_request_notification_test.cc index 69ed8fb311..ffa7203f1f 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_system_request_notification_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_system_request_notification_test.cc @@ -62,6 +62,7 @@ using testing::SaveArg; namespace { const uint32_t kConnectionKey = 1u; const std::string kPolicyAppId = "fake-app-id"; +const connection_handler::DeviceHandle kDeviceId = 1u; } // namespace class OnSystemRequestNotificationTest @@ -73,6 +74,7 @@ class OnSystemRequestNotificationTest ON_CALL(app_mngr_, application(kConnectionKey)) .WillByDefault(Return(mock_app_)); ON_CALL(*mock_app_, policy_app_id()).WillByDefault(Return(kPolicyAppId)); + ON_CALL(*mock_app_, device()).WillByDefault(Return(kDeviceId)); } protected: @@ -90,12 +92,14 @@ TEST_F(OnSystemRequestNotificationTest, Run_ProprietaryType_SUCCESS) { std::shared_ptr<OnSystemRequestNotification> command = CreateCommand<OnSystemRequestNotification>(msg); + PreConditions(); + EXPECT_CALL(app_mngr_, application(kConnectionKey)) .WillRepeatedly(Return(mock_app_)); EXPECT_CALL(*mock_app_, policy_app_id()).WillOnce(Return(kPolicyAppId)); EXPECT_CALL(mock_policy_handler_, - IsRequestTypeAllowed(kPolicyAppId, request_type)) + IsRequestTypeAllowed(kDeviceId, kPolicyAppId, request_type)) .WillRepeatedly(Return(true)); #ifdef PROPRIETARY_MODE @@ -130,10 +134,13 @@ TEST_F(OnSystemRequestNotificationTest, Run_HTTPType_SUCCESS) { std::shared_ptr<OnSystemRequestNotification> command = CreateCommand<OnSystemRequestNotification>(msg); + PreConditions(); + EXPECT_CALL(app_mngr_, application(kConnectionKey)) .WillOnce(Return(mock_app_)); EXPECT_CALL(*mock_app_, policy_app_id()).WillOnce(Return(kPolicyAppId)); - EXPECT_CALL(mock_policy_handler_, IsRequestTypeAllowed(_, _)) + EXPECT_CALL(mock_policy_handler_, + IsRequestTypeAllowed(kDeviceId, kPolicyAppId, request_type)) .WillOnce(Return(true)); EXPECT_CALL(mock_message_helper_, PrintSmartObject(_)) @@ -167,7 +174,7 @@ TEST_F(OnSystemRequestNotificationTest, Run_InvalidApp_NoNotification) { EXPECT_CALL(app_mngr_, application(kConnectionKey)) .WillOnce(Return(MockAppPtr())); EXPECT_CALL(*mock_app_, policy_app_id()).Times(0); - EXPECT_CALL(mock_policy_handler_, IsRequestTypeAllowed(_, _)).Times(0); + EXPECT_CALL(mock_policy_handler_, IsRequestTypeAllowed(_, _, _)).Times(0); EXPECT_CALL(mock_message_helper_, PrintSmartObject(_)).Times(0); @@ -187,10 +194,13 @@ TEST_F(OnSystemRequestNotificationTest, Run_RequestNotAllowed_NoNotification) { std::shared_ptr<OnSystemRequestNotification> command = CreateCommand<OnSystemRequestNotification>(msg); + PreConditions(); + EXPECT_CALL(app_mngr_, application(kConnectionKey)) .WillOnce(Return(mock_app_)); EXPECT_CALL(*mock_app_, policy_app_id()).WillOnce(Return(kPolicyAppId)); - EXPECT_CALL(mock_policy_handler_, IsRequestTypeAllowed(_, _)) + EXPECT_CALL(mock_policy_handler_, + IsRequestTypeAllowed(kDeviceId, kPolicyAppId, request_type)) .WillOnce(Return(false)); EXPECT_CALL(mock_message_helper_, PrintSmartObject(_)).Times(0); @@ -214,7 +224,7 @@ TEST_F( PreConditions(); EXPECT_CALL(mock_policy_handler_, - IsRequestTypeAllowed(kPolicyAppId, request_type)) + IsRequestTypeAllowed(kDeviceId, kPolicyAppId, request_type)) .WillOnce(Return(true)); EXPECT_CALL(mock_policy_handler_, IsRequestSubTypeAllowed(kPolicyAppId, request_subtype)) @@ -241,7 +251,7 @@ TEST_F(OnSystemRequestNotificationTest, PreConditions(); EXPECT_CALL(mock_policy_handler_, - IsRequestTypeAllowed(kPolicyAppId, request_type)) + IsRequestTypeAllowed(kDeviceId, kPolicyAppId, request_type)) .WillOnce(Return(true)); EXPECT_CALL(mock_policy_handler_, IsRequestSubTypeAllowed(kPolicyAppId, request_subtype)) diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/register_app_interface_request_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/register_app_interface_request_test.cc index 0e8374b75a..ac45e90d8e 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/register_app_interface_request_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/register_app_interface_request_test.cc @@ -67,6 +67,8 @@ using ::testing::_; using ::testing::DoAll; using ::testing::Return; using ::testing::ReturnRef; +using ::testing::SaveArg; +using ::testing::SetArgPointee; namespace am = ::application_manager; @@ -75,12 +77,15 @@ using sdl_rpc_plugin::commands::RegisterAppInterfaceRequest; namespace { const uint32_t kConnectionKey = 1u; +const uint32_t kConnectionKey2 = 2u; const hmi_apis::Common_Language::eType kHmiLanguage = hmi_apis::Common_Language::EN_US; const mobile_apis::Language::eType kMobileLanguage = mobile_apis::Language::EN_US; -const std::string kMacAddress = "test_mac_address"; -const std::string kAppId = "test_app_id"; +const std::string kMacAddress1 = "test_mac_address1"; +const std::string kMacAddress2 = "test_mac_address2"; +const std::string kAppId1 = "test_app1_id"; +const std::string kAppId2 = "test_app2_id"; const std::string kFullAppId = "test_app_id_long"; const std::string kDummyString = "test_string"; const std::vector<uint32_t> kDummyDiagModes; @@ -94,6 +99,7 @@ class RegisterAppInterfaceRequestTest : msg_(CreateMessage()) , command_(CreateCommand<RegisterAppInterfaceRequest>(msg_)) , app_name_("test_app_name_") + , app2_name_("test_app2_name_") , lock_ptr_(std::make_shared<sync_primitives::Lock>()) , mock_application_helper_( application_manager_test::MockApplicationHelper:: @@ -112,7 +118,7 @@ class RegisterAppInterfaceRequestTest void InitBasicMessage() { (*msg_)[am::strings::params][am::strings::connection_key] = kConnectionKey; - (*msg_)[am::strings::msg_params][am::strings::app_id] = kAppId; + (*msg_)[am::strings::msg_params][am::strings::app_id] = kAppId1; (*msg_)[am::strings::msg_params][am::strings::full_app_id] = kFullAppId; (*msg_)[am::strings::msg_params][am::strings::app_name] = app_name_; (*msg_)[am::strings::msg_params][am::strings::language_desired] = @@ -130,11 +136,11 @@ class RegisterAppInterfaceRequestTest MockAppPtr CreateBasicMockedApp() { MockAppPtr mock_app = CreateMockApp(); ON_CALL(*mock_app, name()).WillByDefault(ReturnRef(app_name_)); - ON_CALL(*mock_app, mac_address()).WillByDefault(ReturnRef(kMacAddress)); + ON_CALL(*mock_app, mac_address()).WillByDefault(ReturnRef(kMacAddress1)); ON_CALL(*mock_app, app_icon_path()).WillByDefault(ReturnRef(kDummyString)); ON_CALL(*mock_app, language()).WillByDefault(ReturnRef(kMobileLanguage)); ON_CALL(*mock_app, ui_language()).WillByDefault(ReturnRef(kMobileLanguage)); - ON_CALL(*mock_app, policy_app_id()).WillByDefault(Return(kAppId)); + ON_CALL(*mock_app, policy_app_id()).WillByDefault(Return(kAppId1)); ON_CALL(*mock_app, msg_version()) .WillByDefault(ReturnRef(mock_semantic_version)); return mock_app; @@ -154,7 +160,7 @@ class RegisterAppInterfaceRequestTest void InitGetters() { ON_CALL(app_mngr_, GetCorrectMobileIDFromMessage(msg_)) - .WillByDefault(Return(kAppId)); + .WillByDefault(Return(kAppId1)); ON_CALL(app_mngr_, IsHMICooperating()).WillByDefault(Return(true)); ON_CALL(app_mngr_, resume_controller()) .WillByDefault(ReturnRef(mock_resume_crt_)); @@ -168,7 +174,7 @@ class RegisterAppInterfaceRequestTest .WillByDefault(ReturnRef(kDummyString)); ON_CALL(app_mngr_settings_, supported_diag_modes()) .WillByDefault(ReturnRef(kDummyDiagModes)); - ON_CALL(mock_policy_handler_, GetAppRequestTypes(_)) + ON_CALL(mock_policy_handler_, GetAppRequestTypes(_, _)) .WillByDefault(Return(std::vector<std::string>())); ON_CALL(mock_policy_handler_, GetAppRequestTypeState(_)) .WillByDefault(Return(policy::RequestType::State::EMPTY)); @@ -180,7 +186,7 @@ class RegisterAppInterfaceRequestTest .WillByDefault(Return(policy::DeviceConsent::kDeviceAllowed)); ON_CALL(app_mngr_, GetDeviceTransportType(_)) .WillByDefault(Return(hmi_apis::Common_TransportType::WIFI)); - ON_CALL(app_mngr_, IsAppInReconnectMode(_)).WillByDefault(Return(false)); + ON_CALL(app_mngr_, IsAppInReconnectMode(_, _)).WillByDefault(Return(false)); ON_CALL(app_mngr_, application_by_policy_id(_)) .WillByDefault(Return(ApplicationSharedPtr())); ON_CALL(mock_hmi_interfaces_, GetInterfaceState(_)) @@ -201,7 +207,7 @@ class RegisterAppInterfaceRequestTest void SetCommonExpectionsOnSwitchedApplication( MockAppPtr mock_app, mobile_apis::Result::eType response_result_code) { - EXPECT_CALL(mock_policy_handler_, AddApplication(_, _)).Times(0); + EXPECT_CALL(mock_policy_handler_, AddApplication(_, _, _)).Times(0); EXPECT_CALL( mock_rpc_service_, @@ -250,6 +256,7 @@ class RegisterAppInterfaceRequestTest std::shared_ptr<RegisterAppInterfaceRequest> command_; const utils::custom_string::CustomString app_name_; + const utils::custom_string::CustomString app2_name_; std::shared_ptr<sync_primitives::Lock> lock_ptr_; am::ApplicationSet app_set_; @@ -280,7 +287,7 @@ TEST_F(RegisterAppInterfaceRequestTest, Init_SUCCESS) { TEST_F(RegisterAppInterfaceRequestTest, Run_MinimalData_SUCCESS) { InitBasicMessage(); - (*msg_)[am::strings::msg_params][am::strings::hash_id] = kAppId; + (*msg_)[am::strings::msg_params][am::strings::hash_id] = kAppId1; EXPECT_CALL(app_mngr_, IsStopping()) .WillOnce(Return(false)) .WillOnce(Return(true)) @@ -289,20 +296,30 @@ TEST_F(RegisterAppInterfaceRequestTest, Run_MinimalData_SUCCESS) { EXPECT_CALL(app_mngr_, updateRequestTimeout(_, _, _)); EXPECT_CALL(app_mngr_, IsApplicationForbidden(_, _)).WillOnce(Return(false)); + connection_handler::DeviceHandle handle = 1; + ON_CALL(mock_connection_handler_, + GetDataOnSessionKey(kConnectionKey, _, _, _)) + .WillByDefault(DoAll(SetArgPointee<3>(handle), Return(0))); + ON_CALL(mock_session_observer_, GetDataOnDeviceID(handle, _, _, _, _)) + .WillByDefault(DoAll(SetArgPointee<3>(kMacAddress1), Return(0))); + MockAppPtr mock_app = CreateBasicMockedApp(); - EXPECT_CALL(app_mngr_, application(kConnectionKey)) - .WillOnce(Return(ApplicationSharedPtr())) - .WillRepeatedly(Return(mock_app)); + EXPECT_CALL(app_mngr_, application(kMacAddress1, kAppId1)) + .WillRepeatedly(Return(ApplicationSharedPtr())); ON_CALL(app_mngr_, applications()) .WillByDefault( Return(DataAccessor<am::ApplicationSet>(app_set_, lock_ptr_))); + + EXPECT_CALL(app_mngr_, application(kConnectionKey)) + .WillOnce(Return(mock_app)); + ON_CALL(mock_policy_handler_, PolicyEnabled()).WillByDefault(Return(true)); - ON_CALL(mock_policy_handler_, GetInitialAppData(kAppId, _, _)) + ON_CALL(mock_policy_handler_, GetInitialAppData(kAppId1, _, _)) .WillByDefault(Return(true)); policy::StatusNotifier notify_upd_manager = std::make_shared<utils::CallNothing>(); - ON_CALL(mock_policy_handler_, AddApplication(_, _)) + ON_CALL(mock_policy_handler_, AddApplication(kMacAddress1, kAppId1, _)) .WillByDefault(Return(notify_upd_manager)); EXPECT_CALL(app_mngr_, RegisterApplication(msg_)).WillOnce(Return(mock_app)); @@ -323,6 +340,7 @@ TEST_F(RegisterAppInterfaceRequestTest, Run_MinimalData_SUCCESS) { ManageMobileCommand(_, am::commands::Command::SOURCE_SDL)) .Times(2); EXPECT_CALL(app_mngr_, SendDriverDistractionState(_)); + ASSERT_TRUE(command_->Init()); command_->Run(); } @@ -360,10 +378,19 @@ TEST_F(RegisterAppInterfaceRequestTest, EXPECT_CALL(app_mngr_, updateRequestTimeout(_, _, _)); EXPECT_CALL(app_mngr_, IsApplicationForbidden(_, _)).WillOnce(Return(false)); + connection_handler::DeviceHandle handle = 1; + ON_CALL(mock_connection_handler_, + GetDataOnSessionKey(kConnectionKey, _, _, _)) + .WillByDefault(DoAll(SetArgPointee<3>(handle), Return(0))); + ON_CALL(mock_session_observer_, GetDataOnDeviceID(_, _, _, _, _)) + .WillByDefault(DoAll(SetArgPointee<3>(kMacAddress1), Return(0))); + MockAppPtr mock_app = CreateBasicMockedApp(); + EXPECT_CALL(app_mngr_, application(kMacAddress1, kAppId1)) + .WillRepeatedly(Return(ApplicationSharedPtr())); + EXPECT_CALL(app_mngr_, application(kConnectionKey)) - .WillOnce(Return(ApplicationSharedPtr())) - .WillRepeatedly(Return(mock_app)); + .WillOnce(Return(mock_app)); MessageSharedPtr expected_message = CreateMessage(smart_objects::SmartType_Map); @@ -401,11 +428,11 @@ TEST_F(RegisterAppInterfaceRequestTest, .WillByDefault( Return(DataAccessor<am::ApplicationSet>(app_set_, lock_ptr_))); ON_CALL(mock_policy_handler_, PolicyEnabled()).WillByDefault(Return(true)); - ON_CALL(mock_policy_handler_, GetInitialAppData(kAppId, _, _)) + ON_CALL(mock_policy_handler_, GetInitialAppData(kAppId1, _, _)) .WillByDefault(Return(true)); policy::StatusNotifier notify_upd_manager = std::make_shared<utils::CallNothing>(); - ON_CALL(mock_policy_handler_, AddApplication(_, _)) + ON_CALL(mock_policy_handler_, AddApplication(kMacAddress1, kAppId1, _)) .WillByDefault(Return(notify_upd_manager)); EXPECT_CALL(app_mngr_, RegisterApplication(msg_)).WillOnce(Return(mock_app)); @@ -444,7 +471,7 @@ TEST_F(RegisterAppInterfaceRequestTest, ManageMobileCommand(_, am::commands::Command::SOURCE_SDL)) .Times(2); EXPECT_CALL(app_mngr_, SendDriverDistractionState(_)); - + ASSERT_TRUE(command_->Init()); command_->Run(); } @@ -456,10 +483,23 @@ TEST_F(RegisterAppInterfaceRequestTest, (*msg_)[am::strings::msg_params][am::strings::hash_id] = request_hash_id; MockAppPtr mock_app = CreateBasicMockedApp(); - EXPECT_CALL(app_mngr_, application_by_policy_id(kAppId)) + app_set_.insert(mock_app); + EXPECT_CALL(app_mngr_, application_by_policy_id(kAppId1)) .WillRepeatedly(Return(mock_app)); - EXPECT_CALL(app_mngr_, IsAppInReconnectMode(kAppId)).WillOnce(Return(true)); + connection_handler::DeviceHandle device_id = 1; + ON_CALL(mock_connection_handler_, + GetDataOnSessionKey(kConnectionKey, _, _, _)) + .WillByDefault(DoAll(SetArgPointee<3>(device_id), Return(0))); + + ON_CALL(mock_session_observer_, GetDataOnDeviceID(device_id, _, _, _, _)) + .WillByDefault(DoAll(SetArgPointee<3>(kMacAddress1), Return(0))); + + ON_CALL(app_mngr_, application(kMacAddress1, kAppId1)) + .WillByDefault(Return(mock_app)); + + ON_CALL(app_mngr_, IsAppInReconnectMode(device_id, kAppId1)) + .WillByDefault(Return(true)); EXPECT_CALL(app_mngr_, ProcessReconnection(_, kConnectionKey)); @@ -482,6 +522,7 @@ TEST_F(RegisterAppInterfaceRequestTest, SetCommonExpectionsOnSwitchedApplication(mock_app, mobile_apis::Result::SUCCESS); + ASSERT_TRUE(command_->Init()); command_->Run(); } @@ -492,11 +533,22 @@ TEST_F(RegisterAppInterfaceRequestTest, const std::string request_hash_id = "abc123"; (*msg_)[am::strings::msg_params][am::strings::hash_id] = request_hash_id; + connection_handler::DeviceHandle device_id = 1; + ON_CALL(mock_connection_handler_, + GetDataOnSessionKey(kConnectionKey, _, _, _)) + .WillByDefault(DoAll(SetArgPointee<3>(device_id), Return(0))); + + ON_CALL(mock_session_observer_, GetDataOnDeviceID(device_id, _, _, _, _)) + .WillByDefault(DoAll(SetArgPointee<3>(kMacAddress1), Return(0))); + MockAppPtr mock_app = CreateBasicMockedApp(); - EXPECT_CALL(app_mngr_, application_by_policy_id(kAppId)) + EXPECT_CALL(app_mngr_, application_by_policy_id(kAppId1)) .WillRepeatedly(Return(mock_app)); - EXPECT_CALL(app_mngr_, IsAppInReconnectMode(kAppId)).WillOnce(Return(true)); + EXPECT_CALL(app_mngr_, application(kMacAddress1, kAppId1)) + .WillOnce(Return(mock_app)); + ON_CALL(app_mngr_, IsAppInReconnectMode(device_id, kAppId1)) + .WillByDefault(Return(true)); EXPECT_CALL(app_mngr_, ProcessReconnection(_, kConnectionKey)); @@ -520,7 +572,7 @@ TEST_F(RegisterAppInterfaceRequestTest, SetCommonExpectionsOnSwitchedApplication(mock_app, mobile_apis::Result::RESUME_FAILED); - + ASSERT_TRUE(command_->Init()); command_->Run(); } @@ -528,11 +580,23 @@ TEST_F(RegisterAppInterfaceRequestTest, SwitchApplication_NoHash_ExpectCleanupResumeFailed) { InitBasicMessage(); + connection_handler::DeviceHandle device_id = 1; + ON_CALL(mock_connection_handler_, + GetDataOnSessionKey(kConnectionKey, _, _, _)) + .WillByDefault(DoAll(SetArgPointee<3>(device_id), Return(0))); + + ON_CALL(mock_session_observer_, GetDataOnDeviceID(device_id, _, _, _, _)) + .WillByDefault(DoAll(SetArgPointee<3>(kMacAddress1), Return(0))); + MockAppPtr mock_app = CreateBasicMockedApp(); - EXPECT_CALL(app_mngr_, application_by_policy_id(kAppId)) + EXPECT_CALL(app_mngr_, application_by_policy_id(kAppId1)) .WillRepeatedly(Return(mock_app)); - EXPECT_CALL(app_mngr_, IsAppInReconnectMode(kAppId)).WillOnce(Return(true)); + EXPECT_CALL(app_mngr_, application(kMacAddress1, kAppId1)) + .WillOnce(Return(mock_app)); + + EXPECT_CALL(app_mngr_, IsAppInReconnectMode(device_id, kAppId1)) + .WillOnce(Return(true)); EXPECT_CALL(app_mngr_, ProcessReconnection(_, kConnectionKey)); @@ -550,6 +614,133 @@ TEST_F(RegisterAppInterfaceRequestTest, SetCommonExpectionsOnSwitchedApplication(mock_app, mobile_apis::Result::RESUME_FAILED); + ASSERT_TRUE(command_->Init()); + command_->Run(); +} + +TEST_F(RegisterAppInterfaceRequestTest, + RegisterApp_SameAppId_SameDeviceFailed) { + using namespace am; + + InitBasicMessage(); + + MockAppPtr mock_app1 = CreateBasicMockedApp(); + + app_set_.insert(mock_app1); + ON_CALL(app_mngr_, applications()) + .WillByDefault( + Return(DataAccessor<am::ApplicationSet>(app_set_, lock_ptr_))); + + MockAppPtr mock_app2 = CreateBasicMockedApp(); + + connection_handler::DeviceHandle device_id = 1; + ON_CALL(mock_connection_handler_, + GetDataOnSessionKey(kConnectionKey, _, _, _)) + .WillByDefault(DoAll(SetArgPointee<3>(device_id), Return(0))); + + ON_CALL(mock_session_observer_, GetDataOnDeviceID(device_id, _, _, _, _)) + .WillByDefault(DoAll(SetArgPointee<3>(kMacAddress1), Return(0))); + + EXPECT_CALL(app_mngr_, application(kMacAddress1, kAppId1)) + .WillOnce(Return(mock_app1)); + + EXPECT_CALL(mock_rpc_service_, ManageHMICommand(_, _)).Times(0); + + EXPECT_CALL(mock_rpc_service_, + ManageMobileCommand( + MobileResultCodeIs( + mobile_apis::Result::APPLICATION_REGISTERED_ALREADY), + am::commands::Command::SOURCE_SDL)); + + ASSERT_TRUE(command_->Init()); + command_->Run(); +} + +TEST_F(RegisterAppInterfaceRequestTest, + RegisterApp_SameAppId_DifferentDevicesSuccess) { + MockAppPtr mock_app1 = CreateBasicMockedApp(); + const connection_handler::DeviceHandle device_id1 = 1u; + ON_CALL(*mock_app1, device()).WillByDefault(Return(device_id1)); + app_set_.insert(mock_app1); + ON_CALL(app_mngr_, applications()) + .WillByDefault( + Return(DataAccessor<am::ApplicationSet>(app_set_, lock_ptr_))); + + InitBasicMessage(); + (*msg_)[am::strings::params][am::strings::connection_key] = kConnectionKey2; + EXPECT_CALL(app_mngr_, IsStopping()) + .WillOnce(Return(false)) + .WillOnce(Return(true)) + .WillOnce(Return(false)); + ON_CALL(app_mngr_, IsHMICooperating()).WillByDefault(Return(false)); + EXPECT_CALL(app_mngr_, updateRequestTimeout(kConnectionKey2, _, _)); + EXPECT_CALL(app_mngr_, IsApplicationForbidden(kConnectionKey2, kAppId1)) + .WillOnce(Return(false)); + + connection_handler::DeviceHandle device_id2 = 2u; + ON_CALL(mock_connection_handler_, + GetDataOnSessionKey(kConnectionKey2, _, _, _)) + .WillByDefault(DoAll(SetArgPointee<3>(device_id2), Return(0))); + + ON_CALL(mock_session_observer_, GetDataOnDeviceID(device_id2, _, _, _, _)) + .WillByDefault(DoAll(SetArgPointee<3>(kMacAddress2), Return(0))); + + MockAppPtr mock_app2 = CreateBasicMockedApp(); + + ON_CALL(*mock_app2, device()).WillByDefault(Return(device_id2)); + ON_CALL(*mock_app2, mac_address()).WillByDefault(ReturnRef(kMacAddress2)); + EXPECT_CALL(app_mngr_, application(kMacAddress2, kAppId1)) + .WillRepeatedly(Return(ApplicationSharedPtr())); + + EXPECT_CALL(app_mngr_, application(kConnectionKey2)) + .WillOnce(Return(mock_app2)); + + ON_CALL(mock_policy_handler_, PolicyEnabled()).WillByDefault(Return(true)); + ON_CALL(mock_policy_handler_, GetInitialAppData(kAppId1, _, _)) + .WillByDefault(Return(true)); + policy::StatusNotifier notify_upd_manager = + std::make_shared<utils::CallNothing>(); + ON_CALL(mock_policy_handler_, AddApplication(kMacAddress2, kAppId1, _)) + .WillByDefault(Return(notify_upd_manager)); + + EXPECT_CALL(app_mngr_, RegisterApplication(msg_)).WillOnce(Return(mock_app2)); + + EXPECT_CALL(mock_hmi_interfaces_, GetInterfaceState(_)) + .WillRepeatedly(Return(am::HmiInterfaces::STATE_AVAILABLE)); + + EXPECT_CALL(mock_rpc_service_, + ManageHMICommand( + HMIResultCodeIs( + hmi_apis::FunctionID::BasicCommunication_OnAppRegistered), + _)) + .WillOnce(Return(true)); + EXPECT_CALL( + mock_rpc_service_, + ManageHMICommand( + HMIResultCodeIs(hmi_apis::FunctionID::Buttons_OnButtonSubscription), + _)) + .WillOnce(Return(true)); + EXPECT_CALL( + mock_rpc_service_, + ManageHMICommand( + HMIResultCodeIs(hmi_apis::FunctionID::VR_ChangeRegistration), _)) + .WillOnce(Return(true)); + EXPECT_CALL( + mock_rpc_service_, + ManageHMICommand( + HMIResultCodeIs(hmi_apis::FunctionID::TTS_ChangeRegistration), _)) + .WillOnce(Return(true)); + EXPECT_CALL( + mock_rpc_service_, + ManageHMICommand( + HMIResultCodeIs(hmi_apis::FunctionID::UI_ChangeRegistration), _)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_rpc_service_, + ManageMobileCommand(_, am::commands::Command::SOURCE_SDL)) + .Times(2); + EXPECT_CALL(app_mngr_, SendDriverDistractionState(_)); + + ASSERT_TRUE(command_->Init()); command_->Run(); } diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/system_request_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/system_request_test.cc index 7351cd67d3..211888d6be 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/system_request_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/system_request_test.cc @@ -74,6 +74,7 @@ const std::string kAppStorageFolder = "fake-storage"; const std::string kSystemFilesPath = "/fake/system/files"; const std::string kFileName = "Filename"; const uint32_t kHmiAppId = 3u; +const connection_handler::DeviceHandle kDeviceId = 1u; } // namespace class SystemRequestTest @@ -99,13 +100,15 @@ class SystemRequestTest ON_CALL(*mock_app_, policy_app_id()).WillByDefault(Return(kAppPolicyId)); ON_CALL(*mock_app_, folder_name()).WillByDefault(Return(kAppFolderName)); ON_CALL(*mock_app_, hmi_app_id()).WillByDefault(Return(kHmiAppId)); + ON_CALL(*mock_app_, device()).WillByDefault(Return(kDeviceId)); ON_CALL(app_mngr_settings_, system_files_path()) .WillByDefault(ReturnRef(kSystemFilesPath)); ON_CALL(app_mngr_settings_, app_storage_folder()) .WillByDefault(ReturnRef(kAppStorageFolder)); - ON_CALL(mock_policy_handler_, IsRequestTypeAllowed(kAppPolicyId, _)) + ON_CALL(mock_policy_handler_, + IsRequestTypeAllowed(kDeviceId, kAppPolicyId, _)) .WillByDefault(Return(true)); } @@ -146,9 +149,10 @@ TEST_F(SystemRequestTest, PreConditions(); - EXPECT_CALL(mock_policy_handler_, - IsRequestTypeAllowed(kAppPolicyId, - mobile_apis::RequestType::OEM_SPECIFIC)) + EXPECT_CALL( + mock_policy_handler_, + IsRequestTypeAllowed( + kDeviceId, kAppPolicyId, mobile_apis::RequestType::OEM_SPECIFIC)) .WillOnce(Return(true)); EXPECT_CALL(mock_policy_handler_, @@ -191,9 +195,10 @@ TEST_F( PreConditions(); - EXPECT_CALL(mock_policy_handler_, - IsRequestTypeAllowed(kAppPolicyId, - mobile_apis::RequestType::OEM_SPECIFIC)) + EXPECT_CALL( + mock_policy_handler_, + IsRequestTypeAllowed( + kDeviceId, kAppPolicyId, mobile_apis::RequestType::OEM_SPECIFIC)) .WillOnce(Return(true)); EXPECT_CALL(mock_policy_handler_, @@ -216,9 +221,10 @@ TEST_F(SystemRequestTest, Run_RequestTypeDisallowed_SendDisallowedResponse) { PreConditions(); - EXPECT_CALL(mock_policy_handler_, - IsRequestTypeAllowed(kAppPolicyId, - mobile_apis::RequestType::OEM_SPECIFIC)) + EXPECT_CALL( + mock_policy_handler_, + IsRequestTypeAllowed( + kDeviceId, kAppPolicyId, mobile_apis::RequestType::OEM_SPECIFIC)) .WillOnce(Return(false)); ExpectManageMobileCommandWithResultCode(mobile_apis::Result::DISALLOWED); @@ -241,9 +247,9 @@ TEST_F(SystemRequestTest, Run_RequestType_IconURL_Success) { const std::vector<uint8_t> binary_data = {1u, 2u}; (*msg)[am::strings::params][am::strings::binary_data] = binary_data; - EXPECT_CALL( - mock_policy_handler_, - IsRequestTypeAllowed(kAppPolicyId, mobile_apis::RequestType::ICON_URL)) + EXPECT_CALL(mock_policy_handler_, + IsRequestTypeAllowed( + kDeviceId, kAppPolicyId, mobile_apis::RequestType::ICON_URL)) .WillOnce(Return(true)); EXPECT_CALL(app_mngr_settings_, app_icons_folder()) .WillOnce(ReturnRef(kAppStorageFolder)); diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc index 7e72dd4c64..04fcf2c53f 100644 --- a/src/components/application_manager/src/application_manager_impl.cc +++ b/src/components/application_manager/src/application_manager_impl.cc @@ -121,17 +121,26 @@ bool device_id_comparator(const std::string& device_id, } /** - * @brief policy_app_id_comparator is predicate to compare policy application - * ids - * @param policy_app_id Policy id of application - * @param app Application pointer - * @return True if policy id of application matches to policy id passed + * @brief PolicyAppIdComparator is struct predicate to compare policy + * application ids & device + * @param device_handle of application + * @param id of application + * @return True if policy id & device_handle of application matches to policy id + * & device_handle passed */ -bool policy_app_id_comparator(const std::string& policy_app_id, - ApplicationSharedPtr app) { - DCHECK_OR_RETURN(app, false); - return app->policy_app_id() == policy_app_id; -} +struct PolicyAppIdComparator { + PolicyAppIdComparator(const connection_handler::DeviceHandle& device_handle, + const std::string& policy_app_id) + : device_handle_(device_handle), policy_app_id_(policy_app_id) {} + bool operator()(const ApplicationSharedPtr app) const { + return app && app->device() == device_handle_ && + app->policy_app_id() == policy_app_id_; + } + + private: + const connection_handler::DeviceHandle& device_handle_; + const std::string& policy_app_id_; +}; uint32_t ApplicationManagerImpl::mobile_corelation_id_ = 0; uint32_t ApplicationManagerImpl::corelation_id_ = 0; @@ -1631,7 +1640,8 @@ mobile_apis::HMILevel::eType ApplicationManagerImpl::GetDefaultHmiLevel( if (GetPolicyHandler().PolicyEnabled()) { const std::string policy_app_id = application->policy_app_id(); std::string default_hmi_string = ""; - if (GetPolicyHandler().GetDefaultHmi(policy_app_id, &default_hmi_string)) { + if (GetPolicyHandler().GetDefaultHmi( + application->mac_address(), policy_app_id, &default_hmi_string)) { if ("BACKGROUND" == default_hmi_string) { default_hmi = HMILevel::HMI_BACKGROUND; } else if ("FULL" == default_hmi_string) { @@ -1943,7 +1953,7 @@ void ApplicationManagerImpl::OnServiceEndedCallback( return; } - if (IsAppInReconnectMode(app->policy_app_id())) { + if (IsAppInReconnectMode(app->device(), app->policy_app_id())) { LOG4CXX_DEBUG(logger_, "Application is in reconnection list and won't be closed."); return; @@ -2490,8 +2500,24 @@ void ApplicationManagerImpl::CreateApplications(SmartArray& obj_array, } const std::string policy_app_id(app_data[json::appId].asString()); - ApplicationSharedPtr registered_app = - application_by_policy_id(policy_app_id); + + connection_handler::DeviceHandle device_handle; + if (-1 == connection_handler().get_session_observer().GetDataOnSessionKey( + connection_key, nullptr, nullptr, &device_handle)) { + LOG4CXX_ERROR(logger_, + "Failed to create application: no connection info."); + continue; + } + + std::string device_id; + if (-1 == connection_handler().get_session_observer().GetDataOnDeviceID( + device_handle, nullptr, nullptr, &device_id)) { + LOG4CXX_ERROR(logger_, + "Failed to create application: no connection info."); + continue; + } + + ApplicationSharedPtr registered_app = application(device_id, policy_app_id); if (registered_app) { LOG4CXX_DEBUG(logger_, "Application with the same id: " @@ -2530,22 +2556,9 @@ void ApplicationManagerImpl::CreateApplications(SmartArray& obj_array, const std::string app_icon_dir(settings_.app_icons_folder()); const std::string full_icon_path(app_icon_dir + "/" + policy_app_id); - connection_handler::DeviceHandle device_id = 0; - - if (-1 == connection_handler().get_session_observer().GetDataOnSessionKey( - connection_key, NULL, NULL, &device_id)) { - LOG4CXX_ERROR(logger_, - "Failed to create application: no connection info."); - continue; - } - - std::string device_mac; - connection_handler().get_session_observer().GetDataOnDeviceID( - device_id, NULL, NULL, &device_mac, NULL); - const uint32_t hmi_app_id = - resume_controller().IsApplicationSaved(policy_app_id, device_mac) - ? resume_controller().GetHMIApplicationID(policy_app_id, device_mac) + resume_controller().IsApplicationSaved(policy_app_id, device_id) + ? resume_controller().GetHMIApplicationID(policy_app_id, device_id) : GenerateNewHMIAppID(); // AppId = 0 because this is query_app(provided by hmi for download, but not @@ -2553,8 +2566,8 @@ void ApplicationManagerImpl::CreateApplications(SmartArray& obj_array, ApplicationSharedPtr app( new ApplicationImpl(0, policy_app_id, - device_mac, device_id, + device_handle, appName, GetPolicyHandler().GetStatisticManager(), *this)); @@ -3514,14 +3527,14 @@ bool ApplicationManagerImpl::IsApplicationForbidden( } bool ApplicationManagerImpl::IsAppInReconnectMode( + const connection_handler::DeviceHandle& device_id, const std::string& policy_app_id) const { LOG4CXX_AUTO_TRACE(logger_); sync_primitives::AutoLock lock(reregister_wait_list_lock_); return reregister_wait_list_.end() != std::find_if(reregister_wait_list_.begin(), reregister_wait_list_.end(), - std::bind1st(std::ptr_fun(&policy_app_id_comparator), - policy_app_id)); + PolicyAppIdComparator(device_id, policy_app_id)); } policy::DeviceConsent ApplicationManagerImpl::GetUserConsentForDevice( @@ -3846,10 +3859,10 @@ void ApplicationManagerImpl::EraseAppFromReconnectionList( const auto policy_app_id = app->policy_app_id(); sync_primitives::AutoLock lock(reregister_wait_list_lock_); - auto app_it = std::find_if( - reregister_wait_list_.begin(), - reregister_wait_list_.end(), - std::bind1st(std::ptr_fun(&policy_app_id_comparator), policy_app_id)); + auto app_it = + std::find_if(reregister_wait_list_.begin(), + reregister_wait_list_.end(), + PolicyAppIdComparator(app->device(), policy_app_id)); if (reregister_wait_list_.end() != app_it) { reregister_wait_list_.erase(app_it); } diff --git a/src/components/application_manager/src/message_helper/message_helper.cc b/src/components/application_manager/src/message_helper/message_helper.cc index 28f8fd88bb..bae4802e56 100644 --- a/src/components/application_manager/src/message_helper/message_helper.cc +++ b/src/components/application_manager/src/message_helper/message_helper.cc @@ -1648,7 +1648,8 @@ bool MessageHelper::CreateHMIApplicationStruct( const policy::RequestType::State app_request_types_state = policy_handler.GetAppRequestTypeState(policy_app_id); if (policy::RequestType::State::AVAILABLE == app_request_types_state) { - const auto request_types = policy_handler.GetAppRequestTypes(policy_app_id); + const auto request_types = + policy_handler.GetAppRequestTypes(app->device(), policy_app_id); message[strings::request_type] = SmartObject(smart_objects::SmartType_Array); smart_objects::SmartObject& request_types_array = diff --git a/src/components/application_manager/src/policies/policy_handler.cc b/src/components/application_manager/src/policies/policy_handler.cc index cac09bd5f3..fdbd0ce391 100644 --- a/src/components/application_manager/src/policies/policy_handler.cc +++ b/src/components/application_manager/src/policies/policy_handler.cc @@ -470,21 +470,25 @@ void PolicyHandler::OnDeviceConsentChanged(const std::string& device_id, continue; } - policy_manager_->ReactOnUserDevConsentForApp(policy_app_id, is_allowed); + policy_manager_->ReactOnUserDevConsentForApp( + device_handle, policy_app_id, is_allowed); - policy_manager_->SendNotificationOnPermissionsUpdated(policy_app_id); + policy_manager_->SendNotificationOnPermissionsUpdated(device_id, + policy_app_id); } } } void PolicyHandler::SendOnAppPermissionsChanged( - const AppPermissions& permissions, const std::string& policy_app_id) const { + const AppPermissions& permissions, + const std::string& device_id, + const std::string& policy_app_id) const { LOG4CXX_AUTO_TRACE(logger_); LOG4CXX_DEBUG( logger_, "PolicyHandler::SendOnAppPermissionsChanged for " << policy_app_id); ApplicationSharedPtr app = - application_manager_.application_by_policy_id(policy_app_id); + application_manager_.application(device_id, policy_app_id); if (app.use_count() == 0) { LOG4CXX_WARN(logger_, "No app found for policy app id = " << policy_app_id); return; @@ -518,10 +522,11 @@ struct SmartObjectToInt { }; StatusNotifier PolicyHandler::AddApplication( + const std::string& device_id, const std::string& application_id, const rpc::policy_table_interface_base::AppHmiTypes& hmi_types) { POLICY_LIB_CHECK(std::make_shared<utils::CallNothing>()); - return policy_manager_->AddApplication(application_id, hmi_types); + return policy_manager_->AddApplication(device_id, application_id, hmi_types); } void PolicyHandler::AddDevice(const std::string& device_id, @@ -573,13 +578,9 @@ void PolicyHandler::OnAppPermissionConsentInternal( #endif } } else if (!app_to_device_link_.empty()) { - sync_primitives::AutoLock lock(app_to_device_link_lock_); - std::map<std::string, std::string>::const_iterator it = - app_to_device_link_.begin(); - for (; app_to_device_link_.end() != it; ++it) { - ApplicationSharedPtr app = - application_manager_.application_by_policy_id(it->second); - + const ApplicationSet& accessor = + application_manager_.applications().GetData(); + for (const auto& app : accessor) { // If list of apps sent to HMI for user consents is not the same as // current, // permissions should be set only for coincident to registered apps @@ -590,19 +591,26 @@ void PolicyHandler::OnAppPermissionConsentInternal( continue; } + if (!app->IsRegistered()) { + LOG4CXX_DEBUG(logger_, + "Application " << app->policy_app_id() + << " is not marked as registered."); + continue; + } + DeviceParams device_params = GetDeviceParams( app->device(), application_manager_.connection_handler().get_session_observer()); - if (device_params.device_mac_address != it->first) { + if (device_params.device_mac_address != app->mac_address()) { LOG4CXX_WARN(logger_, "Device_id of application is changed." "Permissions setting skipped."); continue; } - out_permissions.policy_app_id = it->second; - out_permissions.device_id = it->first; + out_permissions.policy_app_id = app->policy_app_id(); + out_permissions.device_id = app->mac_address(); #ifdef EXTERNAL_PROPRIETARY_MODE policy_manager_->SetUserConsentForApp(out_permissions, mode); #else @@ -852,10 +860,15 @@ void PolicyHandler::OnUpdateStatusChanged(const std::string& status) { } std::string PolicyHandler::OnCurrentDeviceIdUpdateRequired( + const transport_manager::DeviceHandle& device_handle, const std::string& policy_app_id) { LOG4CXX_AUTO_TRACE(logger_); - ApplicationSharedPtr app = - application_manager_.application_by_policy_id(policy_app_id); + DeviceParams device_params = GetDeviceParams( + device_handle, + application_manager_.connection_handler().get_session_observer()); + + ApplicationSharedPtr app = application_manager_.application( + device_params.device_mac_address, policy_app_id); if (app.use_count() == 0) { LOG4CXX_WARN(logger_, @@ -863,11 +876,8 @@ std::string PolicyHandler::OnCurrentDeviceIdUpdateRequired( << policy_app_id << "' " "not found within registered applications."); - return ""; + return std::string(); } - DeviceParams device_params = GetDeviceParams( - app->device(), - application_manager_.connection_handler().get_session_observer()); return device_params.device_mac_address; } @@ -925,14 +935,14 @@ void PolicyHandler::OnVehicleDataUpdated( } void PolicyHandler::OnPendingPermissionChange( - const std::string& policy_app_id) { + const std::string& device_id, const std::string& policy_app_id) { LOG4CXX_AUTO_TRACE(logger_); LOG4CXX_DEBUG( logger_, "PolicyHandler::OnPendingPermissionChange for " << policy_app_id); POLICY_LIB_CHECK_VOID(); ApplicationSharedPtr app = - application_manager_.application_by_policy_id(policy_app_id); + application_manager_.application(device_id, policy_app_id); if (app.use_count() == 0) { LOG4CXX_WARN(logger_, "No app found for " << policy_app_id << " policy app id."); @@ -940,7 +950,7 @@ void PolicyHandler::OnPendingPermissionChange( } AppPermissions permissions = - policy_manager_->GetAppPermissionsChanges(policy_app_id); + policy_manager_->GetAppPermissionsChanges(device_id, policy_app_id); const uint32_t app_id = app->app_id(); @@ -1099,7 +1109,8 @@ struct SDLAlowedNotification { if (app->device() == device_id_) { std::string hmi_level; mobile_apis::HMILevel::eType default_mobile_hmi; - policy_manager_->GetDefaultHmi(app->policy_app_id(), &hmi_level); + policy_manager_->GetDefaultHmi( + app->mac_address(), app->policy_app_id(), &hmi_level); if ("BACKGROUND" == hmi_level) { default_mobile_hmi = mobile_apis::HMILevel::HMI_BACKGROUND; } else if ("FULL" == hmi_level) { @@ -1256,7 +1267,8 @@ void PolicyHandler::OnActivateApp(uint32_t connection_key, permissions.isSDLAllowed = true; } } else { - permissions = policy_manager_->GetAppPermissionsChanges(policy_app_id); + permissions = policy_manager_->GetAppPermissionsChanges(app->mac_address(), + policy_app_id); #ifdef EXTERNAL_PROPRIETARY_MODE UsageStatistics& usage = app->usage_report(); @@ -1327,18 +1339,19 @@ void PolicyHandler::PTExchangeAtUserRequest(uint32_t correlation_id) { update_status, correlation_id, application_manager_); } -void PolicyHandler::OnPermissionsUpdated(const std::string& policy_app_id, +void PolicyHandler::OnPermissionsUpdated(const std::string& device_id, + const std::string& policy_app_id, const Permissions& permissions, const HMILevel& default_hmi) { LOG4CXX_AUTO_TRACE(logger_); - OnPermissionsUpdated(policy_app_id, permissions); + OnPermissionsUpdated(device_id, policy_app_id, permissions); ApplicationSharedPtr app = - application_manager_.application_by_policy_id(policy_app_id); + application_manager_.application(device_id, policy_app_id); if (app.use_count() == 0) { LOG4CXX_WARN( logger_, - "Connection_key not found for application_id:" << policy_app_id); + "Connection_key not found for application_id: " << policy_app_id); return; } @@ -1365,13 +1378,12 @@ void PolicyHandler::OnPermissionsUpdated(const std::string& policy_app_id, << policy_app_id << " to default hmi level " << default_hmi); - if (hmi_level == mobile_apis::HMILevel::HMI_FULL) { - application_manager_.state_controller().SetRegularState( - app, hmi_level, true); - } else { - application_manager_.state_controller().SetRegularState( - app, hmi_level, false); - } + const bool is_full_hmi_level = + mobile_apis::HMILevel::HMI_FULL == hmi_level; + + application_manager_.state_controller().SetRegularState( + app, hmi_level, is_full_hmi_level); + break; } default: @@ -1383,15 +1395,16 @@ void PolicyHandler::OnPermissionsUpdated(const std::string& policy_app_id, } } -void PolicyHandler::OnPermissionsUpdated(const std::string& policy_app_id, +void PolicyHandler::OnPermissionsUpdated(const std::string& device_id, + const std::string& policy_app_id, const Permissions& permissions) { LOG4CXX_AUTO_TRACE(logger_); ApplicationSharedPtr app = - application_manager_.application_by_policy_id(policy_app_id); + application_manager_.application(device_id, policy_app_id); if (app.use_count() == 0) { LOG4CXX_WARN( logger_, - "Connection_key not found for application_id:" << policy_app_id); + "Connection_key not found for application_id: " << policy_app_id); return; } @@ -1399,7 +1412,7 @@ void PolicyHandler::OnPermissionsUpdated(const std::string& policy_app_id, app->app_id(), permissions, application_manager_); LOG4CXX_DEBUG(logger_, - "Notification sent for application_id:" + "Notification sent for application_id: " << policy_app_id << " and connection_key " << app->app_id()); } @@ -1501,13 +1514,9 @@ void PolicyHandler::CheckPermissions( "Checking permissions for " << app->policy_app_id() << " in " << hmi_level << " on device " << device_id << " rpc " << rpc); -#ifdef EXTERNAL_PROPRIETARY_MODE - policy_manager_->CheckPermissions( - app->policy_app_id(), hmi_level, rpc, rpc_params, result); -#else // EXTERNAL_PROPRIETARY_MODE + policy_manager_->CheckPermissions( device_id, app->policy_app_id(), hmi_level, rpc, rpc_params, result); -#endif // EXTERNAL_PROPRIETARY_MODE } uint32_t PolicyHandler::GetNotificationsNumber( @@ -1522,10 +1531,11 @@ DeviceConsent PolicyHandler::GetUserConsentForDevice( return policy_manager_->GetUserConsentForDevice(device_id); } -bool PolicyHandler::GetDefaultHmi(const std::string& policy_app_id, +bool PolicyHandler::GetDefaultHmi(const std::string& device_id, + const std::string& policy_app_id, std::string* default_hmi) const { POLICY_LIB_CHECK(false); - return policy_manager_->GetDefaultHmi(policy_app_id, default_hmi); + return policy_manager_->GetDefaultHmi(device_id, policy_app_id, default_hmi); } bool PolicyHandler::GetInitialAppData(const std::string& application_id, @@ -1662,7 +1672,7 @@ custom_str::CustomString PolicyHandler::GetAppName( if (app.use_count() == 0) { LOG4CXX_WARN( logger_, - "Connection_key not found for application_id:" << policy_app_id); + "Connection_key not found for application_id: " << policy_app_id); return custom_str::CustomString(""); } return app->name(); @@ -2078,9 +2088,10 @@ void PolicyHandler::OnAppsSearchCompleted(const bool trigger_ptu) { policy_manager_->OnAppsSearchCompleted(trigger_ptu); } -void PolicyHandler::OnAppRegisteredOnMobile(const std::string& application_id) { +void PolicyHandler::OnAppRegisteredOnMobile(const std::string& device_id, + const std::string& application_id) { POLICY_LIB_CHECK_VOID(); - policy_manager_->OnAppRegisteredOnMobile(application_id); + policy_manager_->OnAppRegisteredOnMobile(device_id, application_id); } RequestType::State PolicyHandler::GetAppRequestTypeState( @@ -2096,12 +2107,13 @@ RequestSubType::State PolicyHandler::GetAppRequestSubTypeState( } bool PolicyHandler::IsRequestTypeAllowed( + const transport_manager::DeviceHandle& device_id, const std::string& policy_app_id, mobile_apis::RequestType::eType type) const { POLICY_LIB_CHECK(false); using namespace mobile_apis; - std::string stringified_type = RequestTypeToString(type); + const std::string stringified_type = RequestTypeToString(type); if (stringified_type.empty()) { LOG4CXX_ERROR(logger_, "Unknown request type."); return false; @@ -2124,7 +2136,11 @@ bool PolicyHandler::IsRequestTypeAllowed( case RequestType::State::AVAILABLE: { // If any of request types is available for current application - get them const auto request_types = +#ifdef EXTERNAL_PROPRIETARY_MODE + policy_manager_->GetAppRequestTypes(device_id, policy_app_id); +#else policy_manager_->GetAppRequestTypes(policy_app_id); +#endif return helpers::in_range(request_types, stringified_type); } default: @@ -2170,9 +2186,14 @@ bool PolicyHandler::IsRequestSubTypeAllowed( } const std::vector<std::string> PolicyHandler::GetAppRequestTypes( + const transport_manager::DeviceHandle& device_handle, const std::string& policy_app_id) const { POLICY_LIB_CHECK(std::vector<std::string>()); +#ifdef EXTERNAL_PROPRIETARY_MODE + return policy_manager_->GetAppRequestTypes(device_handle, policy_app_id); +#else return policy_manager_->GetAppRequestTypes(policy_app_id); +#endif } const std::vector<std::string> PolicyHandler::GetAppRequestSubTypes( @@ -2222,18 +2243,32 @@ bool PolicyHandler::IsUrlAppIdValid(const uint32_t app_idx, const EndpointUrls& urls) const { const EndpointData& app_data = urls[app_idx]; const std::vector<std::string> app_urls = app_data.url; - const ApplicationSharedPtr app = - application_manager_.application_by_policy_id(app_data.app_id); - const bool is_registered = (app && (app->IsRegistered())); - const bool is_default = (app_data.app_id == policy::kDefaultId); - const bool is_empty_urls = app_urls.empty(); + if (policy::kDefaultId == app_data.app_id) { + return true; + } - return ((is_registered && !is_empty_urls) || is_default); + if (app_urls.empty()) { + return false; + } + + const auto devices_ids = GetDevicesIds(app_data.app_id); + LOG4CXX_TRACE(logger_, + "Count devices: " << devices_ids.size() + << " for app_id: " << app_data.app_id); + for (const auto& device_id : devices_ids) { + ApplicationSharedPtr app = + application_manager_.application(device_id, app_data.app_id); + if (app && (app->IsRegistered())) { + return true; + } + } + + return false; } std::vector<std::string> PolicyHandler::GetDevicesIds( - const std::string& policy_app_id) { + const std::string& policy_app_id) const { return application_manager_.devices(policy_app_id); } @@ -2307,6 +2342,7 @@ bool PolicyHandler::GetModuleTypes(const std::string& policy_app_id, } void PolicyHandler::SetDefaultHmiTypes( + const transport_manager::DeviceHandle& device_handle, const std::string& application_id, const smart_objects::SmartObject* app_types) { LOG4CXX_AUTO_TRACE(logger_); @@ -2319,7 +2355,7 @@ void PolicyHandler::SetDefaultHmiTypes( std::back_inserter(hmi_types), SmartObjectToInt()); } - policy_manager_->SetDefaultHmiTypes(application_id, hmi_types); + policy_manager_->SetDefaultHmiTypes(device_handle, application_id, hmi_types); } bool PolicyHandler::CheckHMIType(const std::string& application_id, diff --git a/src/components/application_manager/src/rpc_service_impl.cc b/src/components/application_manager/src/rpc_service_impl.cc index b5cae1c126..fef5ef0163 100644 --- a/src/components/application_manager/src/rpc_service_impl.cc +++ b/src/components/application_manager/src/rpc_service_impl.cc @@ -82,7 +82,8 @@ bool RPCServiceImpl::ManageMobileCommand( (*message)[strings::params][strings::connection_key].asUInt()); auto app_ptr = app_manager_.application(connection_key); - if (app_ptr && app_manager_.IsAppInReconnectMode(app_ptr->policy_app_id())) { + if (app_ptr && app_manager_.IsAppInReconnectMode(app_ptr->device(), + app_ptr->policy_app_id())) { commands_holder_.Suspend( app_ptr, CommandHolder::CommandType::kMobileCommand, message); return true; @@ -296,7 +297,8 @@ bool RPCServiceImpl::ManageHMICommand(const commands::MessageSharedPtr message, (*message)[strings::msg_params][strings::app_id].asUInt(); auto app = app_manager_.application(static_cast<uint32_t>(connection_key)); - if (app && app_manager_.IsAppInReconnectMode(app->policy_app_id())) { + if (app && app_manager_.IsAppInReconnectMode(app->device(), + app->policy_app_id())) { commands_holder_.Suspend( app, CommandHolder::CommandType::kHmiCommand, message); return true; diff --git a/src/components/application_manager/test/application_manager_impl_test.cc b/src/components/application_manager/test/application_manager_impl_test.cc index 804959e1db..1f4b94a991 100644 --- a/src/components/application_manager/test/application_manager_impl_test.cc +++ b/src/components/application_manager/test/application_manager_impl_test.cc @@ -145,8 +145,10 @@ class ApplicationManagerImplTest : public ::testing::Test { protected: void SetUp() OVERRIDE { CreateAppManager(); - ON_CALL(mock_session_observer_, GetDataOnSessionKey(_, _, _, _)) - .WillByDefault(DoAll(SetArgPointee<3u>(kDeviceId), Return(0))); + ON_CALL(*mock_app_ptr_, app_id()).WillByDefault(Return(kConnectionKey)); + ON_CALL(*mock_app_ptr_, device()).WillByDefault(Return(kDeviceId)); + ON_CALL(mock_connection_handler_, GetDataOnSessionKey(_, _, _, &kDeviceId)) + .WillByDefault(DoAll(SetArgPointee<3u>(app_id_), Return(0))); ON_CALL(mock_connection_handler_, get_session_observer()) .WillByDefault(ReturnRef(mock_session_observer_)); app_manager_impl_->SetMockRPCService(mock_rpc_service_); @@ -820,6 +822,9 @@ TEST_F(ApplicationManagerImplTest, std::shared_ptr<MockApplication> switching_app_ptr = std::make_shared<MockApplication>(); + ON_CALL(*switching_app_ptr, app_id()).WillByDefault(Return(kConnectionKey)); + ON_CALL(*switching_app_ptr, device()).WillByDefault(Return(kDeviceId)); + const std::string switching_device_id = "switching"; const std::string switching_device_id_hash = encryption::MakeHash(switching_device_id); @@ -837,7 +842,6 @@ TEST_F(ApplicationManagerImplTest, std::shared_ptr<MockApplication> nonswitching_app_ptr = std::make_shared<MockApplication>(); - const std::string nonswitching_device_id = "nonswitching"; const std::string nonswitching_device_id_hash = encryption::MakeHash(nonswitching_device_id); @@ -868,15 +872,18 @@ TEST_F(ApplicationManagerImplTest, .WillOnce(Return(smart_objects::SmartObjectSPtr())); app_manager_impl_->OnDeviceSwitchingStart(switching_device, non_switching_device); - EXPECT_TRUE(app_manager_impl_->IsAppInReconnectMode(policy_app_id_switch)); - EXPECT_FALSE( - app_manager_impl_->IsAppInReconnectMode(policy_app_id_nonswitch)); + EXPECT_TRUE( + app_manager_impl_->IsAppInReconnectMode(kDeviceId, policy_app_id_switch)); + EXPECT_FALSE(app_manager_impl_->IsAppInReconnectMode( + kDeviceId, policy_app_id_nonswitch)); } TEST_F(ApplicationManagerImplTest, OnDeviceSwitchingFinish_ExpectUnregisterAppsInWaitList) { std::shared_ptr<MockApplication> switching_app_ptr = std::make_shared<MockApplication>(); + ON_CALL(*switching_app_ptr, app_id()).WillByDefault(Return(kConnectionKey)); + ON_CALL(*switching_app_ptr, device()).WillByDefault(Return(kDeviceId)); plugin_manager::MockRPCPluginManager* mock_rpc_plugin_manager = new plugin_manager::MockRPCPluginManager; @@ -913,6 +920,10 @@ TEST_F(ApplicationManagerImplTest, EXPECT_CALL(*nonswitching_app_ptr, policy_app_id()) .WillRepeatedly(Return(policy_app_id_nonswitch)); + ON_CALL(*nonswitching_app_ptr, protocol_version()) + .WillByDefault( + Return(protocol_handler::MajorProtocolVersion::PROTOCOL_VERSION_4)); + const auto hmi_level_nonswitching_app = mobile_apis::HMILevel::HMI_LIMITED; EXPECT_CALL(*nonswitching_app_ptr, hmi_level()) .WillRepeatedly(Return(hmi_level_nonswitching_app)); @@ -933,7 +944,8 @@ TEST_F(ApplicationManagerImplTest, app_manager_impl_->OnDeviceSwitchingStart(switching_device, non_switching_device); - EXPECT_TRUE(app_manager_impl_->IsAppInReconnectMode(policy_app_id_switch)); + EXPECT_TRUE( + app_manager_impl_->IsAppInReconnectMode(kDeviceId, policy_app_id_switch)); app_manager_impl_->OnDeviceSwitchingFinish(switching_device_id); EXPECT_FALSE( diff --git a/src/components/application_manager/test/policy_handler_test.cc b/src/components/application_manager/test/policy_handler_test.cc index 458b065cdd..6bd2c7fda6 100644 --- a/src/components/application_manager/test/policy_handler_test.cc +++ b/src/components/application_manager/test/policy_handler_test.cc @@ -233,7 +233,7 @@ class PolicyHandlerTest : public ::testing::Test { void TestOnPermissionsUpdated(const std::string& default_hmi_level, const mobile_apis::HMILevel::eType hmi_level) { - EXPECT_CALL(app_manager_, application_by_policy_id(kPolicyAppId_)) + EXPECT_CALL(app_manager_, application(kDeviceId, kPolicyAppId_)) .WillRepeatedly(Return(mock_app_)); EXPECT_CALL(*mock_app_, app_id()).WillRepeatedly(Return(kAppId1_)); EXPECT_CALL(*mock_app_, hmi_level()) @@ -247,7 +247,7 @@ class PolicyHandlerTest : public ::testing::Test { Permissions permissions; policy_handler_.OnPermissionsUpdated( - kPolicyAppId_, permissions, default_hmi_level); + kDeviceId, kPolicyAppId_, permissions, default_hmi_level); } void CreateFunctionalGroupPermission( @@ -494,31 +494,31 @@ TEST_F(PolicyHandlerTest, UnloadPolicyLibrary_method_ExpectLibraryUnloaded) { TEST_F(PolicyHandlerTest, OnPermissionsUpdated_method_With2Parameters) { // Check expectations - EXPECT_CALL(app_manager_, application_by_policy_id(kPolicyAppId_)) + EXPECT_CALL(app_manager_, application(kDeviceId, kPolicyAppId_)) .WillOnce(Return(mock_app_)); EXPECT_CALL(*mock_app_, app_id()).WillOnce(Return(kAppId1_)); EXPECT_CALL(mock_message_helper_, SendOnPermissionsChangeNotification(kAppId1_, _, _)); // Act Permissions perms; - policy_handler_.OnPermissionsUpdated(kPolicyAppId_, perms); + policy_handler_.OnPermissionsUpdated(kDeviceId, kPolicyAppId_, perms); } TEST_F(PolicyHandlerTest, OnPermissionsUpdated_TwoParams_InvalidApp_UNSUCCESS) { std::shared_ptr<application_manager_test::MockApplication> invalid_app; - EXPECT_CALL(app_manager_, application_by_policy_id(kPolicyAppId_)) + EXPECT_CALL(app_manager_, application(kDeviceId, kPolicyAppId_)) .WillOnce(Return(invalid_app)); EXPECT_CALL(mock_message_helper_, SendOnPermissionsChangeNotification(_, _, _)) .Times(0); Permissions permissions; - policy_handler_.OnPermissionsUpdated(kPolicyAppId_, permissions); + policy_handler_.OnPermissionsUpdated(kDeviceId, kPolicyAppId_, permissions); } TEST_F(PolicyHandlerTest, OnPermissionsUpdated_InvalidApp_UNSUCCESS) { std::shared_ptr<application_manager_test::MockApplication> invalid_app; - EXPECT_CALL(app_manager_, application_by_policy_id(kPolicyAppId_)) + EXPECT_CALL(app_manager_, application(kDeviceId, kPolicyAppId_)) .WillOnce(Return(mock_app_)) .WillOnce(Return(invalid_app)); EXPECT_CALL(*mock_app_, app_id()).WillOnce(Return(kAppId1_)); @@ -526,7 +526,8 @@ TEST_F(PolicyHandlerTest, OnPermissionsUpdated_InvalidApp_UNSUCCESS) { SendOnPermissionsChangeNotification(kAppId1_, _, _)); Permissions permissions; - policy_handler_.OnPermissionsUpdated(kPolicyAppId_, permissions, "HMI_FULL"); + policy_handler_.OnPermissionsUpdated( + kDeviceId, kPolicyAppId_, permissions, "HMI_FULL"); } TEST_F(PolicyHandlerTest, OnPermissionsUpdated_HmiLevelInvalidEnum_UNSUCCESS) { @@ -544,7 +545,7 @@ TEST_F(PolicyHandlerTest, const std::string new_kHmiLevel_string = "HMI_FULL"; mobile_apis::HMILevel::eType new_hmi_level = mobile_apis::HMILevel::HMI_FULL; // Check expectations - EXPECT_CALL(app_manager_, application_by_policy_id(kPolicyAppId_)) + EXPECT_CALL(app_manager_, application(kDeviceId, kPolicyAppId_)) .Times(2) .WillRepeatedly(Return(mock_app_)); EXPECT_CALL(*mock_app_, app_id()).WillOnce(Return(kAppId1_)); @@ -562,7 +563,7 @@ TEST_F(PolicyHandlerTest, // Act Permissions perms; policy_handler_.OnPermissionsUpdated( - kPolicyAppId_, perms, new_kHmiLevel_string); + kDeviceId, kPolicyAppId_, perms, new_kHmiLevel_string); } TEST_F(PolicyHandlerTest, @@ -572,7 +573,7 @@ TEST_F(PolicyHandlerTest, mobile_apis::HMILevel::eType new_hmi_level = mobile_apis::HMILevel::HMI_LIMITED; // Check expectations - EXPECT_CALL(app_manager_, application_by_policy_id(kPolicyAppId_)) + EXPECT_CALL(app_manager_, application(kDeviceId, kPolicyAppId_)) .Times(2) .WillRepeatedly(Return(mock_app_)); EXPECT_CALL(*mock_app_, app_id()).WillOnce(Return(kAppId1_)); @@ -590,7 +591,7 @@ TEST_F(PolicyHandlerTest, // Act Permissions perms; policy_handler_.OnPermissionsUpdated( - kPolicyAppId_, perms, new_kHmiLevel_string); + kDeviceId, kPolicyAppId_, perms, new_kHmiLevel_string); } TEST_F(PolicyHandlerTest, @@ -599,7 +600,7 @@ TEST_F(PolicyHandlerTest, std::string new_kHmiLevel_string = "HMI_FULL"; mobile_apis::HMILevel::eType new_hmi_level = mobile_apis::HMILevel::HMI_FULL; // Check expectations - EXPECT_CALL(app_manager_, application_by_policy_id(kPolicyAppId_)) + EXPECT_CALL(app_manager_, application(kDeviceId, kPolicyAppId_)) .Times(2) .WillRepeatedly(Return(mock_app_)); EXPECT_CALL(*mock_app_, app_id()).WillOnce(Return(kAppId1_)); @@ -615,7 +616,7 @@ TEST_F(PolicyHandlerTest, // Act Permissions perms; policy_handler_.OnPermissionsUpdated( - kPolicyAppId_, perms, new_kHmiLevel_string); + kDeviceId, kPolicyAppId_, perms, new_kHmiLevel_string); } TEST_F(PolicyHandlerTest, GetPriority) { @@ -639,16 +640,9 @@ TEST_F(PolicyHandlerTest, CheckPermissions) { EXPECT_CALL(*mock_app_, hmi_level()).WillOnce(Return(hmi_level)); EXPECT_CALL(*mock_app_, device()).WillOnce(Return(device)); EXPECT_CALL(*mock_app_, policy_app_id()).WillOnce(Return(kPolicyAppId_)); -#ifdef EXTERNAL_PROPRIETARY_MODE - EXPECT_CALL( - *mock_policy_manager_, - CheckPermissions(kPolicyAppId_, kHmiLevel_, kRpc_, kRpc_params, _)); - -#else // EXTERNAL_PROPRIETARY_MODE EXPECT_CALL(*mock_policy_manager_, CheckPermissions( kDeviceId, kPolicyAppId_, kHmiLevel_, kRpc_, kRpc_params, _)); -#endif // EXTERNAL_PROPRIETARY_MODE EXPECT_CALL(mock_message_helper_, StringifiedHMILevel(hmi_level)) .WillOnce(Return(kHmiLevel_)); EXPECT_CALL(mock_message_helper_, GetDeviceMacAddressForHandle(device, _)) @@ -681,9 +675,9 @@ TEST_F(PolicyHandlerTest, GetDefaultHmi) { EnablePolicyAndPolicyManagerMock(); // Check expectations EXPECT_CALL(*mock_policy_manager_, - GetDefaultHmi(kPolicyAppId_, &default_hmi_)); + GetDefaultHmi(kDeviceId_, kPolicyAppId_, &default_hmi_)); // Act - policy_handler_.GetDefaultHmi(kPolicyAppId_, &default_hmi_); + policy_handler_.GetDefaultHmi(kDeviceId_, kPolicyAppId_, &default_hmi_); } TEST_F(PolicyHandlerTest, GetInitialAppData) { @@ -882,12 +876,14 @@ void PolicyHandlerTest::TestActivateApp(const uint32_t connection_key, #endif // EXTERNAL_PROPRIETARY_MODE EXPECT_CALL(*application1, policy_app_id()).WillOnce(Return(kPolicyAppId_)); - EXPECT_CALL(*mock_policy_manager_, GetAppPermissionsChanges(_)) + EXPECT_CALL(*mock_policy_manager_, + GetAppPermissionsChanges(kMacAddr_, kPolicyAppId_)) .WillOnce(Return(permissions)); ON_CALL(*mock_policy_manager_, Increment(_, _)).WillByDefault(Return()); EXPECT_CALL(*mock_policy_manager_, RemovePendingPermissionChanges(_)); EXPECT_CALL(mock_message_helper_, SendSDLActivateAppResponse(_, _, _)); ON_CALL(*application1, app_id()).WillByDefault(Return(kAppId1_)); + ON_CALL(*application1, mac_address()).WillByDefault(ReturnRef(kMacAddr_)); // Act policy_handler_.OnActivateApp(connection_key, correlation_id); } @@ -936,12 +932,14 @@ TEST_F(PolicyHandlerTest, OnActivateApp_AppIsRevoked_AppNotActivated) { // Check expectations EXPECT_CALL(*mock_app_, policy_app_id()).WillOnce(Return(kPolicyAppId_)); - EXPECT_CALL(*mock_policy_manager_, GetAppPermissionsChanges(_)) + EXPECT_CALL(*mock_policy_manager_, + GetAppPermissionsChanges(kDefaultId, kPolicyAppId_)) .WillOnce(Return(permissions)); ON_CALL(*mock_policy_manager_, Increment(_, _)).WillByDefault(Return()); EXPECT_CALL(*mock_policy_manager_, RemovePendingPermissionChanges(_)); EXPECT_CALL(mock_message_helper_, SendSDLActivateAppResponse(_, _, _)); ON_CALL(*mock_app_, app_id()).WillByDefault(Return(kAppId1_)); + ON_CALL(*mock_app_, mac_address()).WillByDefault(ReturnRef(kDefaultId)); // Act policy_handler_.OnActivateApp(kConnectionKey_, kCorrelationKey_); } @@ -963,8 +961,7 @@ void PolicyHandlerTest::OnPendingPermissionChangePrecondition( std::shared_ptr<application_manager_test::MockApplication> application = std::make_shared<application_manager_test::MockApplication>(); - EXPECT_CALL(app_manager_, application_by_policy_id(kPolicyAppId_)) - .WillOnce(Return(application)); + EXPECT_CALL(app_manager_, application(_, _)).WillOnce(Return(application)); EXPECT_CALL(*application, app_id()).WillRepeatedly(Return(kAppId1_)); EXPECT_CALL(*application, hmi_level()).WillRepeatedly(Return(hmi_level)); } @@ -980,13 +977,13 @@ TEST_F(PolicyHandlerTest, EXPECT_CALL(mock_message_helper_, SendOnAppPermissionsChangedNotification(kAppId1_, _, _)) .Times(0); - - EXPECT_CALL(*mock_policy_manager_, GetAppPermissionsChanges(_)) + EXPECT_CALL(*mock_policy_manager_, + GetAppPermissionsChanges(kDeviceId_, kPolicyAppId_)) .WillOnce(Return(permissions)); EXPECT_CALL(*mock_policy_manager_, RemovePendingPermissionChanges(kPolicyAppId_)); // Act - policy_handler_.OnPendingPermissionChange(kPolicyAppId_); + policy_handler_.OnPendingPermissionChange(kDeviceId_, kPolicyAppId_); } TEST_F(PolicyHandlerTest, OnPendingPermissionChange_AppInLimitedConsentNeeded) { @@ -998,12 +995,13 @@ TEST_F(PolicyHandlerTest, OnPendingPermissionChange_AppInLimitedConsentNeeded) { // Check expectations EXPECT_CALL(mock_message_helper_, SendOnAppPermissionsChangedNotification(kAppId1_, _, _)); - EXPECT_CALL(*mock_policy_manager_, GetAppPermissionsChanges(_)) + EXPECT_CALL(*mock_policy_manager_, + GetAppPermissionsChanges(kDeviceId_, kPolicyAppId_)) .WillOnce(Return(permissions)); EXPECT_CALL(*mock_policy_manager_, RemovePendingPermissionChanges(kPolicyAppId_)); // Act - policy_handler_.OnPendingPermissionChange(kPolicyAppId_); + policy_handler_.OnPendingPermissionChange(kDeviceId_, kPolicyAppId_); } TEST_F(PolicyHandlerTest, OnPendingPermissionChange_AppLimitedAndRevoked) { @@ -1025,12 +1023,13 @@ TEST_F(PolicyHandlerTest, OnPendingPermissionChange_AppLimitedAndRevoked) { mobile_apis::VideoStreamingState::NOT_STREAMABLE, true)); - EXPECT_CALL(*mock_policy_manager_, GetAppPermissionsChanges(_)) + EXPECT_CALL(*mock_policy_manager_, + GetAppPermissionsChanges(kDeviceId_, kPolicyAppId_)) .WillOnce(Return(permissions)); EXPECT_CALL(*mock_policy_manager_, RemovePendingPermissionChanges(kPolicyAppId_)); // Act - policy_handler_.OnPendingPermissionChange(kPolicyAppId_); + policy_handler_.OnPendingPermissionChange(kDeviceId_, kPolicyAppId_); } TEST_F(PolicyHandlerTest, OnPendingPermissionChange_AppInBackgroundAndRevoked) { @@ -1044,12 +1043,13 @@ TEST_F(PolicyHandlerTest, OnPendingPermissionChange_AppInBackgroundAndRevoked) { EXPECT_CALL(mock_message_helper_, SendOnAppPermissionsChangedNotification(kAppId1_, _, _)); - EXPECT_CALL(*mock_policy_manager_, GetAppPermissionsChanges(_)) + EXPECT_CALL(*mock_policy_manager_, + GetAppPermissionsChanges(kDeviceId_, kPolicyAppId_)) .WillOnce(Return(permissions)); EXPECT_CALL(*mock_policy_manager_, RemovePendingPermissionChanges(kPolicyAppId_)); // Act - policy_handler_.OnPendingPermissionChange(kPolicyAppId_); + policy_handler_.OnPendingPermissionChange(kDeviceId_, kPolicyAppId_); } TEST_F(PolicyHandlerTest, @@ -1066,7 +1066,8 @@ TEST_F(PolicyHandlerTest, EXPECT_CALL(mock_message_helper_, SendOnAppPermissionsChangedNotification(kAppId1_, _, _)); - EXPECT_CALL(*mock_policy_manager_, GetAppPermissionsChanges(_)) + EXPECT_CALL(*mock_policy_manager_, + GetAppPermissionsChanges(kDeviceId_, kPolicyAppId_)) .WillOnce(Return(permissions)); EXPECT_CALL(mock_message_helper_, @@ -1083,7 +1084,7 @@ TEST_F(PolicyHandlerTest, RemovePendingPermissionChanges(kPolicyAppId_)); // Act - policy_handler_.OnPendingPermissionChange(kPolicyAppId_); + policy_handler_.OnPendingPermissionChange(kDeviceId_, kPolicyAppId_); } TEST_F(PolicyHandlerTest, @@ -1096,13 +1097,14 @@ TEST_F(PolicyHandlerTest, EXPECT_CALL(mock_message_helper_, SendOnAppPermissionsChangedNotification(kAppId1_, _, _)); - EXPECT_CALL(*mock_policy_manager_, GetAppPermissionsChanges(_)) + EXPECT_CALL(*mock_policy_manager_, + GetAppPermissionsChanges(kDeviceId_, kPolicyAppId_)) .WillOnce(Return(permissions)); EXPECT_CALL(*mock_policy_manager_, RemovePendingPermissionChanges(kPolicyAppId_)); - policy_handler_.OnPendingPermissionChange(kPolicyAppId_); + policy_handler_.OnPendingPermissionChange(kDeviceId_, kPolicyAppId_); } TEST_F(PolicyHandlerTest, @@ -1121,7 +1123,8 @@ TEST_F(PolicyHandlerTest, SendOnAppPermissionsChangedNotification(kAppId1_, _, _)) .Times(0); - EXPECT_CALL(*mock_policy_manager_, GetAppPermissionsChanges(_)) + EXPECT_CALL(*mock_policy_manager_, + GetAppPermissionsChanges(kDeviceId_, kPolicyAppId_)) .WillOnce(Return(permissions)); EXPECT_CALL(mock_message_helper_, @@ -1138,7 +1141,7 @@ TEST_F(PolicyHandlerTest, RemovePendingPermissionChanges(kPolicyAppId_)); // Act - policy_handler_.OnPendingPermissionChange(kPolicyAppId_); + policy_handler_.OnPendingPermissionChange(kDeviceId_, kPolicyAppId_); } TEST_F(PolicyHandlerTest, PTExchangeAtUserRequest) { @@ -1234,7 +1237,7 @@ TEST_F(PolicyHandlerTest, OnCurrentDeviceIdUpdateRequired) { // Check expectations std::shared_ptr<application_manager_test::MockApplication> application = std::make_shared<application_manager_test::MockApplication>(); - EXPECT_CALL(app_manager_, application_by_policy_id(kPolicyAppId_)) + EXPECT_CALL(app_manager_, application(kDeviceId_, kPolicyAppId_)) .WillOnce(Return(application)); EXPECT_CALL(app_manager_, connection_handler()) .WillOnce(ReturnRef(conn_handler)); @@ -1251,10 +1254,11 @@ TEST_F(PolicyHandlerTest, OnCurrentDeviceIdUpdateRequired) { _, _, _, - _)); + _)) + .WillOnce(DoAll(SetArgPointee<3>(kDeviceId_), Return(0))); // Act - policy_handler_.OnCurrentDeviceIdUpdateRequired(kPolicyAppId_); + policy_handler_.OnCurrentDeviceIdUpdateRequired(handle, kPolicyAppId_); } TEST_F(PolicyHandlerTest, OnSystemInfoChanged) { @@ -1303,11 +1307,17 @@ TEST_F(PolicyHandlerTest, GetAppRequestTypes) { // Arrange EnablePolicy(); ChangePolicyManagerToMock(); - // Check expectations + const transport_manager::DeviceHandle handle = 0u; +// Check expectations +#ifdef EXTERNAL_PROPRIETARY_MODE + EXPECT_CALL(*mock_policy_manager_, GetAppRequestTypes(handle, kPolicyAppId_)) + .WillOnce(Return(std::vector<std::string>())); +#else EXPECT_CALL(*mock_policy_manager_, GetAppRequestTypes(kPolicyAppId_)) .WillOnce(Return(std::vector<std::string>())); +#endif // Act - policy_handler_.GetAppRequestTypes(kPolicyAppId_); + policy_handler_.GetAppRequestTypes(handle, kPolicyAppId_); } TEST_F(PolicyHandlerTest, OnVIIsReady) { @@ -1376,13 +1386,14 @@ TEST_F(PolicyHandlerTest, SendOnAppPermissionsChanged) { std::shared_ptr<application_manager_test::MockApplication> application = std::make_shared<application_manager_test::MockApplication>(); // Check expectations - EXPECT_CALL(app_manager_, application_by_policy_id(kPolicyAppId_)) + EXPECT_CALL(app_manager_, application(kDeviceId_, kPolicyAppId_)) .WillOnce(Return(application)); EXPECT_CALL(mock_message_helper_, SendOnAppPermissionsChangedNotification(_, _, _)); AppPermissions permissions(kPolicyAppId_); // Act - policy_handler_.SendOnAppPermissionsChanged(permissions, kPolicyAppId_); + policy_handler_.SendOnAppPermissionsChanged( + permissions, kDeviceId_, kPolicyAppId_); } TEST_F(PolicyHandlerTest, OnPTExchangeNeeded) { @@ -1400,11 +1411,12 @@ TEST_F(PolicyHandlerTest, AddApplication) { // Check expectations EXPECT_CALL( *mock_policy_manager_, - AddApplication(kPolicyAppId_, HmiTypes(policy_table::AHT_DEFAULT))) + AddApplication( + kMacAddr_, kPolicyAppId_, HmiTypes(policy_table::AHT_DEFAULT))) .WillOnce(Return(std::make_shared<utils::CallNothing>())); // Act - policy_handler_.AddApplication(kPolicyAppId_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_handler_.AddApplication( + kMacAddr_, kPolicyAppId_, HmiTypes(policy_table::AHT_DEFAULT)); } TEST_F(PolicyHandlerTest, HeartBeatTimeout) { @@ -1439,9 +1451,10 @@ TEST_F(PolicyHandlerTest, OnAppRegisteredOnMobile) { EnablePolicyAndPolicyManagerMock(); // Check expectations - EXPECT_CALL(*mock_policy_manager_, OnAppRegisteredOnMobile(kPolicyAppId_)); + EXPECT_CALL(*mock_policy_manager_, + OnAppRegisteredOnMobile(kDeviceId, kPolicyAppId_)); // Act - policy_handler_.OnAppRegisteredOnMobile(kPolicyAppId_); + policy_handler_.OnAppRegisteredOnMobile(kDeviceId, kPolicyAppId_); } TEST_F(PolicyHandlerTest, IsRequestTypeAllowed) { @@ -1452,13 +1465,20 @@ TEST_F(PolicyHandlerTest, IsRequestTypeAllowed) { mobile_apis::RequestType::eType type = mobile_apis::RequestType::eType::EMERGENCY; + const transport_manager::DeviceHandle handle = 0u; + EXPECT_CALL(*mock_policy_manager_, GetAppRequestTypesState(kPolicyAppId_)) .WillOnce(Return(policy::RequestType::State::AVAILABLE)); - +#ifdef EXTERNAL_PROPRIETARY_MODE + EXPECT_CALL(*mock_policy_manager_, GetAppRequestTypes(handle, kPolicyAppId_)) + .WillOnce(Return(std::vector<std::string>({"HTTP"}))); +#else EXPECT_CALL(*mock_policy_manager_, GetAppRequestTypes(kPolicyAppId_)) .WillOnce(Return(std::vector<std::string>({"HTTP"}))); +#endif // Act - EXPECT_FALSE(policy_handler_.IsRequestTypeAllowed(kPolicyAppId_, type)); + EXPECT_FALSE( + policy_handler_.IsRequestTypeAllowed(handle, kPolicyAppId_, type)); } TEST_F(PolicyHandlerTest, IsRequestSubTypeAllowed) { @@ -1848,8 +1868,9 @@ TEST_F(PolicyHandlerTest, OnDeviceConsentChanged_ConsentAllowed) { connection_handler::DeviceHandle test_device_id = 100u; EXPECT_CALL(app_manager_, connection_handler()) .WillOnce(ReturnRef(conn_handler)); + EXPECT_CALL(app_manager_, applications()).WillRepeatedly(Return(app_set)); - EXPECT_CALL(conn_handler, GetDeviceID(kPolicyAppId_, _)) + EXPECT_CALL(conn_handler, GetDeviceID(kDeviceId, _)) .WillOnce(DoAll(SetArgPointee<1>(test_device_id), Return(true))); test_app.insert(mock_app_); @@ -1859,12 +1880,13 @@ TEST_F(PolicyHandlerTest, OnDeviceConsentChanged_ConsentAllowed) { EXPECT_CALL(*mock_policy_manager_, IsPredataPolicy(kPolicyAppId_)) .WillOnce(Return(true)); + EXPECT_CALL( + *mock_policy_manager_, + ReactOnUserDevConsentForApp(test_device_id, kPolicyAppId_, is_allowed)); EXPECT_CALL(*mock_policy_manager_, - ReactOnUserDevConsentForApp(kPolicyAppId_, is_allowed)); - EXPECT_CALL(*mock_policy_manager_, - SendNotificationOnPermissionsUpdated(kPolicyAppId_)); + SendNotificationOnPermissionsUpdated(kDeviceId, kPolicyAppId_)); - policy_handler_.OnDeviceConsentChanged(kPolicyAppId_, is_allowed); + policy_handler_.OnDeviceConsentChanged(kDeviceId, is_allowed); } TEST_F(PolicyHandlerTest, OnDeviceConsentChanged_ConsentNotAllowed) { @@ -1872,27 +1894,29 @@ TEST_F(PolicyHandlerTest, OnDeviceConsentChanged_ConsentNotAllowed) { // Arrange EnablePolicyAndPolicyManagerMock(); - connection_handler::DeviceHandle test_device_id = 100u; + connection_handler::DeviceHandle handle = 100u; EXPECT_CALL(app_manager_, connection_handler()) .WillOnce(ReturnRef(conn_handler)); // Check expectations - EXPECT_CALL(conn_handler, GetDeviceID(kPolicyAppId_, _)) - .WillOnce(DoAll(SetArgPointee<1>(test_device_id), Return(true))); + EXPECT_CALL(conn_handler, GetDeviceID(kMacAddr_, _)) + .WillOnce(DoAll(SetArgPointee<1>(handle), Return(true))); test_app.insert(mock_app_); - EXPECT_CALL(*mock_app_, device()).WillOnce(Return(test_device_id)); + EXPECT_CALL(*mock_app_, device()).WillOnce(Return(handle)); EXPECT_CALL(*mock_app_, policy_app_id()).WillOnce(Return(kPolicyAppId_)); EXPECT_CALL(*mock_policy_manager_, IsPredataPolicy(kPolicyAppId_)) .WillOnce(Return(true)); - EXPECT_CALL(*mock_policy_manager_, ReactOnUserDevConsentForApp(_, _)) + EXPECT_CALL(*mock_policy_manager_, + ReactOnUserDevConsentForApp(handle, kPolicyAppId_, is_allowed)) .Times(0); - EXPECT_CALL(*mock_policy_manager_, SendNotificationOnPermissionsUpdated(_)) + EXPECT_CALL(*mock_policy_manager_, + SendNotificationOnPermissionsUpdated(kMacAddr_, kPolicyAppId_)) .Times(0); - policy_handler_.OnDeviceConsentChanged(kPolicyAppId_, is_allowed); + policy_handler_.OnDeviceConsentChanged(kMacAddr_, is_allowed); } TEST_F(PolicyHandlerTest, OnDeviceConsentChanged_PredatePolicyNotAllowed) { @@ -1903,8 +1927,9 @@ TEST_F(PolicyHandlerTest, OnDeviceConsentChanged_PredatePolicyNotAllowed) { connection_handler::DeviceHandle test_device_id = 100u; EXPECT_CALL(app_manager_, connection_handler()) .WillOnce(ReturnRef(conn_handler)); + EXPECT_CALL(app_manager_, applications()).WillRepeatedly(Return(app_set)); - EXPECT_CALL(conn_handler, GetDeviceID(kPolicyAppId_, _)) + EXPECT_CALL(conn_handler, GetDeviceID(kMacAddr_, _)) .WillOnce(DoAll(SetArgPointee<1>(test_device_id), Return(true))); test_app.insert(mock_app_); @@ -1916,12 +1941,13 @@ TEST_F(PolicyHandlerTest, OnDeviceConsentChanged_PredatePolicyNotAllowed) { EXPECT_CALL(*mock_policy_manager_, IsPredataPolicy(kPolicyAppId_)) .WillOnce(Return(false)); + EXPECT_CALL( + *mock_policy_manager_, + ReactOnUserDevConsentForApp(test_device_id, kPolicyAppId_, is_allowed)); EXPECT_CALL(*mock_policy_manager_, - ReactOnUserDevConsentForApp(kPolicyAppId_, is_allowed)); - EXPECT_CALL(*mock_policy_manager_, - SendNotificationOnPermissionsUpdated(kPolicyAppId_)); + SendNotificationOnPermissionsUpdated(kMacAddr_, kPolicyAppId_)); - policy_handler_.OnDeviceConsentChanged(kPolicyAppId_, is_allowed); + policy_handler_.OnDeviceConsentChanged(kMacAddr_, is_allowed); } #ifdef ENABLE_SECURITY #ifdef EXTERNAL_PROPRIETARY_MODE diff --git a/src/components/include/application_manager/application_manager.h b/src/components/include/application_manager/application_manager.h index 521eadf48e..e03fdcfb94 100644 --- a/src/components/include/application_manager/application_manager.h +++ b/src/components/include/application_manager/application_manager.h @@ -94,9 +94,12 @@ class StateControllerImpl; struct CommandParametersPermissions; using policy::RPCParams; typedef std::vector<ApplicationSharedPtr> AppSharedPtrs; -struct ApplicationsAppIdSorter { +struct ApplicationsSorter { bool operator()(const ApplicationSharedPtr lhs, const ApplicationSharedPtr rhs) const { + if (lhs->app_id() == rhs->app_id()) { + return lhs->device() < rhs->device(); + } return lhs->app_id() < rhs->app_id(); } }; @@ -110,7 +113,7 @@ struct ApplicationsPolicyAppIdSorter { } }; -typedef std::set<ApplicationSharedPtr, ApplicationsAppIdSorter> ApplicationSet; +typedef std::set<ApplicationSharedPtr, ApplicationsSorter> ApplicationSet; typedef std::set<ApplicationSharedPtr, ApplicationsPolicyAppIdSorter> AppsWaitRegistrationSet; @@ -635,11 +638,14 @@ class ApplicationManager { /** * @brief IsAppInReconnectMode check if application belongs to session * affected by transport switching at the moment + * @param device_id device indentifier * @param policy_app_id Application id * @return True if application is registered within session being switched, * otherwise - false */ - virtual bool IsAppInReconnectMode(const std::string& policy_app_id) const = 0; + virtual bool IsAppInReconnectMode( + const connection_handler::DeviceHandle& device_id, + const std::string& policy_app_id) const = 0; virtual resumption::ResumeCtrl& resume_controller() = 0; diff --git a/src/components/include/application_manager/policies/policy_handler_interface.h b/src/components/include/application_manager/policies/policy_handler_interface.h index 835ddedd28..3387ed2fc6 100644 --- a/src/components/include/application_manager/policies/policy_handler_interface.h +++ b/src/components/include/application_manager/policies/policy_handler_interface.h @@ -71,11 +71,12 @@ class PolicyHandlerInterface { virtual bool ReceiveMessageFromSDK(const std::string& file, const BinaryMessage& pt_string) = 0; virtual bool UnloadPolicyLibrary() = 0; - virtual void OnPermissionsUpdated(const std::string& policy_app_id, + virtual void OnPermissionsUpdated(const std::string& device_id, + const std::string& policy_app_id, const Permissions& permissions, const HMILevel& default_hmi) = 0; - - virtual void OnPermissionsUpdated(const std::string& policy_app_id, + virtual void OnPermissionsUpdated(const std::string& device_id, + const std::string& policy_app_id, const Permissions& permissions) = 0; #ifdef EXTERNAL_PROPRIETARY_MODE @@ -98,7 +99,8 @@ class PolicyHandlerInterface { const std::string& priority) const = 0; virtual DeviceConsent GetUserConsentForDevice( const std::string& device_id) const = 0; - virtual bool GetDefaultHmi(const std::string& policy_app_id, + virtual bool GetDefaultHmi(const std::string& device_id, + const std::string& policy_app_id, std::string* default_hmi) const = 0; virtual bool GetInitialAppData(const std::string& application_id, StringArray* nicknames = NULL, @@ -137,6 +139,7 @@ class PolicyHandlerInterface { virtual void SendOnAppPermissionsChanged( const AppPermissions& permissions, + const std::string& device_id, const std::string& policy_app_id) const = 0; /** @@ -176,7 +179,8 @@ class PolicyHandlerInterface { */ virtual void OnIgnitionCycleOver() = 0; - virtual void OnPendingPermissionChange(const std::string& policy_app_id) = 0; + virtual void OnPendingPermissionChange(const std::string& device_id, + const std::string& policy_app_id) = 0; /** * Initializes PT exchange at user request @@ -255,9 +259,11 @@ class PolicyHandlerInterface { /** * @brief Update currently used device id in policies manager for given * application + * @param device_handle device identifier * @param policy_app_id Application id */ virtual std::string OnCurrentDeviceIdUpdateRequired( + const transport_manager::DeviceHandle& device_handle, const std::string& policy_app_id) = 0; /** @@ -342,10 +348,12 @@ class PolicyHandlerInterface { /** * @brief Allows to add new or update existed application during * registration process + * @param device_id device identifier * @param application_id The policy aplication id. * @return function that will notify update manager about new application */ virtual StatusNotifier AddApplication( + const std::string& device_id, const std::string& application_id, const rpc::policy_table_interface_base::AppHmiTypes& hmi_types) = 0; @@ -384,17 +392,21 @@ class PolicyHandlerInterface { * succesfully registered on mobile device. * It will send OnAppPermissionSend notification and will try to start PTU. * + * @param device_id device identifier * @param application_id registered application. */ - virtual void OnAppRegisteredOnMobile(const std::string& application_id) = 0; + virtual void OnAppRegisteredOnMobile(const std::string& device_id, + const std::string& application_id) = 0; /** * @brief Checks if certain request type is allowed for application + * @param device_handle device identifier * @param policy_app_id Unique applicaion id * @param type Request type * @return true, if allowed, otherwise - false */ virtual bool IsRequestTypeAllowed( + const transport_manager::DeviceHandle& device_handle, const std::string& policy_app_id, mobile_apis::RequestType::eType type) const = 0; @@ -426,10 +438,12 @@ class PolicyHandlerInterface { /** * @brief Gets application request types + * @param device_handle device identifier * @param policy_app_id Unique application id * @return request types */ virtual const std::vector<std::string> GetAppRequestTypes( + const transport_manager::DeviceHandle& device_handle, const std::string& policy_app_id) const = 0; /** @@ -565,10 +579,12 @@ class PolicyHandlerInterface { /** * @brief Sets HMI default type for specified application + * @param device_handle device identifier * @param application_id ID application * @param app_types list of HMI types */ virtual void SetDefaultHmiTypes( + const transport_manager::DeviceHandle& device_handle, const std::string& application_id, const smart_objects::SmartObject* app_types) = 0; diff --git a/src/components/include/policy/policy_external/policy/policy_listener.h b/src/components/include/policy/policy_external/policy/policy_listener.h index c64a6d5496..8203f5c9b6 100644 --- a/src/components/include/policy/policy_external/policy/policy_listener.h +++ b/src/components/include/policy/policy_external/policy/policy_listener.h @@ -45,14 +45,18 @@ namespace custom_str = utils::custom_string; class PolicyListener { public: virtual ~PolicyListener() {} - virtual void OnPermissionsUpdated(const std::string& policy_app_id, + virtual void OnPermissionsUpdated(const std::string& device_id, + const std::string& policy_app_id, const Permissions& permissions, const policy::HMILevel& default_hmi) = 0; - virtual void OnPermissionsUpdated(const std::string& policy_app_id, + virtual void OnPermissionsUpdated(const std::string& device_id, + const std::string& policy_app_id, const Permissions& permissions) = 0; - virtual void OnPendingPermissionChange(const std::string& policy_app_id) = 0; + virtual void OnPendingPermissionChange(const std::string& device_id, + const std::string& policy_app_id) = 0; virtual void OnUpdateStatusChanged(const std::string&) = 0; virtual std::string OnCurrentDeviceIdUpdateRequired( + const transport_manager::DeviceHandle& device_handle, const std::string& policy_app_id) = 0; virtual void OnSystemInfoUpdateRequired() = 0; virtual custom_str::CustomString GetAppName( @@ -95,10 +99,12 @@ class PolicyListener { /** * @brief Sends OnAppPermissionsChanged notification to HMI * @param permissions contains parameter for OnAppPermisionChanged + * @param device_id device identifier * @param policy_app_id contains policy application id */ virtual void SendOnAppPermissionsChanged( const AppPermissions& permissions, + const std::string& device_id, const std::string& policy_app_id) const = 0; /** @@ -146,7 +152,7 @@ class PolicyListener { * @return list devices ids */ virtual std::vector<std::string> GetDevicesIds( - const std::string& policy_app_id) = 0; + const std::string& policy_app_id) const = 0; /** * Notifies about changing HMI level diff --git a/src/components/include/policy/policy_external/policy/policy_manager.h b/src/components/include/policy/policy_external/policy/policy_manager.h index aecc4b607a..c6f0202d59 100644 --- a/src/components/include/policy/policy_external/policy/policy_manager.h +++ b/src/components/include/policy/policy_external/policy/policy_manager.h @@ -133,6 +133,7 @@ class PolicyManager : public usage_statistics::StatisticsManager { * @brief Check if specified RPC for specified application * has permission to be executed in specified HMI Level * and also its permitted params. + * @param device_id device identifier * @param app_id Id of application provided during registration * @param hmi_level Current HMI Level of application * @param rpc Name of RPC @@ -140,7 +141,8 @@ class PolicyManager : public usage_statistics::StatisticsManager { * @param CheckPermissionResult containing flag if HMI Level is allowed * and list of allowed params. */ - virtual void CheckPermissions(const PTString& app_id, + virtual void CheckPermissions(const PTString& device_id, + const PTString& app_id, const PTString& hmi_level, const PTString& rpc, const RPCParams& rpc_params, @@ -265,12 +267,15 @@ class PolicyManager : public usage_statistics::StatisticsManager { /** * @brief Update Application Policies as reaction * on User allowing/disallowing device this app is running on. + * @param device_handle device identifier * @param app_id Unique application id * @param is_device_allowed true if user allowing device otherwise false * @return true if operation was successful */ - virtual bool ReactOnUserDevConsentForApp(const std::string& app_id, - const bool is_device_allowed) = 0; + virtual bool ReactOnUserDevConsentForApp( + const transport_manager::DeviceHandle& device_handle, + const std::string& app_id, + const bool is_device_allowed) = 0; /** * @brief Sets counter value that passed for receiving PT UPdate. @@ -318,12 +323,14 @@ class PolicyManager : public usage_statistics::StatisticsManager { /** * @brief Get default HMI level for application + * @param device_id device identifier * @param policy_app_id Unique application id * @param default_hmi Default HMI level for application or empty, if value * was not set * @return true, if succedeed, otherwise - false */ - virtual bool GetDefaultHmi(const std::string& policy_app_id, + virtual bool GetDefaultHmi(const std::string& device_id, + const std::string& policy_app_id, std::string* default_hmi) const = 0; /** @@ -369,11 +376,12 @@ class PolicyManager : public usage_statistics::StatisticsManager { /** * @brief Gets specific application permissions changes since last policy * table update + * @param device_id device identifier * @param policy_app_id Unique application id * @return Permissions changes */ virtual AppPermissions GetAppPermissionsChanges( - const std::string& policy_app_id) = 0; + const std::string& device_id, const std::string& policy_app_id) = 0; /** * @brief Removes specific application permissions changes @@ -383,9 +391,11 @@ class PolicyManager : public usage_statistics::StatisticsManager { /** * @brief Return device id, which hosts specific application + * @param device_handle device identifier * @param policy_app_id Application id, which is required to update device id */ virtual std::string& GetCurrentDeviceId( + const transport_manager::DeviceHandle& device_handle, const std::string& policy_app_id) const = 0; /** @@ -406,10 +416,11 @@ class PolicyManager : public usage_statistics::StatisticsManager { /** * @brief Send OnPermissionsUpdated for choosen application + * @param device_id device identifier * @param application_id Unique application id */ virtual void SendNotificationOnPermissionsUpdated( - const std::string& application_id) = 0; + const std::string& device_id, const std::string& application_id) = 0; /** * @brief Marks device as upaired @@ -420,11 +431,13 @@ class PolicyManager : public usage_statistics::StatisticsManager { /** * @brief Adds, application to the db or update existed one * run PTU if policy update is necessary for application. + * @param device_id device identifier * @param application_id Unique application id * @param hmi_types application HMI types * @return function that will notify update manager about new application */ virtual StatusNotifier AddApplication( + const std::string& device_id, const std::string& application_id, const rpc::policy_table_interface_base::AppHmiTypes& hmi_types) = 0; @@ -504,10 +517,13 @@ class PolicyManager : public usage_statistics::StatisticsManager { /** * @brief OnAppRegisteredOnMobile allows to handle event when application were * succesfully registered on mobile device. - * It will send OnAppPermissionSend notification and will try to start PTU. * + * It will send OnAppPermissionSend notification and will try to start PTU. + * + * @param device_id device identifier * @param application_id registered application. */ - virtual void OnAppRegisteredOnMobile(const std::string& application_id) = 0; + virtual void OnAppRegisteredOnMobile(const std::string& device_id, + const std::string& application_id) = 0; virtual void OnDeviceSwitching(const std::string& device_id_from, const std::string& device_id_to) = 0; @@ -530,10 +546,12 @@ class PolicyManager : public usage_statistics::StatisticsManager { /** * @brief Gets request types for application + * @param device_handle device identifier * @param policy_app_id Unique application id * @return request types of application */ virtual const std::vector<std::string> GetAppRequestTypes( + const transport_manager::DeviceHandle& device_handle, const std::string policy_app_id) const = 0; /** @@ -694,11 +712,14 @@ class PolicyManager : public usage_statistics::StatisticsManager { /** * @brief Assigns new HMI types for specified application + * @param device_handle device identifier * @param application_id Unique application id * @param hmi_types new HMI types list */ - virtual void SetDefaultHmiTypes(const std::string& application_id, - const std::vector<int>& hmi_types) = 0; + virtual void SetDefaultHmiTypes( + const transport_manager::DeviceHandle& device_handle, + const std::string& application_id, + const std::vector<int>& hmi_types) = 0; /** * @brief Gets HMI types * @param application_id ID application diff --git a/src/components/include/policy/policy_regular/policy/policy_listener.h b/src/components/include/policy/policy_regular/policy/policy_listener.h index f12bb2e85f..d717822cac 100644 --- a/src/components/include/policy/policy_regular/policy/policy_listener.h +++ b/src/components/include/policy/policy_regular/policy/policy_listener.h @@ -45,14 +45,18 @@ namespace custom_str = utils::custom_string; class PolicyListener { public: virtual ~PolicyListener() {} - virtual void OnPermissionsUpdated(const std::string& policy_app_id, + virtual void OnPermissionsUpdated(const std::string& device_id, + const std::string& policy_app_id, const Permissions& permissions, const policy::HMILevel& default_hmi) = 0; - virtual void OnPermissionsUpdated(const std::string& policy_app_id, + virtual void OnPermissionsUpdated(const std::string& device_id, + const std::string& policy_app_id, const Permissions& permissions) = 0; - virtual void OnPendingPermissionChange(const std::string& policy_app_id) = 0; + virtual void OnPendingPermissionChange(const std::string& device_id, + const std::string& policy_app_id) = 0; virtual void OnUpdateStatusChanged(const std::string&) = 0; virtual std::string OnCurrentDeviceIdUpdateRequired( + const transport_manager::DeviceHandle& device_handle, const std::string& policy_app_id) = 0; virtual void OnSystemInfoUpdateRequired() = 0; virtual custom_str::CustomString GetAppName( @@ -93,10 +97,12 @@ class PolicyListener { /** * @brief Sends OnAppPermissionsChanged notification to HMI * @param permissions contains parameter for OnAppPermisionChanged + * @param device_id device identifier * @param policy_app_id contains policy application id */ virtual void SendOnAppPermissionsChanged( const AppPermissions& permissions, + const std::string& device_id, const std::string& policy_app_id) const = 0; /** @@ -128,7 +134,7 @@ class PolicyListener { * @return list devices ids */ virtual std::vector<std::string> GetDevicesIds( - const std::string& policy_app_id) = 0; + const std::string& policy_app_id) const = 0; /** * Notifies about changing HMI level diff --git a/src/components/include/policy/policy_regular/policy/policy_manager.h b/src/components/include/policy/policy_regular/policy/policy_manager.h index 713f71dcdb..c1547da760 100644 --- a/src/components/include/policy/policy_regular/policy/policy_manager.h +++ b/src/components/include/policy/policy_regular/policy/policy_manager.h @@ -260,12 +260,15 @@ class PolicyManager : public usage_statistics::StatisticsManager { /** * @brief Update Application Policies as reaction * on User allowing/disallowing device this app is running on. + * @param device_handle device identifier * @param app_id Unique application id * @param is_device_allowed true if user allowing device otherwise false * @return true if operation was successful */ - virtual bool ReactOnUserDevConsentForApp(const std::string app_id, - bool is_device_allowed) = 0; + virtual bool ReactOnUserDevConsentForApp( + const transport_manager::DeviceHandle& device_handle, + const std::string app_id, + bool is_device_allowed) = 0; /** * @brief Sets counter value that passed for receiving PT UPdate. @@ -311,12 +314,14 @@ class PolicyManager : public usage_statistics::StatisticsManager { /** * @brief Get default HMI level for application + * @param device_id device identifier * @param policy_app_id Unique application id * @param default_hmi Default HMI level for application or empty, if value * was not set * @return true, if succedeed, otherwise - false */ - virtual bool GetDefaultHmi(const std::string& policy_app_id, + virtual bool GetDefaultHmi(const std::string& device_id, + const std::string& policy_app_id, std::string* default_hmi) const = 0; /** @@ -360,11 +365,12 @@ class PolicyManager : public usage_statistics::StatisticsManager { /** * @brief Gets specific application permissions changes since last policy * table update + * @param device_id device identifier * @param policy_app_id Unique application id * @return Permissions changes */ virtual AppPermissions GetAppPermissionsChanges( - const std::string& policy_app_id) = 0; + const std::string& device_id, const std::string& policy_app_id) = 0; /** * @brief Removes specific application permissions changes @@ -374,9 +380,11 @@ class PolicyManager : public usage_statistics::StatisticsManager { /** * @brief Return device id, which hosts specific application + * @param device_handle device identifier * @param policy_app_id Application id, which is required to update device id */ virtual std::string& GetCurrentDeviceId( + const transport_manager::DeviceHandle& device_handle, const std::string& policy_app_id) const = 0; /** @@ -397,10 +405,11 @@ class PolicyManager : public usage_statistics::StatisticsManager { /** * @brief Send OnPermissionsUpdated for choosen application + * @param device_id device identifier * @param application_id Unique application id */ virtual void SendNotificationOnPermissionsUpdated( - const std::string& application_id) = 0; + const std::string& device_id, const std::string& application_id) = 0; /** * @brief Marks device as upaired @@ -411,11 +420,13 @@ class PolicyManager : public usage_statistics::StatisticsManager { /** * @brief Adds, application to the db or update existed one * run PTU if policy update is necessary for application. + * @param device_id device identifier * @param application_id Unique application id * @param hmi_types application HMI types * @return function that will notify update manager about new application */ virtual StatusNotifier AddApplication( + const std::string& device_id, const std::string& application_id, const rpc::policy_table_interface_base::AppHmiTypes& hmi_types) = 0; @@ -636,10 +647,13 @@ class PolicyManager : public usage_statistics::StatisticsManager { /** * @brief OnAppRegisteredOnMobile allows to handle event when application were * succesfully registered on mobile device. - * It will send OnAppPermissionSend notification and will try to start PTU. * + * It will send OnAppPermissionSend notification and will try to start PTU. + * + * @param device_id device identifier * @param application_id registered application. */ - virtual void OnAppRegisteredOnMobile(const std::string& application_id) = 0; + virtual void OnAppRegisteredOnMobile(const std::string& device_id, + const std::string& application_id) = 0; virtual void OnDeviceSwitching(const std::string& device_id_from, const std::string& device_id_to) = 0; @@ -674,11 +688,14 @@ class PolicyManager : public usage_statistics::StatisticsManager { /** * @brief Assigns new HMI types for specified application + * @param device_handle device identifier * @param application_id Unique application id * @param hmi_types new HMI types list */ - virtual void SetDefaultHmiTypes(const std::string& application_id, - const std::vector<int>& hmi_types) = 0; + virtual void SetDefaultHmiTypes( + const transport_manager::DeviceHandle& device_handle, + const std::string& application_id, + const std::vector<int>& hmi_types) = 0; /** * @brief Gets HMI types diff --git a/src/components/include/test/application_manager/mock_application_manager.h b/src/components/include/test/application_manager/mock_application_manager.h index fcedcebcf8..1579341be7 100644 --- a/src/components/include/test/application_manager/mock_application_manager.h +++ b/src/components/include/test/application_manager/mock_application_manager.h @@ -335,8 +335,9 @@ class MockApplicationManager : public application_manager::ApplicationManager { MOCK_METHOD2(ProcessReconnection, void(application_manager::ApplicationSharedPtr application, const uint32_t connection_key)); - MOCK_CONST_METHOD1(IsAppInReconnectMode, - bool(const std::string& policy_app_id)); + MOCK_CONST_METHOD2(IsAppInReconnectMode, + bool(const connection_handler::DeviceHandle& device_id, + const std::string& policy_app_id)); MOCK_CONST_METHOD0(GetCommandFactory, application_manager::CommandFactory&()); MOCK_CONST_METHOD0(get_current_audio_source, uint32_t()); MOCK_METHOD1(set_current_audio_source, void(const uint32_t)); diff --git a/src/components/include/test/application_manager/policies/mock_policy_handler_interface.h b/src/components/include/test/application_manager/policies/mock_policy_handler_interface.h index 342debca0a..36a9ab4c4c 100644 --- a/src/components/include/test/application_manager/policies/mock_policy_handler_interface.h +++ b/src/components/include/test/application_manager/policies/mock_policy_handler_interface.h @@ -57,12 +57,14 @@ class MockPolicyHandlerInterface : public policy::PolicyHandlerInterface { bool(const std::string& file, const policy::BinaryMessage& pt_string)); MOCK_METHOD0(UnloadPolicyLibrary, bool()); - MOCK_METHOD3(OnPermissionsUpdated, - void(const std::string& policy_app_id, + MOCK_METHOD4(OnPermissionsUpdated, + void(const std::string& device_id, + const std::string& policy_app_id, const policy::Permissions& permissions, const policy::HMILevel& default_hmi)); - MOCK_METHOD2(OnPermissionsUpdated, - void(const std::string& policy_app_id, + MOCK_METHOD3(OnPermissionsUpdated, + void(const std::string& device_id, + const std::string& policy_app_id, const policy::Permissions& permissions)); #ifdef EXTERNAL_PROPRIETARY_MODE @@ -86,8 +88,9 @@ class MockPolicyHandlerInterface : public policy::PolicyHandlerInterface { uint32_t(const std::string& priority)); MOCK_CONST_METHOD1(GetUserConsentForDevice, policy::DeviceConsent(const std::string& device_id)); - MOCK_CONST_METHOD2(GetDefaultHmi, - bool(const std::string& policy_app_id, + MOCK_CONST_METHOD3(GetDefaultHmi, + bool(const std::string& device_id, + const std::string& policy_app_id, std::string* default_hmi)); MOCK_METHOD3(GetInitialAppData, @@ -127,8 +130,9 @@ class MockPolicyHandlerInterface : public policy::PolicyHandlerInterface { MOCK_METHOD2(OnAllowSDLFunctionalityNotification, void(bool is_allowed, const std::string& device_id)); MOCK_METHOD0(OnIgnitionCycleOver, void()); - MOCK_METHOD1(OnPendingPermissionChange, - void(const std::string& policy_app_id)); + MOCK_METHOD2(OnPendingPermissionChange, + void(const std::string& device_id, + const std::string& policy_app_id)); MOCK_METHOD1(PTExchangeAtUserRequest, void(uint32_t correlation_id)); MOCK_METHOD2(AddDevice, void(const std::string& device_id, @@ -156,8 +160,9 @@ class MockPolicyHandlerInterface : public policy::PolicyHandlerInterface { const uint32_t correlation_id)); MOCK_METHOD1(OnGetStatusUpdate, void(const uint32_t correlation_id)); MOCK_METHOD1(OnUpdateStatusChanged, void(const std::string& status)); - MOCK_METHOD1(OnCurrentDeviceIdUpdateRequired, - std::string(const std::string& policy_app_id)); + MOCK_METHOD2(OnCurrentDeviceIdUpdateRequired, + std::string(const transport_manager::DeviceHandle& device_handle, + const std::string& policy_app_id)); MOCK_METHOD1(OnSystemInfoChanged, void(const std::string& language)); MOCK_METHOD3(OnGetSystemInfo, void(const std::string& ccpu_version, @@ -182,14 +187,16 @@ class MockPolicyHandlerInterface : public policy::PolicyHandlerInterface { MOCK_METHOD0(CanUpdate, bool()); MOCK_METHOD2(OnDeviceConsentChanged, void(const std::string& device_id, bool is_allowed)); - MOCK_CONST_METHOD2(SendOnAppPermissionsChanged, + MOCK_CONST_METHOD3(SendOnAppPermissionsChanged, void(const policy::AppPermissions& permissions, + const std::string& device_id, const std::string& policy_app_id)); MOCK_METHOD0(OnPTExchangeNeeded, void()); MOCK_METHOD1(GetAvailableApps, void(std::queue<std::string>& apps)); - MOCK_METHOD2( + MOCK_METHOD3( AddApplication, policy::StatusNotifier( + const std::string& device_id, const std::string& application_id, const rpc::policy_table_interface_base::AppHmiTypes& hmi_types)); MOCK_METHOD1(IsApplicationRevoked, bool(const std::string& app_id)); @@ -197,10 +204,12 @@ class MockPolicyHandlerInterface : public policy::PolicyHandlerInterface { MOCK_CONST_METHOD1(HeartBeatTimeout, uint32_t(const std::string& app_id)); MOCK_METHOD0(OnAppsSearchStarted, void()); MOCK_METHOD1(OnAppsSearchCompleted, void(const bool trigger_ptu)); - MOCK_METHOD1(OnAppRegisteredOnMobile, - void(const std::string& application_id)); - MOCK_CONST_METHOD2(IsRequestTypeAllowed, - bool(const std::string& policy_app_id, + MOCK_METHOD2(OnAppRegisteredOnMobile, + void(const std::string& device_id, + const std::string& application_id)); + MOCK_CONST_METHOD3(IsRequestTypeAllowed, + bool(const transport_manager::DeviceHandle& device_handle, + const std::string& policy_app_id, mobile_apis::RequestType::eType type)); MOCK_CONST_METHOD2(IsRequestSubTypeAllowed, bool(const std::string& policy_app_id, @@ -214,9 +223,10 @@ class MockPolicyHandlerInterface : public policy::PolicyHandlerInterface { MOCK_CONST_METHOD1( GetAppRequestSubTypes, const std::vector<std::string>(const std::string& policy_app_id)); - MOCK_CONST_METHOD1( - GetAppRequestTypes, - const std::vector<std::string>(const std::string& policy_app_id)); + MOCK_CONST_METHOD2(GetAppRequestTypes, + const std::vector<std::string>( + const transport_manager::DeviceHandle& device_handle, + const std::string& policy_app_id)); MOCK_CONST_METHOD0(GetVehicleInfo, const policy::VehicleInfo()); MOCK_CONST_METHOD1(GetEnabledCloudApps, void(std::vector<std::string>& enabled_apps)); @@ -293,8 +303,9 @@ class MockPolicyHandlerInterface : public policy::PolicyHandlerInterface { MOCK_CONST_METHOD2(GetModuleTypes, bool(const std::string& policy_app_id, std::vector<std::string>* modules)); - MOCK_METHOD2(SetDefaultHmiTypes, - void(const std::string& application_id, + MOCK_METHOD3(SetDefaultHmiTypes, + void(const transport_manager::DeviceHandle& device_handle, + const std::string& application_id, const smart_objects::SmartObject* app_types)); MOCK_METHOD2(OnDeviceSwitching, void(const std::string& device_id_from, diff --git a/src/components/include/test/policy/policy_external/policy/mock_policy_listener.h b/src/components/include/test/policy/policy_external/policy/mock_policy_listener.h index e6ee086b31..16341ed4f4 100644 --- a/src/components/include/test/policy/policy_external/policy/mock_policy_listener.h +++ b/src/components/include/test/policy/policy_external/policy/mock_policy_listener.h @@ -38,6 +38,7 @@ #include <vector> #include "gmock/gmock.h" +#include "utils/macro.h" #include "policy/policy_listener.h" #include "policy/policy_table/types.h" @@ -54,18 +55,22 @@ namespace custom_str = utils::custom_string; class MockPolicyListener : public ::policy::PolicyListener { public: - MOCK_METHOD3(OnPermissionsUpdated, - void(const std::string& policy_app_id, + MOCK_METHOD4(OnPermissionsUpdated, + void(const std::string& device_id, + const std::string& policy_app_id, const policy::Permissions& permissions, const policy::HMILevel& default_hmi)); - MOCK_METHOD2(OnPermissionsUpdated, - void(const std::string& policy_app_id, + MOCK_METHOD3(OnPermissionsUpdated, + void(const std::string& device_id, + const std::string& policy_app_id, const policy::Permissions& permissions)); - MOCK_METHOD1(OnPendingPermissionChange, - void(const std::string& policy_app_id)); + MOCK_METHOD2(OnPendingPermissionChange, + void(const std::string& device_id, + const std::string& policy_app_id)); MOCK_METHOD1(OnUpdateStatusChanged, void(const std::string& status)); - MOCK_METHOD1(OnCurrentDeviceIdUpdateRequired, - std::string(const std::string& policy_app_id)); + MOCK_METHOD2(OnCurrentDeviceIdUpdateRequired, + std::string(const transport_manager::DeviceHandle& device_handle, + const std::string& policy_app_id)); MOCK_METHOD0(OnSystemInfoUpdateRequired, void()); MOCK_METHOD1(GetAppName, custom_str::CustomString(const std::string& policy_app_id)); @@ -85,10 +90,13 @@ class MockPolicyListener : public ::policy::PolicyListener { void(const std::string& policy_app_id, const std::string& auth_token)); MOCK_METHOD1(OnPTUFinished, void(const bool ptu_result)); - MOCK_CONST_METHOD2(SendOnAppPermissionsChanged, - void(const policy::AppPermissions&, const std::string&)); - MOCK_METHOD1(GetDevicesIds, - std::vector<std::string>(const std::string& policy_app_id)); + MOCK_CONST_METHOD3(SendOnAppPermissionsChanged, + void(const policy::AppPermissions& permissions, + const std::string& device_id, + const std::string& policy_app_id)); + MOCK_CONST_METHOD1( + GetDevicesIds, + std::vector<std::string>(const std::string& policy_app_id)); MOCK_METHOD3(OnUpdateHMILevel, void(const std::string& device_id, const std::string& policy_app_id, diff --git a/src/components/include/test/policy/policy_external/policy/mock_policy_manager.h b/src/components/include/test/policy/policy_external/policy/mock_policy_manager.h index 309e357235..5313628890 100644 --- a/src/components/include/test/policy/policy_external/policy/mock_policy_manager.h +++ b/src/components/include/test/policy/policy_external/policy/mock_policy_manager.h @@ -68,8 +68,9 @@ class MockPolicyManager : public PolicyManager { void(const std::string& service_type, EndpointUrls& out_end_points)); MOCK_METHOD0(RequestPTUpdate, void()); - MOCK_METHOD5(CheckPermissions, - void(const PTString& app_id, + MOCK_METHOD6(CheckPermissions, + void(const PTString& device_id, + const PTString& app_id, const PTString& hmi_level, const PTString& rpc, const RPCParams& rpc_params, @@ -99,8 +100,10 @@ class MockPolicyManager : public PolicyManager { std::vector<policy::FunctionalGroupPermission>& permissions)); MOCK_METHOD2(SetUserConsentForDevice, void(const std::string& device_id, const bool is_allowed)); - MOCK_METHOD2(ReactOnUserDevConsentForApp, - bool(const std::string& app_id, bool is_device_allowed)); + MOCK_METHOD3(ReactOnUserDevConsentForApp, + bool(const transport_manager::DeviceHandle& device_handle, + const std::string& app_id, + bool is_device_allowed)); MOCK_METHOD2(PTUpdatedAt, void(policy::Counters counter, int value)); MOCK_METHOD3(GetInitialAppData, @@ -117,8 +120,9 @@ class MockPolicyManager : public PolicyManager { MOCK_METHOD2(SetUserConsentForApp, void(const policy::PermissionConsent& permissions, const policy::PolicyManager::NotificationMode mode)); - MOCK_CONST_METHOD2(GetDefaultHmi, - bool(const std::string& policy_app_id, + MOCK_CONST_METHOD3(GetDefaultHmi, + bool(const std::string& device_id, + const std::string& policy_app_id, std::string* default_hmi)); MOCK_CONST_METHOD2(GetPriority, bool(const std::string& policy_app_id, @@ -134,26 +138,32 @@ class MockPolicyManager : public PolicyManager { void(const std::string& device_id, const std::string& policy_app_id, std::vector<policy::FunctionalGroupPermission>& permissions)); - MOCK_METHOD1(GetAppPermissionsChanges, - policy::AppPermissions(const std::string& policy_app_id)); + MOCK_METHOD2(GetAppPermissionsChanges, + policy::AppPermissions(const std::string& device_id, + const std::string& policy_app_id)); MOCK_METHOD1(RemovePendingPermissionChanges, void(const std::string& app_id)); - MOCK_CONST_METHOD1(GetCurrentDeviceId, - std::string&(const std::string& policy_app_id)); + MOCK_CONST_METHOD2( + GetCurrentDeviceId, + std::string&(const transport_manager::DeviceHandle& device_handle, + const std::string& policy_app_id)); MOCK_METHOD1(SetSystemLanguage, void(const std::string& language)); MOCK_METHOD3(SetSystemInfo, void(const std::string& ccpu_version, const std::string& wers_country_code, const std::string& language)); - MOCK_METHOD1(SendNotificationOnPermissionsUpdated, - void(const std::string& application_id)); + MOCK_METHOD2(SendNotificationOnPermissionsUpdated, + void(const std::string& device_id, + const std::string& application_id)); MOCK_METHOD1(MarkUnpairedDevice, void(const std::string& device_id)); - MOCK_METHOD2( + MOCK_METHOD3( AddApplication, StatusNotifier( + const std::string& device_id, const std::string& application_id, const rpc::policy_table_interface_base::AppHmiTypes& hmi_types)); - MOCK_METHOD2(SetDefaultHmiTypes, - void(const std::string& application_id, + MOCK_METHOD3(SetDefaultHmiTypes, + void(const transport_manager::DeviceHandle& device_handle, + const std::string& application_id, const std::vector<int>& hmi_types)); MOCK_METHOD2(GetHMITypes, bool(const std::string& application_id, @@ -181,13 +191,15 @@ class MockPolicyManager : public PolicyManager { MOCK_METHOD1(SaveUpdateStatusRequired, void(bool is_update_needed)); MOCK_METHOD0(OnAppsSearchStarted, void()); MOCK_METHOD1(OnAppsSearchCompleted, void(const bool trigger_ptu)); - MOCK_METHOD1(OnAppRegisteredOnMobile, - void(const std::string& application_id)); + MOCK_METHOD2(OnAppRegisteredOnMobile, + void(const std::string& device_id, + const std::string& application_id)); MOCK_CONST_METHOD0(GetLockScreenIconUrl, std::string()); MOCK_CONST_METHOD1(GetIconUrl, std::string(const std::string& policy_app_id)); - MOCK_CONST_METHOD1( - GetAppRequestTypes, - const std::vector<std::string>(const std::string policy_app_id)); + MOCK_CONST_METHOD2(GetAppRequestTypes, + const std::vector<std::string>( + const transport_manager::DeviceHandle& device_handle, + const std::string policy_app_id)); MOCK_CONST_METHOD0(GetVehicleInfo, const policy::VehicleInfo()); MOCK_CONST_METHOD1(GetEnabledCloudApps, void(std::vector<std::string>& enabled_apps)); diff --git a/src/components/include/test/policy/policy_regular/policy/mock_policy_listener.h b/src/components/include/test/policy/policy_regular/policy/mock_policy_listener.h index 7958bd3304..d0d85409a2 100644 --- a/src/components/include/test/policy/policy_regular/policy/mock_policy_listener.h +++ b/src/components/include/test/policy/policy_regular/policy/mock_policy_listener.h @@ -35,6 +35,7 @@ #include <string> #include "gmock/gmock.h" +#include "utils/macro.h" #include "policy/policy_listener.h" #include "policy/policy_table/types.h" @@ -52,17 +53,21 @@ namespace custom_str = utils::custom_string; class MockPolicyListener : public ::policy::PolicyListener { public: MOCK_METHOD3(OnPermissionsUpdated, - void(const std::string& policy_app_id, + void(const std::string& device_id, + const std::string& policy_app_id, + const policy::Permissions& permissions)); + MOCK_METHOD4(OnPermissionsUpdated, + void(const std::string& device_id, + const std::string& policy_app_id, const policy::Permissions& permissions, const policy::HMILevel& default_hmi)); - MOCK_METHOD2(OnPermissionsUpdated, - void(const std::string& policy_app_id, - const policy::Permissions& permissions)); - MOCK_METHOD1(OnPendingPermissionChange, - void(const std::string& policy_app_id)); + MOCK_METHOD2(OnPendingPermissionChange, + void(const std::string& device_id, + const std::string& policy_app_id)); MOCK_METHOD1(OnUpdateStatusChanged, void(const std::string& status)); - MOCK_METHOD1(OnCurrentDeviceIdUpdateRequired, - std::string(const std::string& policy_app_id)); + MOCK_METHOD2(OnCurrentDeviceIdUpdateRequired, + std::string(const transport_manager::DeviceHandle& device_handle, + const std::string& policy_app_id)); MOCK_METHOD0(OnSystemInfoUpdateRequired, void()); MOCK_METHOD1(GetAppName, custom_str::CustomString(const std::string& policy_app_id)); @@ -78,14 +83,17 @@ class MockPolicyListener : public ::policy::PolicyListener { MOCK_METHOD2(OnAuthTokenUpdated, void(const std::string& policy_app_id, const std::string& auth_token)); - MOCK_CONST_METHOD2(SendOnAppPermissionsChanged, - void(const policy::AppPermissions&, const std::string&)); + MOCK_CONST_METHOD3(SendOnAppPermissionsChanged, + void(const policy::AppPermissions& permissions, + const std::string& device_id, + const std::string& policy_app_id)); MOCK_METHOD3(OnUpdateHMILevel, void(const std::string& device_id, const std::string& policy_app_id, const std::string& hmi_level)); - MOCK_METHOD1(GetDevicesIds, - std::vector<std::string>(const std::string& policy_app_id)); + MOCK_CONST_METHOD1( + GetDevicesIds, + std::vector<std::string>(const std::string& policy_app_id)); MOCK_CONST_METHOD1(GetRegisteredLinks, void(std::map<std::string, std::string>&)); MOCK_METHOD1(OnRemoteAllowedChanged, void(bool new_consent)); diff --git a/src/components/include/test/policy/policy_regular/policy/mock_policy_manager.h b/src/components/include/test/policy/policy_regular/policy/mock_policy_manager.h index a670e99bef..c6e692cf0b 100644 --- a/src/components/include/test/policy/policy_regular/policy/mock_policy_manager.h +++ b/src/components/include/test/policy/policy_regular/policy/mock_policy_manager.h @@ -100,8 +100,10 @@ class MockPolicyManager : public PolicyManager { std::vector<policy::FunctionalGroupPermission>& permissions)); MOCK_METHOD2(SetUserConsentForDevice, void(const std::string& device_id, const bool is_allowed)); - MOCK_METHOD2(ReactOnUserDevConsentForApp, - bool(const std::string app_id, bool is_device_allowed)); + MOCK_METHOD3(ReactOnUserDevConsentForApp, + bool(const transport_manager::DeviceHandle& device_handle, + const std::string app_id, + bool is_device_allowed)); MOCK_METHOD2(PTUpdatedAt, void(policy::Counters counter, int value)); MOCK_METHOD3(GetInitialAppData, @@ -117,8 +119,9 @@ class MockPolicyManager : public PolicyManager { const policy::DeviceInfo& device_info)); MOCK_METHOD1(SetUserConsentForApp, void(const policy::PermissionConsent& permissions)); - MOCK_CONST_METHOD2(GetDefaultHmi, - bool(const std::string& policy_app_id, + MOCK_CONST_METHOD3(GetDefaultHmi, + bool(const std::string& device_id, + const std::string& policy_app_id, std::string* default_hmi)); MOCK_CONST_METHOD2(GetPriority, bool(const std::string& policy_app_id, @@ -133,26 +136,32 @@ class MockPolicyManager : public PolicyManager { void(const std::string& device_id, const std::string& policy_app_id, std::vector<policy::FunctionalGroupPermission>& permissions)); - MOCK_METHOD1(GetAppPermissionsChanges, - policy::AppPermissions(const std::string& policy_app_id)); + MOCK_METHOD2(GetAppPermissionsChanges, + policy::AppPermissions(const std::string& device_id, + const std::string& policy_app_id)); MOCK_METHOD1(RemovePendingPermissionChanges, void(const std::string& app_id)); - MOCK_CONST_METHOD1(GetCurrentDeviceId, - std::string&(const std::string& policy_app_id)); + MOCK_CONST_METHOD2( + GetCurrentDeviceId, + std::string&(const transport_manager::DeviceHandle& device_handle, + const std::string& policy_app_id)); MOCK_METHOD1(SetSystemLanguage, void(const std::string& language)); MOCK_METHOD3(SetSystemInfo, void(const std::string& ccpu_version, const std::string& wers_country_code, const std::string& language)); - MOCK_METHOD1(SendNotificationOnPermissionsUpdated, - void(const std::string& application_id)); + MOCK_METHOD2(SendNotificationOnPermissionsUpdated, + void(const std::string& device_id, + const std::string& application_id)); MOCK_METHOD1(MarkUnpairedDevice, void(const std::string& device_id)); - MOCK_METHOD2( + MOCK_METHOD3( AddApplication, StatusNotifier( + const std::string& device_id, const std::string& application_id, const rpc::policy_table_interface_base::AppHmiTypes& hmi_types)); - MOCK_METHOD2(SetDefaultHmiTypes, - void(const std::string& application_id, + MOCK_METHOD3(SetDefaultHmiTypes, + void(const transport_manager::DeviceHandle& device_handle, + const std::string& application_id, const std::vector<int>& hmi_types)); MOCK_METHOD2(GetHMITypes, bool(const std::string& application_id, @@ -179,8 +188,9 @@ class MockPolicyManager : public PolicyManager { MOCK_METHOD1(SaveUpdateStatusRequired, void(bool is_update_needed)); MOCK_METHOD0(OnAppsSearchStarted, void()); MOCK_METHOD1(OnAppsSearchCompleted, void(const bool trigger_ptu)); - MOCK_METHOD1(OnAppRegisteredOnMobile, - void(const std::string& application_id)); + MOCK_METHOD2(OnAppRegisteredOnMobile, + void(const std::string& device_id, + const std::string& application_id)); MOCK_CONST_METHOD1( GetAppRequestTypes, const std::vector<std::string>(const std::string policy_app_id)); diff --git a/src/components/interfaces/HMI_API.xml b/src/components/interfaces/HMI_API.xml index 1e768c694e..0944e71b53 100644 --- a/src/components/interfaces/HMI_API.xml +++ b/src/components/interfaces/HMI_API.xml @@ -2665,7 +2665,7 @@ <param name="vrSynonyms" type="String" maxlength="40" minsize="1" maxsize="100" array="true" mandatory="false"> <description> Defines an additional voice recognition command. - Must not interfere with any name of previously registered applications(SDL makes check). + Must not interfere with any name of previously registered applications from the same device. </description> </param> <param name="appID" type="Integer" mandatory="true"> @@ -4086,7 +4086,7 @@ <param name="vrSynonyms" type="String" maxlength="40" minsize="1" maxsize="100" array="true" mandatory="false"> <description> Defines an additional voice recognition command. - Must not interfere with any name of previously registered applications(SDL makes check). + Must not interfere with any name of previously registered applications from the same device. </description> </param> <param name="resumeVrGrammars" type="Boolean" mandatory="false"> @@ -4471,7 +4471,7 @@ <description> Request new VR synonyms registration Defines an additional voice recognition command. - Must not interfere with any name of previously registered applications(SDL makes check). + Must not interfere with any name of previously registered applications from the same device. </description> </param> <param name="language" type="Common.Language" mandatory="true"> @@ -4947,10 +4947,10 @@ <param name="appName" type="String" maxlength="100" mandatory="false"> <description> Request new app name registration - Needs to be unique over all applications. + Needs to be unique over all applications from the same device. May not be empty. May not start with a new line character. - May not interfere with any name or synonym of any registered applications. - Applications with the same name will be rejected. (SDL makes all the checks) + May not interfere with any name or synonym of any registered applications from the same device. + Additional applications with the same name from the same device will be rejected. </description> </param> <param name="ngnMediaScreenAppName" type="String" maxlength="100" mandatory="false"> diff --git a/src/components/interfaces/MOBILE_API.xml b/src/components/interfaces/MOBILE_API.xml index f874baba70..b62b70003c 100644 --- a/src/components/interfaces/MOBILE_API.xml +++ b/src/components/interfaces/MOBILE_API.xml @@ -4243,11 +4243,11 @@ <param name="appName" type="String" maxlength="100" mandatory="true" since="1.0"> <description> The mobile application name, e.g. "Ford Drive Green". - Needs to be unique over all applications. + Needs to be unique over all applications from the same device. May not be empty. May not start with a new line character. - May not interfere with any name or synonym of previously registered applications and any predefined blacklist of words (global commands) - Needs to be unique over all applications. Applications with the same name will be rejected. + May not interfere with any name or synonym of previously registered applications from the same device and any predefined blacklist of words (global commands) + Additional applications with the same name from the same device will be rejected. Only characters from char set [@TODO: Create char set (character/hex value) for each ACM and refer to] are supported. </description> </param> @@ -4256,7 +4256,7 @@ <description> TTS string for VR recognition of the mobile application name, e.g. "Ford Drive Green". Meant to overcome any failing on speech engine in properly pronouncing / understanding app name. - Needs to be unique over all applications. + Needs to be unique over all applications from the same device. May not be empty. May not start with a new line character. Only characters from char set [@TODO: Create char set (character/hex value) for each ACM and refer to] are supported. @@ -4274,7 +4274,7 @@ <param name="vrSynonyms" type="String" maxlength="40" minsize="1" maxsize="100" array="true" mandatory="false" since="1.0"> <description> Defines an additional voice recognition command. - May not interfere with any app name of previously registered applications and any predefined blacklist of words (global commands) + May not interfere with any app name of previously registered applications from the same device and any predefined blacklist of words (global commands) Only characters from char set [@TODO: Create char set (character/hex value) for each ACM and refer to] are supported. </description> </param> diff --git a/src/components/policy/policy_external/include/policy/policy_manager_impl.h b/src/components/policy/policy_external/include/policy/policy_manager_impl.h index 9dd2b3c6ec..261f66a3b2 100644 --- a/src/components/policy/policy_external/include/policy/policy_manager_impl.h +++ b/src/components/policy/policy_external/include/policy/policy_manager_impl.h @@ -122,6 +122,7 @@ class PolicyManagerImpl : public PolicyManager { * @brief Check if specified RPC for specified application * has permission to be executed in specified HMI Level * and also its permitted params. + * @param device_id device identifier * @param app_id Id of application provided during registration * @param hmi_level Current HMI Level of application * @param rpc Name of RPC @@ -129,7 +130,8 @@ class PolicyManagerImpl : public PolicyManager { * @param result containing flag if HMI Level is allowed * and list of allowed params. */ - void CheckPermissions(const PTString& app_id, + void CheckPermissions(const PTString& device_id, + const PTString& app_id, const PTString& hmi_level, const PTString& rpc, const RPCParams& rpc_params, @@ -267,12 +269,15 @@ class PolicyManagerImpl : public PolicyManager { /** * @brief Update Application Policies as reaction * on User allowing/disallowing device this app is running on. + * @param device_handle device identifier * @param app_id Unique application id * @param is_device_allowed true if user allowing device otherwise false * @return true if operation was successful */ - bool ReactOnUserDevConsentForApp(const std::string& app_id, - const bool is_device_allowed) OVERRIDE; + bool ReactOnUserDevConsentForApp( + const transport_manager::DeviceHandle& device_handle, + const std::string& app_id, + const bool is_device_allowed) OVERRIDE; /** * @brief Retrieves data from app_policies about app on its registration: @@ -315,12 +320,14 @@ class PolicyManagerImpl : public PolicyManager { /** * @brief Get default HMI level for application + * @param device_id device identifier * @param policy_app_id Unique application id * @param default_hmi Default HMI level for application or empty, if value * was not set * @return true, if succedeed, otherwise - false */ - bool GetDefaultHmi(const std::string& policy_app_id, + bool GetDefaultHmi(const std::string& device_id, + const std::string& policy_app_id, std::string* default_hmi) const OVERRIDE; /** @@ -365,9 +372,11 @@ class PolicyManagerImpl : public PolicyManager { /** * @brief Return device id, which hosts specific application + * @param device_id device identifier * @param policy_app_id Application id, which is required to update device id */ std::string& GetCurrentDeviceId( + const transport_manager::DeviceHandle& device_id, const std::string& policy_app_id) const OVERRIDE; /** @@ -409,11 +418,12 @@ class PolicyManagerImpl : public PolicyManager { /** * @brief Gets specific application permissions changes since last policy * table update + * @param device_id device identifier * @param policy_app_id Unique application id * @return Permissions changes */ AppPermissions GetAppPermissionsChanges( - const std::string& policy_app_id) OVERRIDE; + const std::string& device_id, const std::string& policy_app_id) OVERRIDE; /** * @brief Removes specific application permissions changes @@ -423,10 +433,11 @@ class PolicyManagerImpl : public PolicyManager { /** * @brief Send OnPermissionsUpdated for choosen application + * @param device_id device identifier * @param application_id Unique application id */ void SendNotificationOnPermissionsUpdated( - const std::string& application_id) OVERRIDE; + const std::string& device_id, const std::string& application_id) OVERRIDE; /** * @brief Removes unpaired device records and related records from DB @@ -457,20 +468,24 @@ class PolicyManagerImpl : public PolicyManager { /** * @brief Adds, application to the db or update existed one * run PTU if policy update is necessary for application. + * @param device_id device identifier * @param application_id Unique application id * @param hmi_types application HMI types * @return function that will notify update manager about new application */ StatusNotifier AddApplication( + const std::string& device_id, const std::string& application_id, const rpc::policy_table_interface_base::AppHmiTypes& hmi_types) OVERRIDE; /** * @brief Assigns new HMI types for specified application + * @param device_handle device identifier * @param application_id Unique application id * @param hmi_types new HMI types list */ - void SetDefaultHmiTypes(const std::string& application_id, + void SetDefaultHmiTypes(const transport_manager::DeviceHandle& device_handle, + const std::string& application_id, const std::vector<int>& hmi_types) OVERRIDE; /** @@ -564,10 +579,12 @@ class PolicyManagerImpl : public PolicyManager { /** * @brief Gets request types for application + * @param device_handle device identifier * @param policy_app_id Unique application id * @return request types of application */ const std::vector<std::string> GetAppRequestTypes( + const transport_manager::DeviceHandle& device_handle, const std::string policy_app_id) const OVERRIDE; /** @@ -689,10 +706,13 @@ class PolicyManagerImpl : public PolicyManager { /** * @brief OnAppRegisteredOnMobile allows to handle event when application were * succesfully registered on mobile device. - * It will send OnAppPermissionSend notification and will try to start PTU. * + * It will send OnAppPermissionSend notification and will try to start PTU. + * + * @param device_id device identifier * @param application_id registered application. */ - void OnAppRegisteredOnMobile(const std::string& application_id) OVERRIDE; + void OnAppRegisteredOnMobile(const std::string& device_id, + const std::string& application_id) OVERRIDE; void OnDeviceSwitching(const std::string& device_id_from, const std::string& device_id_to) OVERRIDE; @@ -918,19 +938,23 @@ class PolicyManagerImpl : public PolicyManager { /** * @brief Allows to process case when added application is not present in * policy db. + * @param device_id device identifier * @param policy application id. * @param cuuren consent for application's device. */ - void AddNewApplication(const std::string& application_id, + void AddNewApplication(const std::string& device_id, + const std::string& application_id, DeviceConsent device_consent); /** * @brief Allows to process case when added application is already * in policy db. + * @param device_id device identifier * @param policy application id. * @param cuuren consent for application's device. */ - void PromoteExistedApplication(const std::string& application_id, + void PromoteExistedApplication(const std::string& device_id, + const std::string& application_id, DeviceConsent device_consent); /** @@ -948,9 +972,12 @@ class PolicyManagerImpl : public PolicyManager { /** * @brief Checks whether need ask the permission of users + * @param device_id device identifier + * @param appid policy application id * @return true if user consent is needed */ - virtual bool IsConsentNeeded(const std::string& app_id); + virtual bool IsConsentNeeded(const std::string& device_id, + const std::string& app_id); /** * @brief Changes isConsentNeeded for app pending permissions, in case @@ -1036,11 +1063,13 @@ class PolicyManagerImpl : public PolicyManager { /** * @brief Notify application about its permissions changes by preparing and * sending OnPermissionsChanged notification + * @param device_id device identifier * @param policy_app_id Application id to send notification to * @param app_group_permissons Current permissions for groups assigned to * application */ void NotifyPermissionsChanges( + const std::string& device_id, const std::string& policy_app_id, const std::vector<FunctionalGroupPermission>& app_group_permissions); @@ -1065,11 +1094,13 @@ class PolicyManagerImpl : public PolicyManager { * user consents (if any) and ExternalConsent consents (if any) will be * updated * appropiately to current ExternalConsent status stored by policy table + * @param device_id device identifier * @param application_id Application id * @param processing_policy Defines whether consents timestamps must be * considered or external consents take over */ void ProcessExternalConsentStatusForApp( + const std::string& device_id, const std::string& application_id, const ConsentProcessingPolicy processing_policy); /** @@ -1097,16 +1128,20 @@ class PolicyManagerImpl : public PolicyManager { /** * @brief Notifies system by sending OnAppPermissionChanged notification + * @param device_id device identifier * @param app_policy Reference to application policy */ - void NotifySystem(const AppPoliciesValueType& app_policy) const; + void NotifySystem(const std::string& device_id, + const AppPoliciesValueType& app_policy) const; /** * @brief Sends OnPermissionChange notification to application if its * currently registered + * @param device_id device identifier * @param app_policy Reference to application policy */ - void SendPermissionsToApp(const AppPoliciesValueType& app_policy); + void SendPermissionsToApp(const std::string& device_id, + const AppPoliciesValueType& app_policy); /** * @brief Gets groups names from collection of groups permissions diff --git a/src/components/policy/policy_external/src/policy_manager_impl.cc b/src/components/policy/policy_external/src/policy_manager_impl.cc index 42b67734ae..dd33bb86ab 100644 --- a/src/components/policy/policy_external/src/policy_manager_impl.cc +++ b/src/components/policy/policy_external/src/policy_manager_impl.cc @@ -565,33 +565,35 @@ void PolicyManagerImpl::ProcessAppPolicyCheckResults( void PolicyManagerImpl::ProcessActionsForAppPolicies( const ApplicationsPoliciesActions& actions, const policy_table::ApplicationPolicies& app_policies) { - ApplicationsPoliciesActions::const_iterator it_actions = actions.begin(); - for (; it_actions != actions.end(); ++it_actions) { - policy_table::ApplicationPolicies::const_iterator app_policy = - app_policies.find(it_actions->first); + for (const auto& action : actions) { + const auto& app_policy = app_policies.find(action.first); if (app_policies.end() == app_policy) { continue; } - if (it_actions->second.is_consent_needed) { - // Post-check after ExternalConsent consent changes - const std::string& policy_app_id = app_policy->first; - if (!IsConsentNeeded(policy_app_id)) { - sync_primitives::AutoLock lock(app_permissions_diff_lock_); + const auto devices_ids = listener()->GetDevicesIds(app_policy->first); + for (const auto& device_id : devices_ids) { + if (action.second.is_consent_needed) { + // Post-check after ExternalConsent consent changes + const auto& policy_app_id = app_policy->first; + if (!IsConsentNeeded(device_id, policy_app_id)) { + sync_primitives::AutoLock lock(app_permissions_diff_lock_); - PendingPermissions::iterator app_id_diff = - app_permissions_diff_.find(policy_app_id); + const auto& app_id_diff = app_permissions_diff_.find(policy_app_id); - if (app_permissions_diff_.end() != app_id_diff) { - app_id_diff->second.appPermissionsConsentNeeded = false; + if (app_permissions_diff_.end() != app_id_diff) { + app_id_diff->second.appPermissionsConsentNeeded = false; + } } } - } - if (it_actions->second.is_notify_system) { - NotifySystem(*app_policy); - } - if (it_actions->second.is_send_permissions_to_app) { - SendPermissionsToApp(*app_policy); + + if (action.second.is_notify_system) { + NotifySystem(device_id, *app_policy); + } + + if (action.second.is_send_permissions_to_app) { + SendPermissionsToApp(device_id, *app_policy); + } } } } @@ -715,10 +717,11 @@ void PolicyManagerImpl::OnAppsSearchCompleted(const bool trigger_ptu) { } const std::vector<std::string> PolicyManagerImpl::GetAppRequestTypes( + const transport_manager::DeviceHandle& device_handle, const std::string policy_app_id) const { std::vector<std::string> request_types; - if (kDeviceDisallowed == - cache_->GetDeviceConsent(GetCurrentDeviceId(policy_app_id))) { + if (kDeviceAllowed != cache_->GetDeviceConsent( + GetCurrentDeviceId(device_handle, policy_app_id))) { cache_->GetAppRequestTypes(kPreDataConsentId, request_types); } else { cache_->GetAppRequestTypes(policy_app_id, request_types); @@ -818,7 +821,8 @@ bool PolicyManagerImpl::UnknownRPCPassthroughAllowed( return cache_->UnknownRPCPassthroughAllowed(policy_app_id); } -void PolicyManagerImpl::CheckPermissions(const PTString& app_id, +void PolicyManagerImpl::CheckPermissions(const PTString& device_id, + const PTString& app_id, const PTString& hmi_level, const PTString& rpc, const RPCParams& rpc_params, @@ -827,8 +831,6 @@ void PolicyManagerImpl::CheckPermissions(const PTString& app_id, "CheckPermissions for " << app_id << " and rpc " << rpc << " for " << hmi_level << " level."); - const std::string device_id = GetCurrentDeviceId(app_id); - Permissions rpc_permissions; // Check, if there are calculated permission present in cache @@ -998,9 +1000,8 @@ policy_table::Strings PolicyManagerImpl::GetGroupsNames( } void PolicyManagerImpl::SendNotificationOnPermissionsUpdated( - const std::string& application_id) { + const std::string& device_id, const std::string& application_id) { LOG4CXX_AUTO_TRACE(logger_); - const std::string device_id = GetCurrentDeviceId(application_id); if (device_id.empty()) { LOG4CXX_WARN(logger_, "Couldn't find device info for application id " @@ -1028,15 +1029,16 @@ void PolicyManagerImpl::SendNotificationOnPermissionsUpdated( const ApplicationOnDevice who = {device_id, application_id}; if (access_remote_->IsAppRemoteControl(who)) { - listener()->OnPermissionsUpdated(application_id, notification_data); + listener()->OnPermissionsUpdated( + device_id, application_id, notification_data); return; } std::string default_hmi; - GetDefaultHmi(application_id, &default_hmi); + GetDefaultHmi(device_id, application_id, &default_hmi); listener()->OnPermissionsUpdated( - application_id, notification_data, default_hmi); + device_id, application_id, notification_data, default_hmi); } bool PolicyManagerImpl::CleanupUnpairedDevices() { @@ -1069,14 +1071,16 @@ void PolicyManagerImpl::SetUserConsentForDevice(const std::string& device_id, } bool PolicyManagerImpl::ReactOnUserDevConsentForApp( - const std::string& app_id, const bool is_device_allowed) { - std::vector<std::string> current_request_types = GetAppRequestTypes(app_id); + const transport_manager::DeviceHandle& device_handle, + const std::string& app_id, + const bool is_device_allowed) { + auto current_request_types = GetAppRequestTypes(device_handle, app_id); std::string current_priority, new_priority; GetPriority(app_id, ¤t_priority); bool result = cache_->ReactOnUserDevConsentForApp(app_id, is_device_allowed); - std::vector<std::string> new_request_types = GetAppRequestTypes(app_id); + auto new_request_types = GetAppRequestTypes(device_handle, app_id); GetPriority(app_id, &new_priority); std::sort(current_request_types.begin(), current_request_types.end()); std::sort(new_request_types.begin(), new_request_types.end()); @@ -1101,7 +1105,8 @@ bool PolicyManagerImpl::ReactOnUserDevConsentForApp( } if (permissions.requestTypeChanged || (!permissions.priority.empty())) { - listener_->SendOnAppPermissionsChanged(permissions, app_id); + const auto& device_id = GetCurrentDeviceId(device_handle, app_id); + listener_->SendOnAppPermissionsChanged(permissions, device_id, app_id); } return result; } @@ -1219,6 +1224,7 @@ void PolicyManagerImpl::CheckPendingPermissionsChanges( } void PolicyManagerImpl::NotifyPermissionsChanges( + const std::string& device_id, const std::string& policy_app_id, const std::vector<FunctionalGroupPermission>& app_group_permissions) { LOG4CXX_AUTO_TRACE(logger_); @@ -1234,7 +1240,7 @@ void PolicyManagerImpl::NotifyPermissionsChanges( PrepareNotificationData( functional_groups, app_groups, app_group_permissions, notification_data); - listener()->OnPermissionsUpdated(policy_app_id, notification_data); + listener()->OnPermissionsUpdated(device_id, policy_app_id, notification_data); } void PolicyManagerImpl::SetUserConsentForApp( @@ -1273,14 +1279,15 @@ void PolicyManagerImpl::SetUserConsentForApp( CheckPendingPermissionsChanges(verified_permissions.policy_app_id, updated_app_group_permissons); - NotifyPermissionsChanges(verified_permissions.policy_app_id, + NotifyPermissionsChanges(verified_permissions.device_id, + verified_permissions.policy_app_id, updated_app_group_permissons); } -bool PolicyManagerImpl::GetDefaultHmi(const std::string& policy_app_id, +bool PolicyManagerImpl::GetDefaultHmi(const std::string& device_id, + const std::string& policy_app_id, std::string* default_hmi) const { LOG4CXX_AUTO_TRACE(logger_); - const std::string device_id = GetCurrentDeviceId(policy_app_id); DeviceConsent device_consent = GetUserConsentForDevice(device_id); const std::string app_id = policy::kDeviceAllowed != device_consent ? kPreDataConsentId @@ -1385,11 +1392,13 @@ void PolicyManagerImpl::GetPermissionsForApp( } bool allowed_by_default = false; - if (cache_->IsDefaultPolicy(policy_app_id)) { + const auto device_consent = GetUserConsentForDevice(device_id); + if ((policy::kDeviceAllowed == device_consent) && + cache_->IsDefaultPolicy(policy_app_id)) { app_id_to_check = kDefaultId; allowed_by_default = true; } else if (cache_->IsPredataPolicy(policy_app_id) || - policy::kDeviceDisallowed == GetUserConsentForDevice(device_id)) { + policy::kDeviceAllowed != device_consent) { app_id_to_check = kPreDataConsentId; allowed_by_default = true; } @@ -1473,9 +1482,11 @@ void PolicyManagerImpl::GetPermissionsForApp( } std::string& PolicyManagerImpl::GetCurrentDeviceId( + const transport_manager::DeviceHandle& device_handle, const std::string& policy_app_id) const { LOG4CXX_INFO(logger_, "GetDeviceInfo"); - last_device_id_ = listener()->OnCurrentDeviceIdUpdateRequired(policy_app_id); + last_device_id_ = + listener()->OnCurrentDeviceIdUpdateRequired(device_handle, policy_app_id); return last_device_id_; } @@ -1579,15 +1590,16 @@ void PolicyManagerImpl::UpdateAppConsentWithExternalConsent( } void PolicyManagerImpl::NotifySystem( + const std::string& device_id, const PolicyManagerImpl::AppPoliciesValueType& app_policy) const { - listener()->OnPendingPermissionChange(app_policy.first); + listener()->OnPendingPermissionChange(device_id, app_policy.first); } void PolicyManagerImpl::SendPermissionsToApp( + const std::string& device_id, const PolicyManagerImpl::AppPoliciesValueType& app_policy) { const std::string app_id = app_policy.first; - const std::string device_id = GetCurrentDeviceId(app_id); if (device_id.empty()) { LOG4CXX_WARN(logger_, "Couldn't find device info for application id: " << app_id); @@ -1610,6 +1622,7 @@ void PolicyManagerImpl::SendPermissionsToApp( LOG4CXX_INFO(logger_, "Send notification for application_id: " << app_id); listener()->OnPermissionsUpdated( + device_id, app_id, notification_data, policy_table::EnumToJsonString(app_policy.second.default_hmi)); @@ -1870,10 +1883,10 @@ bool PolicyManagerImpl::IsApplicationRevoked(const std::string& app_id) const { return cache_->IsApplicationRevoked(app_id); } -bool PolicyManagerImpl::IsConsentNeeded(const std::string& app_id) { +bool PolicyManagerImpl::IsConsentNeeded(const std::string& device_id, + const std::string& app_id) { LOG4CXX_AUTO_TRACE(logger_); - const std::string device_id = GetCurrentDeviceId(app_id); - int count = cache_->CountUnconsentedGroups(app_id, device_id); + const int count = cache_->CountUnconsentedGroups(app_id, device_id); LOG4CXX_DEBUG(logger_, "There are: " << count << " unconsented groups."); return count != 0; } @@ -1883,7 +1896,7 @@ void PolicyManagerImpl::SetVINValue(const std::string& value) { } AppPermissions PolicyManagerImpl::GetAppPermissionsChanges( - const std::string& policy_app_id) { + const std::string& device_id, const std::string& policy_app_id) { PendingPermissions::iterator app_id_diff = app_permissions_diff_.find(policy_app_id); @@ -1892,7 +1905,8 @@ AppPermissions PolicyManagerImpl::GetAppPermissionsChanges( if (app_permissions_diff_.end() != app_id_diff) { permissions = app_id_diff->second; } else { - permissions.appPermissionsConsentNeeded = IsConsentNeeded(policy_app_id); + permissions.appPermissionsConsentNeeded = + IsConsentNeeded(device_id, policy_app_id); permissions.appRevoked = IsApplicationRevoked(policy_app_id); GetPriority(permissions.application_id, &permissions.priority); } @@ -1921,9 +1935,9 @@ void PolicyManagerImpl::MarkUnpairedDevice(const std::string& device_id) { } void PolicyManagerImpl::OnAppRegisteredOnMobile( - const std::string& application_id) { + const std::string& device_id, const std::string& application_id) { StartPTExchange(); - SendNotificationOnPermissionsUpdated(application_id); + SendNotificationOnPermissionsUpdated(device_id, application_id); } void PolicyManagerImpl::OnDeviceSwitching(const std::string& device_id_from, @@ -2012,20 +2026,23 @@ class CallStatusChange : public utils::Callable { }; StatusNotifier PolicyManagerImpl::AddApplication( + const std::string& device_id, const std::string& application_id, const rpc::policy_table_interface_base::AppHmiTypes& hmi_types) { LOG4CXX_AUTO_TRACE(logger_); - const std::string device_id = GetCurrentDeviceId(application_id); - DeviceConsent device_consent = GetUserConsentForDevice(device_id); + auto device_consent = GetUserConsentForDevice(device_id); + LOG4CXX_DEBUG(logger_, + "check_device_id: " << device_id << " check_device_consent: " + << device_consent); sync_primitives::AutoLock lock(apps_registration_lock_); if (IsNewApplication(application_id)) { LOG4CXX_DEBUG(logger_, "Adding new application"); - AddNewApplication(application_id, device_consent); + AddNewApplication(device_id, application_id, device_consent); return std::make_shared<CallStatusChange>(update_status_manager_, device_consent); } LOG4CXX_DEBUG(logger_, "Promote existed application"); - PromoteExistedApplication(application_id, device_consent); + PromoteExistedApplication(device_id, application_id, device_consent); update_status_manager_.OnExistedApplicationAdded(cache_->UpdateRequired()); return std::make_shared<utils::CallNothing>(); } @@ -2042,6 +2059,7 @@ bool PolicyManagerImpl::IsPredataPolicy( } void PolicyManagerImpl::ProcessExternalConsentStatusForApp( + const std::string& device_id, const std::string& application_id, const ConsentProcessingPolicy processing_policy) { ExternalConsentStatus status = cache_->GetExternalConsentStatus(); @@ -2053,7 +2071,7 @@ void PolicyManagerImpl::ProcessExternalConsentStatusForApp( CalculateGroupsConsentFromExternalConsent( groups_by_status, allowed_groups, disallowed_groups); - const std::string device_id = GetCurrentDeviceId(application_id); + LOG4CXX_DEBUG(logger_, "check device_id: " << device_id); UpdateAppConsentWithExternalConsent(device_id, application_id, allowed_groups, @@ -2061,7 +2079,8 @@ void PolicyManagerImpl::ProcessExternalConsentStatusForApp( processing_policy); } -void PolicyManagerImpl::AddNewApplication(const std::string& application_id, +void PolicyManagerImpl::AddNewApplication(const std::string& device_id, + const std::string& application_id, DeviceConsent device_consent) { LOG4CXX_AUTO_TRACE(logger_); @@ -2081,19 +2100,31 @@ void PolicyManagerImpl::AddNewApplication(const std::string& application_id, } ProcessExternalConsentStatusForApp( - application_id, ConsentProcessingPolicy::kExternalConsentBased); + device_id, + application_id, + ConsentProcessingPolicy::kExternalConsentBased); } void PolicyManagerImpl::PromoteExistedApplication( - const std::string& application_id, DeviceConsent device_consent) { + const std::string& device_id, + const std::string& application_id, + DeviceConsent device_consent) { // If device consent changed to allowed during application being // disconnected, app permissions should be changed also + LOG4CXX_DEBUG(logger_, + "kDeviceAllowed == device_consent: " + << (kDeviceAllowed == device_consent) + << " device_consent: " << device_consent); if (kDeviceAllowed == device_consent && cache_->IsPredataPolicy(application_id)) { + LOG4CXX_INFO(logger_, + "Setting " + << policy::kDefaultId + << " permissions for application id: " << application_id); cache_->SetDefaultPolicy(application_id); } - ProcessExternalConsentStatusForApp(application_id, - ConsentProcessingPolicy::kTimestampBased); + ProcessExternalConsentStatusForApp( + device_id, application_id, ConsentProcessingPolicy::kTimestampBased); } bool PolicyManagerImpl::IsNewApplication( @@ -2173,10 +2204,12 @@ std::ostream& operator<<(std::ostream& output, return output; } -void PolicyManagerImpl::SetDefaultHmiTypes(const std::string& application_id, - const std::vector<int>& hmi_types) { +void PolicyManagerImpl::SetDefaultHmiTypes( + const transport_manager::DeviceHandle& device_handle, + const std::string& application_id, + const std::vector<int>& hmi_types) { LOG4CXX_INFO(logger_, "SetDefaultHmiTypes"); - const std::string device_id = GetCurrentDeviceId(application_id); + const auto device_id = GetCurrentDeviceId(device_handle, application_id); ApplicationOnDevice who = {device_id, application_id}; access_remote_->SetDefaultHmiTypes(who, hmi_types); } @@ -2214,7 +2247,7 @@ bool PolicyManagerImpl::CheckModule(const PTString& app_id, void PolicyManagerImpl::SendHMILevelChanged(const ApplicationOnDevice& who) { std::string default_hmi("NONE"); - if (GetDefaultHmi(who.app_id, &default_hmi)) { + if (GetDefaultHmi(who.dev_id, who.app_id, &default_hmi)) { listener()->OnUpdateHMIStatus(who.dev_id, who.app_id, default_hmi); } else { LOG4CXX_WARN( @@ -2251,7 +2284,8 @@ void PolicyManagerImpl::SendAppPermissionsChanged( const std::string& device_id, const std::string& application_id) { Permissions notification_data; GetPermissions(device_id, application_id, ¬ification_data); - listener()->OnPermissionsUpdated(application_id, notification_data); + listener()->OnPermissionsUpdated( + device_id, application_id, notification_data); } void PolicyManagerImpl::SendAuthTokenUpdated(const std::string policy_app_id) { diff --git a/src/components/policy/policy_external/test/policy_manager_impl_ptu_test.cc b/src/components/policy/policy_external/test/policy_manager_impl_ptu_test.cc index 066b5756e2..bb8c6fc12a 100644 --- a/src/components/policy/policy_external/test/policy_manager_impl_ptu_test.cc +++ b/src/components/policy/policy_external/test/policy_manager_impl_ptu_test.cc @@ -92,7 +92,8 @@ TEST_F(PolicyManagerImplTest, EXPECT_CALL(*cache_manager_, IsApplicationRepresented(_)) .WillOnce(Return(true)); EXPECT_EQ(policy_manager_->GetPolicyTableStatus(), "UP_TO_DATE"); - policy_manager_->AddApplication(kDefaultId, + policy_manager_->AddApplication(kDefaultDeviceMacAddress, + kDefaultId, HmiTypes(policy_table::AHT_DEFAULT)); EXPECT_EQ(policy_manager_->GetPolicyTableStatus(), "UP_TO_DATE"); } @@ -142,8 +143,11 @@ TEST_F(PolicyManagerImplTest2, IsAppRevoked_SetRevokedAppID_ExpectAppRevoked) { // Arrange CreateLocalPT(preloaded_pt_filename_); - policy_manager_->AddApplication(app_id_1_, - HmiTypes(policy_table::AHT_DEFAULT)); + EXPECT_CALL(listener_, GetDevicesIds(app_id_1_)) + .WillRepeatedly(Return(transport_manager::DeviceList())); + + policy_manager_->AddApplication( + device_id_1_, app_id_1_, HmiTypes(policy_table::AHT_DEFAULT)); std::ifstream ifile(kValidSdlPtUpdateJson); Json::Reader reader; @@ -174,8 +178,8 @@ TEST_F(PolicyManagerImplTest2, AppRevokedOne_AppRegistered) { EXPECT_FALSE(policy_manager_->GetCache()->IsPTPreloaded()); ASSERT_TRUE( (policy_manager_->GetCache())->AddDevice(device_id_2_, "Bluetooth")); - policy_manager_->AddApplication(application_id_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->AddApplication( + device_id_2_, application_id_, HmiTypes(policy_table::AHT_DEFAULT)); // Registration is allowed CheckRpcPermissions("RegisterAppInterface", ::policy::kRpcAllowed); } @@ -187,12 +191,13 @@ TEST_F(PolicyManagerImplTest2, AppRevokedOne_AppRegistered_HMIDefault) { EmulatePTAppRevoked(kPtu2Json); EXPECT_FALSE(policy_manager_->GetCache()->IsPTPreloaded()); - policy_manager_->AddApplication(application_id_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->AddApplication( + device_id_1_, application_id_, HmiTypes(policy_table::AHT_DEFAULT)); std::string default_hmi; // Default HMI level is NONE - EXPECT_TRUE(policy_manager_->GetDefaultHmi(application_id_, &default_hmi)); + EXPECT_TRUE(policy_manager_->GetDefaultHmi( + device_id_1_, application_id_, &default_hmi)); EXPECT_EQ("NONE", default_hmi); } @@ -210,12 +215,16 @@ TEST_F(PolicyManagerImplTest2, "Life", 2, "Bluetooth"); - EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(app_id_1_)) - .WillRepeatedly(Return(device_id_1_)); + + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(_, app_id_1_)) + .Times(0); + EXPECT_CALL(listener_, GetDevicesIds(app_id_1_)) + .WillRepeatedly(Return(transport_manager::DeviceList(1, device_id_1_))); + policy_manager_->SetUserConsentForDevice(device_id_1_, true); // Add app from consented device. App will be assigned with default policies - policy_manager_->AddApplication(app_id_1_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->AddApplication( + device_id_1_, app_id_1_, HmiTypes(policy_table::AHT_DEFAULT)); // Check before action policy_table::RpcParameters rpc_parameters; rpc_parameters.hmi_levels.push_back(policy_table::HL_FULL); @@ -227,7 +236,7 @@ TEST_F(PolicyManagerImplTest2, ::policy::CheckPermissionResult output; policy_manager_->CheckPermissions( - app_id_1_, kHmiLevelFull, "Alert", input_params, output); + device_id_1_, app_id_1_, kHmiLevelFull, "Alert", input_params, output); // Check RPC is allowed EXPECT_EQ(::policy::kRpcAllowed, output.hmi_level_permitted); @@ -248,7 +257,7 @@ TEST_F(PolicyManagerImplTest2, EXPECT_FALSE(cache->IsPTPreloaded()); policy_manager_->CheckPermissions( - app_id_1_, kHmiLevelFull, "Alert", input_params, output); + device_id_1_, app_id_1_, kHmiLevelFull, "Alert", input_params, output); // Check RPC is disallowed EXPECT_EQ(::policy::kRpcDisallowed, output.hmi_level_permitted); ASSERT_TRUE(output.list_of_allowed_params.empty()); @@ -269,12 +278,14 @@ TEST_F(PolicyManagerImplTest2, "Life", 2, "Bluetooth")); - EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(application_id_)) - .WillRepeatedly(Return(device_id_1_)); + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(_, application_id_)) + .Times(0); + EXPECT_CALL(listener_, GetDevicesIds(application_id_)) + .WillRepeatedly(Return(transport_manager::DeviceList(1, device_id_1_))); policy_manager_->SetUserConsentForDevice(device_id_1_, true); // Add app from consented device. App will be assigned with default policies - policy_manager_->AddApplication(application_id_, - HmiTypes(policy_table::AHT_MEDIA)); + policy_manager_->AddApplication( + device_id_1_, application_id_, HmiTypes(policy_table::AHT_MEDIA)); // Emulate PTU with new policies for app added above std::ifstream ifile(kValidSdlPtUpdateJson); Json::Reader reader; @@ -323,8 +334,6 @@ TEST_F(PolicyManagerImplTest2, ::policy::RPCParams input_params; ::policy::CheckPermissionResult output; - EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(application_id_)) - .WillOnce(Return(device_id_1_)); cache->AddDevice(device_id_1_, "Bluetooth"); cache->SetDeviceData(device_id_1_, "hardware IPX", @@ -334,8 +343,12 @@ TEST_F(PolicyManagerImplTest2, "Life", 2, "Bluetooth"); - policy_manager_->CheckPermissions( - application_id_, kHmiLevelFull, "Alert", input_params, output); + policy_manager_->CheckPermissions(device_id_1_, + application_id_, + kHmiLevelFull, + "Alert", + input_params, + output); // Check RPC is allowed EXPECT_EQ(::policy::kRpcAllowed, output.hmi_level_permitted); // Check list of parameters empty @@ -344,21 +357,22 @@ TEST_F(PolicyManagerImplTest2, TEST_F(PolicyManagerImplTest2, CheckPermissions_NoParametersInPT_CheckRpcsInDifferentLevels) { + EXPECT_CALL(listener_, GetDevicesIds(application_id_)) + .WillRepeatedly(Return(transport_manager::DeviceList())); // Arrange AddSetDeviceData(); LoadPTUFromJsonFile("json/sdl_update_pt_send_location.json"); - // Will be called each time permissions are checked - EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(application_id_)) - .Times(4) - .WillRepeatedly(Return(device_id_1_)); - // Check RPC in each level ::policy::RPCParams input_params; ::policy::CheckPermissionResult output; // Rpc in FULL level - policy_manager_->CheckPermissions( - application_id_, kHmiLevelFull, "SendLocation", input_params, output); + policy_manager_->CheckPermissions(device_id_1_, + application_id_, + kHmiLevelFull, + "SendLocation", + input_params, + output); // Check RPC is allowed EXPECT_EQ(::policy::kRpcAllowed, output.hmi_level_permitted); ASSERT_TRUE(output.list_of_allowed_params.empty()); @@ -367,8 +381,12 @@ TEST_F(PolicyManagerImplTest2, ResetOutputList(output); // Rpc in LIMITED level - policy_manager_->CheckPermissions( - application_id_, kHmiLevelLimited, "SendLocation", input_params, output); + policy_manager_->CheckPermissions(device_id_1_, + application_id_, + kHmiLevelLimited, + "SendLocation", + input_params, + output); // Check RPC is allowed EXPECT_EQ(::policy::kRpcAllowed, output.hmi_level_permitted); ASSERT_TRUE(output.list_of_allowed_params.empty()); @@ -376,7 +394,8 @@ TEST_F(PolicyManagerImplTest2, ResetOutputList(output); // Rpc in BACKGROUND level - policy_manager_->CheckPermissions(application_id_, + policy_manager_->CheckPermissions(device_id_1_, + application_id_, kHmiLevelBackground, "SendLocation", input_params, @@ -388,8 +407,12 @@ TEST_F(PolicyManagerImplTest2, ResetOutputList(output); // Rpc in NONE level - policy_manager_->CheckPermissions( - application_id_, kHmiLevelNone, "SendLocation", input_params, output); + policy_manager_->CheckPermissions(device_id_1_, + application_id_, + kHmiLevelNone, + "SendLocation", + input_params, + output); // Check RPC is disallowed EXPECT_EQ(::policy::kRpcDisallowed, output.hmi_level_permitted); // Check list of parameters is empty @@ -399,24 +422,25 @@ TEST_F(PolicyManagerImplTest2, TEST_F( PolicyManagerImplTest2, CheckPermissions_ParamsNotAllowedInPT_AddAppWithAllParams_CheckRpcsInDiffLvls) { + EXPECT_CALL(listener_, GetDevicesIds(application_id_)) + .WillRepeatedly(Return(transport_manager::DeviceList())); // Arrange AddSetDeviceData(); // File have empty parameters, so they are forbidden LoadPTUFromJsonFile("json/sdl_update_pt_send_location_no_params.json"); - // Will be called each time permissions are checked - EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(application_id_)) - .Times(4) - .WillRepeatedly(Return(device_id_1_)); - // Check RPC in each level ::policy::RPCParams input_params; InsertRpcParametersInList(input_params); ::policy::CheckPermissionResult output; // Rpc in FULL level - policy_manager_->CheckPermissions( - application_id_, kHmiLevelFull, "SendLocation", input_params, output); + policy_manager_->CheckPermissions(device_id_1_, + application_id_, + kHmiLevelFull, + "SendLocation", + input_params, + output); // Group which has RPC does not require user consent, so its auto-allowed for // user. Since RPC 'parameters' section is present, but empty, that means @@ -431,8 +455,12 @@ TEST_F( ResetOutputList(output); // Rpc in LIMITED level - policy_manager_->CheckPermissions( - application_id_, kHmiLevelLimited, "SendLocation", input_params, output); + policy_manager_->CheckPermissions(device_id_1_, + application_id_, + kHmiLevelLimited, + "SendLocation", + input_params, + output); EXPECT_EQ(::policy::kRpcDisallowed, output.hmi_level_permitted); @@ -443,7 +471,8 @@ TEST_F( ResetOutputList(output); // Rpc in BACKGROUND level - policy_manager_->CheckPermissions(application_id_, + policy_manager_->CheckPermissions(device_id_1_, + application_id_, kHmiLevelBackground, "SendLocation", input_params, @@ -459,8 +488,12 @@ TEST_F( ResetOutputList(output); // Rpc in NONE level - policy_manager_->CheckPermissions( - application_id_, kHmiLevelNone, "SendLocation", input_params, output); + policy_manager_->CheckPermissions(device_id_1_, + application_id_, + kHmiLevelNone, + "SendLocation", + input_params, + output); EXPECT_EQ(::policy::kRpcDisallowed, output.hmi_level_permitted); @@ -472,6 +505,8 @@ TEST_F( TEST_F(PolicyManagerImplTest2, CheckPermissions_SomeParamsAllowedInPT_CheckRpcsInDiffLvls) { + EXPECT_CALL(listener_, GetDevicesIds(application_id_)) + .WillRepeatedly(Return(transport_manager::DeviceList())); // Arrange AddSetDeviceData(); @@ -479,19 +514,18 @@ TEST_F(PolicyManagerImplTest2, //"locationDescription", "phoneNumber" are allowed LoadPTUFromJsonFile("json/sdl_update_pt_send_location_some_params.json"); - // Will be called each time permissions are checked - EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(application_id_)) - .Times(4) - .WillRepeatedly(Return(device_id_1_)); - // Check RPC in each level ::policy::RPCParams input_params; InsertRpcParametersInList(input_params); ::policy::CheckPermissionResult output; // Rpc in FULL level - policy_manager_->CheckPermissions( - application_id_, kHmiLevelFull, "SendLocation", input_params, output); + policy_manager_->CheckPermissions(device_id_1_, + application_id_, + kHmiLevelFull, + "SendLocation", + input_params, + output); // Check RPC is allowed EXPECT_EQ(::policy::kRpcAllowed, output.hmi_level_permitted); @@ -520,8 +554,12 @@ TEST_F(PolicyManagerImplTest2, output.list_of_undefined_params.clear(); // Rpc in LIMITED level - policy_manager_->CheckPermissions( - application_id_, kHmiLevelLimited, "SendLocation", input_params, output); + policy_manager_->CheckPermissions(device_id_1_, + application_id_, + kHmiLevelLimited, + "SendLocation", + input_params, + output); // Check RPC is allowed EXPECT_EQ(::policy::kRpcAllowed, output.hmi_level_permitted); @@ -539,7 +577,8 @@ TEST_F(PolicyManagerImplTest2, ResetOutputList(output); // Rpc in BACKGROUND level - policy_manager_->CheckPermissions(application_id_, + policy_manager_->CheckPermissions(device_id_1_, + application_id_, kHmiLevelBackground, "SendLocation", input_params, @@ -559,8 +598,12 @@ TEST_F(PolicyManagerImplTest2, ResetOutputList(output); // Rpc in NONE level - policy_manager_->CheckPermissions( - application_id_, kHmiLevelNone, "SendLocation", input_params, output); + policy_manager_->CheckPermissions(device_id_1_, + application_id_, + kHmiLevelNone, + "SendLocation", + input_params, + output); // Check RPC is disallowed EXPECT_EQ(::policy::kRpcDisallowed, output.hmi_level_permitted); // Check lists of parameters are empty @@ -585,10 +628,12 @@ TEST_F(PolicyManagerImplTest2, GetCorrectStatus_PTUSuccessful) { CreateLocalPT(preloaded_pt_filename_); // Check EXPECT_EQ("UP_TO_DATE", policy_manager_->GetPolicyTableStatus()); + EXPECT_CALL(listener_, GetDevicesIds(application_id_)) + .WillRepeatedly(Return(transport_manager::DeviceList())); // Adding changes PT status - policy_manager_->AddApplication(application_id_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->AddApplication( + device_id_1_, application_id_, HmiTypes(policy_table::AHT_DEFAULT)); EXPECT_EQ("UP_TO_DATE", policy_manager_->GetPolicyTableStatus()); // Before load PT we should send notification about start updating policy_manager_->OnUpdateStarted(); @@ -613,6 +658,8 @@ TEST_F(PolicyManagerImplTest2, TEST_F(PolicyManagerImplTest2, CheckPermissions_DiffParamsAllowedInGroups_CheckRpcsInDiffLvls) { + EXPECT_CALL(listener_, GetDevicesIds(application_id_)) + .WillRepeatedly(Return(transport_manager::DeviceList())); // Arrange AddSetDeviceData(); // Load Json to cache @@ -621,19 +668,18 @@ TEST_F(PolicyManagerImplTest2, // Allowed both groups of parameters LoadPTUFromJsonFile("json/sdl_update_pt_2_groups_have_params.json"); - // Will be called each time permissions are checked - EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(application_id_)) - .Times(4) - .WillRepeatedly(Return(device_id_1_)); - // Check RPC in each level ::policy::RPCParams input_params; InsertRpcParametersInList(input_params); ::policy::CheckPermissionResult output; // Rpc in FULL level - policy_manager_->CheckPermissions( - application_id_, kHmiLevelFull, "SendLocation", input_params, output); + policy_manager_->CheckPermissions(device_id_1_, + application_id_, + kHmiLevelFull, + "SendLocation", + input_params, + output); // Check RPC is allowed EXPECT_EQ(::policy::kRpcAllowed, output.hmi_level_permitted); // Check list of allowed parameters is not empty @@ -652,8 +698,12 @@ TEST_F(PolicyManagerImplTest2, ResetOutputList(output); // Rpc in LIMITED level - policy_manager_->CheckPermissions( - application_id_, kHmiLevelLimited, "SendLocation", input_params, output); + policy_manager_->CheckPermissions(device_id_1_, + application_id_, + kHmiLevelLimited, + "SendLocation", + input_params, + output); // Check RPC is allowed EXPECT_EQ(::policy::kRpcAllowed, output.hmi_level_permitted); // Check list of allowed parameters is not empty @@ -672,7 +722,8 @@ TEST_F(PolicyManagerImplTest2, ResetOutputList(output); // Rpc in BACKGROUND level - policy_manager_->CheckPermissions(application_id_, + policy_manager_->CheckPermissions(device_id_1_, + application_id_, kHmiLevelBackground, "SendLocation", input_params, @@ -696,8 +747,12 @@ TEST_F(PolicyManagerImplTest2, ResetOutputList(output); // Rpc in NONE level - policy_manager_->CheckPermissions( - application_id_, kHmiLevelNone, "SendLocation", input_params, output); + policy_manager_->CheckPermissions(device_id_1_, + application_id_, + kHmiLevelNone, + "SendLocation", + input_params, + output); // Check RPC is disallowed EXPECT_EQ(::policy::kRpcDisallowed, output.hmi_level_permitted); // Check lists of parameters are empty @@ -726,9 +781,12 @@ TEST_F(PolicyManagerImplTest2, 2, "Bluetooth")); + EXPECT_CALL(listener_, GetDevicesIds(application_id_)) + .WillRepeatedly(Return(transport_manager::DeviceList())); // Add app from consented device. App will be assigned with default policies - policy_manager_->AddApplication(application_id_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->SetUserConsentForDevice(device_id_1_, true); + policy_manager_->AddApplication( + device_id_1_, application_id_, HmiTypes(policy_table::AHT_DEFAULT)); std::ifstream ifile("json/sdl_update_pt_2_groups_no_params_in1.json"); Json::Reader reader; @@ -743,19 +801,18 @@ TEST_F(PolicyManagerImplTest2, EXPECT_TRUE(policy_manager_->LoadPT(kFilePtUpdateJson, msg)); EXPECT_FALSE(cache->IsPTPreloaded()); - // Will be called each time permissions are checked - EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(application_id_)) - .Times(4) - .WillRepeatedly(Return(device_id_1_)); - // Check RPC in each level ::policy::RPCParams input_params; InsertRpcParametersInList(input_params); ::policy::CheckPermissionResult output; // Rpc in FULL level - policy_manager_->CheckPermissions( - application_id_, kHmiLevelFull, "SendLocation", input_params, output); + policy_manager_->CheckPermissions(device_id_1_, + application_id_, + kHmiLevelFull, + "SendLocation", + input_params, + output); EXPECT_EQ(::policy::kRpcAllowed, output.hmi_level_permitted); EXPECT_TRUE(output.list_of_undefined_params.empty()); @@ -763,8 +820,12 @@ TEST_F(PolicyManagerImplTest2, ResetOutputList(output); // Rpc in LIMITED level - policy_manager_->CheckPermissions( - application_id_, kHmiLevelLimited, "SendLocation", input_params, output); + policy_manager_->CheckPermissions(device_id_1_, + application_id_, + kHmiLevelLimited, + "SendLocation", + input_params, + output); EXPECT_EQ(::policy::kRpcAllowed, output.hmi_level_permitted); EXPECT_TRUE(output.list_of_undefined_params.empty()); @@ -772,7 +833,8 @@ TEST_F(PolicyManagerImplTest2, ResetOutputList(output); // Rpc in BACKGROUND level - policy_manager_->CheckPermissions(application_id_, + policy_manager_->CheckPermissions(device_id_1_, + application_id_, kHmiLevelBackground, "SendLocation", input_params, @@ -785,8 +847,12 @@ TEST_F(PolicyManagerImplTest2, ResetOutputList(output); // Rpc in NONE level - policy_manager_->CheckPermissions( - application_id_, kHmiLevelNone, "SendLocation", input_params, output); + policy_manager_->CheckPermissions(device_id_1_, + application_id_, + kHmiLevelNone, + "SendLocation", + input_params, + output); EXPECT_EQ(::policy::kRpcDisallowed, output.hmi_level_permitted); EXPECT_TRUE(output.list_of_allowed_params.empty()); @@ -813,9 +879,12 @@ TEST_F(PolicyManagerImplTest2, 2, "Bluetooth")); + EXPECT_CALL(listener_, GetDevicesIds(application_id_)) + .WillRepeatedly(Return(transport_manager::DeviceList())); // Add app from consented device. App will be assigned with default policies - policy_manager_->AddApplication(application_id_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->SetUserConsentForDevice(device_id_1_, true); + policy_manager_->AddApplication( + device_id_1_, application_id_, HmiTypes(policy_table::AHT_DEFAULT)); std::ifstream ifile( "json/sdl_update_pt_2_groups_no_params_in1_omitted_in2.json"); @@ -831,19 +900,18 @@ TEST_F(PolicyManagerImplTest2, EXPECT_TRUE(policy_manager_->LoadPT(kFilePtUpdateJson, msg)); EXPECT_FALSE(cache->IsPTPreloaded()); - // Will be called each time permissions are checked - EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(application_id_)) - .Times(4) - .WillRepeatedly(Return(device_id_1_)); - // Check RPC in each level ::policy::RPCParams input_params; InsertRpcParametersInList(input_params); ::policy::CheckPermissionResult output; // Rpc in FULL level - policy_manager_->CheckPermissions( - application_id_, kHmiLevelFull, "SendLocation", input_params, output); + policy_manager_->CheckPermissions(device_id_1_, + application_id_, + kHmiLevelFull, + "SendLocation", + input_params, + output); EXPECT_EQ(::policy::kRpcAllowed, output.hmi_level_permitted); EXPECT_TRUE(output.list_of_undefined_params.empty()); @@ -851,15 +919,20 @@ TEST_F(PolicyManagerImplTest2, ResetOutputList(output); // Rpc in LIMITED level - policy_manager_->CheckPermissions( - application_id_, kHmiLevelLimited, "SendLocation", input_params, output); + policy_manager_->CheckPermissions(device_id_1_, + application_id_, + kHmiLevelLimited, + "SendLocation", + input_params, + output); EXPECT_EQ(::policy::kRpcAllowed, output.hmi_level_permitted); EXPECT_TRUE(output.list_of_undefined_params.empty()); EXPECT_EQ(10u, output.list_of_allowed_params.size()); ResetOutputList(output); // Rpc in BACKGROUND level - policy_manager_->CheckPermissions(application_id_, + policy_manager_->CheckPermissions(device_id_1_, + application_id_, kHmiLevelBackground, "SendLocation", input_params, @@ -871,8 +944,12 @@ TEST_F(PolicyManagerImplTest2, ResetOutputList(output); // Rpc in NONE level - policy_manager_->CheckPermissions( - application_id_, kHmiLevelNone, "SendLocation", input_params, output); + policy_manager_->CheckPermissions(device_id_1_, + application_id_, + kHmiLevelNone, + "SendLocation", + input_params, + output); EXPECT_EQ(::policy::kRpcDisallowed, output.hmi_level_permitted); EXPECT_TRUE(output.list_of_allowed_params.empty()); EXPECT_TRUE(output.list_of_disallowed_params.empty()); @@ -917,8 +994,8 @@ TEST_F( GetPTU(kValidSdlPtUpdateJson); EXPECT_EQ("UP_TO_DATE", policy_manager_->GetPolicyTableStatus()); // Try to add existing app - policy_manager_->AddApplication(app_id_2_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->AddApplication( + device_id_1_, app_id_2_, HmiTypes(policy_table::AHT_DEFAULT)); // Check no update required EXPECT_EQ("UP_TO_DATE", policy_manager_->GetPolicyTableStatus()); } @@ -939,14 +1016,14 @@ TEST_F(PolicyManagerImplTest2, GetPTU(kValidSdlPtUpdateJson); EXPECT_EQ("UP_TO_DATE", policy_manager_->GetPolicyTableStatus()); - policy_manager_->AddApplication(app_id_2_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->AddApplication( + device_id_2_, app_id_2_, HmiTypes(policy_table::AHT_DEFAULT)); EXPECT_EQ("UP_TO_DATE", policy_manager_->GetPolicyTableStatus()); ::policy::Counters counter = ::policy::Counters::DAYS_AFTER_EPOCH; // Set PT was updated 10 days ago (limit is 30 days for now) // So no limit exceeded policy_manager_->PTUpdatedAt(counter, days - 10); - policy_manager_->OnAppRegisteredOnMobile(app_id_2_); + policy_manager_->OnAppRegisteredOnMobile(device_id_2_, app_id_2_); EXPECT_EQ("UP_TO_DATE", policy_manager_->GetPolicyTableStatus()); } @@ -959,13 +1036,13 @@ TEST_F(PolicyManagerImplTest2, GetPTU(kValidSdlPtUpdateJson); EXPECT_EQ("UP_TO_DATE", policy_manager_->GetPolicyTableStatus()); - policy_manager_->AddApplication(app_id_2_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->AddApplication( + device_id_2_, app_id_2_, HmiTypes(policy_table::AHT_DEFAULT)); EXPECT_EQ("UP_TO_DATE", policy_manager_->GetPolicyTableStatus()); ::policy::Counters counter = ::policy::Counters::DAYS_AFTER_EPOCH; // Set PT was updated 50 days ago (limit is 30 days for now) policy_manager_->PTUpdatedAt(counter, days - 50); - policy_manager_->OnAppRegisteredOnMobile(app_id_2_); + policy_manager_->OnAppRegisteredOnMobile(device_id_2_, app_id_2_); EXPECT_EQ("UPDATE_NEEDED", policy_manager_->GetPolicyTableStatus()); } @@ -979,8 +1056,8 @@ TEST_F( GetPTU(kValidSdlPtUpdateJson); EXPECT_EQ("UP_TO_DATE", policy_manager_->GetPolicyTableStatus()); // Try to add existing app - policy_manager_->AddApplication(app_id_2_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->AddApplication( + device_id_2_, app_id_2_, HmiTypes(policy_table::AHT_DEFAULT)); EXPECT_EQ("UP_TO_DATE", policy_manager_->GetPolicyTableStatus()); ::policy::Counters counter = ::policy::Counters::DAYS_AFTER_EPOCH; // Set PT was updated 10 days ago (limit is 30 days for now) @@ -993,7 +1070,7 @@ TEST_F( for (int i = 0; i < ign_cycles; ++i) { policy_manager_->IncrementIgnitionCycles(); } - policy_manager_->OnAppRegisteredOnMobile(app_id_2_); + policy_manager_->OnAppRegisteredOnMobile(device_id_2_, app_id_2_); // Check update required EXPECT_EQ("UPDATE_NEEDED", policy_manager_->GetPolicyTableStatus()); } @@ -1022,10 +1099,10 @@ TEST_F(PolicyManagerImplTest2, ->SetUserPermissionsForDevice( device_id_2_, consented_groups, disallowed_groups); policy_manager_->SetUserConsentForDevice(device_id_2_, true); - EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(app_id_2_)) - .WillRepeatedly(Return(device_id_2_)); - policy_manager_->AddApplication(app_id_2_, - HmiTypes(policy_table::AHT_DEFAULT)); + EXPECT_CALL(listener_, GetDevicesIds(app_id_2_)) + .WillRepeatedly(Return(transport_manager::DeviceList())); + policy_manager_->AddApplication( + device_id_2_, app_id_2_, HmiTypes(policy_table::AHT_DEFAULT)); GetPTU(kValidSdlPtUpdateJson); ::policy::PermissionConsent perm_consent; @@ -1045,7 +1122,8 @@ TEST_F(PolicyManagerImplTest2, policy_manager_->SetUserConsentForApp(perm_consent, policy::PolicyManager::kSilentMode); - policy_manager_->SendNotificationOnPermissionsUpdated(app_id_2_); + policy_manager_->SendNotificationOnPermissionsUpdated(device_id_2_, + app_id_2_); std::vector< ::policy::FunctionalGroupPermission> actual_groups_permissions; std::vector< ::policy::FunctionalGroupPermission>::iterator it; policy_manager_->GetUserConsentForApp( @@ -1069,8 +1147,10 @@ TEST_F(PolicyManagerImplTest2, CanAppKeepContext_SetPoliciesForAppUpdated_ExpectAppCanKeepContext) { // Arrange CreateLocalPT(preloaded_pt_filename_); - policy_manager_->AddApplication(app_id_2_, - HmiTypes(policy_table::AHT_DEFAULT)); + EXPECT_CALL(listener_, GetDevicesIds(app_id_2_)) + .WillRepeatedly(Return(transport_manager::DeviceList())); + policy_manager_->AddApplication( + device_id_2_, app_id_2_, HmiTypes(policy_table::AHT_DEFAULT)); GetPTU(kValidSdlPtUpdateJson); // Check keep context in updated policies for app EXPECT_TRUE(policy_manager_->CanAppKeepContext(app_id_2_)); @@ -1080,8 +1160,10 @@ TEST_F(PolicyManagerImplTest2, CanAppStealFocus_SetPoliciesForAppUpdated_ExpectAppCanStealFocus) { // Arrange CreateLocalPT(preloaded_pt_filename_); - policy_manager_->AddApplication(app_id_2_, - HmiTypes(policy_table::AHT_DEFAULT)); + EXPECT_CALL(listener_, GetDevicesIds(app_id_2_)) + .WillRepeatedly(Return(transport_manager::DeviceList())); + policy_manager_->AddApplication( + device_id_2_, app_id_2_, HmiTypes(policy_table::AHT_DEFAULT)); GetPTU(kValidSdlPtUpdateJson); // Check keep context in updated policies for app EXPECT_TRUE(policy_manager_->CanAppKeepContext(app_id_2_)); @@ -1130,10 +1212,10 @@ TEST_F( ->SetUserPermissionsForDevice( device_id_2_, consented_groups, disallowed_groups); policy_manager_->SetUserConsentForDevice(device_id_2_, true); - EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(app_id_2_)) - .WillRepeatedly(Return(device_id_2_)); - policy_manager_->AddApplication(app_id_2_, - HmiTypes(policy_table::AHT_DEFAULT)); + EXPECT_CALL(listener_, GetDevicesIds(app_id_2_)) + .WillRepeatedly(Return(transport_manager::DeviceList(1, device_id_2_))); + policy_manager_->AddApplication( + device_id_2_, app_id_2_, HmiTypes(policy_table::AHT_DEFAULT)); GetPTU(kValidSdlPtUpdateJson); ::policy::PermissionConsent perm_consent; @@ -1153,7 +1235,8 @@ TEST_F( policy_manager_->SetUserConsentForApp(perm_consent, policy::PolicyManager::kSilentMode); - policy_manager_->SendNotificationOnPermissionsUpdated(app_id_2_); + policy_manager_->SendNotificationOnPermissionsUpdated(device_id_2_, + app_id_2_); std::vector< ::policy::FunctionalGroupPermission> actual_groups_permissions; std::vector< ::policy::FunctionalGroupPermission>::iterator it; policy_manager_->GetPermissionsForApp( @@ -1177,19 +1260,23 @@ TEST_F( PolicyManagerImplTest2, GetAppRequestTypes_AddApp_UpdateAppPolicies_ExpectReceivedRequestTypesCorrect) { // Arrange + const transport_manager::DeviceHandle handle = 1; CreateLocalPT(preloaded_pt_filename_); - - policy_manager_->AddApplication(app_id_3_, - HmiTypes(policy_table::AHT_DEFAULT)); + EXPECT_CALL(listener_, GetDevicesIds(app_id_3_)) + .WillRepeatedly(Return(transport_manager::DeviceList(1, device_id_1_))); + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(handle, app_id_3_)) + .WillRepeatedly(Return(device_id_1_)); + policy_manager_->AddApplication( + device_id_1_, app_id_3_, HmiTypes(policy_table::AHT_DEFAULT)); ::policy::StringArray app_requests = - policy_manager_->GetAppRequestTypes(app_id_3_); + policy_manager_->GetAppRequestTypes(handle, app_id_3_); EXPECT_EQ(1u, app_requests.size()); Json::Value root = GetPTU(kPtuRequestTypeJson); Json::Value request_Types = Json::Value(Json::arrayValue); request_Types = root["policy_table"]["app_policies"][app_id_3_]["RequestType"]; - app_requests = policy_manager_->GetAppRequestTypes(app_id_3_); + app_requests = policy_manager_->GetAppRequestTypes(handle, app_id_3_); EXPECT_EQ(request_Types.size(), app_requests.size()); // Check nicknames match for (uint32_t i = 0; i < request_Types.size(); ++i) { @@ -1213,9 +1300,11 @@ TEST_F( rpc::ValidationReport report("policy_table"); pt->ReportErrors(&report); } + EXPECT_CALL(listener_, GetDevicesIds(app_id_2_)) + .WillRepeatedly(Return(transport_manager::DeviceList())); // Add new app - policy_manager_->AddApplication(app_id_2_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->AddApplication( + device_id_2_, app_id_2_, HmiTypes(policy_table::AHT_DEFAULT)); uint32_t result = policy_manager_->HeartBeatTimeout(app_id_2_); // By default hertbeat timeout is 0 EXPECT_EQ(0u, result); @@ -1261,10 +1350,10 @@ TEST_F(PolicyManagerImplTest2, ->SetUserPermissionsForDevice( device_id_2_, consented_groups, disallowed_groups); policy_manager_->SetUserConsentForDevice(device_id_2_, true); - EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(app_id_2_)) - .WillRepeatedly(Return(device_id_2_)); - policy_manager_->AddApplication(app_id_2_, - HmiTypes(policy_table::AHT_DEFAULT)); + EXPECT_CALL(listener_, GetDevicesIds(app_id_2_)) + .WillRepeatedly(Return(transport_manager::DeviceList(1, device_id_2_))); + policy_manager_->AddApplication( + device_id_2_, app_id_2_, HmiTypes(policy_table::AHT_DEFAULT)); GetPTU(kValidSdlPtUpdateJson); ::policy::PermissionConsent perm_consent; @@ -1284,7 +1373,8 @@ TEST_F(PolicyManagerImplTest2, policy_manager_->SetUserConsentForApp(perm_consent, policy::PolicyManager::kSilentMode); - policy_manager_->SendNotificationOnPermissionsUpdated(app_id_2_); + policy_manager_->SendNotificationOnPermissionsUpdated(device_id_2_, + app_id_2_); std::vector< ::policy::FunctionalGroupPermission> actual_groups_permissions; std::vector< ::policy::FunctionalGroupPermission>::iterator it; policy_manager_->GetPermissionsForApp( @@ -1330,20 +1420,22 @@ TEST_F(PolicyManagerImplTest2, SingleInvalidRequestTypeInPTU_ExpectReplaceWithDefaultValues) { // Arrange const std::string section_name = app_id_2_; + const transport_manager::DeviceHandle handle = 1; // Arrange CreateLocalPT(preloaded_pt_filename_); // Setting device consent to 'true' in order to have defult application // permissions, request type etc. - EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(app_id_2_)) + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(handle, app_id_2_)) .WillRepeatedly(Return(device_id_1_)); policy_manager_->SetUserConsentForDevice(device_id_1_, true); - + EXPECT_CALL(listener_, GetDevicesIds(section_name)) + .WillRepeatedly(Return(transport_manager::DeviceList(1, device_id_1_))); // Add app - policy_manager_->AddApplication(section_name, - HmiTypes(policy_table::AHT_DEFAULT)); - EXPECT_CALL(listener_, OnPendingPermissionChange(section_name)); + policy_manager_->AddApplication( + device_id_1_, section_name, HmiTypes(policy_table::AHT_DEFAULT)); + EXPECT_CALL(listener_, OnPendingPermissionChange(device_id_1_, section_name)); // PTU has single invalid RequestTypes, which must be dropped and replaced // with default RT @@ -1351,18 +1443,18 @@ TEST_F(PolicyManagerImplTest2, // Get RequestTypes from <app_id> section of app policies after PT update ::policy::StringArray app_request_types_after = - policy_manager_->GetAppRequestTypes(section_name); + policy_manager_->GetAppRequestTypes(handle, section_name); - EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(kDefaultId)) + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(handle, kDefaultId)) .WillOnce(Return(device_id_1_)); ::policy::StringArray default_request_types_after = - policy_manager_->GetAppRequestTypes(kDefaultId); + policy_manager_->GetAppRequestTypes(handle, kDefaultId); // Check sizes of Request types of PT and PTU EXPECT_EQ(4u, app_request_types_after.size()); ::policy::AppPermissions permissions = - policy_manager_->GetAppPermissionsChanges(section_name); + policy_manager_->GetAppPermissionsChanges(device_id_1_, section_name); EXPECT_TRUE(permissions.requestTypeChanged); policy_table::RequestType temp_res1; diff --git a/src/components/policy/policy_external/test/policy_manager_impl_snapshot_test.cc b/src/components/policy/policy_external/test/policy_manager_impl_snapshot_test.cc index 3c6377cf5f..ddb5474df3 100644 --- a/src/components/policy/policy_external/test/policy_manager_impl_snapshot_test.cc +++ b/src/components/policy/policy_external/test/policy_manager_impl_snapshot_test.cc @@ -259,25 +259,30 @@ TEST_F( PolicyManagerImplTest2, AddValidRequestTypeToPT_GetNewAppWithSpecificPoliciesViaPTU_ExpectRTAdded) { const std::string& app_id = application_id_; + const transport_manager::DeviceHandle handle = 1; // Arrange CreateLocalPT(preloaded_pt_filename_); + EXPECT_CALL(listener_, GetDevicesIds(app_id)) + .WillRepeatedly(Return(transport_manager::DeviceList(1, device_id_1_))); // Add app - policy_manager_->AddApplication(app_id, HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->AddApplication( + device_id_1_, app_id, HmiTypes(policy_table::AHT_DEFAULT)); // Check app gets RequestTypes from pre_DataConsent of app_policies // section - pt_request_types_ = policy_manager_->GetAppRequestTypes(app_id); + pt_request_types_ = policy_manager_->GetAppRequestTypes(handle, app_id); // Only single item as in pre_DataConsent in preloaded PT EXPECT_EQ(1u, pt_request_types_.size()); - EXPECT_CALL(listener_, OnPendingPermissionChange(app_id)).Times(1); + EXPECT_CALL(listener_, OnPendingPermissionChange(device_id_1_, app_id)) + .Times(1); // PTU has RequestTypes as [] - means 'all allowed' Json::Value root = GetPTU("json/PTU2.json"); // Setting device consent to 'true' in order to have appropriate application // permissions, request type etc. - EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(application_id_)) + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(handle, app_id)) .WillRepeatedly(Return(device_id_1_)); policy_manager_->SetUserConsentForDevice(device_id_1_, true); @@ -288,13 +293,13 @@ TEST_F( pt_request_types_.clear(); // Get RequestTypes from <app_id> section of app policies after PT update - pt_request_types_ = policy_manager_->GetAppRequestTypes(app_id); + pt_request_types_ = policy_manager_->GetAppRequestTypes(handle, app_id); // Check sizes of Request types of PT and PTU ASSERT_EQ(ptu_request_types_size_, pt_request_types_.size()); ::policy::AppPermissions permissions = - policy_manager_->GetAppPermissionsChanges(app_id); + policy_manager_->GetAppPermissionsChanges(device_id_1_, app_id); EXPECT_TRUE(permissions.requestTypeChanged); ::policy::StringArray result; diff --git a/src/components/policy/policy_external/test/policy_manager_impl_test.cc b/src/components/policy/policy_external/test/policy_manager_impl_test.cc index 47b3959aee..b809c83d75 100644 --- a/src/components/policy/policy_external/test/policy_manager_impl_test.cc +++ b/src/components/policy/policy_external/test/policy_manager_impl_test.cc @@ -341,8 +341,10 @@ TEST_F(PolicyManagerImplTest, MarkUnpairedDevice) { TEST_F(PolicyManagerImplTest2, GetCurrentDeviceId) { // Arrange - EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(app_id_2_)).Times(1); - EXPECT_EQ("", policy_manager_->GetCurrentDeviceId(app_id_2_)); + const transport_manager::DeviceHandle handle = 1; + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(handle, app_id_2_)) + .Times(1); + EXPECT_EQ("", policy_manager_->GetCurrentDeviceId(handle, app_id_2_)); } TEST_F(PolicyManagerImplTest2, UpdateApplication_AppServices) { @@ -424,7 +426,7 @@ TEST_F( status.insert(ExternalConsentStatusItem(type_2_, id_2_, kStatusOn)); status.insert(ExternalConsentStatusItem(type_3_, id_3_, kStatusOn)); - EXPECT_CALL(listener_, OnPermissionsUpdated(app_id_1_, _)); + EXPECT_CALL(listener_, OnPermissionsUpdated(device_id_1_, app_id_1_, _)); EXPECT_TRUE(policy_manager_->SetExternalConsentStatus(status)); @@ -473,7 +475,7 @@ TEST_F( status.insert(ExternalConsentStatusItem(type_2_, id_2_, kStatusOn)); status.insert(ExternalConsentStatusItem(type_3_, id_3_, kStatusOn)); - EXPECT_CALL(listener_, OnPermissionsUpdated(app_id_1_, _)); + EXPECT_CALL(listener_, OnPermissionsUpdated(device_id_1_, app_id_1_, _)); EXPECT_TRUE(policy_manager_->SetExternalConsentStatus(status)); @@ -529,12 +531,12 @@ TEST_F( EXPECT_FALSE(pt->policy_table.device_data->end() != updated_device_data); - EXPECT_CALL(listener_, OnPermissionsUpdated(app_id_1_, _)); - EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(app_id_1_)) + EXPECT_CALL(listener_, OnPermissionsUpdated(device_id_1_, app_id_1_, _)); + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(_, app_id_1_)) .WillRepeatedly(Return(device_id_1_)); - policy_manager_->AddApplication(app_id_1_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->AddApplication( + device_id_1_, app_id_1_, HmiTypes(policy_table::AHT_DEFAULT)); // Check ExternalConsent consents for application updated_device_data = pt->policy_table.device_data->find(device_id_1_); @@ -597,12 +599,12 @@ TEST_F( EXPECT_FALSE(pt->policy_table.device_data->end() != updated_device_data); - EXPECT_CALL(listener_, OnPermissionsUpdated(app_id_1_, _)); - EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(app_id_1_)) + EXPECT_CALL(listener_, OnPermissionsUpdated(device_id_1_, app_id_1_, _)); + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(_, app_id_1_)) .WillRepeatedly(Return(device_id_1_)); - policy_manager_->AddApplication(app_id_1_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->AddApplication( + device_id_1_, app_id_1_, HmiTypes(policy_table::AHT_DEFAULT)); // Checking ExternalConsent consents after setting new ExternalConsent status ApplicationPolicies::const_iterator app_parameters = @@ -652,15 +654,12 @@ TEST_F( EXPECT_TRUE(policy_manager_->GetCache()->ApplyUpdate(t)); - EXPECT_CALL(listener_, OnPermissionsUpdated(app_id_1_, _)); - EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(app_id_1_)) - .WillOnce(Return(device_id_1_)) // registered - .WillOnce(Return("")) // not registered - .WillRepeatedly(Return(device_id_1_)); // again registered - + EXPECT_CALL(listener_, OnPermissionsUpdated(device_id_1_, app_id_1_, _)); + EXPECT_CALL(listener_, GetDevicesIds(app_id_1_)) + .WillRepeatedly(Return(transport_manager::DeviceList())); // First register w/o app having groups to consent - policy_manager_->AddApplication(app_id_1_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->AddApplication( + device_id_1_, app_id_1_, HmiTypes(policy_table::AHT_DEFAULT)); // Act std::shared_ptr<policy_table::Table> pt = @@ -691,8 +690,8 @@ TEST_F( EXPECT_TRUE(policy_manager_->GetCache()->ApplyUpdate(t)); // Second time register w/ app having groups to consent - policy_manager_->AddApplication(app_id_1_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->AddApplication( + device_id_1_, app_id_1_, HmiTypes(policy_table::AHT_DEFAULT)); // Checking ExternalConsent consents after setting new ExternalConsent status ApplicationPolicies::const_iterator app_parameters = @@ -742,15 +741,11 @@ TEST_F( EXPECT_TRUE(policy_manager_->GetCache()->ApplyUpdate(t)); - EXPECT_CALL(listener_, OnPermissionsUpdated(app_id_1_, _)); - EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(app_id_1_)) - .WillOnce(Return(device_id_1_)) // registered - .WillOnce(Return("")) // not registered - .WillRepeatedly(Return(device_id_1_)); // registered again + EXPECT_CALL(listener_, OnPermissionsUpdated(device_id_1_, app_id_1_, _)); // First register w/o app having groups to consent - policy_manager_->AddApplication(app_id_1_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->AddApplication( + device_id_1_, app_id_1_, HmiTypes(policy_table::AHT_DEFAULT)); // Act std::shared_ptr<policy_table::Table> pt = @@ -781,8 +776,8 @@ TEST_F( EXPECT_TRUE(policy_manager_->GetCache()->ApplyUpdate(t)); // Second time register w/ app having groups to consent - policy_manager_->AddApplication(app_id_1_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->AddApplication( + device_id_1_, app_id_1_, HmiTypes(policy_table::AHT_DEFAULT)); // Check ExternalConsent consents for application updated_device_data = pt->policy_table.device_data->find(device_id_1_); @@ -840,12 +835,11 @@ TEST_F(PolicyManagerImplTest_ExternalConsent, EXPECT_TRUE(policy_manager_->SetExternalConsentStatus(status)); - EXPECT_CALL(listener_, OnPermissionsUpdated(app_id_1_, _)); - EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(app_id_1_)) - .WillRepeatedly(Return(device_id_1_)); - - policy_manager_->AddApplication(app_id_1_, - HmiTypes(policy_table::AHT_DEFAULT)); + EXPECT_CALL(listener_, OnPermissionsUpdated(device_id_1_, app_id_1_, _)); + EXPECT_CALL(listener_, GetDevicesIds(app_id_1_)) + .WillRepeatedly(Return(transport_manager::DeviceList())); + policy_manager_->AddApplication( + device_id_1_, app_id_1_, HmiTypes(policy_table::AHT_DEFAULT)); std::shared_ptr<policy_table::Table> pt = policy_manager_->GetCache()->GetPT(); @@ -965,12 +959,11 @@ TEST_F(PolicyManagerImplTest_ExternalConsent, EXPECT_TRUE(policy_manager_->SetExternalConsentStatus(status)); - EXPECT_CALL(listener_, OnPermissionsUpdated(app_id_1_, _)); - EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(app_id_1_)) - .WillRepeatedly(Return(device_id_1_)); - - policy_manager_->AddApplication(app_id_1_, - HmiTypes(policy_table::AHT_DEFAULT)); + EXPECT_CALL(listener_, OnPermissionsUpdated(device_id_1_, app_id_1_, _)); + EXPECT_CALL(listener_, GetDevicesIds(app_id_1_)) + .WillRepeatedly(Return(transport_manager::DeviceList())); + policy_manager_->AddApplication( + device_id_1_, app_id_1_, HmiTypes(policy_table::AHT_DEFAULT)); std::shared_ptr<policy_table::Table> pt = policy_manager_->GetCache()->GetPT(); @@ -1099,7 +1092,7 @@ TEST_F( status_on.insert(ExternalConsentStatusItem(type_2_, id_2_, kStatusOn)); status_on.insert(ExternalConsentStatusItem(type_3_, id_3_, kStatusOn)); - EXPECT_CALL(listener_, OnPermissionsUpdated(app_id_1_, _)); + EXPECT_CALL(listener_, OnPermissionsUpdated(device_id_1_, app_id_1_, _)); EXPECT_TRUE(policy_manager_->SetExternalConsentStatus(status_on)); @@ -1135,7 +1128,8 @@ TEST_F( status_off.insert(ExternalConsentStatusItem(type_2_, id_2_, kStatusOff)); status_off.insert(ExternalConsentStatusItem(type_3_, id_3_, kStatusOff)); - EXPECT_CALL(listener_, OnPermissionsUpdated(app_id_1_, _)).Times(1); + EXPECT_CALL(listener_, OnPermissionsUpdated(device_id_1_, app_id_1_, _)) + .Times(1); EXPECT_TRUE(policy_manager_->SetExternalConsentStatus(status_off)); diff --git a/src/components/policy/policy_external/test/policy_manager_impl_test_base.cc b/src/components/policy/policy_external/test/policy_manager_impl_test_base.cc index 82d87cd7ba..8a62772992 100644 --- a/src/components/policy/policy_external/test/policy_manager_impl_test_base.cc +++ b/src/components/policy/policy_external/test/policy_manager_impl_test_base.cc @@ -307,7 +307,10 @@ void PolicyManagerImplTest2::AddRTtoPT(const std::string& update_file_name, // Arrange CreateLocalPT(preloaded_pt_filename_); // Get RequestTypes from section of preloaded_pt app_policies - pt_request_types_ = policy_manager_->GetAppRequestTypes(section_name); + const transport_manager::DeviceHandle handle = 1; + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(handle, section_name)) + .WillRepeatedly(Return(device_id_1_)); + pt_request_types_ = policy_manager_->GetAppRequestTypes(handle, section_name); EXPECT_EQ(rt_number, pt_request_types_.size()); Json::Value root = GetPTU(update_file_name); // Get Request Types from JSON (PTU) @@ -316,7 +319,7 @@ void PolicyManagerImplTest2::AddRTtoPT(const std::string& update_file_name, ptu_request_types_size_ = ptu_request_types_.size(); pt_request_types_.clear(); // Get RequestTypes from section of PT app policies after update - pt_request_types_ = policy_manager_->GetAppRequestTypes(section_name); + pt_request_types_ = policy_manager_->GetAppRequestTypes(handle, section_name); // Check number of RT in PTU and PT now are equal ASSERT_EQ(ptu_request_types_size_ - invalid_rt_number, pt_request_types_.size()); @@ -329,14 +332,17 @@ void PolicyManagerImplTest2::AddRTtoAppSectionPT( const uint32_t invalid_rt_number) { // Arrange CreateLocalPT(preloaded_pt_filename_); + const transport_manager::DeviceHandle handle = 1; + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(handle, section_name)) + .WillRepeatedly(Return(device_id_1_)); // Add app - policy_manager_->AddApplication(section_name, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->AddApplication( + device_id_1_, section_name, HmiTypes(policy_table::AHT_DEFAULT)); // Check app gets RequestTypes from pre_DataConsent of app_policies // section - pt_request_types_ = policy_manager_->GetAppRequestTypes(section_name); + pt_request_types_ = policy_manager_->GetAppRequestTypes(handle, section_name); EXPECT_EQ(rt_number, pt_request_types_.size()); - EXPECT_CALL(listener_, OnPendingPermissionChange(section_name)).Times(1); + EXPECT_CALL(listener_, OnPendingPermissionChange(_, section_name)).Times(1); Json::Value root = GetPTU(update_file_name); // Get App Request Types from PTU @@ -346,13 +352,13 @@ void PolicyManagerImplTest2::AddRTtoAppSectionPT( pt_request_types_.clear(); // Get RequestTypes from <app_id> section of app policies after PT update - pt_request_types_ = policy_manager_->GetAppRequestTypes(section_name); + pt_request_types_ = policy_manager_->GetAppRequestTypes(handle, section_name); // Check sizes of Request types of PT and PTU ASSERT_EQ(ptu_request_types_size_ - invalid_rt_number, pt_request_types_.size()); ::policy::AppPermissions permissions = - policy_manager_->GetAppPermissionsChanges(section_name); + policy_manager_->GetAppPermissionsChanges(device_id_1_, section_name); EXPECT_TRUE(permissions.requestTypeChanged); } @@ -449,9 +455,13 @@ void PolicyManagerImplTest2:: 2, "Bluetooth")); + EXPECT_CALL(listener_, GetDevicesIds(application_id_)) + .WillRepeatedly(Return(transport_manager::DeviceList())); + // Add app from consented device. App will be assigned with default policies - policy_manager_->AddApplication(application_id_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->SetUserConsentForDevice(device_id_1_, true); + policy_manager_->AddApplication( + device_id_1_, application_id_, HmiTypes(policy_table::AHT_DEFAULT)); // Expect all parameters are allowed std::ifstream ifile(update_file); @@ -467,19 +477,18 @@ void PolicyManagerImplTest2:: EXPECT_TRUE(policy_manager_->LoadPT(kFilePtUpdateJson, msg)); EXPECT_FALSE(cache->IsPTPreloaded()); - // Will be called each time permissions are checked - EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(application_id_)) - .Times(4) - .WillRepeatedly(Return(device_id_1_)); - // Check RPC in each level ::policy::RPCParams input_params; InsertRpcParametersInList(input_params); ::policy::CheckPermissionResult output; // Rpc in FULL level - policy_manager_->CheckPermissions( - application_id_, kHmiLevelFull, "SendLocation", input_params, output); + policy_manager_->CheckPermissions(device_id_1_, + application_id_, + kHmiLevelFull, + "SendLocation", + input_params, + output); // Check RPC is allowed EXPECT_EQ(::policy::kRpcAllowed, output.hmi_level_permitted); // Check list of allowed parameters is not empty @@ -489,8 +498,12 @@ void PolicyManagerImplTest2:: ResetOutputList(output); // Rpc in LIMITED level - policy_manager_->CheckPermissions( - application_id_, kHmiLevelLimited, "SendLocation", input_params, output); + policy_manager_->CheckPermissions(device_id_1_, + application_id_, + kHmiLevelLimited, + "SendLocation", + input_params, + output); // Check RPC is allowed EXPECT_EQ(::policy::kRpcAllowed, output.hmi_level_permitted); // Check list of allowed parameters is not empty @@ -500,7 +513,8 @@ void PolicyManagerImplTest2:: ResetOutputList(output); // Rpc in BACKGROUND level - policy_manager_->CheckPermissions(application_id_, + policy_manager_->CheckPermissions(device_id_1_, + application_id_, kHmiLevelBackground, "SendLocation", input_params, @@ -515,8 +529,12 @@ void PolicyManagerImplTest2:: ResetOutputList(output); // Rpc in NONE level - policy_manager_->CheckPermissions( - application_id_, kHmiLevelNone, "SendLocation", input_params, output); + policy_manager_->CheckPermissions(device_id_1_, + application_id_, + kHmiLevelNone, + "SendLocation", + input_params, + output); // Check RPC is disallowed EXPECT_EQ(::policy::kRpcDisallowed, output.hmi_level_permitted); // Check lists of parameters are empty @@ -529,8 +547,12 @@ void PolicyManagerImplTest2::CheckRpcPermissions( const std::string& rpc_name, const PermitResult& expected_permission) { ::policy::RPCParams input_params; ::policy::CheckPermissionResult output; - policy_manager_->CheckPermissions( - application_id_, kHmiLevelFull, rpc_name, input_params, output); + policy_manager_->CheckPermissions(device_id_1_, + application_id_, + kHmiLevelFull, + rpc_name, + input_params, + output); EXPECT_EQ(expected_permission, output.hmi_level_permitted); } @@ -541,7 +563,7 @@ void PolicyManagerImplTest2::CheckRpcPermissions( ::policy::RPCParams input_params; ::policy::CheckPermissionResult output; policy_manager_->CheckPermissions( - app_id, kHmiLevelFull, rpc_name, input_params, output); + device_id_1_, app_id, kHmiLevelFull, rpc_name, input_params, output); EXPECT_EQ(out_expected_permission, output.hmi_level_permitted); } @@ -576,8 +598,9 @@ void PolicyManagerImplTest2::AddSetDeviceData() { "Bluetooth")); // Add app from consented device. App will be assigned with default policies - policy_manager_->AddApplication(application_id_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->SetUserConsentForDevice(device_id_1_, true); + policy_manager_->AddApplication( + device_id_1_, application_id_, HmiTypes(policy_table::AHT_DEFAULT)); (policy_manager_->GetCache())->AddDevice(device_id_1_, "Bluetooth"); } diff --git a/src/components/policy/policy_external/test/policy_manager_impl_user_consent_test.cc b/src/components/policy/policy_external/test/policy_manager_impl_user_consent_test.cc index c58ae00ff4..e42ecbacd7 100644 --- a/src/components/policy/policy_external/test/policy_manager_impl_user_consent_test.cc +++ b/src/components/policy/policy_external/test/policy_manager_impl_user_consent_test.cc @@ -34,6 +34,7 @@ #include "policy/policy_manager_impl_test_base.h" #include "utils/date_time.h" +#include "utils/macro.h" namespace test { namespace components { @@ -49,13 +50,13 @@ TEST_F( // Arrange CreateLocalPT(preloaded_pt_filename_); - EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(app_id_1_)) + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(_, app_id_1_)) .WillRepeatedly(Return(device_id_1_)); policy_manager_->SetUserConsentForDevice(device_id_1_, true); - policy_manager_->AddApplication(app_id_1_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->AddApplication( + device_id_1_, app_id_1_, HmiTypes(policy_table::AHT_DEFAULT)); EXPECT_EQ("UPDATE_NEEDED", policy_manager_->GetPolicyTableStatus()); } @@ -76,13 +77,14 @@ TEST_F( policy_manager_->PTUpdatedAt(DAYS_AFTER_EPOCH, days_after_epoch); policy_manager_->PTUpdatedAt(KILOMETERS, 1000); - EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(app_id_1_)) + const transport_manager::DeviceHandle handle = 1; + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(handle, app_id_1_)) .WillRepeatedly(Return(device_id_1_)); policy_manager_->SetUserConsentForDevice(device_id_1_, false); - policy_manager_->AddApplication(app_id_1_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->AddApplication( + device_id_1_, app_id_1_, HmiTypes(policy_table::AHT_DEFAULT)); EXPECT_EQ("UP_TO_DATE", policy_manager_->GetPolicyTableStatus()); } @@ -92,10 +94,13 @@ TEST_F( ReactOnUserDevConsentForApp_AddNewApplicationFromDeviceWithoutConsent_ExpectPreDataConsent) { // Arrange CreateLocalPT(preloaded_pt_filename_); - policy_manager_->AddApplication(app_id_1_, - HmiTypes(policy_table::AHT_DEFAULT)); + const transport_manager::DeviceHandle handle = 1; + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(handle, app_id_1_)) + .WillRepeatedly(Return(device_id_1_)); + policy_manager_->AddApplication( + device_id_1_, app_id_1_, HmiTypes(policy_table::AHT_DEFAULT)); ASSERT_TRUE(policy_manager_->IsPredataPolicy(app_id_1_)); - policy_manager_->ReactOnUserDevConsentForApp(app_id_1_, false); + policy_manager_->ReactOnUserDevConsentForApp(handle, app_id_1_, false); EXPECT_TRUE(policy_manager_->IsPredataPolicy(app_id_1_)); } @@ -106,8 +111,8 @@ TEST_F(PolicyManagerImplTest2, CreateLocalPT(kSdlPreloadedPtJson2); ASSERT_TRUE( (policy_manager_->GetCache())->AddDevice(device_id_2_, "Bluetooth")); - policy_manager_->AddApplication(application_id_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->AddApplication( + device_id_2_, application_id_, HmiTypes(policy_table::AHT_DEFAULT)); // Expect RPCs from pre_dataConsent group are allowed // Next checks are equal to BaseBeforeDataConsent_APIs.xml checks from task @@ -155,11 +160,11 @@ TEST_F(PolicyManagerImplTest2, TEST_F(PolicyManagerImplTest2, CheckPreDataConsent_GetDefaultHmiLevel_NONE) { // Arrange CreateLocalPT(preloaded_pt_filename_); - policy_manager_->AddApplication(app_id_2_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->AddApplication( + device_id_1_, app_id_2_, HmiTypes(policy_table::AHT_DEFAULT)); std::string default_hmi; // Default HMI level is NONE - policy_manager_->GetDefaultHmi(app_id_2_, &default_hmi); + policy_manager_->GetDefaultHmi(device_id_1_, app_id_2_, &default_hmi); EXPECT_EQ("NONE", default_hmi); // Default priority level is NONE @@ -173,11 +178,11 @@ TEST_F(PolicyManagerImplTest2, CheckPreDataConsent_GetDefaultHmiLevel_BACKGROUNG) { // Arrange CreateLocalPT(kSdlPreloadedPtJson2); - policy_manager_->AddApplication(app_id_2_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->AddApplication( + device_id_1_, app_id_2_, HmiTypes(policy_table::AHT_DEFAULT)); std::string default_hmi; // Default HMI level is BACKGROUND - policy_manager_->GetDefaultHmi(app_id_2_, &default_hmi); + policy_manager_->GetDefaultHmi(device_id_1_, app_id_2_, &default_hmi); EXPECT_EQ("BACKGROUND", default_hmi); // Default priority level is EMERGENCY std::string priority1; @@ -191,10 +196,13 @@ TEST_F( // Arrange // RequestTypes for default & preDataConsent are different CreateLocalPT("json/ptu_requestType.json"); - policy_manager_->AddApplication(app_id_1_, - HmiTypes(policy_table::AHT_DEFAULT)); + const transport_manager::DeviceHandle handle = 1; + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(handle, app_id_1_)) + .WillRepeatedly(Return(device_id_1_)); + policy_manager_->AddApplication( + device_id_1_, app_id_1_, HmiTypes(policy_table::AHT_DEFAULT)); ASSERT_TRUE(policy_manager_->IsPredataPolicy(app_id_1_)); - policy_manager_->ReactOnUserDevConsentForApp(app_id_1_, true); + policy_manager_->ReactOnUserDevConsentForApp(handle, app_id_1_, true); EXPECT_FALSE(policy_manager_->IsPredataPolicy(app_id_1_)); // Expect app_id_1_ has default policy EXPECT_TRUE((policy_manager_->GetCache())->IsDefaultPolicy(app_id_1_)); @@ -206,11 +214,14 @@ TEST_F( // Arrange // RequestTypes for default & preDataConsent are the same CreateLocalPT(kPtu2RequestTypeJson); - policy_manager_->AddApplication(app_id_1_, - HmiTypes(policy_table::AHT_DEFAULT)); + const transport_manager::DeviceHandle handle = 1; + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(handle, app_id_1_)) + .WillRepeatedly(Return(device_id_1_)); + policy_manager_->AddApplication( + device_id_1_, app_id_1_, HmiTypes(policy_table::AHT_DEFAULT)); ASSERT_TRUE(policy_manager_->IsPredataPolicy(app_id_1_)); - EXPECT_CALL(listener_, OnPendingPermissionChange(app_id_1_)).Times(0); - policy_manager_->ReactOnUserDevConsentForApp(app_id_1_, true); + EXPECT_CALL(listener_, OnPendingPermissionChange(_, app_id_1_)).Times(0); + policy_manager_->ReactOnUserDevConsentForApp(handle, app_id_1_, true); EXPECT_FALSE(policy_manager_->IsPredataPolicy(app_id_1_)); EXPECT_TRUE((policy_manager_->GetCache())->IsDefaultPolicy(app_id_1_)); } @@ -297,12 +308,12 @@ TEST_F(PolicyManagerImplTest2, policy_manager_->GetUserConsentForDevice(device_id_2_); // Check EXPECT_EQ(::policy::DeviceConsent::kDeviceDisallowed, consent); - EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(app_id_2_)) + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(_, app_id_2_)) .WillRepeatedly(Return(device_id_2_)); - policy_manager_->AddApplication(app_id_2_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->AddApplication( + device_id_2_, app_id_2_, HmiTypes(policy_table::AHT_DEFAULT)); std::string default_hmi; - policy_manager_->GetDefaultHmi(app_id_2_, &default_hmi); + policy_manager_->GetDefaultHmi(device_id_2_, app_id_2_, &default_hmi); EXPECT_EQ("NONE", default_hmi); } @@ -310,12 +321,12 @@ TEST_F(PolicyManagerImplTest2, GetDefaultHmi_SetDeviceAllowed_ExpectReceivedHmiCorrect) { // Arrange CreateLocalPT(kPtu2RequestTypeJson); - policy_manager_->AddApplication(app_id_2_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->AddApplication( + device_id_1_, app_id_2_, HmiTypes(policy_table::AHT_DEFAULT)); // Check if app has preData policy EXPECT_TRUE(policy_manager_->IsPredataPolicy(app_id_2_)); std::string default_hmi1; - policy_manager_->GetDefaultHmi(app_id_2_, &default_hmi1); + policy_manager_->GetDefaultHmi(device_id_1_, app_id_2_, &default_hmi1); EXPECT_EQ("NONE", default_hmi1); ASSERT_TRUE( (policy_manager_->GetCache())->AddDevice(device_id_2_, "Bluetooth")); @@ -333,13 +344,13 @@ TEST_F(PolicyManagerImplTest2, policy_manager_->GetUserConsentForDevice(device_id_2_); // Check EXPECT_EQ(::policy::DeviceConsent::kDeviceAllowed, consent); - EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(app_id_2_)) + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(_, app_id_2_)) .WillRepeatedly(Return(device_id_2_)); - policy_manager_->AddApplication(app_id_2_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->AddApplication( + device_id_2_, app_id_2_, HmiTypes(policy_table::AHT_DEFAULT)); EXPECT_TRUE((policy_manager_->GetCache())->IsDefaultPolicy(app_id_2_)); std::string default_hmi2; - policy_manager_->GetDefaultHmi(app_id_2_, &default_hmi2); + policy_manager_->GetDefaultHmi(device_id_2_, app_id_2_, &default_hmi2); EXPECT_EQ("LIMITED", default_hmi2); } @@ -347,8 +358,8 @@ TEST_F(PolicyManagerImplTest2, GetDefaultPriority_SetDeviceAllowed_ExpectReceivedPriorityCorrect) { // Arrange CreateLocalPT(kPtu2RequestTypeJson); - policy_manager_->AddApplication(app_id_2_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->AddApplication( + device_id_1_, app_id_2_, HmiTypes(policy_table::AHT_DEFAULT)); // Check if app has preData policy EXPECT_TRUE(policy_manager_->IsPredataPolicy(app_id_2_)); std::string priority1; @@ -370,10 +381,10 @@ TEST_F(PolicyManagerImplTest2, policy_manager_->GetUserConsentForDevice(device_id_2_); // Check EXPECT_EQ(::policy::DeviceConsent::kDeviceAllowed, consent); - EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(app_id_2_)) + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(_, app_id_2_)) .WillRepeatedly(Return(device_id_2_)); - policy_manager_->AddApplication(app_id_2_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->AddApplication( + device_id_2_, app_id_2_, HmiTypes(policy_table::AHT_DEFAULT)); EXPECT_TRUE((policy_manager_->GetCache())->IsDefaultPolicy(app_id_2_)); std::string priority2; EXPECT_TRUE(policy_manager_->GetPriority(app_id_2_, &priority2)); @@ -490,8 +501,10 @@ TEST_F(PolicyManagerImplTest2, SetDeviceInfo_ExpectDevInfoAddedToPT) { TEST_F(PolicyManagerImplTest2, GetInitialAppData_ExpectReceivedConsentCorrect) { // Arrange CreateLocalPT(preloaded_pt_filename_); - policy_manager_->AddApplication(app_id_2_, - HmiTypes(policy_table::AHT_DEFAULT)); + EXPECT_CALL(listener_, GetDevicesIds(app_id_2_)) + .WillRepeatedly(Return(transport_manager::DeviceList())); + policy_manager_->AddApplication( + device_id_1_, app_id_2_, HmiTypes(policy_table::AHT_DEFAULT)); ::policy::StringArray app_nicknames; ::policy::StringArray app_hmi_types; policy_manager_->GetInitialAppData(app_id_2_, &app_nicknames, &app_hmi_types); @@ -534,8 +547,8 @@ TEST_F( CanAppKeepContext_AddAppFromUnconsentedDevice_ExpectAppCannotKeepContext) { // Arrange CreateLocalPT(preloaded_pt_filename_); - policy_manager_->AddApplication(app_id_2_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->AddApplication( + device_id_1_, app_id_2_, HmiTypes(policy_table::AHT_DEFAULT)); // Check if app has preData policy EXPECT_TRUE(policy_manager_->IsPredataPolicy(app_id_2_)); // Check keep context in preData policy @@ -548,8 +561,8 @@ TEST_F(PolicyManagerImplTest2, CreateLocalPT(preloaded_pt_filename_); ASSERT_TRUE( (policy_manager_->GetCache())->AddDevice(device_id_2_, "Bluetooth")); - policy_manager_->AddApplication(app_id_2_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->AddApplication( + device_id_1_, app_id_2_, HmiTypes(policy_table::AHT_DEFAULT)); ASSERT_TRUE((policy_manager_->GetCache()) ->SetDeviceData(device_id_2_, "hardware IPX", @@ -563,10 +576,10 @@ TEST_F(PolicyManagerImplTest2, ::policy::DeviceConsent consent = policy_manager_->GetUserConsentForDevice(device_id_2_); EXPECT_EQ(::policy::DeviceConsent::kDeviceAllowed, consent); - EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(app_id_2_)) + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(_, app_id_2_)) .WillRepeatedly(Return(device_id_2_)); - policy_manager_->AddApplication(app_id_2_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->AddApplication( + device_id_2_, app_id_2_, HmiTypes(policy_table::AHT_DEFAULT)); EXPECT_TRUE((policy_manager_->GetCache())->IsDefaultPolicy(app_id_2_)); // Check keep context in default policy EXPECT_FALSE(policy_manager_->CanAppKeepContext(app_id_2_)); @@ -576,8 +589,8 @@ TEST_F(PolicyManagerImplTest2, CanAppStealFocus_AddAppFromUnconsentedDevice_ExpectAppCannotStealFocus) { // Arrange CreateLocalPT(preloaded_pt_filename_); - policy_manager_->AddApplication(app_id_2_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->AddApplication( + device_id_1_, app_id_2_, HmiTypes(policy_table::AHT_DEFAULT)); // Check if app has preData policy EXPECT_TRUE(policy_manager_->IsPredataPolicy(app_id_2_)); // Check keep context in preData policy @@ -590,8 +603,8 @@ TEST_F(PolicyManagerImplTest2, CreateLocalPT(preloaded_pt_filename_); ASSERT_TRUE( (policy_manager_->GetCache())->AddDevice(device_id_2_, "Bluetooth")); - policy_manager_->AddApplication(app_id_2_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->AddApplication( + device_id_1_, app_id_2_, HmiTypes(policy_table::AHT_DEFAULT)); ASSERT_TRUE((policy_manager_->GetCache()) ->SetDeviceData(device_id_2_, "hardware IPX", @@ -605,10 +618,10 @@ TEST_F(PolicyManagerImplTest2, ::policy::DeviceConsent consent = policy_manager_->GetUserConsentForDevice(device_id_2_); EXPECT_EQ(::policy::DeviceConsent::kDeviceAllowed, consent); - EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(app_id_2_)) + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(_, app_id_2_)) .WillRepeatedly(Return(device_id_2_)); - policy_manager_->AddApplication(app_id_2_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->AddApplication( + device_id_2_, app_id_2_, HmiTypes(policy_table::AHT_DEFAULT)); EXPECT_TRUE((policy_manager_->GetCache())->IsDefaultPolicy(app_id_2_)); // Check keep context in default policy EXPECT_FALSE(policy_manager_->CanAppStealFocus(app_id_2_)); @@ -618,8 +631,8 @@ TEST_F(PolicyManagerImplTest2, IsPredataPolicy_SetAppWIthPredataPolicy_ExpectPredataPolicy) { // Arrange CreateLocalPT(preloaded_pt_filename_); - policy_manager_->AddApplication(app_id_2_, - HmiTypes(policy_table::AHT_DEFAULT)); + policy_manager_->AddApplication( + device_id_1_, app_id_2_, HmiTypes(policy_table::AHT_DEFAULT)); // Check if app has preData policy EXPECT_TRUE(policy_manager_->IsPredataPolicy(app_id_2_)); } @@ -629,18 +642,18 @@ TEST_F( SendNotificationOnPermissionsUpdated_SetDeviceAllowed_ExpectNotificationSent) { // Arrange CreateLocalPT(kPtu2RequestTypeJson); - policy_manager_->AddApplication(app_id_2_, - HmiTypes(policy_table::AHT_DEFAULT)); + EXPECT_CALL(listener_, GetDevicesIds(app_id_2_)).Times(0); + policy_manager_->AddApplication( + device_id_1_, app_id_2_, HmiTypes(policy_table::AHT_DEFAULT)); // Check if app has preData policy EXPECT_TRUE(policy_manager_->IsPredataPolicy(app_id_2_)); std::string default_hmi1; - policy_manager_->GetDefaultHmi(app_id_2_, &default_hmi1); + policy_manager_->GetDefaultHmi(device_id_1_, app_id_2_, &default_hmi1); EXPECT_EQ("NONE", default_hmi1); - EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(app_id_2_)) - .WillOnce(Return("")); - EXPECT_CALL(listener_, OnPermissionsUpdated(app_id_2_, _, default_hmi1)) + EXPECT_CALL(listener_, OnPermissionsUpdated(device_id_1_, app_id_2_, _)) .Times(0); - policy_manager_->SendNotificationOnPermissionsUpdated(app_id_2_); + policy_manager_->SendNotificationOnPermissionsUpdated(device_id_1_, + app_id_2_); ASSERT_TRUE( (policy_manager_->GetCache())->AddDevice(device_id_2_, "Bluetooth")); @@ -658,16 +671,17 @@ TEST_F( policy_manager_->GetUserConsentForDevice(device_id_2_); // Check EXPECT_EQ(::policy::DeviceConsent::kDeviceAllowed, consent); - EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(app_id_2_)) - .WillRepeatedly(Return(device_id_2_)); - policy_manager_->AddApplication(app_id_2_, - HmiTypes(policy_table::AHT_DEFAULT)); + EXPECT_CALL(listener_, GetDevicesIds(app_id_2_)).Times(0); + policy_manager_->AddApplication( + device_id_2_, app_id_2_, HmiTypes(policy_table::AHT_DEFAULT)); EXPECT_TRUE((policy_manager_->GetCache())->IsDefaultPolicy(app_id_2_)); std::string default_hmi2; - policy_manager_->GetDefaultHmi(app_id_2_, &default_hmi2); + policy_manager_->GetDefaultHmi(device_id_2_, app_id_2_, &default_hmi2); EXPECT_EQ("LIMITED", default_hmi2); - EXPECT_CALL(listener_, OnPermissionsUpdated(app_id_2_, _, default_hmi2)); - policy_manager_->SendNotificationOnPermissionsUpdated(app_id_2_); + EXPECT_CALL(listener_, + OnPermissionsUpdated(device_id_2_, app_id_2_, _, default_hmi2)); + policy_manager_->SendNotificationOnPermissionsUpdated(device_id_2_, + app_id_2_); } } // namespace policy_test diff --git a/src/components/policy/policy_regular/CMakeLists.txt b/src/components/policy/policy_regular/CMakeLists.txt index 3679b2efea..b7455388e9 100644 --- a/src/components/policy/policy_regular/CMakeLists.txt +++ b/src/components/policy/policy_regular/CMakeLists.txt @@ -38,6 +38,8 @@ include_directories ( ${JSONCPP_INCLUDE_DIRECTORY} ${COMPONENTS_DIR}/utils/include/ ${COMPONENTS_DIR}/config_profile/include + ${COMPONENTS_DIR}/connection_handler/include/ + ${COMPONENTS_DIR}/protocol_handler/include/ ${LOG4CXX_INCLUDE_DIRECTORY} ${BOOST_INCLUDE_DIR} ) diff --git a/src/components/policy/policy_regular/include/policy/policy_manager_impl.h b/src/components/policy/policy_regular/include/policy/policy_manager_impl.h index 13d19e1a41..903f7820d2 100644 --- a/src/components/policy/policy_regular/include/policy/policy_manager_impl.h +++ b/src/components/policy/policy_regular/include/policy/policy_manager_impl.h @@ -265,12 +265,15 @@ class PolicyManagerImpl : public PolicyManager { /** * @brief Update Application Policies as reaction * on User allowing/disallowing device this app is running on. + * @param device_handle device identifier * @param app_id Unique application id * @param is_device_allowed true if user allowing device otherwise false * @return true if operation was successful */ - bool ReactOnUserDevConsentForApp(const std::string app_id, - const bool is_device_allowed) OVERRIDE; + bool ReactOnUserDevConsentForApp( + const transport_manager::DeviceHandle& device_handle, + const std::string app_id, + const bool is_device_allowed) OVERRIDE; /** * @brief Retrieves data from app_policies about app on its registration: @@ -311,12 +314,14 @@ class PolicyManagerImpl : public PolicyManager { /** * @brief Get default HMI level for application + * @param device_id device identifier * @param policy_app_id Unique application id * @param default_hmi Default HMI level for application or empty, if value * was not set * @return true, if succedeed, otherwise - false */ - bool GetDefaultHmi(const std::string& policy_app_id, + bool GetDefaultHmi(const std::string& device_id, + const std::string& policy_app_id, std::string* default_hmi) const OVERRIDE; /** @@ -359,9 +364,11 @@ class PolicyManagerImpl : public PolicyManager { /** * @brief Return device id, which hosts specific application + * @param device_handle device identifier * @param policy_app_id Application id, which is required to update device id */ std::string& GetCurrentDeviceId( + const transport_manager::DeviceHandle& device_handle, const std::string& policy_app_id) const OVERRIDE; /** @@ -403,11 +410,12 @@ class PolicyManagerImpl : public PolicyManager { /** * @brief Gets specific application permissions changes since last policy * table update + * @param device_id device identifier * @param policy_app_id Unique application id * @return Permissions changes */ AppPermissions GetAppPermissionsChanges( - const std::string& policy_app_id) OVERRIDE; + const std::string& device_id, const std::string& policy_app_id) OVERRIDE; /** * @brief Removes specific application permissions changes @@ -417,10 +425,11 @@ class PolicyManagerImpl : public PolicyManager { /** * @brief Send OnPermissionsUpdated for choosen application + * @param device_id device identifier * @param application_id Unique application id */ void SendNotificationOnPermissionsUpdated( - const std::string& application_id) OVERRIDE; + const std::string& device_id, const std::string& application_id) OVERRIDE; /** * @brief Removes unpaired device records and related records from DB @@ -451,20 +460,24 @@ class PolicyManagerImpl : public PolicyManager { /** * @brief Adds, application to the db or update existed one * run PTU if policy update is necessary for application. + * @param device_id device identifier * @param application_id Unique application id * @param hmi_types application HMI types * @return function that will notify update manager about new application */ StatusNotifier AddApplication( + const std::string& device_id, const std::string& application_id, const rpc::policy_table_interface_base::AppHmiTypes& hmi_types) OVERRIDE; /** * @brief Assigns new HMI types for specified application + * @param device_handle device identifier * @param application_id Unique application id * @param hmi_types new HMI types list */ - void SetDefaultHmiTypes(const std::string& application_id, + void SetDefaultHmiTypes(const transport_manager::DeviceHandle& device_handle, + const std::string& application_id, const std::vector<int>& hmi_types) OVERRIDE; /** @@ -684,10 +697,13 @@ class PolicyManagerImpl : public PolicyManager { /** * @brief OnAppRegisteredOnMobile allows to handle event when application were * succesfully registered on mobile device. - * It will send OnAppPermissionSend notification and will try to start PTU. * + * It will send OnAppPermissionSend notification and will try to start PTU. + * + * @param device_id device identifier * @param application_id registered application. */ - void OnAppRegisteredOnMobile(const std::string& application_id) OVERRIDE; + void OnAppRegisteredOnMobile(const std::string& device_id, + const std::string& application_id) OVERRIDE; void OnDeviceSwitching(const std::string& device_id_from, const std::string& device_id_to) OVERRIDE; @@ -891,9 +907,12 @@ class PolicyManagerImpl : public PolicyManager { /** * @brief Checks whether need ask the permission of users + * @param device_id device identifier + * @param app_id policy application id * @return true if user consent is needed */ - virtual bool IsConsentNeeded(const std::string& app_id); + virtual bool IsConsentNeeded(const std::string& device_id, + const std::string& app_id); /** * @brief Changes isConsentNeeded for app pending permissions, in case diff --git a/src/components/policy/policy_regular/src/policy_helper.cc b/src/components/policy/policy_regular/src/policy_helper.cc index 5fa0b314b3..26e4984e6d 100644 --- a/src/components/policy/policy_regular/src/policy_helper.cc +++ b/src/components/policy/policy_regular/src/policy_helper.cc @@ -263,30 +263,45 @@ bool CheckAppPolicy::IsKnownAppication( void policy::CheckAppPolicy::NotifySystem( const policy::AppPoliciesValueType& app_policy) const { - pm_->listener()->OnPendingPermissionChange(app_policy.first); + auto& listener = *pm_->listener(); + const auto devices_ids = listener.GetDevicesIds(app_policy.first); + if (devices_ids.empty()) { + LOG4CXX_WARN( + logger_, + "Couldn't find device info for application id: " << app_policy.first); + return; + } + + for (const auto& device_id : devices_ids) { + listener.OnPendingPermissionChange(device_id, app_policy.first); + } } void CheckAppPolicy::SendPermissionsToApp( const std::string& app_id, const policy_table::Strings& groups) const { - const std::string device_id = pm_->GetCurrentDeviceId(app_id); - if (device_id.empty()) { + const auto devices_ids = pm_->listener()->GetDevicesIds(app_id); + if (devices_ids.empty()) { LOG4CXX_WARN(logger_, "Couldn't find device info for application id: " << app_id); return; } - std::vector<FunctionalGroupPermission> group_permissons; - pm_->GetPermissionsForApp(device_id, app_id, group_permissons); - Permissions notification_data; - pm_->PrepareNotificationData(update_->policy_table.functional_groupings, - groups, - group_permissons, - notification_data); + for (const auto& device_id : devices_ids) { + std::vector<FunctionalGroupPermission> group_permissons; + pm_->GetPermissionsForApp(device_id, app_id, group_permissons); + + Permissions notification_data; + pm_->PrepareNotificationData(update_->policy_table.functional_groupings, + groups, + group_permissons, + notification_data); - LOG4CXX_INFO(logger_, "Send notification for application_id: " << app_id); - // Default_hmi is Ford-specific and should not be used with basic policy - const std::string default_hmi; - pm_->listener()->OnPermissionsUpdated(app_id, notification_data, default_hmi); + LOG4CXX_INFO(logger_, "Send notification for application_id: " << app_id); + // Default_hmi is Ford-specific and should not be used with basic policy + const std::string default_hmi; + pm_->listener()->OnPermissionsUpdated( + device_id, app_id, notification_data, default_hmi); + } } bool CheckAppPolicy::IsAppRevoked( diff --git a/src/components/policy/policy_regular/src/policy_manager_impl.cc b/src/components/policy/policy_regular/src/policy_manager_impl.cc index 00a3d33379..8bfa001293 100644 --- a/src/components/policy/policy_regular/src/policy_manager_impl.cc +++ b/src/components/policy/policy_regular/src/policy_manager_impl.cc @@ -526,9 +526,9 @@ void PolicyManagerImpl::OnAppsSearchCompleted(const bool trigger_ptu) { } void PolicyManagerImpl::OnAppRegisteredOnMobile( - const std::string& application_id) { + const std::string& device_id, const std::string& application_id) { StartPTExchange(); - SendNotificationOnPermissionsUpdated(application_id); + SendNotificationOnPermissionsUpdated(device_id, application_id); } void PolicyManagerImpl::OnDeviceSwitching(const std::string& device_id_from, @@ -681,16 +681,8 @@ bool PolicyManagerImpl::ResetUserConsent() { } void PolicyManagerImpl::SendNotificationOnPermissionsUpdated( - const std::string& application_id) { + const std::string& device_id, const std::string& application_id) { LOG4CXX_AUTO_TRACE(logger_); - const std::string device_id = GetCurrentDeviceId(application_id); - if (device_id.empty()) { - LOG4CXX_WARN(logger_, - "Couldn't find device info for application id " - "'" << application_id - << "'"); - return; - } std::vector<FunctionalGroupPermission> app_group_permissions; GetPermissionsForApp(device_id, application_id, app_group_permissions); @@ -699,12 +691,8 @@ void PolicyManagerImpl::SendNotificationOnPermissionsUpdated( cache_->GetFunctionalGroupings(functional_groupings); policy_table::Strings app_groups; - std::vector<FunctionalGroupPermission>::const_iterator it = - app_group_permissions.begin(); - std::vector<FunctionalGroupPermission>::const_iterator it_end = - app_group_permissions.end(); - for (; it != it_end; ++it) { - app_groups.push_back((*it).group_name); + for (const auto& group_permission : app_group_permissions) { + app_groups.push_back(group_permission.group_name); } Permissions notification_data; @@ -714,19 +702,19 @@ void PolicyManagerImpl::SendNotificationOnPermissionsUpdated( notification_data); LOG4CXX_INFO(logger_, - "Send notification for application_id:" << application_id); + "Send notification for application_id: " << application_id); - std::string default_hmi; - default_hmi = "NONE"; + std::string default_hmi = "NONE"; const ApplicationOnDevice who = {device_id, application_id}; if (access_remote_->IsAppRemoteControl(who)) { - listener()->OnPermissionsUpdated(application_id, notification_data); + listener()->OnPermissionsUpdated( + device_id, application_id, notification_data); return; } listener()->OnPermissionsUpdated( - application_id, notification_data, default_hmi); + device_id, application_id, notification_data, default_hmi); } bool PolicyManagerImpl::CleanupUnpairedDevices() { @@ -756,8 +744,13 @@ void PolicyManagerImpl::SetUserConsentForDevice(const std::string& device_id, } } -bool PolicyManagerImpl::ReactOnUserDevConsentForApp(const std::string app_id, - bool is_device_allowed) { +bool PolicyManagerImpl::ReactOnUserDevConsentForApp( + const transport_manager::DeviceHandle& device_handle, + const std::string app_id, + bool is_device_allowed) { + UNUSED(device_handle); + UNUSED(app_id); + UNUSED(is_device_allowed); return true; } @@ -868,11 +861,11 @@ void PolicyManagerImpl::SetUserConsentForApp( LOG4CXX_AUTO_TRACE(logger_); } -bool PolicyManagerImpl::GetDefaultHmi(const std::string& policy_app_id, +bool PolicyManagerImpl::GetDefaultHmi(const std::string& device_id, + const std::string& policy_app_id, std::string* default_hmi) const { LOG4CXX_AUTO_TRACE(logger_); - const std::string device_id = GetCurrentDeviceId(policy_app_id); - DeviceConsent device_consent = GetUserConsentForDevice(device_id); + const DeviceConsent device_consent = GetUserConsentForDevice(device_id); const std::string app_id = policy::kDeviceAllowed != device_consent ? kPreDataConsentId : policy_app_id; @@ -955,7 +948,7 @@ void PolicyManagerImpl::GetPermissionsForApp( app_id_to_check = kDefaultId; allowed_by_default = true; } else if (cache_->IsPredataPolicy(policy_app_id) || - policy::kDeviceDisallowed == GetUserConsentForDevice(device_id)) { + policy::kDeviceAllowed != GetUserConsentForDevice(device_id)) { app_id_to_check = kPreDataConsentId; allowed_by_default = true; } @@ -1010,9 +1003,11 @@ void PolicyManagerImpl::GetPermissionsForApp( } std::string& PolicyManagerImpl::GetCurrentDeviceId( + const transport_manager::DeviceHandle& device_handle, const std::string& policy_app_id) const { LOG4CXX_AUTO_TRACE(logger_); - last_device_id_ = listener()->OnCurrentDeviceIdUpdateRequired(policy_app_id); + last_device_id_ = + listener()->OnCurrentDeviceIdUpdateRequired(device_handle, policy_app_id); return last_device_id_; } @@ -1202,7 +1197,8 @@ bool PolicyManagerImpl::IsApplicationRevoked(const std::string& app_id) const { return cache_->IsApplicationRevoked(app_id); } -bool PolicyManagerImpl::IsConsentNeeded(const std::string& app_id) { +bool PolicyManagerImpl::IsConsentNeeded(const std::string& device_id, + const std::string& app_id) { LOG4CXX_AUTO_TRACE(logger_); return false; } @@ -1210,14 +1206,15 @@ bool PolicyManagerImpl::IsConsentNeeded(const std::string& app_id) { void PolicyManagerImpl::SetVINValue(const std::string& value) {} AppPermissions PolicyManagerImpl::GetAppPermissionsChanges( - const std::string& policy_app_id) { + const std::string& device_id, const std::string& policy_app_id) { typedef std::map<std::string, AppPermissions>::iterator PermissionsIt; PermissionsIt app_id_diff = app_permissions_diff_.find(policy_app_id); AppPermissions permissions(policy_app_id); if (app_permissions_diff_.end() != app_id_diff) { permissions = app_id_diff->second; } else { - permissions.appPermissionsConsentNeeded = IsConsentNeeded(policy_app_id); + permissions.appPermissionsConsentNeeded = + IsConsentNeeded(device_id, policy_app_id); permissions.appRevoked = IsApplicationRevoked(policy_app_id); GetPriority(permissions.application_id, &permissions.priority); } @@ -1305,11 +1302,11 @@ class CallStatusChange : public utils::Callable { }; StatusNotifier PolicyManagerImpl::AddApplication( + const std::string& device_id, const std::string& application_id, const rpc::policy_table_interface_base::AppHmiTypes& hmi_types) { LOG4CXX_AUTO_TRACE(logger_); - const std::string device_id = GetCurrentDeviceId(application_id); - DeviceConsent device_consent = GetUserConsentForDevice(device_id); + auto device_consent = GetUserConsentForDevice(device_id); sync_primitives::AutoLock lock(apps_registration_lock_); if (IsNewApplication(application_id)) { AddNewApplication(application_id, device_consent); @@ -1437,10 +1434,13 @@ void PolicyManagerImpl::RetrySequence() { timer_retry_sequence_.Start(timeout_msec, timer::kPeriodic); } -void PolicyManagerImpl::SetDefaultHmiTypes(const std::string& application_id, - const std::vector<int>& hmi_types) { +void PolicyManagerImpl::SetDefaultHmiTypes( + const transport_manager::DeviceHandle& device_handle, + const std::string& application_id, + const std::vector<int>& hmi_types) { LOG4CXX_INFO(logger_, "SetDefaultHmiTypes"); - const std::string device_id = GetCurrentDeviceId(application_id); + const std::string device_id = + GetCurrentDeviceId(device_handle, application_id); ApplicationOnDevice who = {device_id, application_id}; access_remote_->SetDefaultHmiTypes(who, hmi_types); } @@ -1478,7 +1478,7 @@ bool PolicyManagerImpl::CheckModule(const PTString& app_id, void PolicyManagerImpl::SendHMILevelChanged(const ApplicationOnDevice& who) { std::string default_hmi("NONE"); - if (GetDefaultHmi(who.app_id, &default_hmi)) { + if (GetDefaultHmi(who.dev_id, who.app_id, &default_hmi)) { listener()->OnUpdateHMIStatus(who.dev_id, who.app_id, default_hmi); } else { LOG4CXX_WARN( @@ -1515,7 +1515,8 @@ void PolicyManagerImpl::SendAppPermissionsChanged( const std::string& device_id, const std::string& application_id) { Permissions notification_data; GetPermissions(device_id, application_id, ¬ification_data); - listener()->OnPermissionsUpdated(application_id, notification_data); + listener()->OnPermissionsUpdated( + device_id, application_id, notification_data); } void PolicyManagerImpl::SendAuthTokenUpdated(const std::string policy_app_id) { diff --git a/src/components/policy/policy_regular/test/policy_manager_impl_test.cc b/src/components/policy/policy_regular/test/policy_manager_impl_test.cc index 39ff0efa7e..3b07506981 100644 --- a/src/components/policy/policy_regular/test/policy_manager_impl_test.cc +++ b/src/components/policy/policy_regular/test/policy_manager_impl_test.cc @@ -40,6 +40,7 @@ #include "json/writer.h" #include "config_profile/profile.h" +#include "connection_handler/connection_handler.h" #include "policy/mock_cache_manager.h" #include "policy/mock_policy_listener.h" #include "policy/mock_policy_settings.h" @@ -177,6 +178,8 @@ class PolicyManagerImplTest2 : public ::testing::Test { , app_id2("1010101010") , dev_id1("XXX123456789ZZZ") , dev_id2("08-00-27-CE-76-FE") + , dev_handle1(123456789) + , dev_handle2(1010101010) , PTU_request_types(Json::arrayValue) {} protected: @@ -190,6 +193,8 @@ class PolicyManagerImplTest2 : public ::testing::Test { const std::string app_id2; const std::string dev_id1; const std::string dev_id2; + const connection_handler::DeviceHandle dev_handle1; + const connection_handler::DeviceHandle dev_handle2; Json::Value PTU_request_types; NiceMock<policy_handler_test::MockPolicySettings> policy_settings_; const std::string kAppStorageFolder = "storage_PolicyManagerImplTest2"; @@ -271,12 +276,13 @@ class PolicyManagerImplTest2 : public ::testing::Test { // Arrange CreateLocalPT("sdl_preloaded_pt.json"); // Add app - manager->AddApplication(section_name, HmiTypes(policy_table::AHT_DEFAULT)); + manager->AddApplication( + dev_id1, section_name, HmiTypes(policy_table::AHT_DEFAULT)); // Check app gets RequestTypes from pre_DataConsent of app_policies // section PT_request_types = manager->GetAppRequestTypes(section_name); EXPECT_EQ(rt_number, PT_request_types.size()); - EXPECT_CALL(listener, OnPendingPermissionChange(section_name)).Times(1); + EXPECT_CALL(listener, OnPendingPermissionChange(_, section_name)).Times(1); Json::Value root = GetPTU(update_file_name); // Get App Request Types from PTU @@ -292,7 +298,7 @@ class PolicyManagerImplTest2 : public ::testing::Test { PT_request_types.size()); ::policy::AppPermissions permissions = - manager->GetAppPermissionsChanges(section_name); + manager->GetAppPermissionsChanges(dev_id1, section_name); EXPECT_TRUE(permissions.requestTypeChanged); } @@ -537,11 +543,14 @@ TEST_F(PolicyManagerImplTest2, "Life", 2, "Bluetooth"); - EXPECT_CALL(listener, OnCurrentDeviceIdUpdateRequired(app_id1)) + EXPECT_CALL(listener, OnCurrentDeviceIdUpdateRequired(_, app_id1)) .WillRepeatedly(Return(dev_id1)); manager->SetUserConsentForDevice(dev_id1, true); // Add app from consented device. App will be assigned with default policies - manager->AddApplication(app_id1, HmiTypes(policy_table::AHT_DEFAULT)); + manager->AddApplication( + dev_id1, app_id1, HmiTypes(policy_table::AHT_DEFAULT)); + EXPECT_CALL(listener, GetDevicesIds(app_id1)) + .WillRepeatedly(Return(transport_manager::DeviceList())); // Check before action policy_table::RpcParameters rpc_parameters; rpc_parameters.hmi_levels.push_back(policy_table::HL_FULL); @@ -594,11 +603,11 @@ TEST_F(PolicyManagerImplTest2, "Life", 2, "Bluetooth")); - EXPECT_CALL(listener, OnCurrentDeviceIdUpdateRequired("1234")) + EXPECT_CALL(listener, OnCurrentDeviceIdUpdateRequired(_, "1234")) .WillRepeatedly(Return(dev_id1)); manager->SetUserConsentForDevice(dev_id1, true); // Add app from consented device. App will be assigned with default policies - manager->AddApplication("1234", HmiTypes(policy_table::AHT_MEDIA)); + manager->AddApplication(dev_id1, "1234", HmiTypes(policy_table::AHT_MEDIA)); // Emulate PTU with new policies for app added above std::ifstream ifile("sdl_preloaded_pt.json"); Json::Reader reader; @@ -785,8 +794,8 @@ TEST_F( AddApplication_AddNewApplicationFromDeviceWithoutConsent_ExpectUpdateRequired) { // Arrange CreateLocalPT("sdl_preloaded_pt.json"); - ::policy::StatusNotifier notifyer = - manager->AddApplication(app_id1, HmiTypes(policy_table::AHT_DEFAULT)); + ::policy::StatusNotifier notifyer = manager->AddApplication( + dev_id1, app_id1, HmiTypes(policy_table::AHT_DEFAULT)); DCHECK(notifyer); (*notifyer)(); EXPECT_EQ("UPDATE_NEEDED", manager->GetPolicyTableStatus()); @@ -798,9 +807,10 @@ TEST_F( // Arrange // RequestTypes for default & preDataConsent are different CreateLocalPT("ptu_requestType.json"); - manager->AddApplication(app_id1, HmiTypes(policy_table::AHT_DEFAULT)); + manager->AddApplication( + dev_id1, app_id1, HmiTypes(policy_table::AHT_DEFAULT)); EXPECT_FALSE(manager->IsPredataPolicy(app_id1)); - manager->ReactOnUserDevConsentForApp(app_id1, true); + manager->ReactOnUserDevConsentForApp(dev_handle1, app_id1, true); EXPECT_FALSE(manager->IsPredataPolicy(app_id1)); EXPECT_TRUE((manager->GetCache())->IsDefaultPolicy(app_id1)); } @@ -811,10 +821,11 @@ TEST_F( // Arrange // RequestTypes for default & preDataConsent are the same CreateLocalPT("ptu2_requestType.json"); - manager->AddApplication(app_id1, HmiTypes(policy_table::AHT_DEFAULT)); + manager->AddApplication( + dev_id1, app_id1, HmiTypes(policy_table::AHT_DEFAULT)); EXPECT_FALSE(manager->IsPredataPolicy(app_id1)); - EXPECT_CALL(listener, OnPendingPermissionChange(app_id1)).Times(0); - manager->ReactOnUserDevConsentForApp(app_id1, true); + EXPECT_CALL(listener, OnPendingPermissionChange(_, app_id1)).Times(0); + manager->ReactOnUserDevConsentForApp(dev_handle1, app_id1, true); EXPECT_FALSE(manager->IsPredataPolicy(app_id1)); EXPECT_TRUE((manager->GetCache())->IsDefaultPolicy(app_id1)); } @@ -828,7 +839,8 @@ TEST_F( GetPTU("valid_sdl_pt_update.json"); EXPECT_EQ("UP_TO_DATE", manager->GetPolicyTableStatus()); // Try to add existing app - manager->AddApplication(app_id2, HmiTypes(policy_table::AHT_DEFAULT)); + manager->AddApplication( + dev_id2, app_id2, HmiTypes(policy_table::AHT_DEFAULT)); // Check no update required EXPECT_EQ("UP_TO_DATE", manager->GetPolicyTableStatus()); } @@ -876,13 +888,14 @@ TEST_F(PolicyManagerImplTest2, GetPTU("valid_sdl_pt_update.json"); EXPECT_EQ("UP_TO_DATE", manager->GetPolicyTableStatus()); - manager->AddApplication(app_id2, HmiTypes(policy_table::AHT_DEFAULT)); + manager->AddApplication( + dev_id2, app_id2, HmiTypes(policy_table::AHT_DEFAULT)); EXPECT_EQ("UP_TO_DATE", manager->GetPolicyTableStatus()); ::policy::Counters counter = ::policy::Counters::DAYS_AFTER_EPOCH; // Set PT was updated 10 days ago (limit is 30 days for now) // So no limit exceeded manager->PTUpdatedAt(counter, days - 10); - manager->OnAppRegisteredOnMobile(app_id2); + manager->OnAppRegisteredOnMobile(dev_id2, app_id2); EXPECT_EQ("UP_TO_DATE", manager->GetPolicyTableStatus()); } @@ -1087,11 +1100,12 @@ TEST_F(PolicyManagerImplTest2, DISABLED_GetDefaultHmi_SetDeviceAllowed_ExpectReceivedHmiCorrect) { // Arrange CreateLocalPT("ptu2_requestType.json"); - manager->AddApplication(app_id2, HmiTypes(policy_table::AHT_DEFAULT)); + manager->AddApplication( + dev_id2, app_id2, HmiTypes(policy_table::AHT_DEFAULT)); // Check if app has preData policy EXPECT_FALSE(manager->IsPredataPolicy(app_id2)); std::string default_hmi1; - manager->GetDefaultHmi(app_id2, &default_hmi1); + manager->GetDefaultHmi(dev_id2, app_id2, &default_hmi1); EXPECT_EQ("", default_hmi1); ASSERT_TRUE((manager->GetCache())->AddDevice(dev_id2, "Bluetooth")); ASSERT_TRUE((manager->GetCache()) @@ -1107,12 +1121,13 @@ TEST_F(PolicyManagerImplTest2, ::policy::DeviceConsent consent = manager->GetUserConsentForDevice(dev_id2); // Check EXPECT_EQ(::policy::DeviceConsent::kDeviceAllowed, consent); - EXPECT_CALL(listener, OnCurrentDeviceIdUpdateRequired(app_id2)) + EXPECT_CALL(listener, OnCurrentDeviceIdUpdateRequired(_, app_id2)) .WillRepeatedly(Return(dev_id2)); - manager->AddApplication(app_id2, HmiTypes(policy_table::AHT_DEFAULT)); + manager->AddApplication( + dev_id2, app_id2, HmiTypes(policy_table::AHT_DEFAULT)); EXPECT_TRUE((manager->GetCache())->IsDefaultPolicy(app_id2)); std::string default_hmi2; - manager->GetDefaultHmi(app_id2, &default_hmi2); + manager->GetDefaultHmi(dev_id2, app_id2, &default_hmi2); EXPECT_EQ("", default_hmi2); } @@ -1120,7 +1135,8 @@ TEST_F(PolicyManagerImplTest2, GetDefaultPriority_SetDeviceAllowed_ExpectReceivedPriorityCorrect) { // Arrange CreateLocalPT("ptu2_requestType.json"); - manager->AddApplication(app_id2, HmiTypes(policy_table::AHT_DEFAULT)); + manager->AddApplication( + dev_id2, app_id2, HmiTypes(policy_table::AHT_DEFAULT)); // Check if app has preData policy EXPECT_FALSE(manager->IsPredataPolicy(app_id2)); std::string priority1; @@ -1140,9 +1156,10 @@ TEST_F(PolicyManagerImplTest2, ::policy::DeviceConsent consent = manager->GetUserConsentForDevice(dev_id2); // Check EXPECT_EQ(::policy::DeviceConsent::kDeviceAllowed, consent); - EXPECT_CALL(listener, OnCurrentDeviceIdUpdateRequired(app_id2)) + EXPECT_CALL(listener, OnCurrentDeviceIdUpdateRequired(_, app_id2)) .WillRepeatedly(Return(dev_id2)); - manager->AddApplication(app_id2, HmiTypes(policy_table::AHT_DEFAULT)); + manager->AddApplication( + dev_id2, app_id2, HmiTypes(policy_table::AHT_DEFAULT)); EXPECT_TRUE((manager->GetCache())->IsDefaultPolicy(app_id2)); std::string priority2; EXPECT_TRUE(manager->GetPriority(app_id2, &priority2)); @@ -1152,7 +1169,10 @@ TEST_F(PolicyManagerImplTest2, TEST_F(PolicyManagerImplTest2, GetInitialAppData_ExpectReceivedConsentCorrect) { // Arrange CreateLocalPT("sdl_preloaded_pt.json"); - manager->AddApplication(app_id2, HmiTypes(policy_table::AHT_DEFAULT)); + manager->AddApplication( + dev_id2, app_id2, HmiTypes(policy_table::AHT_DEFAULT)); + EXPECT_CALL(listener, GetDevicesIds(app_id2)) + .WillRepeatedly(Return(transport_manager::DeviceList())); ::policy::StringArray app_nicknames; ::policy::StringArray app_hmi_types; manager->GetInitialAppData(app_id2, &app_nicknames, &app_hmi_types); @@ -1194,7 +1214,8 @@ TEST_F( CanAppKeepContext_AddAppFromUnconsentedDevice_ExpectAppCannotKeepContext) { // Arrange CreateLocalPT("sdl_preloaded_pt.json"); - manager->AddApplication(app_id2, HmiTypes(policy_table::AHT_DEFAULT)); + manager->AddApplication( + dev_id2, app_id2, HmiTypes(policy_table::AHT_DEFAULT)); // Check if app has preData policy EXPECT_FALSE(manager->IsPredataPolicy(app_id2)); // Check keep context in preData policy @@ -1206,7 +1227,8 @@ TEST_F(PolicyManagerImplTest2, // Arrange CreateLocalPT("sdl_preloaded_pt.json"); ASSERT_TRUE((manager->GetCache())->AddDevice(dev_id2, "Bluetooth")); - manager->AddApplication(app_id2, HmiTypes(policy_table::AHT_DEFAULT)); + manager->AddApplication( + dev_id2, app_id2, HmiTypes(policy_table::AHT_DEFAULT)); ASSERT_TRUE((manager->GetCache()) ->SetDeviceData(dev_id2, "hardware IPX", @@ -1219,9 +1241,10 @@ TEST_F(PolicyManagerImplTest2, manager->SetUserConsentForDevice(dev_id2, true); ::policy::DeviceConsent consent = manager->GetUserConsentForDevice(dev_id2); EXPECT_EQ(::policy::DeviceConsent::kDeviceAllowed, consent); - EXPECT_CALL(listener, OnCurrentDeviceIdUpdateRequired(app_id2)) + EXPECT_CALL(listener, OnCurrentDeviceIdUpdateRequired(_, app_id2)) .WillRepeatedly(Return(dev_id2)); - manager->AddApplication(app_id2, HmiTypes(policy_table::AHT_DEFAULT)); + manager->AddApplication( + dev_id2, app_id2, HmiTypes(policy_table::AHT_DEFAULT)); EXPECT_TRUE((manager->GetCache())->IsDefaultPolicy(app_id2)); // Check keep context in default policy EXPECT_TRUE(manager->CanAppKeepContext(app_id2)); @@ -1231,7 +1254,10 @@ TEST_F(PolicyManagerImplTest2, CanAppKeepContext_SetPoliciesForAppUpdated_ExpectAppCanKeepContext) { // Arrange CreateLocalPT("sdl_preloaded_pt.json"); - manager->AddApplication(app_id2, HmiTypes(policy_table::AHT_DEFAULT)); + manager->AddApplication( + dev_id2, app_id2, HmiTypes(policy_table::AHT_DEFAULT)); + EXPECT_CALL(listener, GetDevicesIds(app_id2)) + .WillRepeatedly(Return(transport_manager::DeviceList())); GetPTU("valid_sdl_pt_update.json"); // Check keep context in updated policies for app EXPECT_TRUE(manager->CanAppKeepContext(app_id2)); @@ -1242,7 +1268,8 @@ TEST_F(PolicyManagerImplTest2, // Arrange CreateLocalPT("sdl_preloaded_pt.json"); ASSERT_TRUE((manager->GetCache())->AddDevice(dev_id2, "Bluetooth")); - manager->AddApplication(app_id2, HmiTypes(policy_table::AHT_DEFAULT)); + manager->AddApplication( + dev_id2, app_id2, HmiTypes(policy_table::AHT_DEFAULT)); ASSERT_TRUE((manager->GetCache()) ->SetDeviceData(dev_id2, "hardware IPX", @@ -1255,9 +1282,10 @@ TEST_F(PolicyManagerImplTest2, manager->SetUserConsentForDevice(dev_id2, true); ::policy::DeviceConsent consent = manager->GetUserConsentForDevice(dev_id2); EXPECT_EQ(::policy::DeviceConsent::kDeviceAllowed, consent); - EXPECT_CALL(listener, OnCurrentDeviceIdUpdateRequired(app_id2)) + EXPECT_CALL(listener, OnCurrentDeviceIdUpdateRequired(_, app_id2)) .WillRepeatedly(Return(dev_id2)); - manager->AddApplication(app_id2, HmiTypes(policy_table::AHT_DEFAULT)); + manager->AddApplication( + dev_id2, app_id2, HmiTypes(policy_table::AHT_DEFAULT)); EXPECT_TRUE((manager->GetCache())->IsDefaultPolicy(app_id2)); // Check keep context in default policy EXPECT_TRUE(manager->CanAppStealFocus(app_id2)); @@ -1267,7 +1295,10 @@ TEST_F(PolicyManagerImplTest2, CanAppStealFocus_SetPoliciesForAppUpdated_ExpectAppCanStealFocus) { // Arrange CreateLocalPT("sdl_preloaded_pt.json"); - manager->AddApplication(app_id2, HmiTypes(policy_table::AHT_DEFAULT)); + manager->AddApplication( + dev_id2, app_id2, HmiTypes(policy_table::AHT_DEFAULT)); + EXPECT_CALL(listener, GetDevicesIds(app_id2)) + .WillRepeatedly(Return(transport_manager::DeviceList())); GetPTU("valid_sdl_pt_update.json"); // Check keep context in updated policies for app EXPECT_TRUE(manager->CanAppKeepContext(app_id2)); @@ -1275,9 +1306,11 @@ TEST_F(PolicyManagerImplTest2, TEST_F(PolicyManagerImplTest2, GetCurrentDeviceId) { // Arrange - EXPECT_CALL(listener, OnCurrentDeviceIdUpdateRequired(app_id2)).Times(2); - EXPECT_EQ(custom_str::CustomString(""), manager->GetCurrentDeviceId(app_id2)); - EXPECT_EQ("", manager->GetCurrentDeviceId(app_id2)); + EXPECT_CALL(listener, OnCurrentDeviceIdUpdateRequired(dev_handle2, app_id2)) + .Times(2); + EXPECT_EQ(custom_str::CustomString(""), + manager->GetCurrentDeviceId(dev_handle2, app_id2)); + EXPECT_EQ("", manager->GetCurrentDeviceId(dev_handle2, app_id2)); } TEST_F(PolicyManagerImplTest2, @@ -1321,9 +1354,12 @@ TEST_F( ->SetUserPermissionsForDevice( dev_id2, consented_groups, disallowed_groups); manager->SetUserConsentForDevice(dev_id2, true); - EXPECT_CALL(listener, OnCurrentDeviceIdUpdateRequired(app_id2)) + EXPECT_CALL(listener, OnCurrentDeviceIdUpdateRequired(_, app_id2)) .WillRepeatedly(Return(dev_id2)); - manager->AddApplication(app_id2, HmiTypes(policy_table::AHT_DEFAULT)); + manager->AddApplication( + dev_id2, app_id2, HmiTypes(policy_table::AHT_DEFAULT)); + EXPECT_CALL(listener, GetDevicesIds(app_id2)) + .WillRepeatedly(Return(transport_manager::DeviceList())); GetPTU("valid_sdl_pt_update.json"); ::policy::PermissionConsent perm_consent; @@ -1342,7 +1378,7 @@ TEST_F( perm_consent.group_permissions = groups_permissions; manager->SetUserConsentForApp(perm_consent); - manager->SendNotificationOnPermissionsUpdated(app_id2); + manager->SendNotificationOnPermissionsUpdated(dev_id2, app_id2); std::vector< ::policy::FunctionalGroupPermission> actual_groups_permissions; std::vector< ::policy::FunctionalGroupPermission>::iterator it; manager->GetPermissionsForApp(dev_id2, app_id2, actual_groups_permissions); @@ -1377,7 +1413,10 @@ TEST_F( pt->ReportErrors(&report); } // Add new app - manager->AddApplication(app_id2, HmiTypes(policy_table::AHT_DEFAULT)); + manager->AddApplication( + dev_id2, app_id2, HmiTypes(policy_table::AHT_DEFAULT)); + EXPECT_CALL(listener, GetDevicesIds(app_id2)) + .WillRepeatedly(Return(transport_manager::DeviceList())); uint32_t result = manager->HeartBeatTimeout(app_id2); // By default hertbeat timeout is 0 EXPECT_EQ(0u, result); diff --git a/src/components/rpc_base/include/rpc_base/rpc_base_inl.h b/src/components/rpc_base/include/rpc_base/rpc_base_inl.h index 07a85eaa22..985e244235 100644 --- a/src/components/rpc_base/include/rpc_base/rpc_base_inl.h +++ b/src/components/rpc_base/include/rpc_base/rpc_base_inl.h @@ -185,12 +185,14 @@ Integer<T, minval, maxval>& Integer<T, minval, maxval>::operator=( template <typename T, T minval, T maxval> Integer<T, minval, maxval>& Integer<T, minval, maxval>::operator++() { ++value_; + value_state_ = range_.Includes(value_) ? kValid : kInvalid; return *this; } template <typename T, T minval, T maxval> Integer<T, minval, maxval>& Integer<T, minval, maxval>::operator+=(int value) { value_ += value; + value_state_ = range_.Includes(value_) ? kValid : kInvalid; return *this; } |