diff options
author | jacobkeeler <jacob.keeler@livioradio.com> | 2021-04-14 16:50:29 -0400 |
---|---|---|
committer | jacobkeeler <jacob.keeler@livioradio.com> | 2021-04-14 16:50:29 -0400 |
commit | 1b3f0f4c83769a6e63893075122b9bda52a28282 (patch) | |
tree | bb372e2cbb5c63953a685aa6ec18a032939eb52e | |
parent | ba49ca4c7b953385a1ce2963a8f6e439271f0d2d (diff) | |
parent | 6fbff3ab06b04fadc29f8dce5feb5ad98556ea14 (diff) | |
download | sdl_core-feature/update_travis_20_04.tar.gz |
Merge remote-tracking branch 'origin/develop' into feature/update_travis_20_04feature/update_travis_20_04
199 files changed, 4209 insertions, 2225 deletions
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 301a22eafe..319edc5458 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,4 +1,4 @@ -[Things to note: Pull Requests **must** fix an issue. Discussion about the feature / bug takes place in the issue, discussion of the implementation takes place in the PR. Please also see the [Contributing Guide](https://github.com/smartdevicelink/sdl_core/blob/master/.github/CONTRIBUTING.md) for information on branch naming and the CLA, and the [SmartDeviceLink GitHub Best Practices](https://d83tozu1c8tt6.cloudfront.net/media/resources/SDL_GitHub_BestPractices.pdf) document for more information on how to enter a pull request. Once this PR is ready for review, please request one from @theresalech. +[Things to note: Pull Requests **must** fix an issue. Discussion about the feature / bug takes place in the issue, discussion of the implementation takes place in the PR. Please also see the [Contributing Guide](https://github.com/smartdevicelink/sdl_core/blob/master/.github/CONTRIBUTING.md) for information on branch naming and the CLA, and the [SmartDeviceLink GitHub Best Practices](https://d83tozu1c8tt6.cloudfront.net/media/resources/SDL_GitHub_BestPractices.pdf) document for more information on how to enter a pull request. Once this PR is ready for review, please request one from @JackLivio. Delete the above section when you've read it.] diff --git a/src/3rd_party/CMakeLists.txt b/src/3rd_party/CMakeLists.txt index 0fdc0ba013..26baeca3eb 100644 --- a/src/3rd_party/CMakeLists.txt +++ b/src/3rd_party/CMakeLists.txt @@ -221,13 +221,14 @@ else() endif() set(BOOST_ROOT ${3RD_PARTY_INSTALL_PREFIX}) -find_package(Boost 1.66.0 COMPONENTS system thread date_time filesystem regex) -set(BOOST_LIB_SOURCE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/boost_src) -set(BOOST_LIBS_DIRECTORY ${3RD_PARTY_INSTALL_PREFIX}/lib) -set(BOOST_INCLUDE_DIR ${3RD_PARTY_INSTALL_PREFIX}/include PARENT_SCOPE) -SET_PROPERTY(GLOBAL PROPERTY GLOBAL_BOOST_LIBS ${BOOST_LIBS_DIRECTORY}) +set(Boost_NO_BOOST_CMAKE ON) +find_package(Boost 1.72.0 COMPONENTS system thread date_time filesystem regex) if (NOT ${Boost_FOUND}) - message(STATUS "Did not find boost. Downloading and installing boost 1.66") + set(BOOST_LIB_SOURCE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/boost_src) + set(BOOST_LIBS_DIRECTORY ${3RD_PARTY_INSTALL_PREFIX}/lib) + set(BOOST_INCLUDE_DIR ${3RD_PARTY_INSTALL_PREFIX}/include PARENT_SCOPE) + SET_PROPERTY(GLOBAL PROPERTY GLOBAL_BOOST_LIBS ${BOOST_LIBS_DIRECTORY}) + message(STATUS "Did not find boost. Downloading and installing boost 1.72") set(BOOST_INSTALL_COMMAND ./b2 install) if (${3RD_PARTY_INSTALL_PREFIX} MATCHES "/usr/local") set(BOOST_INSTALL_COMMAND sudo ./b2 install) @@ -235,18 +236,22 @@ if (NOT ${Boost_FOUND}) include(ExternalProject) ExternalProject_Add( Boost - URL https://mirror.bazel.build/dl.bintray.com/boostorg/release/1.68.0/source/boost_1_68_0.tar.gz - URL_HASH SHA256=da3411ea45622579d419bfda66f45cd0f8c32a181d84adfa936f5688388995cf + URL https://dl.bintray.com/boostorg/release/1.72.0/source/boost_1_72_0.tar.gz + URL_HASH SHA256=c66e88d5786f2ca4dbebb14e06b566fb642a1a6947ad8cc9091f9f445134143f DOWNLOAD_DIR ${BOOST_LIB_SOURCE_DIRECTORY} SOURCE_DIR ${BOOST_LIB_SOURCE_DIRECTORY} CONFIGURE_COMMAND ./bootstrap.sh --with-libraries=system,thread,date_time,filesystem,regex --prefix=${3RD_PARTY_INSTALL_PREFIX} BUILD_COMMAND ./b2 - INSTALL_COMMAND ${BOOST_INSTALL_COMMAND} --with-system --with-thread --with-date_time --with-filesystem --with-regex --prefix=${3RD_PARTY_INSTALL_PREFIX} > boost_install.log + INSTALL_COMMAND ${BOOST_INSTALL_COMMAND} --clean --prefix=${3RD_PARTY_INSTALL_PREFIX} && ${BOOST_INSTALL_COMMAND} --with-system --with-thread --with-date_time --with-filesystem --with-regex --prefix=${3RD_PARTY_INSTALL_PREFIX} > boost_install.log INSTALL_DIR ${3RD_PARTY_INSTALL_PREFIX} BUILD_IN_SOURCE true ) else() -add_custom_target(Boost) # empty target, Boost is already installed + message (STATUS "Boost installed in " ${Boost_LIBRARY_DIRS} ", " ${Boost_INCLUDE_DIRS}) + set(BOOST_LIBS_DIRECTORY ${Boost_LIBRARY_DIRS}) + set(BOOST_INCLUDE_DIR ${Boost_INCLUDE_DIRS} PARENT_SCOPE) + SET_PROPERTY(GLOBAL PROPERTY GLOBAL_BOOST_LIBS ${BOOST_LIBS_DIRECTORY}) + add_custom_target(Boost) # empty target, Boost is already installed endif() add_custom_target(install-3rd_party diff --git a/src/appMain/hmi_capabilities.json b/src/appMain/hmi_capabilities.json index 4266f40cf3..8adb8da4b7 100755 --- a/src/appMain/hmi_capabilities.json +++ b/src/appMain/hmi_capabilities.json @@ -105,55 +105,67 @@ "rows": 1 }, { - "name": "navigationText", + "name": "audioPassThruDisplayText1", "characterSet": "UTF_8", "width": 500, "rows": 1 }, { - "name": "audioPassThruDisplayText1", + "name": "audioPassThruDisplayText2", "characterSet": "UTF_8", "width": 500, "rows": 1 }, { - "name": "audioPassThruDisplayText2", + "name": "sliderHeader", "characterSet": "UTF_8", "width": 500, "rows": 1 }, { - "name": "sliderHeader", + "name": "sliderFooter", "characterSet": "UTF_8", "width": 500, "rows": 1 }, { - "name": "sliderFooter", + "name": "menuName", "characterSet": "UTF_8", "width": 500, "rows": 1 }, { - "name": "notificationText", + "name": "secondaryText", "characterSet": "UTF_8", "width": 500, "rows": 1 }, { - "name": "menuName", + "name": "tertiaryText", "characterSet": "UTF_8", "width": 500, "rows": 1 }, { - "name": "secondaryText", + "name": "menuCommandSecondaryText", "characterSet": "UTF_8", "width": 500, "rows": 1 }, { - "name": "tertiaryText", + "name": "menuCommandTertiaryText", + "characterSet": "UTF_8", + "width": 500, + "rows": 1 + }, + { + "name": "menuSubMenuSecondaryText", + "characterSet": "UTF_8", + "width": 500, + "rows": 1 + }, + { + "name": "menuSubMenuTertiaryText", "characterSet": "UTF_8", "width": 500, "rows": 1 @@ -213,6 +225,20 @@ } }, { + "name": "menuCommandSecondaryImage", + "imageResolution": { + "resolutionWidth": 35, + "resolutionHeight": 35 + } + }, + { + "name": "menuSubMenuSecondaryImage", + "imageResolution": { + "resolutionWidth": 35, + "resolutionHeight": 35 + } + }, + { "name": "appIcon", "imageResolution": { "resolutionWidth": 35, @@ -311,20 +337,106 @@ "dialNumberEnabled": true }, "videoStreamingCapability": { - "preferredResolution": { + "preferredResolution": { + "resolutionWidth": 800, + "resolutionHeight": 380 + }, + "maxBitrate": 20000, + "supportedFormats": [ + { + "protocol": "RAW", + "codec": "H264" + }, + { + "protocol": "RTP", + "codec": "H264" + }, + { + "protocol": "RTSP", + "codec": "Theora" + }, + { + "protocol": "RTMP", + "codec": "VP8" + }, + { + "protocol": "WEBM", + "codec": "VP9" + } + ], + "hapticSpatialDataSupported": true, + "diagonalScreenSize": 8, + "pixelPerInch": 96, + "scale": 1, + "preferredFPS": 15, + "additionalVideoStreamingCapabilities": [ + { + "preferredResolution": + { "resolutionWidth": 800, - "resolutionHeight": 350 + "resolutionHeight": 380 + }, + "hapticSpatialDataSupported": true, + "scale": 1, + "diagonalScreenSize": 8 }, - "maxBitrate": 10000, - "supportedFormats": [{ - "protocol": "RAW", - "codec": "H264" - }], - "hapticSpatialDataSupported": false, - "diagonalScreenSize": 8, - "pixelPerInch": 117, - "scale": 1, - "preferredFPS": 15 + { + "preferredResolution": + { + "resolutionWidth": 320, + "resolutionHeight": 200 + }, + "hapticSpatialDataSupported": false, + "diagonalScreenSize": 3 + }, + { + "preferredResolution": + { + "resolutionWidth": 480, + "resolutionHeight": 320 + }, + "hapticSpatialDataSupported": true, + "diagonalScreenSize": 5 + }, + { + "preferredResolution": + { + "resolutionWidth": 400, + "resolutionHeight": 380 + }, + "hapticSpatialDataSupported": true, + "diagonalScreenSize": 4 + }, + { + "preferredResolution": + { + "resolutionWidth": 800, + "resolutionHeight": 240 + }, + "hapticSpatialDataSupported": true, + "diagonalScreenSize": 4 + }, + { + "preferredResolution": + { + "resolutionWidth": 800, + "resolutionHeight": 380 + }, + "hapticSpatialDataSupported": true, + "scale": 1.5, + "diagonalScreenSize": 5 + }, + { + "preferredResolution": + { + "resolutionWidth": 800, + "resolutionHeight": 380 + }, + "hapticSpatialDataSupported": true, + "scale": 2, + "diagonalScreenSize": 4 + } + ] }, "driverDistractionCapability": { "menuLength": 10, diff --git a/src/appMain/sdl_preloaded_pt.json b/src/appMain/sdl_preloaded_pt.json index dc6a615e82..50bbce6a97 100644 --- a/src/appMain/sdl_preloaded_pt.json +++ b/src/appMain/sdl_preloaded_pt.json @@ -189,6 +189,13 @@ "NONE" ] }, + "OnAppCapabilityUpdated": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, "OnAppInterfaceUnregistered": { "hmi_levels": [ "BACKGROUND", @@ -625,6 +632,7 @@ "deviceStatus", "engineOilLife", "engineTorque", + "climateData", "externalTemperature", "turnSignal", "fuelLevel", @@ -652,6 +660,7 @@ "deviceStatus", "engineOilLife", "engineTorque", + "climateData", "externalTemperature", "turnSignal", "fuelLevel", @@ -679,6 +688,7 @@ "deviceStatus", "engineOilLife", "engineTorque", + "climateData", "externalTemperature", "turnSignal", "fuelLevel", @@ -705,6 +715,7 @@ "deviceStatus", "engineOilLife", "engineTorque", + "climateData", "externalTemperature", "turnSignal", "fuelLevel", @@ -1650,6 +1661,7 @@ "rpcs": { "CreateWindow": { "hmi_levels": [ + "NONE", "BACKGROUND", "FULL", "LIMITED" @@ -1657,6 +1669,7 @@ }, "DeleteWindow": { "hmi_levels": [ + "NONE", "BACKGROUND", "FULL", "LIMITED" @@ -3480,12 +3493,71 @@ "since": "5.0" }, { + "name": "climateData", + "params": [ + { + "name": "externalTemperature", + "key": "OEM_REF_EXT_TEMP", + "params": [ + { + "name": "unit", + "key": "OEM_REF_EXT_TEMP_UNIT", + "type": "TemperatureUnit", + "mandatory": true + }, + { + "name": "value", + "key": "OEM_REF_EXT_TEMP_VALUE", + "type": "Float", + "mandatory": true + } + ], + "type": "Struct", + "mandatory": false + }, + { + "name": "cabinTemperature", + "key": "OEM_REF_CABIN_TEMP", + "params": [ + { + "name": "unit", + "key": "OEM_REF_CABIN_TEMP_VALUE", + "type": "TemperatureUnit", + "mandatory": true + }, + { + "name": "value", + "key": "OEM_REF_CABIN_TEMP_VALUE", + "type": "Float", + "mandatory": true + } + ], + "type": "Struct", + "mandatory": false + }, + { + "name": "atmosphericPressure", + "key": "OEM_REF_ATMOSPHERIC_PRESSURE", + "type": "Float", + "minvalue": 0, + "maxvalue": 2000, + "mandatory": false + } + ], + "key": "OEM_REF_CLIMATE_DATA", + "type": "Struct", + "mandatory": false, + "since": "7.1" + }, + { "name": "externalTemperature", "key": "OEM_REF_EXT_TEMP", "type": "Float", "mandatory": false, "minvalue": -40, - "maxvalue": 100 + "maxvalue": 100, + "deprecated": true, + "since": "7.1" }, { "name": "turnSignal", diff --git a/src/appMain/smartDeviceLink.ini b/src/appMain/smartDeviceLink.ini index 0b27e6263a..ed0e672552 100644 --- a/src/appMain/smartDeviceLink.ini +++ b/src/appMain/smartDeviceLink.ini @@ -185,6 +185,9 @@ ForceUnprotectedService = Non ; The PTU will be triggered in case expiration date of certificate ; then certain hours amount UpdateBeforeHours = 24 +; Security level for openssl lib according to: +; https://www.openssl.org/docs/man1.1.0/man3/SSL_CTX_get_security_level.html +SecurityLevel = 1 [Policy] EnablePolicy = true diff --git a/src/components/application_manager/include/application_manager/application.h b/src/components/application_manager/include/application_manager/application.h index 2eb4501bcc..bc966cd00c 100644 --- a/src/components/application_manager/include/application_manager/application.h +++ b/src/components/application_manager/include/application_manager/application.h @@ -374,8 +374,8 @@ class DynamicApplicationData { /* * @brief Returns true if sub menu with such name already exist */ - virtual bool IsSubMenuNameAlreadyExist(const std::string& name, - const uint32_t parent_id) = 0; + DEPRECATED virtual bool IsSubMenuNameAlreadyExist( + const std::string& name, const uint32_t parent_id) = 0; /* * @brief Adds a interaction choice set to the application @@ -529,6 +529,7 @@ class Application : public virtual InitialApplicationData, * @brief The StreamingState enum defines current streaming state */ enum class StreamingState { kStopped, kStarted, kSuspended }; + enum ApplicationRegisterState { kRegistered = 0, kWaitingForRegistration }; Application() : is_greyed_out_(false) {} @@ -669,8 +670,10 @@ class Application : public virtual InitialApplicationData, /** * @brief Wakes up streaming process for application * @param service_type Type of streaming service + * @param timer_len The amount of time in ms the timer will wait */ - virtual void WakeUpStreaming(protocol_handler::ServiceType service_type) = 0; + virtual void WakeUpStreaming(protocol_handler::ServiceType service_type, + uint32_t timer_len = 0) = 0; virtual bool is_voice_communication_supported() const = 0; virtual void set_voice_communication_supported( diff --git a/src/components/application_manager/include/application_manager/application_impl.h b/src/components/application_manager/include/application_manager/application_impl.h index 6d60699a4e..21e45b4515 100644 --- a/src/components/application_manager/include/application_manager/application_impl.h +++ b/src/components/application_manager/include/application_manager/application_impl.h @@ -142,7 +142,8 @@ class ApplicationImpl : public virtual Application, void StopStreamingForce(protocol_handler::ServiceType service_type); void StopStreaming(protocol_handler::ServiceType service_type); void SuspendStreaming(protocol_handler::ServiceType service_type); - void WakeUpStreaming(protocol_handler::ServiceType service_type); + void WakeUpStreaming(protocol_handler::ServiceType service_type, + uint32_t timer_len = 0); virtual bool is_voice_communication_supported() const; virtual void set_voice_communication_supported(bool option); 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 bedf63b954..9191a06c6b 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 @@ -700,6 +700,9 @@ class ApplicationManagerImpl void RemoveDevice( const connection_handler::DeviceHandle& device_handle) OVERRIDE; + bool GetProtocolVehicleData( + connection_handler::ProtocolVehicleData& data) OVERRIDE; + /** * @brief OnDeviceSwitchingStart is invoked on device transport switching * start (e.g. from Bluetooth to USB) and creates waiting list of applications @@ -870,6 +873,10 @@ class ApplicationManagerImpl void OnAppStreaming(uint32_t app_id, protocol_handler::ServiceType service_type, + bool state) OVERRIDE; + + void OnAppStreaming(uint32_t app_id, + protocol_handler::ServiceType service_type, const Application::StreamingState new_state) OVERRIDE; mobile_api::HMILevel::eType GetDefaultHmiLevel( @@ -1144,6 +1151,8 @@ class ApplicationManagerImpl return is_stopping_; } + bool WaitForHmiIsReady() OVERRIDE; + /** * @brief ProcessReconnection handles reconnection flow for application on * transport switch @@ -1189,6 +1198,11 @@ class ApplicationManagerImpl private: /** + * @brief Sets is_stopping flag to true + */ + void InitiateStopping(); + + /** * @brief Adds application to registered applications list and marks it as * registered * @param application Application that should be added to registered @@ -1615,8 +1629,8 @@ class ApplicationManagerImpl ns_smart_device_link_rpc::V1::v4_protocol_v1_2_no_extra mobile_v4_protocol_so_factory_; - std::atomic_uint32_t mobile_correlation_id_; - std::atomic_uint32_t correlation_id_; + std::atomic<uint32_t> mobile_correlation_id_; + std::atomic<uint32_t> correlation_id_; const uint32_t max_correlation_id_; std::unique_ptr<HMICapabilities> hmi_capabilities_; @@ -1645,6 +1659,9 @@ class ApplicationManagerImpl sync_primitives::Lock close_app_timer_pool_lock_; sync_primitives::Lock end_stream_timer_pool_lock_; + mutable sync_primitives::Lock wait_for_hmi_lock_; + sync_primitives::ConditionalVariable wait_for_hmi_condvar_; + StateControllerImpl state_ctrl_; std::unique_ptr<app_launch::AppLaunchData> app_launch_dto_; std::unique_ptr<app_launch::AppLaunchCtrl> app_launch_ctrl_; diff --git a/src/components/application_manager/include/application_manager/hmi_capabilities_impl.h b/src/components/application_manager/include/application_manager/hmi_capabilities_impl.h index 0bc98827c8..f646c66ca1 100644 --- a/src/components/application_manager/include/application_manager/hmi_capabilities_impl.h +++ b/src/components/application_manager/include/application_manager/hmi_capabilities_impl.h @@ -81,6 +81,10 @@ class HMICapabilitiesImpl : public HMICapabilities { const std::string& ccpu_version() const OVERRIDE; + void set_hardware_version(const std::string& hardware_version) OVERRIDE; + + const std::string& hardware_version() const OVERRIDE; + bool attenuated_supported() const OVERRIDE; void set_attenuated_supported(const bool state) OVERRIDE; @@ -476,6 +480,7 @@ class HMICapabilitiesImpl : public HMICapabilities { bool is_rc_supported_; bool is_driver_distraction_supported_; std::string ccpu_version_; + std::string hardware_version_; smart_objects::SmartObjectSPtr navigation_capability_; smart_objects::SmartObjectSPtr phone_capability_; smart_objects::SmartObjectSPtr video_streaming_capability_; diff --git a/src/components/application_manager/include/application_manager/message_helper.h b/src/components/application_manager/include/application_manager/message_helper.h index 7af9bacf27..9797442e34 100644 --- a/src/components/application_manager/include/application_manager/message_helper.h +++ b/src/components/application_manager/include/application_manager/message_helper.h @@ -75,6 +75,7 @@ struct ResetGlobalPropertiesResult { bool menu_name; bool menu_icon; bool keyboard_properties; + bool user_location; bool vr_has_been_reset; ResetGlobalPropertiesResult() @@ -84,6 +85,7 @@ struct ResetGlobalPropertiesResult { , menu_name(false) , menu_icon(false) , keyboard_properties(false) + , user_location(false) , vr_has_been_reset(false) {} bool HasUIPropertiesReset() const { @@ -93,6 +95,10 @@ struct ResetGlobalPropertiesResult { bool HasTTSPropertiesReset() const { return timeout_prompt || help_prompt; } + + bool HasRCPropertiesReset() const { + return user_location; + } }; /** @@ -1062,6 +1068,18 @@ class MessageHelper { const ResetGlobalPropertiesResult& reset_result, const ApplicationSharedPtr application); + /** + * @brief CreateRCResetGlobalPropertiesRequest Creates request + * to reset global properties for RC + * @param reset_result struct containing result of global properties reset + * procedure + * @param application application for which properties are to be reset + * @return filled smart object with relevant request data + */ + static smart_objects::SmartObjectSPtr CreateRCResetGlobalPropertiesRequest( + const ResetGlobalPropertiesResult& reset_result, + const ApplicationSharedPtr application); + static smart_objects::SmartObject CreateAppServiceCapabilities( std::vector<smart_objects::SmartObject>& all_services); 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 61b228d4f8..0a815b4c5b 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 @@ -386,10 +386,14 @@ class PolicyHandler : public PolicyHandlerInterface, const std::string& wers_country_code, const std::string& language) OVERRIDE; + void OnHardwareVersionReceived(const std::string& hardware_version) OVERRIDE; + void SetPreloadedPtFlag(const bool is_preloaded) OVERRIDE; std::string GetCCPUVersionFromPT() const OVERRIDE; + std::string GetHardwareVersionFromPT() const OVERRIDE; + /** * @brief Sends GetVehicleData request in case when Vechicle info is ready. */ diff --git a/src/components/application_manager/include/application_manager/smart_object_keys.h b/src/components/application_manager/include/application_manager/smart_object_keys.h index bb5e08f6e2..5572dfd55d 100644 --- a/src/components/application_manager/include/application_manager/smart_object_keys.h +++ b/src/components/application_manager/include/application_manager/smart_object_keys.h @@ -230,6 +230,8 @@ extern const char* policy_type; extern const char* property; extern const char* displays; extern const char* seat_location; +extern const char* app_capability; +extern const char* app_capability_type; // PutFile extern const char* sync_file_name; @@ -299,6 +301,7 @@ extern const char* fuel_level_state; extern const char* instant_fuel_consumption; extern const char* fuel_range; extern const char* cloud_app_vehicle_id; +extern const char* climate_data; extern const char* external_temp; extern const char* turn_signal; extern const char* vin; @@ -339,6 +342,7 @@ extern const char* video_streaming; extern const char* remote_control; extern const char* sdl_version; extern const char* system_software_version; +extern const char* system_hardware_version; extern const char* priority; extern const char* engine_oil_life; extern const char* oem_custom_data_type; @@ -484,6 +488,7 @@ extern const char* const haptic_spatial_data_supported; extern const char* const diagonal_screen_size; extern const char* const pixel_per_inch; extern const char* const scale; +extern const char* const additional_video_streaming_capabilities; extern const char* const haptic_rect_data; extern const char* const rect; extern const char* const x; @@ -589,6 +594,8 @@ extern const char* method_name; extern const char* keyboard_layout; extern const char* limited_character_list; extern const char* auto_complete_list; +extern const char* mask_input_characters; +extern const char* custom_keys; extern const char* file; extern const char* file_name; extern const char* retry; @@ -626,6 +633,9 @@ extern const char* image_capabilities; extern const char* display_type; extern const char* display_name; extern const char* text_fields; +extern const char* keyboard_capabilities; +extern const char* supported_keyboards; +extern const char* num_configurable_keys; extern const char* media_clock_formats; extern const char* graphic_supported; extern const char* image_fields; diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/get_interior_vehicle_data_request.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/get_interior_vehicle_data_request.cc index 8d3a3d796e..c3b0a7d4a5 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/get_interior_vehicle_data_request.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/get_interior_vehicle_data_request.cc @@ -284,10 +284,8 @@ void GetInteriorVehicleDataRequest::on_event( [message_params::kModuleData][data_mapping(module_type)]; interior_data_cache_.Add(module, module_data); } - } else { - hmi_response[app_mngr::strings::msg_params].erase( - message_params::kIsSubscribed); } + std::string response_info; GetInfo(hmi_response, response_info); SetResourceState(ModuleType(), ResourceState::FREE); @@ -295,7 +293,7 @@ void GetInteriorVehicleDataRequest::on_event( SendResponse(result, result_code, response_info.c_str(), - &hmi_response[app_mngr::strings::msg_params]); + result ? &hmi_response[app_mngr::strings::msg_params] : nullptr); } GetInteriorVehicleDataRequest::~GetInteriorVehicleDataRequest() {} diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/get_interior_vehicle_data_request_test.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/get_interior_vehicle_data_request_test.cc index 20f9c27912..fdfa3ea03a 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/get_interior_vehicle_data_request_test.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/get_interior_vehicle_data_request_test.cc @@ -734,6 +734,8 @@ TEST_F(GetInteriorVehicleDataRequestTest, available_hd_chanels[1] = chanel2_index; available_hd_chanels[2] = chanel3_index; + msg_params[message_params::kModuleData][message_params::kModuleId] = + kModuleId; msg_params[message_params::kModuleData][message_params::kRadioControlData] [message_params::kAvailableHdChannels] = available_hd_chanels; @@ -792,6 +794,8 @@ TEST_F(GetInteriorVehicleDataRequestTest, smart_objects::SmartObject(smart_objects::SmartType_Boolean); climate_control_data = true; + msg_params[message_params::kModuleData][message_params::kModuleId] = + kModuleId; msg_params[message_params::kModuleData][message_params::kClimateControlData] [message_params::kClimateEnableAvailable] = climate_control_data; diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/CMakeLists.txt b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/CMakeLists.txt index a03b34d742..67a178893c 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/CMakeLists.txt +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/CMakeLists.txt @@ -28,7 +28,10 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -include_directories(include) +include_directories( + include + ${CMAKE_CURRENT_SOURCE_DIR}/include/sdl_rpc_plugin +) set (COMMANDS_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/commands diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/bc_on_app_capability_updated_notification.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/bc_on_app_capability_updated_notification.h new file mode 100644 index 0000000000..f4883cecaf --- /dev/null +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/bc_on_app_capability_updated_notification.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2020, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_HMI_BC_ON_APP_CAPABILITY_UPDATED_NOTIFICATION_H_ +#define SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_HMI_BC_ON_APP_CAPABILITY_UPDATED_NOTIFICATION_H_ + +#include "application_manager/commands/notification_to_hmi.h" + +namespace sdl_rpc_plugin { +namespace app_mngr = application_manager; + +namespace commands { + +class BCOnAppCapabilityUpdatedNotification + : public app_mngr::commands::NotificationToHMI { + public: + BCOnAppCapabilityUpdatedNotification( + const app_mngr::commands::MessageSharedPtr& message, + app_mngr::ApplicationManager& application_manager, + app_mngr::rpc_service::RPCService& rpc_service, + app_mngr::HMICapabilities& hmi_capabilities, + policy::PolicyHandlerInterface& policy_handle); + + ~BCOnAppCapabilityUpdatedNotification() OVERRIDE; + + void Run() OVERRIDE; + + private: + DISALLOW_COPY_AND_ASSIGN(BCOnAppCapabilityUpdatedNotification); +}; + +} // namespace commands +} // namespace sdl_rpc_plugin + +#endif // SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_HMI_BC_ON_APP_CAPABILITY_UPDATED_NOTIFICATION_H_ diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/get_system_info_response.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/get_system_info_response.h index 2d3c40c3f3..5254d641de 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/get_system_info_response.h +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/get_system_info_response.h @@ -45,6 +45,7 @@ struct SystemInfo { std::string ccpu_version; std::string wers_country_code; std::string language; + std::string hardware_version; }; /** diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/navi_is_ready_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/navi_is_ready_request.h index 17d4eb483f..d2bda320a3 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/navi_is_ready_request.h +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/navi_is_ready_request.h @@ -72,6 +72,8 @@ class NaviIsReadyRequest : public app_mngr::commands::RequestToHMI, **/ void on_event(const app_mngr::event_engine::Event& event) OVERRIDE; + void onTimeOut() OVERRIDE; + private: DISALLOW_COPY_AND_ASSIGN(NaviIsReadyRequest); }; diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/on_bc_system_capability_updated_notification_from_hmi.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/on_bc_system_capability_updated_notification_from_hmi.h index 39b5c3aee3..41b5846a46 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/on_bc_system_capability_updated_notification_from_hmi.h +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/on_bc_system_capability_updated_notification_from_hmi.h @@ -87,6 +87,18 @@ class OnBCSystemCapabilityUpdatedNotificationFromHMI ProcessSystemDisplayCapabilitiesResult ProcessSystemDisplayCapabilities( const smart_objects::SmartObject& display_capabilities); + /** + * @brief ProcessVideoStreamingCapability processes provided video + * streaming capabilities according to its structure + * @param system_capability capabilities to process + * @return true if video streaming capabilities have been processed + * properly, otherwise returns false + */ + bool ProcessVideoStreamingCapability( + const smart_objects::SmartObject& system_capability); + + void RemoveAppIdFromNotification(); + DISALLOW_COPY_AND_ASSIGN(OnBCSystemCapabilityUpdatedNotificationFromHMI); }; diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/update_device_list_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/update_device_list_request.h index db4f265a9f..ed89bc73ec 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/update_device_list_request.h +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/update_device_list_request.h @@ -46,8 +46,7 @@ namespace commands { /** * @brief UpdateDeviceListRequest command class **/ -class UpdateDeviceListRequest : public app_mngr::commands::RequestToHMI, - public app_mngr::event_engine::EventObserver { +class UpdateDeviceListRequest : public app_mngr::commands::RequestToHMI { public: /** * @brief UpdateDeviceListRequest class constructor @@ -70,23 +69,7 @@ class UpdateDeviceListRequest : public app_mngr::commands::RequestToHMI, **/ virtual void Run(); - /** - * @brief Interface method that is called whenever new event received - * Need to observe OnHMIReady event, to send UpdateDeviceListRequest - * when HMI will be ready - * @param event The received event - */ - virtual void on_event(const app_mngr::event_engine::Event& event); - - /** - * @brief Need to stop execution StopMethod if HMI did not started - */ - virtual bool CleanUp(); - private: - sync_primitives::Lock wait_hmi_lock; - sync_primitives::ConditionalVariable termination_condition_; - DISALLOW_COPY_AND_ASSIGN(UpdateDeviceListRequest); }; diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/add_command_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/add_command_request.h index 8cac0d686d..6ccd57947c 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/add_command_request.h +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/add_command_request.h @@ -91,16 +91,6 @@ class AddCommandRequest : public app_mngr::commands::CommandRequestImpl { private: /* - * @brief Check if command name doesn't exist in application - * Please see SDLAQ-CRS-407 for more information - * - * @param app Mobile application - * - * @return TRUE on success, otherwise FALSE - */ - bool CheckCommandName(app_mngr::ApplicationConstSharedPtr app); - - /* * @brief Check if command VR synonyms doesn't exist in application commands * Please see SDLAQ-CRS-407 for more information * diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/create_interaction_choice_set_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/create_interaction_choice_set_request.h index a1bc866347..aba2ce3be5 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/create_interaction_choice_set_request.h +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/create_interaction_choice_set_request.h @@ -162,56 +162,6 @@ class CreateInteractionChoiceSetRequest app_mngr::ApplicationConstSharedPtr app); /* - * @brief Predicate for using with CheckChoiceSet method to compare choice ID - *param - * - * return TRUE if there is coincidence of choice ID, otherwise FALSE - */ - struct CoincidencePredicateChoiceID { - CoincidencePredicateChoiceID(const uint32_t newItem) : newItem_(newItem) {} - - bool operator()(smart_objects::SmartObject obj) { - return obj[app_mngr::strings::choice_id].asUInt() == newItem_; - } - - const uint32_t newItem_; - }; - - /* - * @brief Predicate for using with CheckChoiceSet method to compare menu name - *param - * - * return TRUE if there is coincidence of menu name, otherwise FALSE - */ - struct CoincidencePredicateMenuName { - CoincidencePredicateMenuName(const std::string& newItem) - : newItem_(newItem) {} - - bool operator()(smart_objects::SmartObject obj) { - return obj[app_mngr::strings::menu_name].asString() == newItem_; - } - - const std::string& newItem_; - }; - - /* - * @brief Predicate for using with CheckChoiceSet method to compare VR - *commands param - * - * return TRUE if there is coincidence of VR commands, otherwise FALSE - */ - struct CoincidencePredicateVRCommands { - CoincidencePredicateVRCommands(const smart_objects::SmartObject& newItem) - : newItem_(newItem) {} - - bool operator()(smart_objects::SmartObject obj) { - return compareStr(obj, newItem_); - } - - const smart_objects::SmartObject& newItem_; - }; - - /* * @brief Checks if incoming choice set doesn't has similar VR synonyms. * * @param choice1 Choice to compare diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/on_app_capability_updated_notification.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/on_app_capability_updated_notification.h new file mode 100644 index 0000000000..64e16f57be --- /dev/null +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/on_app_capability_updated_notification.h @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2020, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_MOBILE_ON_APP_CAPABILITY_UPDATED_NOTIFICATION_H_ +#define SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_MOBILE_ON_APP_CAPABILITY_UPDATED_NOTIFICATION_H_ + +#include "application_manager/commands/command_notification_from_mobile_impl.h" +#include "utils/macro.h" + +namespace sdl_rpc_plugin { +namespace commands { +namespace mobile { + +namespace app_mngr = application_manager; +class OnAppCapabilityUpdatedNotification + : public app_mngr::commands::CommandNotificationFromMobileImpl { + public: + /** + * @brief OnAppPermissionChangedNotification class constructor + * @param message Incoming SmartObject message + * @param application_manager Reference to the instance of the Application + *Manager + * @param rpc_service Reference to the instance of the RPCService + * @param hmi_capabilities Reference to the instance of the HMICapabilities + * @param policy_handle Reference to the instance of the PolicyHandler + **/ + OnAppCapabilityUpdatedNotification( + const app_mngr::commands::MessageSharedPtr& message, + app_mngr::ApplicationManager& application_manager, + app_mngr::rpc_service::RPCService& rpc_service, + app_mngr::HMICapabilities& hmi_capabilities, + policy::PolicyHandlerInterface& policy_handle); + + /** + * @brief OnAppPermissionChangedNotification class destructor + **/ + ~OnAppCapabilityUpdatedNotification() OVERRIDE; + + /** + * @brief Execute command + **/ + void Run() OVERRIDE; + + private: + DISALLOW_COPY_AND_ASSIGN(OnAppCapabilityUpdatedNotification); +}; + +} // namespace mobile +} // namespace commands +} // namespace sdl_rpc_plugin + +#endif // SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_MOBILE_ON_APP_CAPABILITY_UPDATED_NOTIFICATION_H_ diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/perform_interaction_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/perform_interaction_request.h index 9d14b248b6..88182a0b8e 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/perform_interaction_request.h +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/perform_interaction_request.h @@ -162,16 +162,6 @@ class PerformInteractionRequest void SendUIShowVRHelpRequest(app_mngr::ApplicationSharedPtr const app); /* - * @brief Checks if incoming choice set doesn't has similar menu names. - * - * @param app_id Application ID - * - * return Return TRUE if there are no similar menu names in choice set, - * otherwise FALSE - */ - bool CheckChoiceSetMenuNames(app_mngr::ApplicationSharedPtr const app); - - /* * @brief Checks if incoming choice set doesn't has similar VR synonyms. * * @param app_id Application ID 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 fae8f5eeb7..ae52caf0f7 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 @@ -261,12 +261,6 @@ class RegisterAppInterfaceRequest const smart_objects::SmartObject& message); /** - * @brief WaitForHMIIsReady blocking function. Waits for HMI be ready for - * requests processing - */ - void WaitForHMIIsReady(); - - /** * @brief FillApplicationParams set app application attributes from the RAI * request * @param application applicaiton to fill params diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/set_global_properties_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/set_global_properties_request.h index 190cb07459..fbf3056e58 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/set_global_properties_request.h +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/set_global_properties_request.h @@ -203,7 +203,30 @@ class SetGlobalPropertiesRequest */ bool IsWhiteSpaceExist(); - /* + /** + * @brief helps to determine layout of interest. Returns keyboard layout, + * mentioned in current request. If not, returns saved keyboard layout for + * current app. If such layout wasn't saved, returns default keyboard layout + * (QWERTY) + * @return KeyboardLayout enum value + */ + hmi_apis::Common_KeyboardLayout::eType GetKeyboardLayout() const; + + /** + * @brief Returns allowed number of configurable keys for certain layout + * @return allowed number of configurable keys, if provided, and zero + * otherwise + */ + uint32_t GetAllowedNumberOfConfigurableKeys() const; + + /** + * @brief Checks provided custom keys against capabilities. + * @return true if the specified keyboard layout supports the number of + * custom keys provided. + */ + bool ValidateCustomKeys() const; + + /** * @brief Prepare result code and result for sending to mobile application * @param result_code contains result code for sending to mobile application * @param info contains info for sending to mobile applicaion diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/bc_on_app_capability_updated_notification.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/bc_on_app_capability_updated_notification.cc new file mode 100644 index 0000000000..a5f2137136 --- /dev/null +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/bc_on_app_capability_updated_notification.cc @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2020, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "sdl_rpc_plugin/commands/hmi/bc_on_app_capability_updated_notification.h" + +namespace sdl_rpc_plugin { +namespace app_mngr = application_manager; + +namespace commands { + +SDL_CREATE_LOG_VARIABLE("Commands") + +BCOnAppCapabilityUpdatedNotification::BCOnAppCapabilityUpdatedNotification( + const application_manager::commands::MessageSharedPtr& message, + application_manager::ApplicationManager& application_manager, + application_manager::rpc_service::RPCService& rpc_service, + application_manager::HMICapabilities& hmi_capabilities, + policy::PolicyHandlerInterface& policy_handle) + : NotificationToHMI(message, + application_manager, + rpc_service, + hmi_capabilities, + policy_handle) {} + +BCOnAppCapabilityUpdatedNotification::~BCOnAppCapabilityUpdatedNotification() {} + +void BCOnAppCapabilityUpdatedNotification::Run() { + SDL_LOG_AUTO_TRACE(); + + SendNotification(); +} + +} // namespace commands +} // namespace sdl_rpc_plugin diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/button_get_capabilities_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/button_get_capabilities_response.cc index 20250af222..722bfc5097 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/button_get_capabilities_response.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/button_get_capabilities_response.cc @@ -60,11 +60,10 @@ void ButtonGetCapabilitiesResponse::Run() { static_cast<hmi_apis::Common_Result::eType>( (*message_)[strings::params][hmi_response::code].asInt()); - hmi_capabilities_.UpdateRequestsRequiredForCapabilities( - hmi_apis::FunctionID::Buttons_GetCapabilities); - if (hmi_apis::Common_Result::SUCCESS != code) { SDL_LOG_ERROR("Error is returned. Capabilities won't be updated."); + hmi_capabilities_.UpdateRequestsRequiredForCapabilities( + hmi_apis::FunctionID::Buttons_GetCapabilities); return; } @@ -81,6 +80,9 @@ void ButtonGetCapabilitiesResponse::Run() { [hmi_response::preset_bank_capabilities]); } + hmi_capabilities_.UpdateRequestsRequiredForCapabilities( + hmi_apis::FunctionID::Buttons_GetCapabilities); + if (!hmi_capabilities_.SaveCachedCapabilitiesToFile( hmi_interface::buttons, sections_to_update, message_->getSchema())) { SDL_LOG_ERROR("Failed to save Buttons.GetCapabilities response to cache"); diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/get_system_info_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/get_system_info_response.cc index 8229e1978c..50fb41a551 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/get_system_info_response.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/get_system_info_response.cc @@ -59,6 +59,8 @@ void GetSystemInfoResponse::Run() { (*message_)[strings::params][hmi_response::code].asInt()); hmi_capabilities_.set_ccpu_version(policy_handler_.GetCCPUVersionFromPT()); + hmi_capabilities_.set_hardware_version( + policy_handler_.GetHardwareVersionFromPT()); if (hmi_apis::Common_Result::SUCCESS != code) { SDL_LOG_WARN("GetSystemError returns an error code " << code); @@ -72,6 +74,11 @@ void GetSystemInfoResponse::Run() { policy_handler_.OnGetSystemInfo( info.ccpu_version, info.wers_country_code, info.language); + if (!info.hardware_version.empty()) { + policy_handler_.OnHardwareVersionReceived(info.hardware_version); + hmi_capabilities_.set_hardware_version(info.hardware_version); + } + hmi_capabilities_.OnSoftwareVersionReceived(info.ccpu_version); } @@ -89,6 +96,12 @@ const SystemInfo GetSystemInfoResponse::GetSystemInfo() const { info.language = application_manager::EnumToString( static_cast<hmi_apis::Common_Language::eType>(lang_code)); + if ((*message_)[strings::msg_params].keyExists( + strings::system_hardware_version)) { + info.hardware_version = + (*message_)[strings::msg_params][strings::system_hardware_version] + .asString(); + } return info; } diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/navi_is_ready_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/navi_is_ready_request.cc index 4caa307be3..850f292972 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/navi_is_ready_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/navi_is_ready_request.cc @@ -75,6 +75,8 @@ void NaviIsReadyRequest::on_event(const event_engine::Event& event) { HMICapabilities& hmi_capabilities = hmi_capabilities_; hmi_capabilities.set_is_navi_cooperating(is_available); + hmi_capabilities_.UpdateRequestsRequiredForCapabilities( + hmi_apis::FunctionID::Navigation_IsReady); break; } default: { @@ -84,6 +86,11 @@ void NaviIsReadyRequest::on_event(const event_engine::Event& event) { } } +void NaviIsReadyRequest::onTimeOut() { + hmi_capabilities_.UpdateRequestsRequiredForCapabilities( + hmi_apis::FunctionID::Navigation_IsReady); +} + } // namespace commands } // namespace sdl_rpc_plugin diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_bc_system_capability_updated_notification_from_hmi.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_bc_system_capability_updated_notification_from_hmi.cc index 7ba330caa8..56ff20ecc5 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_bc_system_capability_updated_notification_from_hmi.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_bc_system_capability_updated_notification_from_hmi.cc @@ -34,6 +34,7 @@ #include "application_manager/display_capabilities_builder.h" #include "application_manager/message_helper.h" +#include "extensions/system_capability_app_extension.h" #include "interfaces/HMI_API.h" #include "interfaces/MOBILE_API.h" @@ -84,11 +85,7 @@ OnBCSystemCapabilityUpdatedNotificationFromHMI:: SDL_LOG_DEBUG("Updating display capabilities for app " << app_id); app->set_display_capabilities(display_capabilities); - // Remove app_id from notification to mobile - (*message_)[strings::params][strings::connection_key] = - (*message_)[strings::msg_params][strings::app_id]; - (*message_)[strings::msg_params].erase(strings::app_id); - + RemoveAppIdFromNotification(); auto& builder = app->display_capabilities_builder(); if (builder.IsWaitingForWindowCapabilities(display_capabilities)) { SDL_LOG_DEBUG("Application is waiting for capabilities"); @@ -99,6 +96,54 @@ OnBCSystemCapabilityUpdatedNotificationFromHMI:: return ProcessSystemDisplayCapabilitiesResult::SUCCESS; } +void OnBCSystemCapabilityUpdatedNotificationFromHMI:: + RemoveAppIdFromNotification() { + (*message_)[strings::params][strings::connection_key] = + (*message_)[strings::msg_params][strings::app_id]; + (*message_)[strings::msg_params].erase(strings::app_id); +} + +bool OnBCSystemCapabilityUpdatedNotificationFromHMI:: + ProcessVideoStreamingCapability( + const smart_objects::SmartObject& system_capability) { + if (!system_capability.keyExists(strings::video_streaming_capability)) { + SDL_LOG_WARN( + "VideoStreamingCapability is absent in the notification. " + "Notification Will be ignored"); + return false; + } + if (!(*message_)[strings::msg_params].keyExists(strings::app_id)) { + SDL_LOG_WARN( + "Notification doesn't contain an application id. Will " + "be ignored"); + return false; + } + + const auto app_id = + (*message_)[strings::msg_params][strings::app_id].asUInt(); + + auto app = application_manager_.application(app_id); + if (!app) { + SDL_LOG_WARN("Application with app_id: " + << app_id + << " isn't registered. Notification will be ignored"); + return false; + } + + auto& system_capability_extension = + SystemCapabilityAppExtension::ExtractExtension(*app); + + if (!system_capability_extension.IsSubscribedTo( + mobile_apis::SystemCapabilityType::VIDEO_STREAMING)) { + SDL_LOG_WARN("The Application with app_id: " + << app_id + << " isn't subscribed to the VIDEO_STREAMING system " + "capability type. Notification will be ignored"); + return false; + } + return true; +} + void OnBCSystemCapabilityUpdatedNotificationFromHMI::Run() { SDL_LOG_AUTO_TRACE(); @@ -109,7 +154,11 @@ void OnBCSystemCapabilityUpdatedNotificationFromHMI::Run() { const auto& system_capability = (*message_)[strings::msg_params][strings::system_capability]; - switch (system_capability[strings::system_capability_type].asInt()) { + const auto system_capability_type = + static_cast<mobile_apis::SystemCapabilityType::eType>( + system_capability[strings::system_capability_type].asInt()); + + switch (system_capability_type) { case mobile_apis::SystemCapabilityType::DISPLAYS: { if (system_capability.keyExists(strings::display_capabilities)) { const auto result = ProcessSystemDisplayCapabilities( @@ -135,6 +184,14 @@ void OnBCSystemCapabilityUpdatedNotificationFromHMI::Run() { } break; } + case mobile_apis::SystemCapabilityType::VIDEO_STREAMING: { + if (!ProcessVideoStreamingCapability(system_capability)) { + return; + } + RemoveAppIdFromNotification(); + break; + } + default: { SDL_LOG_ERROR("Unknown system capability type received"); } } SendNotificationToMobile(message_); diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/rc_get_capabilities_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/rc_get_capabilities_response.cc index 10507a516f..bd5da04cb3 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/rc_get_capabilities_response.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/rc_get_capabilities_response.cc @@ -58,11 +58,10 @@ void RCGetCapabilitiesResponse::Run() { const auto result_code = static_cast<hmi_apis::Common_Result::eType>( (*message_)[strings::params][hmi_response::code].asInt()); - hmi_capabilities_.UpdateRequestsRequiredForCapabilities( - hmi_apis::FunctionID::RC_GetCapabilities); - if (hmi_apis::Common_Result::SUCCESS != result_code) { SDL_LOG_DEBUG("Request was not successful. Don't change HMI capabilities"); + hmi_capabilities_.UpdateRequestsRequiredForCapabilities( + hmi_apis::FunctionID::RC_GetCapabilities); return; } @@ -88,6 +87,9 @@ void RCGetCapabilitiesResponse::Run() { hmi_capabilities_.set_rc_supported(rc_capability_exists); + hmi_capabilities_.UpdateRequestsRequiredForCapabilities( + hmi_apis::FunctionID::RC_GetCapabilities); + if (!hmi_capabilities_.SaveCachedCapabilitiesToFile( hmi_interface::rc, sections_to_update, message_->getSchema())) { SDL_LOG_ERROR("Failed to save RC.GetCapabilities response to cache"); diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/rc_is_ready_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/rc_is_ready_request.cc index c9a9af87fb..3d31953474 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/rc_is_ready_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/rc_is_ready_request.cc @@ -79,6 +79,8 @@ void RCIsReadyRequest::on_event(const event_engine::Event& event) { if (!is_available) { hmi_capabilities.set_rc_supported(false); } + hmi_capabilities_.UpdateRequestsRequiredForCapabilities( + hmi_apis::FunctionID::RC_IsReady); if (!app_mngr::commands::CheckAvailabilityHMIInterfaces( application_manager_, HmiInterfaces::HMI_INTERFACE_RC)) { @@ -99,6 +101,8 @@ void RCIsReadyRequest::on_event(const event_engine::Event& event) { void RCIsReadyRequest::onTimeOut() { // Note(dtrunov): According to new requirment APPLINK-27956 + hmi_capabilities_.UpdateRequestsRequiredForCapabilities( + hmi_apis::FunctionID::RC_IsReady); RequestInterfaceCapabilities(hmi_interface::rc); } diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_capabilities_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_capabilities_response.cc index 167966e55b..10709bf94d 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_capabilities_response.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_capabilities_response.cc @@ -57,11 +57,10 @@ void TTSGetCapabilitiesResponse::Run() { const auto result_code = static_cast<hmi_apis::Common_Result::eType>( (*message_)[strings::params][hmi_response::code].asInt()); - hmi_capabilities_.UpdateRequestsRequiredForCapabilities( - hmi_apis::FunctionID::TTS_GetCapabilities); - if (hmi_apis::Common_Result::SUCCESS != result_code) { SDL_LOG_DEBUG("Request was not successful. Don't change HMI capabilities"); + hmi_capabilities_.UpdateRequestsRequiredForCapabilities( + hmi_apis::FunctionID::TTS_GetCapabilities); return; } @@ -80,6 +79,9 @@ void TTSGetCapabilitiesResponse::Run() { [hmi_response::prerecorded_speech_capabilities]); } + hmi_capabilities_.UpdateRequestsRequiredForCapabilities( + hmi_apis::FunctionID::TTS_GetCapabilities); + if (!hmi_capabilities_.SaveCachedCapabilitiesToFile( hmi_interface::tts, sections_to_update, message_->getSchema())) { SDL_LOG_ERROR("Failed to save TTS.GetCapabilities response to cache"); diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_language_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_language_response.cc index 2b14bea681..8b708dda01 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_language_response.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_language_response.cc @@ -61,11 +61,10 @@ void TTSGetLanguageResponse::Run() { const Common_Result::eType result_code = static_cast<Common_Result::eType>( (*message_)[strings::params][hmi_response::code].asInt()); - hmi_capabilities_.UpdateRequestsRequiredForCapabilities( - hmi_apis::FunctionID::TTS_GetLanguage); - if (Common_Result::SUCCESS != result_code) { SDL_LOG_DEBUG("Request was not successful. Don't change HMI capabilities"); + hmi_capabilities_.UpdateRequestsRequiredForCapabilities( + hmi_apis::FunctionID::TTS_GetLanguage); return; } @@ -79,6 +78,9 @@ void TTSGetLanguageResponse::Run() { hmi_capabilities_.set_active_tts_language(language); + hmi_capabilities_.UpdateRequestsRequiredForCapabilities( + hmi_apis::FunctionID::TTS_GetLanguage); + std::vector<std::string> sections_to_update{hmi_response::language}; if (!hmi_capabilities_.SaveCachedCapabilitiesToFile( hmi_interface::tts, sections_to_update, message_->getSchema())) { diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_supported_languages_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_supported_languages_response.cc index 6b074005b2..71ecd9d4da 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_supported_languages_response.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_supported_languages_response.cc @@ -61,17 +61,19 @@ void TTSGetSupportedLanguagesResponse::Run() { static_cast<hmi_apis::Common_Result::eType>( (*message_)[strings::params][hmi_response::code].asInt()); - hmi_capabilities_.UpdateRequestsRequiredForCapabilities( - hmi_apis::FunctionID::TTS_GetSupportedLanguages); - if (hmi_apis::Common_Result::SUCCESS != code) { SDL_LOG_DEBUG("Request was not successful. Don't change HMI capabilities"); + hmi_capabilities_.UpdateRequestsRequiredForCapabilities( + hmi_apis::FunctionID::TTS_GetSupportedLanguages); return; } hmi_capabilities_.set_tts_supported_languages( (*message_)[strings::msg_params][hmi_response::languages]); + hmi_capabilities_.UpdateRequestsRequiredForCapabilities( + hmi_apis::FunctionID::TTS_GetSupportedLanguages); + std::vector<std::string> sections_to_update{hmi_response::languages}; if (!hmi_capabilities_.SaveCachedCapabilitiesToFile( hmi_interface::tts, sections_to_update, message_->getSchema())) { diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_is_ready_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_is_ready_request.cc index 1f1f3e7eab..5ff7bc5a50 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_is_ready_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_is_ready_request.cc @@ -73,6 +73,8 @@ void TTSIsReadyRequest::on_event(const event_engine::Event& event) { application_manager_, message, HmiInterfaces::HMI_INTERFACE_TTS); HMICapabilities& hmi_capabilities = hmi_capabilities_; hmi_capabilities.set_is_tts_cooperating(is_available); + hmi_capabilities_.UpdateRequestsRequiredForCapabilities( + hmi_apis::FunctionID::TTS_IsReady); if (!app_mngr::commands::CheckAvailabilityHMIInterfaces( application_manager_, HmiInterfaces::HMI_INTERFACE_TTS)) { UpdateRequiredInterfaceCapabilitiesRequests(hmi_interface::tts); @@ -92,6 +94,8 @@ void TTSIsReadyRequest::on_event(const event_engine::Event& event) { void TTSIsReadyRequest::onTimeOut() { // Note(dtrunov): According to new requirment APPLINK-27956 + hmi_capabilities_.UpdateRequestsRequiredForCapabilities( + hmi_apis::FunctionID::TTS_IsReady); RequestInterfaceCapabilities(hmi_interface::tts); } } // namespace commands diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_capabilities_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_capabilities_response.cc index 31dda22709..45c5f59326 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_capabilities_response.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_capabilities_response.cc @@ -58,11 +58,10 @@ void UIGetCapabilitiesResponse::Run() { const auto result_code = static_cast<hmi_apis::Common_Result::eType>( (*message_)[strings::params][hmi_response::code].asInt()); - hmi_capabilities_.UpdateRequestsRequiredForCapabilities( - hmi_apis::FunctionID::UI_GetCapabilities); - if (hmi_apis::Common_Result::SUCCESS != result_code) { SDL_LOG_DEBUG("Request was not successful. Don't change HMI capabilities"); + hmi_capabilities_.UpdateRequestsRequiredForCapabilities( + hmi_apis::FunctionID::UI_GetCapabilities); return; } @@ -165,6 +164,9 @@ void UIGetCapabilitiesResponse::Run() { msg_params[strings::pcm_stream_capabilities]); } + hmi_capabilities_.UpdateRequestsRequiredForCapabilities( + hmi_apis::FunctionID::UI_GetCapabilities); + if (!hmi_capabilities_.SaveCachedCapabilitiesToFile( hmi_interface::ui, sections_to_update, message_->getSchema())) { SDL_LOG_ERROR("Failed to save UI.GetCapabilities response to cache"); diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_language_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_language_response.cc index ffeec025be..9bae80f48e 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_language_response.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_language_response.cc @@ -61,11 +61,10 @@ void UIGetLanguageResponse::Run() { const Common_Result::eType result_code = static_cast<Common_Result::eType>( (*message_)[strings::params][hmi_response::code].asInt()); - hmi_capabilities_.UpdateRequestsRequiredForCapabilities( - hmi_apis::FunctionID::UI_GetLanguage); - if (Common_Result::SUCCESS != result_code) { SDL_LOG_DEBUG("Request was not successful. Don't change HMI capabilities"); + hmi_capabilities_.UpdateRequestsRequiredForCapabilities( + hmi_apis::FunctionID::UI_GetLanguage); return; } @@ -79,6 +78,9 @@ void UIGetLanguageResponse::Run() { hmi_capabilities_.set_active_ui_language(language); + hmi_capabilities_.UpdateRequestsRequiredForCapabilities( + hmi_apis::FunctionID::UI_GetLanguage); + std::vector<std::string> sections_to_update{hmi_response::language}; if (!hmi_capabilities_.SaveCachedCapabilitiesToFile( hmi_interface::ui, sections_to_update, message_->getSchema())) { diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_supported_languages_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_supported_languages_response.cc index 20606294ae..e3d6a979ba 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_supported_languages_response.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_supported_languages_response.cc @@ -61,17 +61,19 @@ void UIGetSupportedLanguagesResponse::Run() { static_cast<hmi_apis::Common_Result::eType>( (*message_)[strings::params][hmi_response::code].asInt()); - hmi_capabilities_.UpdateRequestsRequiredForCapabilities( - hmi_apis::FunctionID::UI_GetSupportedLanguages); - if (hmi_apis::Common_Result::SUCCESS != code) { SDL_LOG_DEBUG("Request was not successful. Don't change HMI capabilities"); + hmi_capabilities_.UpdateRequestsRequiredForCapabilities( + hmi_apis::FunctionID::UI_GetSupportedLanguages); return; } hmi_capabilities_.set_ui_supported_languages( (*message_)[strings::msg_params][hmi_response::languages]); + hmi_capabilities_.UpdateRequestsRequiredForCapabilities( + hmi_apis::FunctionID::UI_GetSupportedLanguages); + std::vector<std::string> sections_to_update{hmi_response::languages}; if (!hmi_capabilities_.SaveCachedCapabilitiesToFile( hmi_interface::ui, sections_to_update, message_->getSchema())) { diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_is_ready_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_is_ready_request.cc index d020972ce6..f3da33c5b5 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_is_ready_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_is_ready_request.cc @@ -72,6 +72,8 @@ void UIIsReadyRequest::on_event(const event_engine::Event& event) { application_manager_, message, HmiInterfaces::HMI_INTERFACE_UI); HMICapabilities& hmi_capabilities = hmi_capabilities_; hmi_capabilities.set_is_ui_cooperating(is_available); + hmi_capabilities_.UpdateRequestsRequiredForCapabilities( + hmi_apis::FunctionID::UI_IsReady); if (!app_mngr::commands::CheckAvailabilityHMIInterfaces( application_manager_, HmiInterfaces::HMI_INTERFACE_UI)) { UpdateRequiredInterfaceCapabilitiesRequests(hmi_interface::ui); @@ -91,6 +93,8 @@ void UIIsReadyRequest::on_event(const event_engine::Event& event) { void UIIsReadyRequest::onTimeOut() { // Note(dtrunov): According to new requirment APPLINK-27956 + hmi_capabilities_.UpdateRequestsRequiredForCapabilities( + hmi_apis::FunctionID::UI_IsReady); RequestInterfaceCapabilities(hmi_interface::ui); } diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/update_device_list_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/update_device_list_request.cc index c8aa295645..4d055564de 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/update_device_list_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/update_device_list_request.cc @@ -53,51 +53,27 @@ UpdateDeviceListRequest::UpdateDeviceListRequest( application_manager, rpc_service, hmi_capabilities, - policy_handle) - , EventObserver(application_manager_.event_dispatcher()) {} + policy_handle) {} UpdateDeviceListRequest::~UpdateDeviceListRequest() {} void UpdateDeviceListRequest::Run() { SDL_LOG_AUTO_TRACE(); - sync_primitives::AutoLock auto_lock(wait_hmi_lock); // Fix problem with SDL and HMI HTML. This problem is not actual for HMI PASA. // Flag conditional compilation for specific customer is used in order to // exclude // hit code to RTC - if (true == application_manager_.get_settings().launch_hmi()) { - if (!application_manager_.IsHMICooperating()) { - SDL_LOG_INFO("Wait for HMI Cooperation"); - subscribe_on_event(hmi_apis::FunctionID::BasicCommunication_OnReady); - termination_condition_.Wait(auto_lock); - SDL_LOG_DEBUG("HMI Cooperation OK"); + if (application_manager_.get_settings().launch_hmi()) { + SDL_LOG_INFO("Wait for HMI Cooperation"); + if (!application_manager_.WaitForHmiIsReady()) { + SDL_LOG_ERROR("HMI is not ready"); + return; } - } - - SendRequest(); -} -void UpdateDeviceListRequest::on_event(const event_engine::Event& event) { - SDL_LOG_AUTO_TRACE(); - sync_primitives::AutoLock auto_lock(wait_hmi_lock); - switch (event.id()) { - case hmi_apis::FunctionID::BasicCommunication_OnReady: { - SDL_LOG_INFO("received OnReady"); - unsubscribe_from_event(hmi_apis::FunctionID::BasicCommunication_OnReady); - termination_condition_.Broadcast(); - break; - }; - default: { - SDL_LOG_ERROR("Unknown event " << event.id()); - break; - }; + SDL_LOG_DEBUG("HMI Cooperation is OK"); } -} -bool UpdateDeviceListRequest::CleanUp() { - sync_primitives::AutoLock auto_lock(wait_hmi_lock); - termination_condition_.Broadcast(); - return true; + SendRequest(); } } // namespace commands diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_capabilities_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_capabilities_response.cc index 315107d94a..60cb39f987 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_capabilities_response.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_capabilities_response.cc @@ -57,11 +57,10 @@ void VRGetCapabilitiesResponse::Run() { const auto result_code = static_cast<hmi_apis::Common_Result::eType>( (*message_)[strings::params][hmi_response::code].asInt()); - hmi_capabilities_.UpdateRequestsRequiredForCapabilities( - hmi_apis::FunctionID::VR_GetCapabilities); - if (hmi_apis::Common_Result::SUCCESS != result_code) { SDL_LOG_DEBUG("Request was not successful. Don't change HMI capabilities"); + hmi_capabilities_.UpdateRequestsRequiredForCapabilities( + hmi_apis::FunctionID::VR_GetCapabilities); return; } @@ -74,6 +73,9 @@ void VRGetCapabilitiesResponse::Run() { hmi_capabilities_.set_vr_capabilities(msg_params[strings::vr_capabilities]); } + hmi_capabilities_.UpdateRequestsRequiredForCapabilities( + hmi_apis::FunctionID::VR_GetCapabilities); + if (!hmi_capabilities_.SaveCachedCapabilitiesToFile( hmi_interface::vr, sections_to_update, message_->getSchema())) { SDL_LOG_ERROR("Failed to save VR.GetCapabilities response to cache"); diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_language_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_language_response.cc index e8c881f6f8..3529d9fcde 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_language_response.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_language_response.cc @@ -61,11 +61,10 @@ void VRGetLanguageResponse::Run() { const Common_Result::eType result_code = static_cast<Common_Result::eType>( (*message_)[strings::params][hmi_response::code].asInt()); - hmi_capabilities_.UpdateRequestsRequiredForCapabilities( - hmi_apis::FunctionID::VR_GetLanguage); - if (Common_Result::SUCCESS != result_code) { SDL_LOG_DEBUG("Request was not successful. Don't change HMI capabilities"); + hmi_capabilities_.UpdateRequestsRequiredForCapabilities( + hmi_apis::FunctionID::VR_GetLanguage); return; } @@ -79,6 +78,9 @@ void VRGetLanguageResponse::Run() { hmi_capabilities_.set_active_vr_language(language); + hmi_capabilities_.UpdateRequestsRequiredForCapabilities( + hmi_apis::FunctionID::VR_GetLanguage); + std::vector<std::string> sections_to_update{hmi_response::language}; if (!hmi_capabilities_.SaveCachedCapabilitiesToFile( hmi_interface::vr, sections_to_update, message_->getSchema())) { diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_supported_languages_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_supported_languages_response.cc index 72278fcddd..7b234befbe 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_supported_languages_response.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_supported_languages_response.cc @@ -62,20 +62,24 @@ void VRGetSupportedLanguagesResponse::Run() { static_cast<hmi_apis::Common_Result::eType>( (*message_)[strings::params][hmi_response::code].asInt()); + if (hmi_apis::Common_Result::SUCCESS != code) { + SDL_LOG_DEBUG("Request was not successful. Don't change HMI capabilities"); + hmi_capabilities_.UpdateRequestsRequiredForCapabilities( + hmi_apis::FunctionID::VR_GetSupportedLanguages); + return; + } + + HMICapabilities& hmi_capabilities = hmi_capabilities_; + hmi_capabilities.set_vr_supported_languages( + (*message_)[strings::msg_params][hmi_response::languages]); + hmi_capabilities_.UpdateRequestsRequiredForCapabilities( hmi_apis::FunctionID::VR_GetSupportedLanguages); - if (hmi_apis::Common_Result::SUCCESS == code) { - HMICapabilities& hmi_capabilities = hmi_capabilities_; - hmi_capabilities.set_vr_supported_languages( - (*message_)[strings::msg_params][hmi_response::languages]); - - std::vector<std::string> sections_to_update{hmi_response::languages}; - if (!hmi_capabilities_.SaveCachedCapabilitiesToFile( - hmi_interface::vr, sections_to_update, message_->getSchema())) { - SDL_LOG_ERROR( - "Failed to save VR.GetSupportedLanguages response to cache"); - } + std::vector<std::string> sections_to_update{hmi_response::languages}; + if (!hmi_capabilities_.SaveCachedCapabilitiesToFile( + hmi_interface::vr, sections_to_update, message_->getSchema())) { + SDL_LOG_ERROR("Failed to save VR.GetSupportedLanguages response to cache"); } } diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_is_ready_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_is_ready_request.cc index 303e7a6843..2efd227add 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_is_ready_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_is_ready_request.cc @@ -73,6 +73,8 @@ void VRIsReadyRequest::on_event(const event_engine::Event& event) { HMICapabilities& hmi_capabilities = hmi_capabilities_; hmi_capabilities.set_is_vr_cooperating(is_available); + hmi_capabilities_.UpdateRequestsRequiredForCapabilities( + hmi_apis::FunctionID::VR_IsReady); if (!app_mngr::commands::CheckAvailabilityHMIInterfaces( application_manager_, HmiInterfaces::HMI_INTERFACE_VR)) { UpdateRequiredInterfaceCapabilitiesRequests(hmi_interface::vr); @@ -92,6 +94,8 @@ void VRIsReadyRequest::on_event(const event_engine::Event& event) { void VRIsReadyRequest::onTimeOut() { // Note(dtrunov): According to new requirment APPLINK-27956 + hmi_capabilities_.UpdateRequestsRequiredForCapabilities( + hmi_apis::FunctionID::VR_IsReady); RequestInterfaceCapabilities(hmi_interface::vr); } diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_command_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_command_request.cc index 6717f332f8..03b0ee20fc 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_command_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_command_request.cc @@ -107,6 +107,20 @@ void AddCommandRequest::Run() { } } + if ((*message_)[strings::msg_params].keyExists(strings::secondary_image)) { + mobile_apis::Result::eType verification_result = MessageHelper::VerifyImage( + (*message_)[strings::msg_params][strings::secondary_image], + app, + application_manager_); + + if (mobile_apis::Result::INVALID_DATA == verification_result) { + SDL_LOG_ERROR("MessageHelper::VerifyImage return " + << verification_result); + SendResponse(false, verification_result); + return; + } + } + if (!((*message_)[strings::msg_params].keyExists(strings::cmd_id))) { SDL_LOG_ERROR("INVALID_DATA"); SendResponse(false, mobile_apis::Result::INVALID_DATA); @@ -127,10 +141,6 @@ void AddCommandRequest::Run() { bool data_exist = false; if ((*message_)[strings::msg_params].keyExists(strings::menu_params)) { - if (!CheckCommandName(app)) { - SendResponse(false, mobile_apis::Result::DUPLICATE_NAME); - return; - } if (((*message_)[strings::msg_params][strings::menu_params].keyExists( hmi_request::parent_id)) && (0 != (*message_)[strings::msg_params][strings::menu_params] @@ -191,6 +201,17 @@ void AddCommandRequest::Run() { (*message_)[strings::msg_params][strings::cmd_icon]; } + if (((*message_)[strings::msg_params].keyExists( + strings::secondary_image)) && + ((*message_)[strings::msg_params][strings::secondary_image].keyExists( + strings::value)) && + (0 < (*message_)[strings::msg_params][strings::secondary_image] + [strings::value] + .length())) { + ui_msg_params[strings::secondary_image] = + (*message_)[strings::msg_params][strings::secondary_image]; + } + send_ui_ = true; } @@ -220,47 +241,6 @@ void AddCommandRequest::Run() { } } -bool AddCommandRequest::CheckCommandName(ApplicationConstSharedPtr app) { - if (!app) { - return false; - } - - const DataAccessor<CommandsMap> accessor = app->commands_map(); - const CommandsMap& commands = accessor.GetData(); - CommandsMap::const_iterator i = commands.begin(); - uint32_t saved_parent_id = 0; - uint32_t parent_id = 0; - if ((*message_)[strings::msg_params][strings::menu_params].keyExists( - hmi_request::parent_id)) { - parent_id = (*message_)[strings::msg_params][strings::menu_params] - [hmi_request::parent_id] - .asUInt(); - } - - for (; commands.end() != i; ++i) { - if (!(*i->second).keyExists(strings::menu_params)) { - continue; - } - - saved_parent_id = 0; - if ((*i->second)[strings::menu_params].keyExists(hmi_request::parent_id)) { - saved_parent_id = - (*i->second)[strings::menu_params][hmi_request::parent_id].asUInt(); - } - if (((*i->second)[strings::menu_params][strings::menu_name].asString() == - (*message_)[strings::msg_params][strings::menu_params] - [strings::menu_name] - .asString()) && - (saved_parent_id == parent_id)) { - SDL_LOG_INFO( - "AddCommandRequest::CheckCommandName received" - " command name already exist in same level menu"); - return false; - } - } - return true; -} - bool AddCommandRequest::CheckCommandVRSynonym(ApplicationConstSharedPtr app) { if (!app) { return false; @@ -565,6 +545,16 @@ bool AddCommandRequest::IsWhiteSpaceExist() { return true; } } + + if ((*message_)[strings::msg_params].keyExists(strings::secondary_image)) { + str = (*message_)[strings::msg_params][strings::secondary_image] + [strings::value] + .asCharArray(); + if (!CheckSyntax(str)) { + SDL_LOG_ERROR("Invalid secondaryImage value syntax check failed"); + return true; + } + } return false; } diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_sub_menu_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_sub_menu_request.cc index e2a37f17bd..309f07e443 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_sub_menu_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_sub_menu_request.cc @@ -86,6 +86,20 @@ void AddSubMenuRequest::Run() { } } + if (received_msg_params.keyExists(strings::secondary_image)) { + verification_result = MessageHelper::VerifyImage( + received_msg_params[strings::secondary_image], + app, + application_manager_); + + if (mobile_apis::Result::INVALID_DATA == verification_result) { + SDL_LOG_ERROR("MessageHelper::VerifyImage return " + << verification_result); + SendResponse(false, verification_result); + return; + } + } + const int32_t menu_id = received_msg_params[strings::menu_id].asInt(); const auto sub_menu = app->FindSubMenu(menu_id); @@ -114,12 +128,6 @@ void AddSubMenuRequest::Run() { const std::string& menu_name = received_msg_params[strings::menu_name].asString(); - if (app->IsSubMenuNameAlreadyExist(menu_name, parent_id)) { - SDL_LOG_ERROR("Menu name " << menu_name << " is duplicated."); - SendResponse(false, mobile_apis::Result::DUPLICATE_NAME); - return; - } - if (!CheckSubMenuName()) { SDL_LOG_ERROR("Sub-menu name is not valid."); SendResponse(false, mobile_apis::Result::INVALID_DATA); @@ -148,11 +156,23 @@ void AddSubMenuRequest::Run() { if (received_msg_params.keyExists(strings::menu_icon)) { msg_params[strings::menu_icon] = received_msg_params[strings::menu_icon]; } + if (received_msg_params.keyExists(strings::secondary_image)) { + msg_params[strings::secondary_image] = + received_msg_params[strings::secondary_image]; + } msg_params[strings::menu_params][strings::menu_name] = received_msg_params[strings::menu_name]; if (received_msg_params.keyExists(strings::parent_id)) { msg_params[strings::menu_params][strings::parent_id] = parent_id; } + if (received_msg_params.keyExists(strings::secondary_text)) { + msg_params[strings::menu_params][strings::secondary_text] = + received_msg_params[strings::secondary_text]; + } + if (received_msg_params.keyExists(strings::tertiary_text)) { + msg_params[strings::menu_params][strings::tertiary_text] = + received_msg_params[strings::tertiary_text]; + } msg_params[strings::app_id] = app->app_id(); diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_maneuver_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_maneuver_request.cc index c2172d5180..8728bb4403 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_maneuver_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_maneuver_request.cc @@ -144,6 +144,7 @@ void AlertManeuverRequest::Run() { smart_objects::SmartObject msg_params = smart_objects::SmartObject(smart_objects::SmartType_Map); + msg_params[strings::app_id] = app->app_id(); msg_params[hmi_request::tts_chunks] = (*message_)[strings::msg_params][strings::tts_chunks]; msg_params[hmi_request::speak_type] = diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/get_system_capability_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/get_system_capability_request.cc index 1cd4806f7e..64eae885a8 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/get_system_capability_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/get_system_capability_request.cc @@ -204,10 +204,12 @@ void GetSystemCapabilityRequest::Run() { auto& ext = SystemCapabilityAppExtension::ExtractExtension(*app); if ((*message_)[app_mngr::strings::msg_params][strings::subscribe] .asBool() == true) { - SDL_LOG_DEBUG("Subscribe to system capability: " << response_type); + SDL_LOG_DEBUG("Subscribe to system capability: " + << response_type << " for app_id: " << app->app_id()); ext.SubscribeTo(response_type); } else { - SDL_LOG_DEBUG("Unsubscribe from system capability: " << response_type); + SDL_LOG_DEBUG("Unsubscribe from system capability: " + << response_type << " for app_id: " << app->app_id()); ext.UnsubscribeFrom(response_type); } } diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_app_capability_updated_notification.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_app_capability_updated_notification.cc new file mode 100644 index 0000000000..c04b10cbd4 --- /dev/null +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_app_capability_updated_notification.cc @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2020, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "sdl_rpc_plugin/commands/mobile/on_app_capability_updated_notification.h" + +namespace sdl_rpc_plugin { + +namespace commands { +namespace mobile { + +SDL_CREATE_LOG_VARIABLE("Commands") + +OnAppCapabilityUpdatedNotification::OnAppCapabilityUpdatedNotification( + const application_manager::commands::MessageSharedPtr& message, + app_mngr::ApplicationManager& application_manager, + app_mngr::rpc_service::RPCService& rpc_service, + app_mngr::HMICapabilities& hmi_capabilities, + policy::PolicyHandlerInterface& policy_handle) + : CommandNotificationFromMobileImpl(message, + application_manager, + rpc_service, + hmi_capabilities, + policy_handle) {} + +OnAppCapabilityUpdatedNotification::~OnAppCapabilityUpdatedNotification() {} + +void OnAppCapabilityUpdatedNotification::Run() { + SDL_LOG_AUTO_TRACE(); + app_mngr::ApplicationSharedPtr app = + application_manager_.application(connection_key()); + + if (!app) { + SDL_LOG_ERROR("No application associated with session key"); + return; + } + + (*message_)[app_mngr::strings::msg_params][app_mngr::strings::app_id] = + app->app_id(); + + SendNotificationToHMI( + hmi_apis::FunctionID::BasicCommunication_OnAppCapabilityUpdated); +} + +} // namespace mobile +} // namespace commands +} // namespace sdl_rpc_plugin diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_system_capability_updated_notification.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_system_capability_updated_notification.cc index 850aa64b5f..1f15170ffe 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_system_capability_updated_notification.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_system_capability_updated_notification.cc @@ -81,15 +81,10 @@ void OnSystemCapabilityUpdatedNotification::Run() { } break; } - case mobile_apis::SystemCapabilityType::VIDEO_STREAMING: - if (hmi_capabilities_.video_streaming_capability()) { - msg_params[strings::system_capability] - [strings::video_streaming_capability] = - *hmi_capabilities_.video_streaming_capability(); - } else { - return; - } - break; + case mobile_apis::SystemCapabilityType::VIDEO_STREAMING: { + SendNotification(); + return; + } case mobile_apis::SystemCapabilityType::APP_SERVICES: { auto all_services = application_manager_.GetAppServiceManager().GetAllServiceRecords(); @@ -200,48 +195,51 @@ void OnSystemCapabilityUpdatedNotification::Run() { for (; applications.end() != app_it; ++app_it) { const ApplicationSharedPtr app = *app_it; - if (system_capability_type == - mobile_apis::SystemCapabilityType::REMOTE_CONTROL && - !app->is_remote_control_supported()) { - SDL_LOG_WARN( - "App with connection key: " - << app->app_id() - << " was subcribed to REMOTE_CONTROL system capabilities, but " - "does not have RC permissions. Unsubscribing"); - auto& ext = SystemCapabilityAppExtension::ExtractExtension(*app); - ext.UnsubscribeFrom(system_capability_type); - continue; - } - if (mobile_apis::SystemCapabilityType::DISPLAYS == system_capability_type) { - SDL_LOG_DEBUG("Using common display capabilities"); - auto capabilities = hmi_capabilities_.system_display_capabilities(); - - auto& builder = app->display_capabilities_builder(); - if (app->is_resuming() && builder.IsWindowResumptionNeeded()) { - SDL_LOG_DEBUG("Application " - << app->app_id() - << " is resuming. Providing cached capabilities"); - auto display_caps = builder.display_capabilities(); - capabilities = display_caps; - } else if (app->display_capabilities()) { - SDL_LOG_DEBUG("Application " << app->app_id() - << " has specific display capabilities"); - const WindowID window_id = - msg_params[strings::system_capability] - [strings::display_capabilities][0] - [strings::window_capabilities][0][strings::window_id] - .asInt(); - capabilities = app->display_capabilities(window_id); - } + switch (system_capability_type) { + case mobile_apis::SystemCapabilityType::REMOTE_CONTROL: { + if (!app->is_remote_control_supported()) { + SDL_LOG_WARN("App with connection key: " + << app->app_id() + << " was subcribed to REMOTE_CONTROL system " + "capabilities, but " + "does not have RC permissions. Unsubscribing"); + auto& ext = SystemCapabilityAppExtension::ExtractExtension(*app); + ext.UnsubscribeFrom(system_capability_type); + } + } break; + + case mobile_apis::SystemCapabilityType::DISPLAYS: { + SDL_LOG_DEBUG("Using common display capabilities"); + auto capabilities = hmi_capabilities_.system_display_capabilities(); + auto& builder = app->display_capabilities_builder(); + if (app->is_resuming() && builder.IsWindowResumptionNeeded()) { + SDL_LOG_DEBUG("Application " + << app->app_id() + << " is resuming. Providing cached capabilities"); + auto display_caps = builder.display_capabilities(); + capabilities = display_caps; + } else if (app->display_capabilities()) { + SDL_LOG_DEBUG("Application " << app->app_id() + << " has specific display capabilities"); + const WindowID window_id = + msg_params[strings::system_capability] + [strings::display_capabilities][0] + [strings::window_capabilities][0][strings::window_id] + .asInt(); + capabilities = app->display_capabilities(window_id); + } - if (!capabilities) { - SDL_LOG_WARN("No available display capabilities for sending. Skipping"); - continue; - } + if (!capabilities) { + SDL_LOG_WARN( + "No available display capabilities for sending. Skipping"); + continue; + } - msg_params[strings::system_capability][strings::display_capabilities] = - *capabilities; + msg_params[strings::system_capability][strings::display_capabilities] = + *capabilities; + } break; + default: { SDL_LOG_ERROR("Unknown system capability type"); } } SDL_LOG_INFO("Sending OnSystemCapabilityUpdated " << capability_type_string diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_interaction_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_interaction_request.cc index 5d3b203afe..bb990574bd 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_interaction_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_interaction_request.cc @@ -195,8 +195,7 @@ void PerformInteractionRequest::Run() { switch (interaction_mode_) { case mobile_apis::InteractionMode::BOTH: { SDL_LOG_DEBUG("Interaction Mode: BOTH"); - if (!CheckChoiceSetVRSynonyms(app) || !CheckChoiceSetMenuNames(app) || - !CheckVrHelpItemPositions(app) || + if (!CheckChoiceSetVRSynonyms(app) || !CheckVrHelpItemPositions(app) || !CheckChoiceSetListVRCommands(app)) { return; } @@ -204,8 +203,7 @@ void PerformInteractionRequest::Run() { } case mobile_apis::InteractionMode::MANUAL_ONLY: { SDL_LOG_DEBUG("Interaction Mode: MANUAL_ONLY"); - if (!CheckChoiceSetVRSynonyms(app) || !CheckChoiceSetMenuNames(app) || - !CheckVrHelpItemPositions(app)) { + if (!CheckChoiceSetVRSynonyms(app) || !CheckVrHelpItemPositions(app)) { return; } break; @@ -683,60 +681,6 @@ void PerformInteractionRequest::SendVRPerformInteractionRequest( hmi_apis::FunctionID::VR_PerformInteraction, &msg_params, true); } -bool PerformInteractionRequest::CheckChoiceSetMenuNames( - application_manager::ApplicationSharedPtr const app) { - SDL_LOG_AUTO_TRACE(); - - smart_objects::SmartObject& choice_list = - (*message_)[strings::msg_params][strings::interaction_choice_set_id_list]; - - for (size_t i = 0; i < choice_list.length(); ++i) { - // choice_set contains SmartObject msg_params - smart_objects::SmartObject i_choice_set = - app->FindChoiceSet(choice_list[i].asInt()); - - for (size_t j = 0; j < choice_list.length(); ++j) { - smart_objects::SmartObject j_choice_set = - app->FindChoiceSet(choice_list[j].asInt()); - - if (i == j) { - // skip check the same element - continue; - } - - if ((smart_objects::SmartType_Null == i_choice_set.getType()) || - (smart_objects::SmartType_Null == j_choice_set.getType())) { - SDL_LOG_ERROR("Invalid ID"); - SendResponse(false, mobile_apis::Result::INVALID_ID); - return false; - } - - size_t ii = 0; - size_t jj = 0; - for (; ii < i_choice_set[strings::choice_set].length(); ++ii) { - for (; jj < j_choice_set[strings::choice_set].length(); ++jj) { - const std::string& ii_menu_name = - i_choice_set[strings::choice_set][ii][strings::menu_name] - .asString(); - const std::string& jj_menu_name = - j_choice_set[strings::choice_set][jj][strings::menu_name] - .asString(); - - if (ii_menu_name == jj_menu_name) { - SDL_LOG_ERROR("Choice set has duplicated menu name"); - SendResponse(false, - mobile_apis::Result::DUPLICATE_NAME, - "Choice set has duplicated menu name"); - return false; - } - } - } - } - } - - return true; -} - bool PerformInteractionRequest::CheckChoiceSetVRSynonyms( application_manager::ApplicationSharedPtr const app) { SDL_LOG_AUTO_TRACE(); @@ -1166,27 +1110,15 @@ bool PerformInteractionRequest::SetChoiceIdToResponseMsgParams( return true; } - switch (interaction_mode_) { - case mobile_apis::InteractionMode::eType::MANUAL_ONLY: - if (ui_choice_id_valid) { - msg_param[strings::trigger_source] = - mobile_apis::TriggerSource::TS_MENU; - msg_param[strings::choice_id] = ui_choice_id_received_; - } - case mobile_apis::InteractionMode::eType::VR_ONLY: - if (vr_choice_id_valid) { - msg_param[strings::trigger_source] = mobile_apis::TriggerSource::TS_VR; - msg_param[strings::choice_id] = vr_choice_id_received_; - } - default: - if (ui_choice_id_valid) { - msg_param[strings::trigger_source] = - mobile_apis::TriggerSource::TS_MENU; - msg_param[strings::choice_id] = ui_choice_id_received_; - } else if (vr_choice_id_valid) { - msg_param[strings::trigger_source] = mobile_apis::TriggerSource::TS_VR; - msg_param[strings::choice_id] = vr_choice_id_received_; - } + if (ui_choice_id_valid && + interaction_mode_ != mobile_apis::InteractionMode::eType::VR_ONLY) { + msg_param[strings::trigger_source] = mobile_apis::TriggerSource::TS_MENU; + msg_param[strings::choice_id] = ui_choice_id_received_; + } else if (vr_choice_id_valid && + interaction_mode_ != + mobile_apis::InteractionMode::eType::MANUAL_ONLY) { + msg_param[strings::trigger_source] = mobile_apis::TriggerSource::TS_VR; + msg_param[strings::choice_id] = vr_choice_id_received_; } return true; 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 6ac830c378..920805be7c 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 @@ -159,18 +159,6 @@ uint32_t RegisterAppInterfaceRequest::default_timeout() const { return 0; } -void RegisterAppInterfaceRequest::WaitForHMIIsReady() { - while (!application_manager_.IsStopping() && - !application_manager_.IsHMICooperating()) { - SDL_LOG_DEBUG("Waiting for the HMI... conn_key=" - << connection_key() << ", correlation_id=" << correlation_id() - << ", default_timeout=" << default_timeout() - << ", thread=" << pthread_self()); - sleep(1); - // TODO(DK): timer_->StartWait(1); - } -} - void RegisterAppInterfaceRequest::FillApplicationParams( ApplicationSharedPtr application) { SDL_LOG_AUTO_TRACE(); @@ -488,10 +476,8 @@ void RegisterAppInterfaceRequest::Run() { SDL_LOG_AUTO_TRACE(); SDL_LOG_DEBUG("Connection key is " << connection_key()); - WaitForHMIIsReady(); - - if (application_manager_.IsStopping()) { - SDL_LOG_WARN("The ApplicationManager is stopping!"); + if (!application_manager_.WaitForHmiIsReady()) { + SDL_LOG_WARN("Failed to wait for HMI readiness"); return; } diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/reset_global_properties_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/reset_global_properties_request.cc index 40302e51d5..f4e07d4b78 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/reset_global_properties_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/reset_global_properties_request.cc @@ -89,6 +89,10 @@ void ResetGlobalPropertiesRequest::Run() { StartAwaitForInterface(HmiInterfaces::HMI_INTERFACE_TTS); } + if (reset_global_props_result.HasRCPropertiesReset()) { + StartAwaitForInterface(HmiInterfaces::HMI_INTERFACE_RC); + } + app->set_reset_global_properties_active(true); if (reset_global_props_result.HasUIPropertiesReset()) { @@ -110,6 +114,15 @@ void ResetGlobalPropertiesRequest::Run() { SendHMIRequest( hmi_apis::FunctionID::TTS_SetGlobalProperties, msg_params.get(), true); } + + if (reset_global_props_result.HasRCPropertiesReset()) { + smart_objects::SmartObjectSPtr msg_params = + MessageHelper::CreateRCResetGlobalPropertiesRequest( + reset_global_props_result, app); + + SendHMIRequest( + hmi_apis::FunctionID::RC_SetGlobalProperties, msg_params.get(), true); + } } void ResetGlobalPropertiesRequest::on_event(const event_engine::Event& event) { diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/send_haptic_data_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/send_haptic_data_request.cc index aa5e1077ca..2b0a36cb9d 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/send_haptic_data_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/send_haptic_data_request.cc @@ -70,6 +70,7 @@ void SendHapticDataRequest::Run() { } if (app->is_navi() || app->mobile_projection_enabled()) { + msg_params[strings::app_id] = connection_key(); SendHMIRequest(hmi_apis::FunctionID::UI_SendHapticData, &msg_params, true); } else { SendResponse(false, diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_global_properties_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_global_properties_request.cc index 396763ff98..bbce4d2bb3 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_global_properties_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_global_properties_request.cc @@ -151,6 +151,17 @@ void SetGlobalPropertiesRequest::Run() { return; } + if (!ValidateCustomKeys()) { + SDL_LOG_ERROR( + "Number of customizable keys exceeds the maximum number for this " + "layout"); + SendResponse( + false, + mobile_apis::Result::INVALID_DATA, + "customKeys exceeds the number of customizable keys in this Layout"); + return; + } + // if application waits for sending ttsGlobalProperties need to remove this // application from tts_global_properties_app_list_ application_manager_.RemoveAppFromTTSGlobalPropertiesList(connection_key()); @@ -642,7 +653,53 @@ void SetGlobalPropertiesRequest::PrepareUIRequestMenuAndKeyboardData( if (is_keyboard_props_present) { out_params[hmi_request::keyboard_properties] = msg_params[hmi_request::keyboard_properties]; - app->set_keyboard_props(msg_params[hmi_request::keyboard_properties]); + smart_objects::SmartObject cached_keyboard_props( + msg_params[hmi_request::keyboard_properties]); + + if (cached_keyboard_props.keyExists(hmi_request::auto_complete_list)) { + auto auto_complete_list = + cached_keyboard_props[hmi_request::auto_complete_list].asArray(); + if (auto_complete_list && auto_complete_list->empty()) { + cached_keyboard_props.erase(hmi_request::auto_complete_list); + } + } + + auto saved_keyboard_props = app->keyboard_props(); + if (!saved_keyboard_props) { + app->set_keyboard_props(cached_keyboard_props); + return; + } + + if (!msg_params[hmi_request::keyboard_properties].keyExists( + hmi_request::keyboard_layout) && + saved_keyboard_props->keyExists(hmi_request::keyboard_layout)) { + cached_keyboard_props[hmi_request::keyboard_layout] = + static_cast<hmi_apis::Common_KeyboardLayout::eType>( + (*saved_keyboard_props)[hmi_request::keyboard_layout].asInt()); + } + + if (!msg_params[hmi_request::keyboard_properties].keyExists( + hmi_response::language) && + saved_keyboard_props->keyExists(hmi_response::language)) { + cached_keyboard_props[hmi_response::language] = + static_cast<hmi_apis::Common_Language::eType>( + (*saved_keyboard_props)[hmi_response::language].asInt()); + } + + if (!msg_params[hmi_request::keyboard_properties].keyExists( + hmi_request::auto_complete_list) && + saved_keyboard_props->keyExists(hmi_request::auto_complete_list)) { + cached_keyboard_props[hmi_request::auto_complete_list] = + (*saved_keyboard_props)[hmi_request::auto_complete_list]; + } + + if (!msg_params[hmi_request::keyboard_properties].keyExists( + hmi_request::mask_input_characters) && + saved_keyboard_props->keyExists(hmi_request::mask_input_characters)) { + cached_keyboard_props[hmi_request::mask_input_characters] = + (*saved_keyboard_props)[hmi_request::mask_input_characters]; + } + app->set_keyboard_props(cached_keyboard_props); } } @@ -820,9 +877,130 @@ bool SetGlobalPropertiesRequest::IsWhiteSpaceExist() { } } } + + if (msg_params[strings::keyboard_properties].keyExists( + hmi_request::custom_keys)) { + const smart_objects::SmartArray* custom_keys_array = + msg_params[strings::keyboard_properties][hmi_request::custom_keys] + .asArray(); + + for (auto keys : (*custom_keys_array)) { + if (!CheckSyntax(keys.asCharArray())) { + SDL_LOG_ERROR( + "Invalid keyboard_properties " + "custom_keys syntax check failed"); + return true; + } + } + } } + return false; } +hmi_apis::Common_KeyboardLayout::eType +SetGlobalPropertiesRequest::GetKeyboardLayout() const { + SDL_LOG_AUTO_TRACE(); + + const smart_objects::SmartObject& msg_params = + (*message_)[strings::msg_params]; + if (msg_params[strings::keyboard_properties].keyExists( + hmi_request::keyboard_layout)) { + return static_cast<hmi_apis::Common_KeyboardLayout::eType>( + msg_params[strings::keyboard_properties][hmi_request::keyboard_layout] + .asInt()); + } + + ApplicationSharedPtr app = application_manager_.application(connection_key()); + auto saved_keyboard_props = app->keyboard_props(); + if (saved_keyboard_props) { + if (saved_keyboard_props->keyExists(hmi_request::keyboard_layout)) { + return static_cast<hmi_apis::Common_KeyboardLayout::eType>( + (*saved_keyboard_props)[hmi_request::keyboard_layout].asInt()); + } + } + + return hmi_apis::Common_KeyboardLayout::QWERTY; +} + +uint32_t SetGlobalPropertiesRequest::GetAllowedNumberOfConfigurableKeys() + const { + SDL_LOG_AUTO_TRACE(); + + ApplicationSharedPtr app = application_manager_.application(connection_key()); + auto display_capabilities = app->display_capabilities(); + if (!display_capabilities) { + SDL_LOG_WARN("Display capabilities are not available"); + return 0; + } + + auto* window_capabilities = + (*display_capabilities)[0][strings::window_capabilities].asArray(); + + if (!window_capabilities) { + SDL_LOG_WARN("Window capabilities are not available"); + return 0; + } + + if (!(*window_capabilities)[0].keyExists( + hmi_response::keyboard_capabilities)) { + SDL_LOG_WARN("Keyboard capabilities are not available"); + return 0; + } + + if (!(*window_capabilities)[0][hmi_response::keyboard_capabilities].keyExists( + hmi_response::supported_keyboards)) { + SDL_LOG_WARN("Data about supported keyboards is not available"); + return 0; + } + + auto supported_keyboards = + (*window_capabilities)[0][hmi_response::keyboard_capabilities] + [hmi_response::supported_keyboards] + .asArray(); + + const auto requested_layout = GetKeyboardLayout(); + for (auto keyboard : (*supported_keyboards)) { + if (requested_layout == + static_cast<hmi_apis::Common_KeyboardLayout::eType>( + keyboard[hmi_request::keyboard_layout].asInt())) { + return keyboard[hmi_response::num_configurable_keys].asUInt(); + } + } + + return 0; +} + +bool SetGlobalPropertiesRequest::ValidateCustomKeys() const { + SDL_LOG_AUTO_TRACE(); + + const smart_objects::SmartObject& msg_params = + (*message_)[strings::msg_params]; + + if (!msg_params.keyExists(strings::keyboard_properties)) { + SDL_LOG_WARN("Keyboard properties are not available"); + return true; + } + + if (!msg_params[strings::keyboard_properties].keyExists( + hmi_request::custom_keys)) { + SDL_LOG_WARN("Customizable keys are not available"); + return true; + } + + auto custom_keys_array = + msg_params[strings::keyboard_properties][hmi_request::custom_keys] + .asArray(); + if (custom_keys_array) { + uint32_t requested_key_count = custom_keys_array->size(); + uint32_t allowed_key_count = GetAllowedNumberOfConfigurableKeys(); + + if (requested_key_count > allowed_key_count) { + return false; + } + } + + return true; +} } // namespace commands } // namespace sdl_rpc_plugin diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/hmi_command_factory.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/hmi_command_factory.cc index 570a4ce12e..2727c89673 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/hmi_command_factory.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/hmi_command_factory.cc @@ -173,6 +173,7 @@ #include "sdl_rpc_plugin/commands/hmi/basic_communication_on_awake_sdl.h" #include "sdl_rpc_plugin/commands/hmi/basic_communication_system_request.h" #include "sdl_rpc_plugin/commands/hmi/basic_communication_system_response.h" +#include "sdl_rpc_plugin/commands/hmi/bc_on_app_capability_updated_notification.h" #include "sdl_rpc_plugin/commands/hmi/dial_number_request.h" #include "sdl_rpc_plugin/commands/hmi/dial_number_response.h" #include "sdl_rpc_plugin/commands/hmi/navi_alert_maneuver_request.h" @@ -942,6 +943,10 @@ CommandCreator& HMICommandFactory::get_creator_factory( case hmi_apis::FunctionID::UI_OnSubtleAlertPressed: { return factory.GetCreator<commands::OnUISubtleAlertPressedNotification>(); } + case hmi_apis::FunctionID::BasicCommunication_OnAppCapabilityUpdated: { + return factory + .GetCreator<commands::BCOnAppCapabilityUpdatedNotification>(); + } default: { return factory.GetCreator<InvalidCommand>(); } } } diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/mobile_command_factory.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/mobile_command_factory.cc index 9809a11a81..0a8c342448 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/mobile_command_factory.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/mobile_command_factory.cc @@ -76,6 +76,7 @@ #include "sdl_rpc_plugin/commands/mobile/get_way_points_response.h" #include "sdl_rpc_plugin/commands/mobile/list_files_request.h" #include "sdl_rpc_plugin/commands/mobile/list_files_response.h" +#include "sdl_rpc_plugin/commands/mobile/on_app_capability_updated_notification.h" #include "sdl_rpc_plugin/commands/mobile/on_app_interface_unregistered_notification.h" #include "sdl_rpc_plugin/commands/mobile/on_audio_pass_thru_notification.h" #include "sdl_rpc_plugin/commands/mobile/on_button_event_notification.h" @@ -496,6 +497,10 @@ CommandCreator& MobileCommandFactory::get_notification_from_mobile_creator( return factory .GetCreator<commands::OnWayPointChangeNotificationFromMobile>(); } + case mobile_apis::FunctionID::OnAppCapabilityUpdatedID: { + return factory + .GetCreator<commands::mobile::OnAppCapabilityUpdatedNotification>(); + } default: {} } return factory.GetCreator<InvalidCommand>(); @@ -548,10 +553,12 @@ bool MobileCommandFactory::IsAbleToProcess( const int32_t function_id, const application_manager::commands::Command::CommandSource message_source) const { + SDL_LOG_AUTO_TRACE(); auto id = static_cast<mobile_apis::FunctionID::eType>(function_id); return get_command_creator(id, mobile_apis::messageType::INVALID_ENUM) .CanBeCreated() || - get_notification_creator(id).CanBeCreated(); + get_notification_creator(id).CanBeCreated() || + get_notification_from_mobile_creator(id).CanBeCreated(); } CommandSharedPtr MobileCommandFactory::CreateCommand( diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/sdl_rpc_plugin.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/sdl_rpc_plugin.cc index 4756c8b9a2..c5bc79f09d 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/sdl_rpc_plugin.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/sdl_rpc_plugin.cc @@ -131,14 +131,20 @@ void SDLRPCPlugin::RevertResumption(application_manager::Application& app) { pending_resumption_handler_->OnResumptionRevert(); if (application_manager_->IsAppSubscribedForWayPoints(app)) { - application_manager_->UnsubscribeAppFromWayPoints(app.app_id()); - if (!application_manager_->IsAnyAppSubscribedForWayPoints()) { + const auto subscribed_apps = + application_manager_->GetAppsSubscribedForWayPoints(); + const bool send_unsubscribe = + subscribed_apps.size() <= 1 && + application_manager_->IsSubscribedToHMIWayPoints(); + if (send_unsubscribe) { SDL_LOG_DEBUG("Send UnsubscribeWayPoints"); auto request = application_manager::MessageHelper::CreateUnsubscribeWayPointsRequest( application_manager_->GetNextHMICorrelationID()); application_manager_->GetRPCService().ManageHMICommand(request); } + application_manager_->UnsubscribeAppFromWayPoints(app.app_id(), + send_unsubscribe); } } diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/bc_on_app_capability_updated_notification_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/bc_on_app_capability_updated_notification_test.cc new file mode 100644 index 0000000000..2d875a2680 --- /dev/null +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/bc_on_app_capability_updated_notification_test.cc @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2020, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "hmi/bc_on_app_capability_updated_notification.h" + +#include "application_manager/commands/commands_test.h" +#include "gtest/gtest.h" +#include "sdl_rpc_plugin/extensions/system_capability_app_extension.h" +#include "sdl_rpc_plugin/sdl_rpc_plugin.h" + +namespace test { +namespace components { +namespace commands_test { +namespace hmi_commands_test { +namespace bc_on_app_capability_updated_notification_test { + +using sdl_rpc_plugin::commands::BCOnAppCapabilityUpdatedNotification; +using ::testing::_; + +typedef std::shared_ptr<BCOnAppCapabilityUpdatedNotification> + BCOnAppCapabilityUpdatedNotificationPtr; + +namespace strings = application_manager::strings; +namespace { +const uint32_t kConnectionKey = 1u; +} // namespace + +MATCHER_P(CheckAppCapability, app_capability, "") { + return app_capability == (*arg)[strings::msg_params][strings::app_capability]; +} + +class BCOnAppCapabilityUpdatedNotificationTest + : public CommandsTest<CommandsTestMocks::kIsNice> { + protected: + void SetUp() OVERRIDE { + message_ = CreateMessage(); + (*message_)[strings::params][strings::connection_key] = kConnectionKey; + command_ = CreateCommand<BCOnAppCapabilityUpdatedNotification>(message_); + mock_app_ = CreateMockApp(); + } + + BCOnAppCapabilityUpdatedNotificationPtr command_; + MockAppPtr mock_app_; + MessageSharedPtr message_; +}; + +TEST_F(BCOnAppCapabilityUpdatedNotificationTest, Run_SendMessageToHMI_SUCCESS) { + smart_objects::SmartObject app_capability = + smart_objects::SmartObject(smart_objects::SmartType_Map); + + app_capability[strings::app_capability_type] = + mobile_apis::AppCapabilityType::VIDEO_STREAMING; + app_capability[strings::video_streaming_capability] = + smart_objects::SmartObject(smart_objects::SmartType_Map); + + FillVideoStreamingCapability( + app_capability[strings::video_streaming_capability]); + + (*message_)[strings::msg_params][strings::app_capability] = app_capability; + + ASSERT_TRUE(command_->Init()); + + EXPECT_CALL(mock_rpc_service_, + SendMessageToHMI(CheckAppCapability(app_capability))); + command_->Run(); +} + +} // namespace bc_on_app_capability_updated_notification_test +} // namespace hmi_commands_test +} // namespace commands_test +} // namespace components +} // namespace test diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/get_system_info_response_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/get_system_info_response_test.cc index 8cdce4fa74..3e01849807 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/get_system_info_response_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/get_system_info_response_test.cc @@ -68,6 +68,7 @@ typedef NiceMock< namespace { const uint32_t kConnectionKey = 2u; const std::string ccpu_version("4.1.3.B_EB355B"); +const std::string kHardwareVersion("1.1.1.1"); const std::string wers_country_code("WAEGB"); const std::string lang_code("EN-US"); } // namespace @@ -82,14 +83,36 @@ class GetSystemInfoResponseTest (*command_msg)[strings::msg_params]["ccpu_version"] = ccpu_version; (*command_msg)[strings::msg_params]["wersCountryCode"] = wers_country_code; (*command_msg)[strings::msg_params]["language"] = lang_code; - return command_msg; } + void SetHardwareVersionFromPT() { + const std::string hardware_version_from_pt = "1.1.1.0"; + ON_CALL(mock_policy_handler_, GetHardwareVersionFromPT()) + .WillByDefault(Return(hardware_version_from_pt)); + EXPECT_CALL(mock_hmi_capabilities_, + set_hardware_version(hardware_version_from_pt)); + } + SmartObject capabilities_; }; -TEST_F(GetSystemInfoResponseTest, GetSystemInfo_SUCCESS) { +TEST_F(GetSystemInfoResponseTest, GetSystemInfo_UNSUCCESS) { + MessageSharedPtr command_msg = CreateCommandMsg(); + (*command_msg)[strings::params][hmi_response::code] = + hmi_apis::Common_Result::WRONG_LANGUAGE; + (*command_msg)[strings::msg_params][hmi_response::capabilities] = + (capabilities_); + + ResponseFromHMIPtr command(CreateCommand<GetSystemInfoResponse>(command_msg)); + + EXPECT_CALL(mock_hmi_capabilities_, UpdateCachedCapabilities()); + EXPECT_CALL(mock_policy_handler_, SetPreloadedPtFlag(false)); + + command->Run(); +} + +TEST_F(GetSystemInfoResponseTest, GetSystemInfo_UpdateCapabilities_Called) { MessageSharedPtr command_msg = CreateCommandMsg(); (*command_msg)[strings::params][hmi_response::code] = hmi_apis::Common_Result::SUCCESS; @@ -98,28 +121,35 @@ TEST_F(GetSystemInfoResponseTest, GetSystemInfo_SUCCESS) { ResponseFromHMIPtr command(CreateCommand<GetSystemInfoResponse>(command_msg)); - EXPECT_CALL(mock_policy_handler_, - OnGetSystemInfo(ccpu_version, wers_country_code, lang_code)); + EXPECT_CALL(mock_hmi_capabilities_, OnSoftwareVersionReceived(ccpu_version)); + ASSERT_TRUE(command->Init()); command->Run(); } -TEST_F(GetSystemInfoResponseTest, GetSystemInfo_UNSUCCESS) { +TEST_F(GetSystemInfoResponseTest, + GetSystemInfo_SaveHardwareVersionToHMICapabilitiesIfPresentInResponse) { MessageSharedPtr command_msg = CreateCommandMsg(); (*command_msg)[strings::params][hmi_response::code] = - hmi_apis::Common_Result::WRONG_LANGUAGE; + hmi_apis::Common_Result::SUCCESS; (*command_msg)[strings::msg_params][hmi_response::capabilities] = (capabilities_); + (*command_msg)[strings::msg_params][strings::system_hardware_version] = + kHardwareVersion; ResponseFromHMIPtr command(CreateCommand<GetSystemInfoResponse>(command_msg)); - EXPECT_CALL(mock_hmi_capabilities_, UpdateCachedCapabilities()); - EXPECT_CALL(mock_policy_handler_, SetPreloadedPtFlag(false)); + SetHardwareVersionFromPT(); + EXPECT_CALL(mock_policy_handler_, OnHardwareVersionReceived(_)); + EXPECT_CALL(mock_hmi_capabilities_, set_hardware_version(kHardwareVersion)); + ASSERT_TRUE(command->Init()); command->Run(); } -TEST_F(GetSystemInfoResponseTest, GetSystemInfo_UpdateCapabilities_Called) { +TEST_F( + GetSystemInfoResponseTest, + GetSystemInfo_DontSaveHardwareVersionToHMICapabilitiesIfAbsentInResponse) { MessageSharedPtr command_msg = CreateCommandMsg(); (*command_msg)[strings::params][hmi_response::code] = hmi_apis::Common_Result::SUCCESS; @@ -128,7 +158,10 @@ TEST_F(GetSystemInfoResponseTest, GetSystemInfo_UpdateCapabilities_Called) { ResponseFromHMIPtr command(CreateCommand<GetSystemInfoResponse>(command_msg)); - EXPECT_CALL(mock_hmi_capabilities_, OnSoftwareVersionReceived(ccpu_version)); + SetHardwareVersionFromPT(); + EXPECT_CALL(mock_policy_handler_, OnHardwareVersionReceived(_)).Times(0); + EXPECT_CALL(mock_hmi_capabilities_, set_hardware_version(kHardwareVersion)) + .Times(0); ASSERT_TRUE(command->Init()); command->Run(); diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/on_bc_system_capability_updated_notification_from_hmi_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/on_bc_system_capability_updated_notification_from_hmi_test.cc index ae2a544cc9..1316952a92 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/on_bc_system_capability_updated_notification_from_hmi_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/on_bc_system_capability_updated_notification_from_hmi_test.cc @@ -33,6 +33,8 @@ #include "hmi/on_bc_system_capability_updated_notification_from_hmi.h" #include "application_manager/commands/commands_test.h" +#include "sdl_rpc_plugin/extensions/system_capability_app_extension.h" + #include "gtest/gtest.h" namespace test { @@ -47,8 +49,10 @@ using ::testing::Return; typedef std::shared_ptr<OnBCSystemCapabilityUpdatedNotificationFromHMI> OnBCSystemCapabilityUpdatedNotificationFromHMIPtr; +typedef mobile_apis::SystemCapabilityType::eType SystemCapabilityType; namespace strings = application_manager::strings; + namespace { const uint32_t kAppId = 1u; } // namespace @@ -61,11 +65,30 @@ MATCHER(CheckMessageToMobile, "") { (*arg)[strings::params][strings::function_id].asInt()); const bool app_id_exist = (*arg)[strings::msg_params].keyExists(strings::app_id); - bool is_connection_key_correct = true; - if ((*arg)[strings::msg_params].keyExists(strings::connection_key)) { - is_connection_key_correct = - (*arg)[strings::params][strings::connection_key] == kAppId; - } + const bool is_connection_key_correct = [](arg_type arg) { + if ((*arg)[strings::msg_params].keyExists(strings::connection_key)) { + return (*arg)[strings::params][strings::connection_key] == kAppId; + } + return false; + }; + + return is_function_id_matched && app_id_exist && is_connection_key_correct; +} + +MATCHER(CheckMessageToMobileWithoutAppId, "") { + const auto function_id = mobile_apis::FunctionID::OnSystemCapabilityUpdatedID; + + const bool is_function_id_matched = + function_id == static_cast<am::mobile_api::FunctionID::eType>( + (*arg)[strings::params][strings::function_id].asInt()); + const bool app_id_exist = + (*arg)[strings::msg_params].keyExists(strings::app_id); + const bool is_connection_key_correct = [](arg_type arg) { + if ((*arg)[strings::msg_params].keyExists(strings::connection_key)) { + return (*arg)[strings::params][strings::connection_key] == kAppId; + } + return false; + }; return is_function_id_matched && !app_id_exist && is_connection_key_correct; } @@ -73,6 +96,27 @@ MATCHER_P(CheckDisplayCapabilitiesNotChanged, display_capability, "") { return display_capability == arg; } +MATCHER_P2(CheckVideoStreamingCapability, + system_capability_type, + video_streaming_capability, + "") { + const mobile_apis::SystemCapabilityType::eType received_sys_cap_type = + static_cast<mobile_apis::SystemCapabilityType::eType>( + (*arg)[strings::msg_params][strings::system_capability] + [strings::system_capability_type] + .asInt()); + + const bool system_capability_type_matched = + received_sys_cap_type == system_capability_type; + + const bool video_capability_matched = + video_streaming_capability == + (*arg)[strings::msg_params][strings::system_capability] + [strings::video_streaming_capability]; + + return system_capability_type_matched && video_capability_matched; +} + class OnBCSystemCapabilityUpdatedNotificationFromHMITest : public CommandsTest<CommandsTestMocks::kIsNice> { protected: @@ -105,7 +149,7 @@ TEST_F( EXPECT_CALL( mock_rpc_service_, ManageMobileCommand( - CheckMessageToMobile(), + CheckMessageToMobileWithoutAppId(), ::application_manager::commands::Command::CommandSource::SOURCE_SDL)) .WillOnce(Return(true)); @@ -130,7 +174,7 @@ TEST_F(OnBCSystemCapabilityUpdatedNotificationFromHMITest, TEST_F( OnBCSystemCapabilityUpdatedNotificationFromHMITest, - Run_AppRegisteredWithPresentedAppIdInMessage_SetDisplayCapabilitiesToApp_SendMessageToMobile) { + Run_AppRegisteredWithPresentedAppIdInMessage_SetDisplayCapabilitiesToAppAndAppIdIsErasedFromMessage_SendMessageToMobile) { (*message_)[am::strings::msg_params][strings::system_capability] [am::strings::system_capability_type] = mobile_apis::SystemCapabilityType::DISPLAYS; @@ -147,7 +191,7 @@ TEST_F( EXPECT_CALL( mock_rpc_service_, ManageMobileCommand( - CheckMessageToMobile(), + CheckMessageToMobileWithoutAppId(), ::application_manager::commands::Command::CommandSource::SOURCE_SDL)) .WillOnce(Return(true)); @@ -155,6 +199,149 @@ TEST_F( command_->Run(); } +TEST_F( + OnBCSystemCapabilityUpdatedNotificationFromHMITest, + Run_SysCapTypeVideoStreaming_CapabilityIsAbsent_DoesntSetInHMICapabilities) { + smart_objects::SmartObject system_capability = + smart_objects::SmartObject(smart_objects::SmartType_Map); + + system_capability[strings::system_capability_type] = + mobile_apis::SystemCapabilityType::VIDEO_STREAMING; + + ASSERT_TRUE(command_->Init()); + EXPECT_CALL(mock_hmi_capabilities_, set_video_streaming_capability(_)) + .Times(0); + command_->Run(); +} + +TEST_F(OnBCSystemCapabilityUpdatedNotificationFromHMITest, + Run_VideoStreamingCapability_AppIdIsAbsent_NotificationIgnored) { + (*message_)[am::strings::msg_params][strings::system_capability] + [am::strings::system_capability_type] = + mobile_apis::SystemCapabilityType::VIDEO_STREAMING; + + EXPECT_CALL(mock_rpc_service_, ManageMobileCommand(_, _)).Times(0); + + ASSERT_TRUE(command_->Init()); + command_->Run(); +} + +TEST_F(OnBCSystemCapabilityUpdatedNotificationFromHMITest, + Run_VideoStreamingCapability_AppNotRegistered_NotificationIgnored) { + (*message_)[am::strings::msg_params][strings::system_capability] + [am::strings::system_capability_type] = + mobile_apis::SystemCapabilityType::VIDEO_STREAMING; + (*message_)[am::strings::msg_params][strings::app_id] = kAppId; + + ApplicationSharedPtr app; // Empty application shared pointer + + ON_CALL(app_mngr_, application(kAppId)).WillByDefault(Return(app)); + EXPECT_CALL(mock_rpc_service_, ManageMobileCommand(_, _)).Times(0); + + ASSERT_TRUE(command_->Init()); + command_->Run(); +} + +TEST_F(OnBCSystemCapabilityUpdatedNotificationFromHMITest, + Run_VideoStreamingCapability_AppNotSubsribed_NotificationIgnored) { + (*message_)[am::strings::msg_params][strings::system_capability] + [am::strings::system_capability_type] = + mobile_apis::SystemCapabilityType::VIDEO_STREAMING; + (*message_)[am::strings::msg_params][strings::app_id] = kAppId; + + sdl_rpc_plugin::SDLRPCPlugin sdl_rpc_plugin; + + // By default system capability extension is not subsribed to the + // VIDEO_STREAMING + auto system_capability_app_extension = + std::make_shared<sdl_rpc_plugin::SystemCapabilityAppExtension>( + sdl_rpc_plugin, *mock_app_); + + ON_CALL(*mock_app_, + QueryInterface(sdl_rpc_plugin::SystemCapabilityAppExtension:: + SystemCapabilityAppExtensionUID)) + .WillByDefault(Return(system_capability_app_extension)); + ON_CALL(app_mngr_, application(kAppId)).WillByDefault(Return(mock_app_)); + + EXPECT_CALL(mock_rpc_service_, ManageMobileCommand(_, _)).Times(0); + + ASSERT_TRUE(command_->Init()); + command_->Run(); +} + +TEST_F( + OnBCSystemCapabilityUpdatedNotificationFromHMITest, + Run_VideoStreamingCapability_AppIsSubsribed_VideoCapabilityIsAbsent_NotificationIgnored) { + const mobile_apis::SystemCapabilityType::eType system_capability_type = + mobile_apis::SystemCapabilityType::VIDEO_STREAMING; + + (*message_)[am::strings::msg_params][strings::system_capability] + [am::strings::system_capability_type] = system_capability_type; + (*message_)[am::strings::msg_params][strings::app_id] = kAppId; + + sdl_rpc_plugin::SDLRPCPlugin sdl_rpc_plugin; + std::shared_ptr<sdl_rpc_plugin::SystemCapabilityAppExtension> + system_capability_app_extension( + std::make_shared<sdl_rpc_plugin::SystemCapabilityAppExtension>( + sdl_rpc_plugin, *mock_app_)); + system_capability_app_extension->SubscribeTo(system_capability_type); + + ON_CALL(*mock_app_, + QueryInterface(sdl_rpc_plugin::SystemCapabilityAppExtension:: + SystemCapabilityAppExtensionUID)) + .WillByDefault(Return(system_capability_app_extension)); + ON_CALL(app_mngr_, application(kAppId)).WillByDefault(Return(mock_app_)); + + EXPECT_CALL(mock_rpc_service_, ManageMobileCommand(_, _)).Times(0); + + ASSERT_TRUE(command_->Init()); + command_->Run(); +} + +TEST_F( + OnBCSystemCapabilityUpdatedNotificationFromHMITest, + Run_VideoStreamingCapability_AppIsSubsribed_VideoCapabilityExists_NotificationForwarded) { + const mobile_apis::SystemCapabilityType::eType system_capability_type = + mobile_apis::SystemCapabilityType::VIDEO_STREAMING; + + (*message_)[am::strings::msg_params][strings::system_capability] + [am::strings::system_capability_type] = system_capability_type; + (*message_)[am::strings::msg_params][strings::app_id] = kAppId; + + (*message_)[am::strings::msg_params][strings::system_capability] + [strings::video_streaming_capability] = + new smart_objects::SmartObject( + smart_objects::SmartType::SmartType_Map); + + auto& video_streaming_capability = + (*message_)[am::strings::msg_params][strings::system_capability] + [strings::video_streaming_capability]; + + FillVideoStreamingCapability(video_streaming_capability); + + sdl_rpc_plugin::SDLRPCPlugin sdl_rpc_plugin; + std::shared_ptr<sdl_rpc_plugin::SystemCapabilityAppExtension> + system_capability_app_extension( + std::make_shared<sdl_rpc_plugin::SystemCapabilityAppExtension>( + sdl_rpc_plugin, *mock_app_)); + system_capability_app_extension->SubscribeTo(system_capability_type); + + ON_CALL(*mock_app_, + QueryInterface(sdl_rpc_plugin::SystemCapabilityAppExtension:: + SystemCapabilityAppExtensionUID)) + .WillByDefault(Return(system_capability_app_extension)); + ON_CALL(app_mngr_, application(kAppId)).WillByDefault(Return(mock_app_)); + + EXPECT_CALL(mock_rpc_service_, + ManageMobileCommand( + CheckVideoStreamingCapability(system_capability_type, + video_streaming_capability), + _)); + + ASSERT_TRUE(command_->Init()); + command_->Run(); +} + } // namespace on_bc_system_capability_updated_notification_from_hmi } // namespace hmi_commands_test } // namespace commands_test diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/update_device_list_request_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/update_device_list_request_test.cc index 31c03a7ed5..9760462d05 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/update_device_list_request_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/update_device_list_request_test.cc @@ -92,10 +92,6 @@ class UpdateDeviceListRequestTest TEST_F(UpdateDeviceListRequestTest, RUN_LaunchHMIReturnsFalse) { MessageSharedPtr command_msg = CreateCommandMsg(); - EXPECT_CALL(app_mngr_, event_dispatcher()) - .WillOnce(ReturnRef(mock_event_dispatcher_)); - EXPECT_CALL(mock_event_dispatcher_, remove_observer(_)); - UpdateDeviceListRequestPtr command( CreateCommand<UpdateDeviceListRequest>(command_msg)); @@ -103,7 +99,7 @@ TEST_F(UpdateDeviceListRequestTest, RUN_LaunchHMIReturnsFalse) { EXPECT_CALL(settings_, launch_hmi()).WillOnce(Return(false)); - EXPECT_CALL(app_mngr_, IsHMICooperating()).Times(0); + EXPECT_CALL(app_mngr_, WaitForHmiIsReady()).Times(0); EXPECT_CALL(mock_rpc_service_, SendMessageToHMI(command_msg)); command->Run(); @@ -114,13 +110,9 @@ TEST_F(UpdateDeviceListRequestTest, RUN_LaunchHMIReturnsFalse) { CommandImpl::protocol_version_); } -TEST_F(UpdateDeviceListRequestTest, RUN_HMICooperatingReturnsTrue_SUCCESSS) { +TEST_F(UpdateDeviceListRequestTest, RUN_HMICooperatingReturnsTrue_SUCCESS) { MessageSharedPtr command_msg = CreateCommandMsg(); - EXPECT_CALL(app_mngr_, event_dispatcher()) - .WillOnce(ReturnRef(mock_event_dispatcher_)); - EXPECT_CALL(mock_event_dispatcher_, remove_observer(_)); - UpdateDeviceListRequestPtr command( CreateCommand<UpdateDeviceListRequest>(command_msg)); @@ -128,7 +120,7 @@ TEST_F(UpdateDeviceListRequestTest, RUN_HMICooperatingReturnsTrue_SUCCESSS) { EXPECT_CALL(settings_, launch_hmi()).WillOnce(Return(true)); - EXPECT_CALL(app_mngr_, IsHMICooperating()).WillOnce(Return(true)); + EXPECT_CALL(app_mngr_, WaitForHmiIsReady()).WillOnce(Return(true)); EXPECT_CALL(mock_rpc_service_, SendMessageToHMI(command_msg)); command->Run(); @@ -139,29 +131,20 @@ TEST_F(UpdateDeviceListRequestTest, RUN_HMICooperatingReturnsTrue_SUCCESSS) { CommandImpl::protocol_version_); } -TEST_F(UpdateDeviceListRequestTest, OnEvent_WrongEventId_UNSUCCESS) { - Event event(Event::EventID::INVALID_ENUM); - - EXPECT_CALL(app_mngr_, event_dispatcher()) - .WillOnce(ReturnRef(mock_event_dispatcher_)); - EXPECT_CALL(mock_event_dispatcher_, remove_observer(_)); - - UpdateDeviceListRequestPtr command(CreateCommand<UpdateDeviceListRequest>()); +TEST_F(UpdateDeviceListRequestTest, RUN_HMICooperatingReturnsFalse_UNSUCCESS) { + MessageSharedPtr command_msg = CreateCommandMsg(); - command->on_event(event); -} + UpdateDeviceListRequestPtr command( + CreateCommand<UpdateDeviceListRequest>(command_msg)); -TEST_F(UpdateDeviceListRequestTest, OnEvent_SUCCESS) { - Event event(Event::EventID::BasicCommunication_OnReady); + EXPECT_CALL(app_mngr_, get_settings()).WillOnce(ReturnRef(settings_)); - EXPECT_CALL(app_mngr_, event_dispatcher()) - .WillOnce(ReturnRef(mock_event_dispatcher_)); - EXPECT_CALL(mock_event_dispatcher_, remove_observer(_, _)); - EXPECT_CALL(mock_event_dispatcher_, remove_observer(_)); + EXPECT_CALL(settings_, launch_hmi()).WillOnce(Return(true)); - UpdateDeviceListRequestPtr command(CreateCommand<UpdateDeviceListRequest>()); + EXPECT_CALL(app_mngr_, WaitForHmiIsReady()).WillOnce(Return(false)); + EXPECT_CALL(mock_rpc_service_, SendMessageToHMI(_)).Times(0); - command->on_event(event); + command->Run(); } } // namespace update_device_list_request diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/add_command_request_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/add_command_request_test.cc index aa199bd112..93ae813535 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/add_command_request_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/add_command_request_test.cc @@ -373,26 +373,27 @@ TEST_F(AddCommandRequestTest, Run_CommandIDAlreadyExists_EXPECT_INVALID_ID) { request_ptr->Run(); } -TEST_F(AddCommandRequestTest, - Run_CommandNameAlreadyExists_EXPECT_DUPLICATE_NAME) { +TEST_F(AddCommandRequestTest, Run_CommandNameAlreadyExists_EXPECT_Forwarded) { CreateBasicParamsUIRequest(); - SmartObject& msg_params = (*msg_)[strings::msg_params]; - msg_params[menu_params][hmi_request::parent_id] = kFirstParentId; - SmartObject& image = msg_params[cmd_icon]; + (*msg_)[msg_params][menu_name] = kMenuName; + SmartObject& image = (*msg_)[msg_params][cmd_icon]; EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _)) .WillOnce(Return(mobile_apis::Result::SUCCESS)); EXPECT_CALL(*mock_app_, FindCommand(kCmdId)).WillOnce(Return(smart_obj_)); + EXPECT_CALL(*mock_app_, AddCommand(_, (*msg_)[msg_params])); + SmartObject first_command = SmartObject(SmartType_Map); SmartObject second_command = SmartObject(SmartType_Map); - const am::CommandsMap commands_map = + am::CommandsMap commands_map = CreateCommandsMap(first_command, second_command); EXPECT_CALL(*mock_app_, commands_map()) .WillRepeatedly(Return(DataAccessor<application_manager::CommandsMap>( commands_map, lock_ptr_))); - EXPECT_CALL(mock_rpc_service_, - ManageMobileCommand( - MobileResultCodeIs(mobile_apis::Result::DUPLICATE_NAME), _)); + EXPECT_CALL( + mock_rpc_service_, + ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::UI_AddCommand), _)) + .WillOnce(Return(true)); std::shared_ptr<AddCommandRequest> request_ptr = CreateCommand<AddCommandRequest>(msg_); request_ptr->Run(); diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_app_capability_updated_notification_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_app_capability_updated_notification_test.cc new file mode 100644 index 0000000000..41e734137b --- /dev/null +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_app_capability_updated_notification_test.cc @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2020, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "mobile/on_app_capability_updated_notification.h" + +#include "application_manager/commands/commands_test.h" +#include "gtest/gtest.h" +#include "sdl_rpc_plugin/extensions/system_capability_app_extension.h" +#include "sdl_rpc_plugin/sdl_rpc_plugin.h" + +namespace test { +namespace components { +namespace commands_test { +namespace mobile_commands_test { +namespace on_app_capability_updated_notification_test { + +using sdl_rpc_plugin::commands::mobile::OnAppCapabilityUpdatedNotification; +using ::testing::_; + +typedef std::shared_ptr<OnAppCapabilityUpdatedNotification> + OnAppCapabilityUpdatedNotificationPtr; + +namespace strings = application_manager::strings; +namespace { +const uint32_t kConnectionKey = 1u; +const uint32_t kAppId = 2u; +} // namespace + +MATCHER_P(CheckAppCapability, app_capability, "") { + return app_capability == (*arg)[strings::msg_params][strings::app_capability]; +} + +class OnAppCapabilityUpdatedNotificationTest + : public CommandsTest<CommandsTestMocks::kIsNice> { + protected: + void SetUp() OVERRIDE { + message_ = CreateMessage(); + (*message_)[strings::params][strings::connection_key] = kConnectionKey; + command_ = CreateCommand<OnAppCapabilityUpdatedNotification>(message_); + mock_app_ = CreateMockApp(); + } + + OnAppCapabilityUpdatedNotificationPtr command_; + MockAppPtr mock_app_; + MessageSharedPtr message_; +}; + +TEST_F(OnAppCapabilityUpdatedNotificationTest, Run_ManageHMICommand_SUCCESS) { + smart_objects::SmartObject app_capability = + smart_objects::SmartObject(smart_objects::SmartType_Map); + + app_capability[strings::app_capability_type] = + mobile_apis::AppCapabilityType::VIDEO_STREAMING; + app_capability[strings::video_streaming_capability] = + smart_objects::SmartObject(smart_objects::SmartType_Map); + + FillVideoStreamingCapability( + app_capability[strings::video_streaming_capability]); + + (*message_)[strings::msg_params][strings::app_capability] = app_capability; + + ASSERT_TRUE(command_->Init()); + + ON_CALL(app_mngr_, application(kConnectionKey)) + .WillByDefault(Return(mock_app_)); + ON_CALL(*mock_app_, app_id()).WillByDefault(Return(kAppId)); + + EXPECT_CALL(mock_rpc_service_, + ManageHMICommand(CheckAppCapability(app_capability), + app_mngr::commands::Command::SOURCE_SDL_TO_HMI)); + command_->Run(); +} + +} // namespace on_app_capability_updated_notification_test +} // namespace mobile_commands_test +} // namespace commands_test +} // namespace components +} // namespace test diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_system_capability_updated_notification_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_system_capability_updated_notification_test.cc index 7e7b16aa89..32a13f402c 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_system_capability_updated_notification_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_system_capability_updated_notification_test.cc @@ -63,6 +63,12 @@ MATCHER_P(CheckDisplayCapabilities, display_capabilities, "") { [strings::display_capabilities]; } +MATCHER_P(CheckVideoStreamCapability, video_streaming_capability, "") { + return video_streaming_capability == + (*arg)[strings::msg_params][strings::system_capability] + [strings::video_streaming_capability]; +} + class OnSystemCapabilityUpdatedNotificationTest : public CommandsTest<CommandsTestMocks::kIsNice> { protected: @@ -233,6 +239,43 @@ TEST_F( command_->Run(); } +TEST_F(OnSystemCapabilityUpdatedNotificationTest, + Run_VideoSteamingCapability_AppIdIsAbsent_SendMessageToMobile) { + (*message_)[am::strings::msg_params][strings::system_capability] + [am::strings::system_capability_type] = + mobile_apis::SystemCapabilityType::VIDEO_STREAMING; + + EXPECT_CALL(mock_rpc_service_, SendMessageToMobile(message_, false)); + + ASSERT_TRUE(command_->Init()); + command_->Run(); +} + +TEST_F(OnSystemCapabilityUpdatedNotificationTest, + Run_VideoSteamingCapability_AppIdExistsInMessage_SendMessageToMobile) { + (*message_)[strings::msg_params][strings::system_capability] + [strings::system_capability_type] = + mobile_apis::SystemCapabilityType::VIDEO_STREAMING; + (*message_)[strings::msg_params][strings::app_id] = kAppId; + (*message_)[strings::msg_params][strings::system_capability] + [strings::video_streaming_capability] = + new smart_objects::SmartObject(smart_objects::SmartType_Map); + + auto& video_streaming_capability = + (*message_)[strings::msg_params][strings::system_capability] + [strings::video_streaming_capability]; + + FillVideoStreamingCapability(video_streaming_capability); + + EXPECT_CALL( + mock_rpc_service_, + SendMessageToMobile( + CheckVideoStreamCapability(video_streaming_capability), false)); + + ASSERT_TRUE(command_->Init()); + command_->Run(); +} + } // namespace on_system_capability_updated_notification } // namespace mobile_commands_test } // namespace commands_test 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 fab648fc95..4572a6d907 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 @@ -198,7 +198,7 @@ class RegisterAppInterfaceRequestTest void InitGetters() { ON_CALL(app_mngr_, GetCorrectMobileIDFromMessage(msg_)) .WillByDefault(Return(kAppId1)); - ON_CALL(app_mngr_, IsHMICooperating()).WillByDefault(Return(true)); + ON_CALL(app_mngr_, WaitForHmiIsReady()).WillByDefault(Return(true)); ON_CALL(app_mngr_, resume_controller()) .WillByDefault(ReturnRef(mock_resume_crt_)); ON_CALL(app_mngr_, connection_handler()) @@ -416,11 +416,7 @@ TEST_F(RegisterAppInterfaceRequestTest, DefaultTimeout_CheckIfZero_SUCCESS) { TEST_F(RegisterAppInterfaceRequestTest, Run_MinimalData_SUCCESS) { InitBasicMessage(); (*msg_)[am::strings::msg_params][am::strings::hash_id] = kAppId1; - 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_, WaitForHmiIsReady()).WillOnce(Return(true)); EXPECT_CALL(app_mngr_, IsApplicationForbidden(_, _)).WillOnce(Return(false)); ON_CALL(mock_connection_handler_, @@ -504,11 +500,7 @@ TEST_F(RegisterAppInterfaceRequestTest, Run_HmiInterfacesStateAvailable_SUCCESS) { InitBasicMessage(); - EXPECT_CALL(app_mngr_, IsStopping()) - .WillOnce(Return(false)) - .WillOnce(Return(true)) - .WillOnce(Return(false)); - ON_CALL(app_mngr_, IsHMICooperating()).WillByDefault(Return(false)); + ON_CALL(app_mngr_, WaitForHmiIsReady()).WillByDefault(Return(true)); EXPECT_CALL(app_mngr_, IsApplicationForbidden(_, _)).WillOnce(Return(false)); ON_CALL(mock_connection_handler_, @@ -808,11 +800,8 @@ TEST_F(RegisterAppInterfaceRequestTest, 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)); + + ON_CALL(app_mngr_, WaitForHmiIsReady()).WillByDefault(Return(true)); EXPECT_CALL(app_mngr_, IsApplicationForbidden(kConnectionKey2, kAppId1)) .WillOnce(Return(false)); diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/set_global_properties_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/set_global_properties_test.cc index 9b72d41f7e..4272005fba 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/set_global_properties_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/set_global_properties_test.cc @@ -397,6 +397,29 @@ class SetGlobalPropertiesRequestTest ui_result, tts_result, rc_result, false); } + void AddCustomizableKeys(MessageSharedPtr msg) { + SmartObject customizable_keys(smart_objects::SmartType_Array); + customizable_keys[0] = "%"; + customizable_keys[1] = "@"; + customizable_keys[2] = "&"; + (*msg)[am::strings::msg_params][am::strings::keyboard_properties] + [am::hmi_request::custom_keys] = customizable_keys; + } + + std::shared_ptr<SmartObject> GetCapabilitiesForConfigurableKeyboard( + hmi_apis::Common_KeyboardLayout::eType layout, int num_allowed_keys) { + auto display_capabilities = + std::make_shared<SmartObject>(smart_objects::SmartType_Map); + auto& supported_keyboards = + (*display_capabilities)[0][am::strings::window_capabilities][0] + [am::hmi_response::keyboard_capabilities] + [am::hmi_response::supported_keyboards]; + supported_keyboards[0][am::hmi_request::keyboard_layout] = layout; + supported_keyboards[0][am::hmi_response::num_configurable_keys] = + num_allowed_keys; + return display_capabilities; + } + std::shared_ptr<sync_primitives::Lock> lock_ptr_; MockAppPtr mock_app_; std::shared_ptr<application_manager_test::MockHelpPromptManager> @@ -1262,6 +1285,371 @@ TEST_F(SetGlobalPropertiesRequestTest, command->Run(); } +TEST_F(SetGlobalPropertiesRequestTest, + Run_InvalidCustomizableKeys_INVALID_DATA) { + MessageSharedPtr msg = CreateMsgParams(); + SmartObject customizable_keys(smart_objects::SmartType_Array); + customizable_keys[0] = "%"; + customizable_keys[1] = "\\n"; + customizable_keys[2] = " "; + (*msg)[am::strings::msg_params][am::strings::keyboard_properties] + [am::hmi_request::custom_keys] = customizable_keys; + + std::shared_ptr<SetGlobalPropertiesRequest> command( + CreateCommand<SetGlobalPropertiesRequest>(msg)); + + ExpectInvalidData(); + + command->Run(); +} + +TEST_F( + SetGlobalPropertiesRequestTest, + Run_DisallowedNumberOfCustomizableKeysAndLayoutFromRequest_INVALID_DATA) { + MessageSharedPtr msg = CreateMsgParams(); + AddCustomizableKeys(msg); + (*msg)[am::strings::msg_params][am::strings::keyboard_properties] + [am::hmi_request::keyboard_layout] = + hmi_apis::Common_KeyboardLayout::QWERTZ; + + const int num_allowed_keys = 0; + auto display_capabilities = GetCapabilitiesForConfigurableKeyboard( + hmi_apis::Common_KeyboardLayout::QWERTZ, num_allowed_keys); + + ON_CALL(app_mngr_, application(kConnectionKey)) + .WillByDefault(Return(mock_app_)); + ON_CALL(*mock_app_, display_capabilities()) + .WillByDefault(Return(display_capabilities)); + std::shared_ptr<SetGlobalPropertiesRequest> command( + CreateCommand<SetGlobalPropertiesRequest>(msg)); + + ExpectInvalidData(); + + command->Run(); +} + +TEST_F(SetGlobalPropertiesRequestTest, + Run_DisallowedNumberOfCustomizableKeysAndSavedLayout_INVALID_DATA) { + MessageSharedPtr msg = CreateMsgParams(); + AddCustomizableKeys(msg); + + ON_CALL(app_mngr_, application(kConnectionKey)) + .WillByDefault(Return(mock_app_)); + auto saved_keyboard_props = SmartObject(smart_objects::SmartType_Map); + saved_keyboard_props[am::hmi_request::keyboard_layout] = + hmi_apis::Common_KeyboardLayout::QWERTZ; + EXPECT_CALL(*mock_app_, keyboard_props()) + .WillOnce(Return(&saved_keyboard_props)); + + const int num_allowed_keys = 0; + auto display_capabilities = GetCapabilitiesForConfigurableKeyboard( + hmi_apis::Common_KeyboardLayout::QWERTZ, num_allowed_keys); + + ON_CALL(*mock_app_, display_capabilities()) + .WillByDefault(Return(display_capabilities)); + std::shared_ptr<SetGlobalPropertiesRequest> command( + CreateCommand<SetGlobalPropertiesRequest>(msg)); + + ExpectInvalidData(); + + command->Run(); +} + +TEST_F(SetGlobalPropertiesRequestTest, + Run_DisallowedNumberOfCustomizableKeysAndDefaultLayout_INVALID_DATA) { + MessageSharedPtr msg = CreateMsgParams(); + AddCustomizableKeys(msg); + + const int num_allowed_keys = 0; + auto display_capabilities = GetCapabilitiesForConfigurableKeyboard( + hmi_apis::Common_KeyboardLayout::QWERTY, num_allowed_keys); + + ON_CALL(app_mngr_, application(kConnectionKey)) + .WillByDefault(Return(mock_app_)); + ON_CALL(*mock_app_, display_capabilities()) + .WillByDefault(Return(display_capabilities)); + std::shared_ptr<SetGlobalPropertiesRequest> command( + CreateCommand<SetGlobalPropertiesRequest>(msg)); + + ExpectInvalidData(); + + command->Run(); +} + +TEST_F(SetGlobalPropertiesRequestTest, + Run_AllowedNumberOfCustomizableKeysAndNotSupportedLayout_INVALID_DATA) { + MessageSharedPtr msg = CreateMsgParams(); + AddCustomizableKeys(msg); + (*msg)[am::strings::msg_params][am::strings::keyboard_properties] + [am::hmi_request::keyboard_layout] = + hmi_apis::Common_KeyboardLayout::QWERTZ; + + const int num_allowed_keys = 3; + auto display_capabilities = GetCapabilitiesForConfigurableKeyboard( + hmi_apis::Common_KeyboardLayout::QWERTY, num_allowed_keys); + + ON_CALL(app_mngr_, application(kConnectionKey)) + .WillByDefault(Return(mock_app_)); + ON_CALL(*mock_app_, display_capabilities()) + .WillByDefault(Return(display_capabilities)); + std::shared_ptr<SetGlobalPropertiesRequest> command( + CreateCommand<SetGlobalPropertiesRequest>(msg)); + + ExpectInvalidData(); + + command->Run(); +} + +TEST_F(SetGlobalPropertiesRequestTest, + Run_AllowedNumberOfCustomizableKeys_LayoutFromRequestCached) { + MessageSharedPtr msg = CreateMsgParams(); + AddCustomizableKeys(msg); + auto& keyboard_properties = + (*msg)[am::strings::msg_params][am::strings::keyboard_properties]; + keyboard_properties[am::hmi_request::keyboard_layout] = + hmi_apis::Common_KeyboardLayout::QWERTY; + + const int num_allowed_keys = 3; + auto display_capabilities = GetCapabilitiesForConfigurableKeyboard( + hmi_apis::Common_KeyboardLayout::QWERTY, num_allowed_keys); + + ON_CALL(app_mngr_, application(kConnectionKey)) + .WillByDefault(Return(mock_app_)); + ON_CALL(*mock_app_, display_capabilities()) + .WillByDefault(Return(display_capabilities)); + std::shared_ptr<SetGlobalPropertiesRequest> command( + CreateCommand<SetGlobalPropertiesRequest>(msg)); + + EXPECT_CALL(*mock_app_, set_keyboard_props(keyboard_properties)); + + command->Run(); +} + +TEST_F( + SetGlobalPropertiesRequestTest, + Run_AllowedNumberOfCustomizableKeysAndSavedLayout_SavedLayoutCachedAgain) { + MessageSharedPtr msg = CreateMsgParams(); + AddCustomizableKeys(msg); + + ON_CALL(app_mngr_, application(kConnectionKey)) + .WillByDefault(Return(mock_app_)); + auto saved_keyboard_props = SmartObject(smart_objects::SmartType_Map); + saved_keyboard_props[am::hmi_request::keyboard_layout] = + hmi_apis::Common_KeyboardLayout::QWERTZ; + EXPECT_CALL(*mock_app_, keyboard_props()) + .WillRepeatedly(Return(&saved_keyboard_props)); + + const int num_allowed_keys = 3; + auto display_capabilities = GetCapabilitiesForConfigurableKeyboard( + hmi_apis::Common_KeyboardLayout::QWERTZ, num_allowed_keys); + + ON_CALL(*mock_app_, display_capabilities()) + .WillByDefault(Return(display_capabilities)); + std::shared_ptr<SetGlobalPropertiesRequest> command( + CreateCommand<SetGlobalPropertiesRequest>(msg)); + + auto requested_keyboard_properties = + (*msg)[am::strings::msg_params][am::strings::keyboard_properties]; + auto cached_keyboard_props(requested_keyboard_properties); + cached_keyboard_props[am::hmi_request::keyboard_layout] = + hmi_apis::Common_KeyboardLayout::QWERTZ; + EXPECT_CALL(*mock_app_, set_keyboard_props(cached_keyboard_props)); + + command->Run(); +} + +TEST_F( + SetGlobalPropertiesRequestTest, + Run_AllowedNumberOfCustomizableKeysAndDefaultLayout_KeyboardPropsCachedAsIs) { + MessageSharedPtr msg = CreateMsgParams(); + AddCustomizableKeys(msg); + + const int num_allowed_keys = 3; + auto display_capabilities = GetCapabilitiesForConfigurableKeyboard( + hmi_apis::Common_KeyboardLayout::QWERTY, num_allowed_keys); + + ON_CALL(app_mngr_, application(kConnectionKey)) + .WillByDefault(Return(mock_app_)); + ON_CALL(*mock_app_, display_capabilities()) + .WillByDefault(Return(display_capabilities)); + std::shared_ptr<SetGlobalPropertiesRequest> command( + CreateCommand<SetGlobalPropertiesRequest>(msg)); + + auto requested_keyboard_properties = + (*msg)[am::strings::msg_params][am::strings::keyboard_properties]; + EXPECT_CALL(*mock_app_, set_keyboard_props(requested_keyboard_properties)); + + command->Run(); +} + +TEST_F(SetGlobalPropertiesRequestTest, + Run_RequestContainsLanguageParam_KeyboardPropsCachedAsIs) { + MessageSharedPtr msg = CreateMsgParams(); + auto& keyboard_properties = + (*msg)[am::strings::msg_params][am::strings::keyboard_properties]; + keyboard_properties[am::hmi_response::language] = + hmi_apis::Common_Language::EN_GB; + + std::shared_ptr<SetGlobalPropertiesRequest> command( + CreateCommand<SetGlobalPropertiesRequest>(msg)); + + EXPECT_CALL(*mock_app_, set_keyboard_props(keyboard_properties)); + + command->Run(); +} + +TEST_F(SetGlobalPropertiesRequestTest, + Run_NoLanguageInRequestButPresentInSaved_SavedLanguageCachedAgain) { + MessageSharedPtr msg = CreateMsgParams(); + + ON_CALL(app_mngr_, application(kConnectionKey)) + .WillByDefault(Return(mock_app_)); + auto saved_keyboard_props = SmartObject(smart_objects::SmartType_Map); + saved_keyboard_props[am::hmi_response::language] = + hmi_apis::Common_Language::EN_GB; + EXPECT_CALL(*mock_app_, keyboard_props()) + .WillRepeatedly(Return(&saved_keyboard_props)); + + std::shared_ptr<SetGlobalPropertiesRequest> command( + CreateCommand<SetGlobalPropertiesRequest>(msg)); + + auto cached_keyboard_props = + (*msg)[am::strings::msg_params][am::strings::keyboard_properties]; + cached_keyboard_props[am::hmi_response::language] = + hmi_apis::Common_Language::EN_GB; + EXPECT_CALL(*mock_app_, set_keyboard_props(cached_keyboard_props)); + + command->Run(); +} + +TEST_F(SetGlobalPropertiesRequestTest, + Run_RequestContainsMaskInputCharactersParam_KeyboardPropsCachedAsIs) { + MessageSharedPtr msg = CreateMsgParams(); + auto& keyboard_properties = + (*msg)[am::strings::msg_params][am::strings::keyboard_properties]; + keyboard_properties[am::hmi_request::mask_input_characters] = + hmi_apis::Common_KeyboardInputMask::ENABLE_INPUT_KEY_MASK; + + std::shared_ptr<SetGlobalPropertiesRequest> command( + CreateCommand<SetGlobalPropertiesRequest>(msg)); + + EXPECT_CALL(*mock_app_, set_keyboard_props(keyboard_properties)); + + command->Run(); +} + +TEST_F( + SetGlobalPropertiesRequestTest, + Run_NoMaskInputCharactersInRequestButPresentInSaved_SavedParamCachedAgain) { + MessageSharedPtr msg = CreateMsgParams(); + + ON_CALL(app_mngr_, application(kConnectionKey)) + .WillByDefault(Return(mock_app_)); + auto saved_keyboard_props = SmartObject(smart_objects::SmartType_Map); + saved_keyboard_props[am::hmi_request::mask_input_characters] = + hmi_apis::Common_KeyboardInputMask::USER_CHOICE_INPUT_KEY_MASK; + EXPECT_CALL(*mock_app_, keyboard_props()) + .WillRepeatedly(Return(&saved_keyboard_props)); + + std::shared_ptr<SetGlobalPropertiesRequest> command( + CreateCommand<SetGlobalPropertiesRequest>(msg)); + + auto cached_keyboard_props = + (*msg)[am::strings::msg_params][am::strings::keyboard_properties]; + cached_keyboard_props[am::hmi_request::mask_input_characters] = + hmi_apis::Common_KeyboardInputMask::USER_CHOICE_INPUT_KEY_MASK; + EXPECT_CALL(*mock_app_, set_keyboard_props(cached_keyboard_props)); + + command->Run(); +} + +TEST_F(SetGlobalPropertiesRequestTest, + Run_NoAutocompleteListInRequestButPresentInSaved_SavedArrayCachedAgain) { + MessageSharedPtr msg = CreateMsgParams(); + + ON_CALL(app_mngr_, application(kConnectionKey)) + .WillByDefault(Return(mock_app_)); + auto saved_keyboard_props = SmartObject(smart_objects::SmartType_Map); + + SmartObject autocomplete_list(smart_objects::SmartType_Array); + autocomplete_list[0] = "first"; + autocomplete_list[1] = "second"; + saved_keyboard_props[am::hmi_request::auto_complete_list] = autocomplete_list; + EXPECT_CALL(*mock_app_, keyboard_props()) + .WillRepeatedly(Return(&saved_keyboard_props)); + + std::shared_ptr<SetGlobalPropertiesRequest> command( + CreateCommand<SetGlobalPropertiesRequest>(msg)); + + auto cached_keyboard_props = + (*msg)[am::strings::msg_params][am::strings::keyboard_properties]; + cached_keyboard_props[am::hmi_request::auto_complete_list] = + autocomplete_list; + EXPECT_CALL(*mock_app_, set_keyboard_props(cached_keyboard_props)); + + command->Run(); +} + +TEST_F( + SetGlobalPropertiesRequestTest, + Run_NewAutocompleteListInRequestAndAlsoPresentInSaved_TransferAndSaveNewArray) { + MessageSharedPtr msg = CreateMsgParams(); + + auto& keyboard_properties = + (*msg)[am::strings::msg_params][am::strings::keyboard_properties]; + SmartObject new_list(smart_objects::SmartType_Array); + new_list[0] = "first_new_value"; + new_list[1] = "second_new_value"; + keyboard_properties[am::hmi_request::auto_complete_list] = new_list; + + ON_CALL(app_mngr_, application(kConnectionKey)) + .WillByDefault(Return(mock_app_)); + SmartObject old_list(smart_objects::SmartType_Array); + old_list[0] = "old_value"; + old_list[1] = "another_old_value"; + auto saved_keyboard_props = SmartObject(smart_objects::SmartType_Map); + saved_keyboard_props[am::hmi_request::auto_complete_list] = old_list; + EXPECT_CALL(*mock_app_, keyboard_props()) + .WillRepeatedly(Return(&saved_keyboard_props)); + + std::shared_ptr<SetGlobalPropertiesRequest> command( + CreateCommand<SetGlobalPropertiesRequest>(msg)); + + EXPECT_CALL(*mock_app_, set_keyboard_props(keyboard_properties)); + + command->Run(); +} + +TEST_F( + SetGlobalPropertiesRequestTest, + Run_EmptyAutocompleteListInRequestAndAlsoPresentInSaved_TransferButNotSaveEmptyArray) { + MessageSharedPtr msg = CreateMsgParams(); + + auto& keyboard_properties = + (*msg)[am::strings::msg_params][am::strings::keyboard_properties]; + SmartObject new_list(smart_objects::SmartType_Array); + keyboard_properties[am::hmi_request::auto_complete_list] = new_list; + + ON_CALL(app_mngr_, application(kConnectionKey)) + .WillByDefault(Return(mock_app_)); + SmartObject old_list(smart_objects::SmartType_Array); + old_list[0] = "old_value"; + old_list[1] = "another_old_value"; + auto saved_keyboard_props = SmartObject(smart_objects::SmartType_Map); + saved_keyboard_props[am::hmi_request::auto_complete_list] = old_list; + EXPECT_CALL(*mock_app_, keyboard_props()) + .WillRepeatedly(Return(&saved_keyboard_props)); + + std::shared_ptr<SetGlobalPropertiesRequest> command( + CreateCommand<SetGlobalPropertiesRequest>(msg)); + + auto properties_without_empty_list(keyboard_properties); + properties_without_empty_list.erase(am::hmi_request::auto_complete_list); + EXPECT_CALL(*mock_app_, set_keyboard_props(properties_without_empty_list)); + + command->Run(); +} + TEST_F(SetGlobalPropertiesRequestTest, Run_NoData_Canceled) { MessageSharedPtr msg = CreateMsgParams(); diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/hmi/vi_get_vehicle_type_response.cc b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/hmi/vi_get_vehicle_type_response.cc index dbd1b48033..19c1113cc6 100644 --- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/hmi/vi_get_vehicle_type_response.cc +++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/hmi/vi_get_vehicle_type_response.cc @@ -55,11 +55,10 @@ void VIGetVehicleTypeResponse::Run() { const auto result_code = static_cast<hmi_apis::Common_Result::eType>( (*message_)[strings::params][hmi_response::code].asInt()); - hmi_capabilities_.UpdateRequestsRequiredForCapabilities( - hmi_apis::FunctionID::VehicleInfo_GetVehicleType); - if (hmi_apis::Common_Result::SUCCESS != result_code) { SDL_LOG_DEBUG("Request was not successful. Don't change HMI capabilities"); + hmi_capabilities_.UpdateRequestsRequiredForCapabilities( + hmi_apis::FunctionID::VehicleInfo_GetVehicleType); return; } @@ -67,6 +66,9 @@ void VIGetVehicleTypeResponse::Run() { hmi_capabilities_.set_vehicle_type( (*message_)[strings::msg_params][hmi_response::vehicle_type]); + hmi_capabilities_.UpdateRequestsRequiredForCapabilities( + hmi_apis::FunctionID::VehicleInfo_GetVehicleType); + if (!hmi_capabilities_.SaveCachedCapabilitiesToFile( hmi_interface::vehicle_info, sections_to_update, diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/hmi/vi_is_ready_request.cc b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/hmi/vi_is_ready_request.cc index 578f650e98..2c9ac78523 100644 --- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/hmi/vi_is_ready_request.cc +++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/hmi/vi_is_ready_request.cc @@ -78,6 +78,8 @@ void VIIsReadyRequest::on_event(const event_engine::Event& event) { HMICapabilities& hmi_capabilities = hmi_capabilities_; hmi_capabilities.set_is_ivi_cooperating(is_available); policy_handler_.OnVIIsReady(); + hmi_capabilities_.UpdateRequestsRequiredForCapabilities( + hmi_apis::FunctionID::VehicleInfo_IsReady); if (!app_mngr::commands::CheckAvailabilityHMIInterfaces( application_manager_, HmiInterfaces::HMI_INTERFACE_VehicleInfo)) { SDL_LOG_INFO( @@ -99,6 +101,8 @@ void VIIsReadyRequest::on_event(const event_engine::Event& event) { void VIIsReadyRequest::onTimeOut() { // Note(dtrunov): According to new requirment APPLINK-27956 + hmi_capabilities_.UpdateRequestsRequiredForCapabilities( + hmi_apis::FunctionID::VehicleInfo_IsReady); RequestInterfaceCapabilities(hmi_interface ::vehicle_info); } diff --git a/src/components/application_manager/src/application_impl.cc b/src/components/application_manager/src/application_impl.cc index 2e104f73e2..2952fd5481 100644 --- a/src/components/application_manager/src/application_impl.cc +++ b/src/components/application_manager/src/application_impl.cc @@ -613,9 +613,6 @@ void ApplicationImpl::StopStreaming( void ApplicationImpl::StopNaviStreaming() { SDL_LOG_AUTO_TRACE(); video_stream_suspend_timer_.Stop(); - application_manager_.OnAppStreaming(app_id(), - protocol_handler::ServiceType::kMobileNav, - StreamingState::kStopped); MessageHelper::SendNaviStopStream(app_id(), application_manager_); set_video_streaming_approved(false); set_video_stream_retry_number(0); @@ -624,9 +621,6 @@ void ApplicationImpl::StopNaviStreaming() { void ApplicationImpl::StopAudioStreaming() { SDL_LOG_AUTO_TRACE(); audio_stream_suspend_timer_.Stop(); - application_manager_.OnAppStreaming(app_id(), - protocol_handler::ServiceType::kAudio, - StreamingState::kStopped); MessageHelper::SendAudioStopStream(app_id(), application_manager_); set_audio_streaming_approved(false); set_audio_stream_retry_number(0); @@ -637,17 +631,14 @@ void ApplicationImpl::SuspendStreaming( using namespace protocol_handler; SDL_LOG_AUTO_TRACE(); - if (ServiceType::kMobileNav == service_type && !video_streaming_suspended_) { + if (ServiceType::kMobileNav == service_type) { video_stream_suspend_timer_.Stop(); - application_manager_.OnAppStreaming( - app_id(), service_type, StreamingState::kSuspended); + application_manager_.OnAppStreaming(app_id(), service_type, false); sync_primitives::AutoLock lock(video_streaming_suspended_lock_); video_streaming_suspended_ = true; - } else if (ServiceType::kAudio == service_type && - !audio_streaming_suspended_) { + } else if (ServiceType::kAudio == service_type) { audio_stream_suspend_timer_.Stop(); - application_manager_.OnAppStreaming( - app_id(), service_type, StreamingState::kSuspended); + application_manager_.OnAppStreaming(app_id(), service_type, false); sync_primitives::AutoLock lock(audio_streaming_suspended_lock_); audio_streaming_suspended_ = true; } @@ -656,7 +647,7 @@ void ApplicationImpl::SuspendStreaming( } void ApplicationImpl::WakeUpStreaming( - protocol_handler::ServiceType service_type) { + protocol_handler::ServiceType service_type, uint32_t timer_len) { using namespace protocol_handler; SDL_LOG_AUTO_TRACE(); @@ -668,29 +659,28 @@ void ApplicationImpl::WakeUpStreaming( { // reduce the range of video_streaming_suspended_lock_ sync_primitives::AutoLock auto_lock(video_streaming_suspended_lock_); if (video_streaming_suspended_) { - application_manager_.OnAppStreaming( - app_id(), service_type, StreamingState::kStarted); + application_manager_.OnAppStreaming(app_id(), service_type, true); application_manager_.ProcessOnDataStreamingNotification( service_type, app_id(), true); video_streaming_suspended_ = false; } } - - video_stream_suspend_timer_.Start(video_stream_suspend_timeout_, - timer::kPeriodic); + video_stream_suspend_timer_.Start( + timer_len == 0 ? video_stream_suspend_timeout_ : timer_len, + timer::kPeriodic); } else if (ServiceType::kAudio == service_type) { { // reduce the range of audio_streaming_suspended_lock_ sync_primitives::AutoLock auto_lock(audio_streaming_suspended_lock_); if (audio_streaming_suspended_) { - application_manager_.OnAppStreaming( - app_id(), service_type, StreamingState::kStarted); + application_manager_.OnAppStreaming(app_id(), service_type, true); application_manager_.ProcessOnDataStreamingNotification( service_type, app_id(), true); audio_streaming_suspended_ = false; } } - audio_stream_suspend_timer_.Start(audio_stream_suspend_timeout_, - timer::kPeriodic); + audio_stream_suspend_timer_.Start( + timer_len == 0 ? audio_stream_suspend_timeout_ : timer_len, + timer::kPeriodic); } } diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc index 24f131cafe..475baae9ec 100644 --- a/src/components/application_manager/src/application_manager_impl.cc +++ b/src/components/application_manager/src/application_manager_impl.cc @@ -227,7 +227,7 @@ ApplicationManagerImpl::ApplicationManagerImpl( ApplicationManagerImpl::~ApplicationManagerImpl() { SDL_LOG_AUTO_TRACE(); - is_stopping_.store(true); + InitiateStopping(); SendOnSDLClose(); media_manager_ = NULL; hmi_handler_ = NULL; @@ -1597,6 +1597,58 @@ void ApplicationManagerImpl::OnDeviceListUpdated( RefreshCloudAppInformation(); } +bool ApplicationManagerImpl::WaitForHmiIsReady() { + sync_primitives::AutoLock lock(wait_for_hmi_lock_); + if (!IsStopping() && !IsHMICooperating()) { + SDL_LOG_DEBUG("Waiting for the HMI cooperation..."); + wait_for_hmi_condvar_.Wait(lock); + } + + if (IsStopping()) { + SDL_LOG_WARN("System is terminating..."); + return false; + } + + return IsHMICooperating(); +} + +bool ApplicationManagerImpl::GetProtocolVehicleData( + connection_handler::ProtocolVehicleData& data) { + SDL_LOG_AUTO_TRACE(); + using namespace protocol_handler::strings; + + if (!WaitForHmiIsReady()) { + SDL_LOG_ERROR("Failed to wait for HMI readiness"); + return false; + } + + const auto vehicle_type_ptr = hmi_capabilities_->vehicle_type(); + if (vehicle_type_ptr) { + if (vehicle_type_ptr->keyExists(vehicle_make)) { + data.vehicle_make = vehicle_type_ptr->getElement(vehicle_make).asString(); + } + + if (vehicle_type_ptr->keyExists(vehicle_model)) { + data.vehicle_model = + vehicle_type_ptr->getElement(vehicle_model).asString(); + } + + if (vehicle_type_ptr->keyExists(vehicle_model_year)) { + data.vehicle_year = + vehicle_type_ptr->getElement(vehicle_model_year).asString(); + } + + if (vehicle_type_ptr->keyExists(vehicle_trim)) { + data.vehicle_trim = vehicle_type_ptr->getElement(vehicle_trim).asString(); + } + } + + data.vehicle_system_software_version = hmi_capabilities_->ccpu_version(); + data.vehicle_system_hardware_version = hmi_capabilities_->hardware_version(); + + return true; +} + void ApplicationManagerImpl::OnFindNewApplicationsRequest() { connection_handler().ConnectToAllDevices(); SDL_LOG_DEBUG("Starting application list update timer"); @@ -2536,7 +2588,7 @@ bool ApplicationManagerImpl::Init( bool ApplicationManagerImpl::Stop() { SDL_LOG_AUTO_TRACE(); - is_stopping_.store(true); + InitiateStopping(); application_list_update_timer_.Stop(); try { if (unregister_reason_ == @@ -2951,7 +3003,7 @@ void ApplicationManagerImpl::SetUnregisterAllApplicationsReason( void ApplicationManagerImpl::HeadUnitReset( mobile_api::AppInterfaceUnregisteredReason::eType reason) { SDL_LOG_AUTO_TRACE(); - is_stopping_.store(true); + InitiateStopping(); switch (reason) { case mobile_api::AppInterfaceUnregisteredReason::MASTER_RESET: { SDL_LOG_TRACE("Performing MASTER_RESET"); @@ -3203,6 +3255,7 @@ void ApplicationManagerImpl::UnregisterApplication( } ApplicationSharedPtr app_to_remove; connection_handler::DeviceHandle handle = 0; + { sync_primitives::AutoLock lock(applications_list_lock_ptr_); auto it_app = applications_.begin(); @@ -3215,64 +3268,65 @@ void ApplicationManagerImpl::UnregisterApplication( ++it_app; } } - if (!app_to_remove) { - SDL_LOG_ERROR("Cant find application with app_id = " << app_id); - - // Just to terminate RAI in case of connection is dropped (rare case) - // App won't be unregistered since RAI has not been started yet - SDL_LOG_DEBUG("Trying to terminate possible RAI request."); - request_ctrl_.terminateAppRequests(app_id); + } + if (!app_to_remove) { + SDL_LOG_ERROR("Cant find application with app_id = " << app_id); - return; - } + // Just to terminate RAI in case of connection is dropped (rare case) + // App won't be unregistered since RAI has not been started yet + SDL_LOG_DEBUG("Trying to terminate possible RAI request."); + request_ctrl_.terminateAppRequests(app_id); - if (is_resuming) { - resume_controller().SaveApplication(app_to_remove); - } else { - resume_controller().RemoveApplicationFromSaved(app_to_remove); - } - - if (IsAppSubscribedForWayPoints(app_id)) { - UnsubscribeAppFromWayPoints(app_id, true); - if (!IsAnyAppSubscribedForWayPoints()) { - SDL_LOG_DEBUG("Send UnsubscribeWayPoints"); - auto request = MessageHelper::CreateUnsubscribeWayPointsRequest( - GetNextHMICorrelationID()); - rpc_service_->ManageHMICommand(request); - } - } + return; + } - (hmi_capabilities_->get_hmi_language_handler()) - .OnUnregisterApplication(app_id); + resume_controller().RemoveFromResumption(app_id); - if (connection_handler().GetDeviceID(app_to_remove->mac_address(), - &handle)) { - AppV4DevicePredicate finder(handle); - ApplicationSharedPtr app = FindApp(applications(), finder); - if (!app) { - SDL_LOG_DEBUG( - "There is no more SDL4 apps with device handle: " << handle); + if (is_resuming) { + resume_controller().SaveApplication(app_to_remove); + } else { + resume_controller().RemoveApplicationFromSaved(app_to_remove); + } - RemoveAppsWaitingForRegistration(handle); - } + if (IsAppSubscribedForWayPoints(app_id)) { + UnsubscribeAppFromWayPoints(app_id, true); + if (!IsAnyAppSubscribedForWayPoints()) { + SDL_LOG_DEBUG("Send UnsubscribeWayPoints"); + auto request = MessageHelper::CreateUnsubscribeWayPointsRequest( + GetNextHMICorrelationID()); + rpc_service_->ManageHMICommand(request); } + } - MessageHelper::SendOnAppUnregNotificationToHMI( - app_to_remove, is_unexpected_disconnect, *this); - commands_holder_->Clear(app_to_remove); + (hmi_capabilities_->get_hmi_language_handler()) + .OnUnregisterApplication(app_id); - const auto enabled_local_apps = policy_handler_->GetEnabledLocalApps(); - if (helpers::in_range(enabled_local_apps, app_to_remove->policy_app_id())) { + if (connection_handler().GetDeviceID(app_to_remove->mac_address(), &handle)) { + AppV4DevicePredicate finder(handle); + ApplicationSharedPtr app = FindApp(applications(), finder); + if (!app) { SDL_LOG_DEBUG( - "Enabled local app has been unregistered. Re-create " - "pending application"); - CreatePendingLocalApplication(app_to_remove->policy_app_id()); + "There is no more SDL4 apps with device handle: " << handle); + + RemoveAppsWaitingForRegistration(handle); } + } - RefreshCloudAppInformation(); - SendUpdateAppList(); + MessageHelper::SendOnAppUnregNotificationToHMI( + app_to_remove, is_unexpected_disconnect, *this); + commands_holder_->Clear(app_to_remove); + + const auto enabled_local_apps = policy_handler_->GetEnabledLocalApps(); + if (helpers::in_range(enabled_local_apps, app_to_remove->policy_app_id())) { + SDL_LOG_DEBUG( + "Enabled local app has been unregistered. Re-create " + "pending application"); + CreatePendingLocalApplication(app_to_remove->policy_app_id()); } + RefreshCloudAppInformation(); + SendUpdateAppList(); + if (EndAudioPassThru(app_id)) { // May be better to put this code in MessageHelper? StopAudioPassThru(app_id); @@ -3555,6 +3609,27 @@ void ApplicationManagerImpl::ForbidStreaming( } void ApplicationManagerImpl::OnAppStreaming( + uint32_t app_id, protocol_handler::ServiceType service_type, bool state) { + SDL_LOG_AUTO_TRACE(); + + ApplicationSharedPtr app = application(app_id); + if (!app || (!app->is_navi() && !app->mobile_projection_enabled())) { + SDL_LOG_DEBUG( + " There is no navi or projection application with id: " << app_id); + return; + } + DCHECK_OR_RETURN_VOID(media_manager_); + + if (state) { + state_ctrl_.OnVideoStreamingStarted(app); + media_manager_->StartStreaming(app_id, service_type); + } else { + media_manager_->StopStreaming(app_id, service_type); + state_ctrl_.OnVideoStreamingStopped(app); + } +} + +void ApplicationManagerImpl::OnAppStreaming( uint32_t app_id, protocol_handler::ServiceType service_type, const Application::StreamingState new_state) { @@ -4104,7 +4179,17 @@ bool ApplicationManagerImpl::IsHMICooperating() const { } void ApplicationManagerImpl::SetHMICooperating(const bool hmi_cooperating) { + SDL_LOG_AUTO_TRACE(); + sync_primitives::AutoLock lock(wait_for_hmi_lock_); hmi_cooperating_ = hmi_cooperating; + wait_for_hmi_condvar_.Broadcast(); +} + +void ApplicationManagerImpl::InitiateStopping() { + SDL_LOG_AUTO_TRACE(); + sync_primitives::AutoLock lock(wait_for_hmi_lock_); + is_stopping_.store(true); + wait_for_hmi_condvar_.Broadcast(); } void ApplicationManagerImpl::OnApplicationListUpdateTimer() { @@ -4238,6 +4323,10 @@ ResetGlobalPropertiesResult ApplicationManagerImpl::ResetGlobalProperties( result.keyboard_properties = true; break; } + case mobile_apis::GlobalProperty::USER_LOCATION: { + result.user_location = true; + break; + } default: { SDL_LOG_TRACE("Unknown global property: " << global_property); break; @@ -4288,7 +4377,9 @@ ApplicationManagerImpl::CreateAllAppGlobalPropsIDList( if (application->keyboard_props()) { (*global_properties)[i++] = GlobalProperty::KEYBOARDPROPERTIES; } - + if (!application->get_user_location().empty()) { + (*global_properties)[i++] = GlobalProperty::USER_LOCATION; + } return global_properties; } diff --git a/src/components/application_manager/src/application_state.cc b/src/components/application_manager/src/application_state.cc index 1ec4abaed7..adaefd2e95 100644 --- a/src/components/application_manager/src/application_state.cc +++ b/src/components/application_manager/src/application_state.cc @@ -127,7 +127,7 @@ HmiStatePtr ApplicationState::GetState(const WindowID window_id, SDL_LOG_DEBUG("Getting postponed state for window " << window_id); return PostponedHmiState(window_id); default: - SDL_LOG_DEBUG("Getting current state for window " << window_id); + SDL_LOG_TRACE("Getting current state for window " << window_id); return CurrentHmiState(window_id); } } diff --git a/src/components/application_manager/src/hmi_capabilities_impl.cc b/src/components/application_manager/src/hmi_capabilities_impl.cc index 1390a3ae2c..f313e0c0a5 100644 --- a/src/components/application_manager/src/hmi_capabilities_impl.cc +++ b/src/components/application_manager/src/hmi_capabilities_impl.cc @@ -126,6 +126,13 @@ HMICapabilitiesImpl::HMICapabilitiesImpl(ApplicationManager& app_mngr) is_ivi_cooperating_ = true; is_rc_cooperating_ = true; } + requests_required_for_capabilities_ = { + hmi_apis::FunctionID::VehicleInfo_IsReady, + hmi_apis::FunctionID::VR_IsReady, + hmi_apis::FunctionID::TTS_IsReady, + hmi_apis::FunctionID::UI_IsReady, + hmi_apis::FunctionID::RC_IsReady, + hmi_apis::FunctionID::Navigation_IsReady}; } HMICapabilitiesImpl::~HMICapabilitiesImpl() {} @@ -1860,6 +1867,15 @@ const std::string& HMICapabilitiesImpl::ccpu_version() const { return ccpu_version_; } +void HMICapabilitiesImpl::set_hardware_version( + const std::string& hardware_version) { + hardware_version_ = hardware_version; +} + +const std::string& HMICapabilitiesImpl::hardware_version() const { + return hardware_version_; +} + void HMICapabilitiesImpl::convert_json_languages_to_obj( const Json::Value& json_languages, smart_objects::SmartObject& languages) const { 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 9bf623d343..b25e07c8f3 100644 --- a/src/components/application_manager/src/message_helper/message_helper.cc +++ b/src/components/application_manager/src/message_helper/message_helper.cc @@ -53,6 +53,7 @@ #include "application_manager/message_helper.h" #include "application_manager/policies/policy_handler_interface.h" #include "application_manager/resumption/resume_ctrl.h" +#include "application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/rc_module_constants.h" #include "application_manager/rpc_service.h" #include "connection_handler/connection_handler_impl.h" #include "interfaces/MOBILE_API.h" @@ -183,6 +184,8 @@ std::pair<std::string, mobile_apis::VehicleDataType::eType> std::make_pair( strings::cloud_app_vehicle_id, mobile_apis::VehicleDataType::VEHICLEDATA_CLOUDAPPVEHICLEID), + std::make_pair(strings::climate_data, + mobile_apis::VehicleDataType::VEHICLEDATA_CLIMATEDATA), std::make_pair(strings::external_temp, mobile_apis::VehicleDataType::VEHICLEDATA_EXTERNTEMP), std::make_pair(strings::turn_signal, @@ -394,18 +397,23 @@ MessageHelper::CreateUIResetGlobalPropertiesRequest( } if (reset_result.keyboard_properties) { - smart_objects::SmartObject key_board_properties = + smart_objects::SmartObject keyboard_properties = smart_objects::SmartObject(smart_objects::SmartType_Map); - key_board_properties[strings::language] = + keyboard_properties[strings::language] = static_cast<int32_t>(hmi_apis::Common_Language::EN_US); - key_board_properties[hmi_request::keyboard_layout] = + keyboard_properties[hmi_request::keyboard_layout] = static_cast<int32_t>(hmi_apis::Common_KeyboardLayout::QWERTY); - key_board_properties[hmi_request::auto_complete_list] = + keyboard_properties[hmi_request::auto_complete_list] = smart_objects::SmartObject(smart_objects::SmartType_Array); + keyboard_properties[strings::auto_complete_text] = ""; + keyboard_properties[hmi_request::mask_input_characters] = + static_cast<int32_t>( + hmi_apis::Common_KeyboardInputMask::DISABLE_INPUT_KEY_MASK); - key_board_properties[strings::auto_complete_text] = ""; (*ui_reset_global_prop_request)[hmi_request::keyboard_properties] = - key_board_properties; + keyboard_properties; + application->set_keyboard_props( + smart_objects::SmartObject(smart_objects::SmartType_Null)); } (*ui_reset_global_prop_request)[strings::app_id] = application->app_id(); @@ -414,6 +422,39 @@ MessageHelper::CreateUIResetGlobalPropertiesRequest( } smart_objects::SmartObjectSPtr +MessageHelper::CreateRCResetGlobalPropertiesRequest( + const ResetGlobalPropertiesResult& reset_result, + const ApplicationSharedPtr application) { + namespace rc = rc_rpc_plugin; + + smart_objects::SmartObjectSPtr rc_reset_global_prop_request = + std::make_shared<smart_objects::SmartObject>( + smart_objects::SmartType_Map); + + if (reset_result.user_location) { + smart_objects::SmartObject user_location = + smart_objects::SmartObject(smart_objects::SmartType_Map); + + user_location[rc::strings::kGrid] = + smart_objects::SmartObject(smart_objects::SmartType_Map); + smart_objects::SmartObject& grid = user_location[rc::strings::kGrid]; + grid[rc::strings::kRow] = 0; + grid[rc::strings::kCol] = 0; + grid[rc::strings::kLevel] = 0; + grid[rc::strings::kRowspan] = 1; + grid[rc::strings::kColspan] = 1; + grid[rc::strings::kLevelspan] = 1; + + (*rc_reset_global_prop_request)[strings::user_location] = user_location; + application->set_user_location(user_location); + } + + (*rc_reset_global_prop_request)[strings::app_id] = application->app_id(); + + return rc_reset_global_prop_request; +} + +smart_objects::SmartObjectSPtr MessageHelper::CreateDisplayCapabilityUpdateToMobile( const smart_objects::SmartObject& display_capabilities, Application& app) { SDL_LOG_AUTO_TRACE(); diff --git a/src/components/application_manager/src/policies/policy_handler.cc b/src/components/application_manager/src/policies/policy_handler.cc index 890dd5b57a..bacd478138 100644 --- a/src/components/application_manager/src/policies/policy_handler.cc +++ b/src/components/application_manager/src/policies/policy_handler.cc @@ -838,7 +838,7 @@ void PolicyHandler::OnSystemRequestReceived() const { } void PolicyHandler::TriggerPTUOnStartupIfRequired() { -#ifdef PROPRIETARY_MODE +#if defined(PROPRIETARY_MODE) || defined(EXTERNAL_PROPRIETARY_MODE) const auto policy_manager = LoadPolicyManager(); POLICY_LIB_CHECK_VOID(policy_manager); policy_manager->TriggerPTUOnStartupIfRequired(); @@ -1097,6 +1097,14 @@ void PolicyHandler::OnGetSystemInfo(const std::string& ccpu_version, policy_manager->SetSystemInfo(ccpu_version, wers_country_code, language); } +void PolicyHandler::OnHardwareVersionReceived( + const std::string& hardware_version) { + SDL_LOG_AUTO_TRACE(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_VOID(policy_manager); + policy_manager->SetHardwareVersion(hardware_version); +} + std::string PolicyHandler::GetCCPUVersionFromPT() const { SDL_LOG_AUTO_TRACE(); const auto policy_manager = LoadPolicyManager(); @@ -1104,6 +1112,13 @@ std::string PolicyHandler::GetCCPUVersionFromPT() const { return policy_manager->GetCCPUVersionFromPT(); } +std::string PolicyHandler::GetHardwareVersionFromPT() const { + SDL_LOG_AUTO_TRACE(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, std::string()); + return policy_manager->GetHardwareVersionFromPT(); +} + void PolicyHandler::OnVIIsReady() { SDL_LOG_AUTO_TRACE(); const uint32_t correlation_id = diff --git a/src/components/application_manager/src/resumption/resumption_data_processor_impl.cc b/src/components/application_manager/src/resumption/resumption_data_processor_impl.cc index 504db76a82..dffb1ea094 100644 --- a/src/components/application_manager/src/resumption/resumption_data_processor_impl.cc +++ b/src/components/application_manager/src/resumption/resumption_data_processor_impl.cc @@ -29,6 +29,7 @@ #include "application_manager/application_manager.h" #include "application_manager/commands/command_impl.h" +#include "application_manager/commands/command_request_impl.h" #include "application_manager/display_capabilities_builder.h" #include "application_manager/event_engine/event_observer.h" #include "application_manager/message_helper.h" @@ -151,6 +152,8 @@ void ResumptionDataProcessorImpl::ProcessResumptionStatus( if (IsResponseSuccessful(response)) { status.successful_requests.push_back(found_request); } else { + SDL_LOG_DEBUG("Resumption request failed"); + MessageHelper::PrintSmartObject(response); status.error_requests.push_back(found_request); } @@ -807,6 +810,21 @@ void ResumptionDataProcessorImpl::DeleteGlobalProperties( (*msg)[strings::msg_params] = *msg_params; ProcessMessageToHMI(msg, false); } + + if (result.HasRCPropertiesReset() && + check_if_successful(hmi_apis::FunctionID::RC_SetGlobalProperties)) { + smart_objects::SmartObjectSPtr msg_params = + MessageHelper::CreateRCResetGlobalPropertiesRequest(result, + application); + auto msg = MessageHelper::CreateMessageForHMI( + hmi_apis::messageType::request, + application_manager_.GetNextHMICorrelationID()); + (*msg)[strings::params][strings::function_id] = + hmi_apis::FunctionID::RC_SetGlobalProperties; + + (*msg)[strings::msg_params] = *msg_params; + ProcessMessageToHMI(msg, false); + } } void ResumptionDataProcessorImpl::AddSubscriptions( @@ -977,7 +995,12 @@ void ResumptionDataProcessorImpl::DeletePluginsSubscriptions( } bool IsResponseSuccessful(const smart_objects::SmartObject& response) { - return !response[strings::params].keyExists(strings::error_msg); + auto result_code = static_cast<hmi_apis::Common_Result::eType>( + response[strings::params][application_manager::hmi_response::code] + .asInt()); + + return commands::CommandRequestImpl::IsHMIResultSuccess(result_code) || + hmi_apis::Common_Result::UNSUPPORTED_RESOURCE == result_code; } void ResumptionDataProcessorImpl::CheckVehicleDataResponse( diff --git a/src/components/application_manager/src/rpc_service_impl.cc b/src/components/application_manager/src/rpc_service_impl.cc index 34a0bed7af..f0cd720e30 100644 --- a/src/components/application_manager/src/rpc_service_impl.cc +++ b/src/components/application_manager/src/rpc_service_impl.cc @@ -390,7 +390,10 @@ bool RPCServiceImpl::ManageHMICommand(const commands::MessageSharedPtr message, if (command->Init()) { command->Run(); - if (kResponse == message_type) { + if (helpers::Compare<int32_t, helpers::EQ, helpers::ONE>( + message_type, kResponse, kErrorResponse) && + message->getElement(strings::params) + .keyExists(strings::correlation_id)) { const uint32_t correlation_id = (*(message.get()))[strings::params][strings::correlation_id].asUInt(); const int32_t function_id = diff --git a/src/components/application_manager/src/smart_object_keys.cc b/src/components/application_manager/src/smart_object_keys.cc index a96c02f88f..a680653d6c 100644 --- a/src/components/application_manager/src/smart_object_keys.cc +++ b/src/components/application_manager/src/smart_object_keys.cc @@ -197,6 +197,8 @@ const char* policy_type = "policyType"; const char* property = "property"; const char* displays = "displays"; const char* seat_location = "seatLocation"; +const char* app_capability = "appCapability"; +const char* app_capability_type = "appCapabilityType"; // PutFile const char* sync_file_name = "syncFileName"; @@ -266,6 +268,7 @@ const char* fuel_level_state = "fuelLevel_State"; const char* instant_fuel_consumption = "instantFuelConsumption"; const char* fuel_range = "fuelRange"; const char* cloud_app_vehicle_id = "cloudAppVehicleID"; +const char* climate_data = "climateData"; const char* external_temp = "externalTemperature"; const char* turn_signal = "turnSignal"; const char* vin = "vin"; @@ -306,6 +309,7 @@ const char* video_streaming = "videoStreaming"; const char* remote_control = "remoteControl"; const char* sdl_version = "sdlVersion"; const char* system_software_version = "systemSoftwareVersion"; +const char* system_hardware_version = "systemHardwareVersion"; const char* priority = "priority"; const char* engine_oil_life = "engineOilLife"; const char* oem_custom_data_type = "oemCustomDataType"; @@ -443,6 +447,8 @@ const char* const haptic_spatial_data_supported = "hapticSpatialDataSupported"; const char* const diagonal_screen_size = "diagonalScreenSize"; const char* const pixel_per_inch = "pixelPerInch"; const char* const scale = "scale"; +const char* const additional_video_streaming_capabilities = + "additionalVideoStreamingCapabilities"; const char* const haptic_rect_data = "hapticRectData"; const char* const rect = "rect"; const char* const x = "x"; @@ -546,6 +552,8 @@ const char* method_name = "methodName"; const char* keyboard_layout = "keyboardLayout"; const char* limited_character_list = "limitedCharacterList"; const char* auto_complete_list = "autoCompleteList"; +const char* mask_input_characters = "maskInputCharacters"; +const char* custom_keys = "customKeys"; const char* file = "file"; const char* file_name = "fileName"; const char* retry = "retry"; @@ -583,6 +591,9 @@ const char* image_capabilities = "imageCapabilities"; const char* display_type = "displayType"; const char* display_name = "displayName"; const char* text_fields = "textFields"; +const char* keyboard_capabilities = "keyboardCapabilities"; +const char* supported_keyboards = "supportedKeyboards"; +const char* num_configurable_keys = "numConfigurableKeys"; const char* media_clock_formats = "mediaClockFormats"; const char* graphic_supported = "graphicSupported"; const char* image_fields = "imageFields"; diff --git a/src/components/application_manager/test/application_impl_test.cc b/src/components/application_manager/test/application_impl_test.cc index c3d02271cf..5f23e97391 100644 --- a/src/components/application_manager/test/application_impl_test.cc +++ b/src/components/application_manager/test/application_impl_test.cc @@ -840,6 +840,7 @@ TEST_F(ApplicationImplTest, StartStreaming_StreamingApproved) { TEST_F(ApplicationImplTest, SuspendNaviStreaming) { protocol_handler::ServiceType type = protocol_handler::ServiceType::kMobileNav; + EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, false)); EXPECT_CALL(mock_application_manager_, ProcessOnDataStreamingNotification(type, app_id, false)); app_impl->SuspendStreaming(type); @@ -847,6 +848,7 @@ TEST_F(ApplicationImplTest, SuspendNaviStreaming) { TEST_F(ApplicationImplTest, SuspendAudioStreaming) { protocol_handler::ServiceType type = protocol_handler::ServiceType::kAudio; + EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, false)); EXPECT_CALL(mock_application_manager_, ProcessOnDataStreamingNotification(type, app_id, false)); app_impl->SuspendStreaming(type); @@ -855,16 +857,12 @@ TEST_F(ApplicationImplTest, SuspendAudioStreaming) { // TODO {AKozoriz} : Fix tests with streaming (APPLINK-19289) TEST_F(ApplicationImplTest, DISABLED_Suspend_WakeUpAudioStreaming) { protocol_handler::ServiceType type = protocol_handler::ServiceType::kAudio; - EXPECT_CALL( - mock_application_manager_, - OnAppStreaming(app_id, type, Application::StreamingState::kSuspended)); + EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, false)); EXPECT_CALL(*MockMessageHelper::message_helper_mock(), SendOnDataStreaming(type, false, _)); app_impl->SuspendStreaming(type); - EXPECT_CALL( - mock_application_manager_, - OnAppStreaming(app_id, type, Application::StreamingState::kStarted)); + EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, true)); EXPECT_CALL(*MockMessageHelper::message_helper_mock(), SendOnDataStreaming(type, true, _)); app_impl->WakeUpStreaming(type); @@ -873,16 +871,12 @@ TEST_F(ApplicationImplTest, DISABLED_Suspend_WakeUpAudioStreaming) { TEST_F(ApplicationImplTest, DISABLED_Suspend_WakeUpNaviStreaming) { protocol_handler::ServiceType type = protocol_handler::ServiceType::kMobileNav; - EXPECT_CALL( - mock_application_manager_, - OnAppStreaming(app_id, type, Application::StreamingState::kSuspended)); + EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, false)); EXPECT_CALL(*MockMessageHelper::message_helper_mock(), SendOnDataStreaming(type, false, _)); app_impl->SuspendStreaming(type); - EXPECT_CALL( - mock_application_manager_, - OnAppStreaming(app_id, type, Application::StreamingState::kStarted)); + EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, true)); EXPECT_CALL(*MockMessageHelper::message_helper_mock(), SendOnDataStreaming(type, true, _)); app_impl->WakeUpStreaming(type); @@ -894,9 +888,7 @@ TEST_F(ApplicationImplTest, StopStreaming_StreamingApproved) { protocol_handler::ServiceType::kMobileNav; app_impl->set_video_streaming_approved(true); - EXPECT_CALL( - mock_application_manager_, - OnAppStreaming(app_id, type, Application::StreamingState::kStopped)); + EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, false)); EXPECT_CALL(mock_application_manager_, ProcessOnDataStreamingNotification(type, app_id, false)); EXPECT_CALL(*MockMessageHelper::message_helper_mock(), @@ -908,9 +900,7 @@ TEST_F(ApplicationImplTest, StopStreaming_StreamingApproved) { // Stop audio streaming app_impl->set_audio_streaming_approved(true); type = protocol_handler::ServiceType::kAudio; - EXPECT_CALL( - mock_application_manager_, - OnAppStreaming(app_id, type, Application::StreamingState::kStopped)); + EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, false)); EXPECT_CALL(mock_application_manager_, ProcessOnDataStreamingNotification(type, app_id, false)); EXPECT_CALL(*MockMessageHelper::message_helper_mock(), diff --git a/src/components/application_manager/test/hmi_capabilities_test.cc b/src/components/application_manager/test/hmi_capabilities_test.cc index 1377b0bc22..c83dd76978 100644 --- a/src/components/application_manager/test/hmi_capabilities_test.cc +++ b/src/components/application_manager/test/hmi_capabilities_test.cc @@ -130,6 +130,14 @@ const std::vector<hmi_apis::Common_LightName::eType> light_name_enum_values{ hmi_apis::Common_LightName::eType::EXTERIOR_RIGHT_LIGHTS, hmi_apis::Common_LightName::eType::EXTERIOR_ALL_LIGHTS}; +const std::vector<hmi_apis::FunctionID::eType> is_ready_requests{ + hmi_apis::FunctionID::RC_IsReady, + hmi_apis::FunctionID::VR_IsReady, + hmi_apis::FunctionID::UI_IsReady, + hmi_apis::FunctionID::TTS_IsReady, + hmi_apis::FunctionID::Navigation_IsReady, + hmi_apis::FunctionID::VehicleInfo_IsReady}; + bool IsLightNameExists(const hmi_apis::Common_LightName::eType& light_name) { auto it = std::find( light_name_enum_values.begin(), light_name_enum_values.end(), light_name); @@ -155,6 +163,13 @@ class HMICapabilitiesTest : public ::testing::Test { .WillByDefault(ReturnRef(kHmiCapabilitiesCacheFile)); hmi_capabilities_ = std::make_shared<HMICapabilitiesImpl>(mock_app_mngr_); + IsReadyResponsesReceived(); + } + + void IsReadyResponsesReceived() { + for (const auto& request : is_ready_requests) { + hmi_capabilities_->UpdateRequestsRequiredForCapabilities(request); + } } void TearDown() OVERRIDE { @@ -530,16 +545,16 @@ TEST_F( 800, vs_capability_so[strings::preferred_resolution][strings::resolution_width] .asInt()); - EXPECT_EQ(350, + EXPECT_EQ(380, vs_capability_so[strings::preferred_resolution] [strings::resolution_height] .asInt()); EXPECT_TRUE(vs_capability_so.keyExists(strings::max_bitrate)); - EXPECT_EQ(10000, vs_capability_so[strings::max_bitrate].asInt()); + EXPECT_EQ(20000, vs_capability_so[strings::max_bitrate].asInt()); EXPECT_TRUE(vs_capability_so.keyExists(strings::supported_formats)); const size_t supported_formats_len = vs_capability_so[strings::supported_formats].length(); - EXPECT_EQ(1ull, supported_formats_len); + EXPECT_EQ(5u, supported_formats_len); EXPECT_TRUE(vs_capability_so[strings::supported_formats][0].keyExists( strings::protocol)); @@ -554,9 +569,21 @@ TEST_F( EXPECT_TRUE( vs_capability_so.keyExists(strings::haptic_spatial_data_supported)); - EXPECT_FALSE( + EXPECT_TRUE( vs_capability_so[strings::haptic_spatial_data_supported].asBool()); + EXPECT_TRUE(vs_capability_so.keyExists(strings::diagonal_screen_size)); + EXPECT_EQ(8, vs_capability_so[strings::diagonal_screen_size].asInt()); + EXPECT_TRUE(vs_capability_so.keyExists(strings::pixel_per_inch)); + EXPECT_EQ(96, vs_capability_so[strings::pixel_per_inch].asInt()); + EXPECT_TRUE(vs_capability_so.keyExists(strings::scale)); + EXPECT_EQ(1, vs_capability_so[strings::scale].asInt()); EXPECT_TRUE(vs_capability_so.keyExists(strings::preferred_fps)); + EXPECT_TRUE(vs_capability_so.keyExists( + strings::additional_video_streaming_capabilities)); + const size_t additional_video_streaming_capabilities_len = + vs_capability_so[strings::additional_video_streaming_capabilities] + .length(); + EXPECT_EQ(7u, additional_video_streaming_capabilities_len); EXPECT_TRUE(hmi_capabilities_->video_streaming_supported()); } diff --git a/src/components/application_manager/test/include/application_manager/commands/commands_test.h b/src/components/application_manager/test/include/application_manager/commands/commands_test.h index fdaef2c716..18afa01a88 100644 --- a/src/components/application_manager/test/include/application_manager/commands/commands_test.h +++ b/src/components/application_manager/test/include/application_manager/commands/commands_test.h @@ -53,6 +53,7 @@ namespace components { namespace commands_test { namespace am = ::application_manager; +namespace strings = am::strings; using ::testing::_; using ::testing::Mock; @@ -179,6 +180,30 @@ class CommandsTest : public ::testing::Test { InitHMIToMobileResultConverter(); } + void FillVideoStreamingCapability( + smart_objects::SmartObject& video_streaming_capability) { + video_streaming_capability[strings::preferred_resolution] = + smart_objects::SmartObject(smart_objects::SmartType_Map); + video_streaming_capability[strings::preferred_resolution] + [strings::resolution_width] = 800; + video_streaming_capability[strings::preferred_resolution] + [strings::resolution_height] = 354; + video_streaming_capability[strings::max_bitrate] = 10000; + video_streaming_capability[strings::supported_formats] = + smart_objects::SmartObject(smart_objects::SmartType_Array); + video_streaming_capability[strings::supported_formats][0] = + smart_objects::SmartObject(smart_objects::SmartType_Map); + video_streaming_capability[strings::supported_formats][0] + [strings::protocol] = + hmi_apis::Common_VideoStreamingProtocol::RAW; + video_streaming_capability[strings::supported_formats][0][strings::codec] = + hmi_apis::Common_VideoStreamingCodec::H264; + video_streaming_capability[strings::haptic_spatial_data_supported] = true; + video_streaming_capability[strings::diagonal_screen_size] = 7.47; + video_streaming_capability[strings::pixel_per_inch] = 117.f; + video_streaming_capability[strings::scale] = 1.f; + } + void InitHMIToMobileResultConverter() { namespace MobileResult = mobile_apis::Result; namespace HMIResult = hmi_apis::Common_Result; diff --git a/src/components/application_manager/test/include/application_manager/mock_application.h b/src/components/application_manager/test/include/application_manager/mock_application.h index 9c28d321fa..2c9fe688b4 100644 --- a/src/components/application_manager/test/include/application_manager/mock_application.h +++ b/src/components/application_manager/test/include/application_manager/mock_application.h @@ -88,8 +88,9 @@ class MockApplication : public ::application_manager::Application { void(protocol_handler::ServiceType service_type)); MOCK_METHOD1(SuspendStreaming, void(protocol_handler::ServiceType service_type)); - MOCK_METHOD1(WakeUpStreaming, - void(protocol_handler::ServiceType service_type)); + MOCK_METHOD2(WakeUpStreaming, + void(protocol_handler::ServiceType service_type, + uint32_t timer_len)); MOCK_CONST_METHOD0(is_voice_communication_supported, bool()); MOCK_METHOD1(set_voice_communication_supported, void(bool is_voice_communication_supported)); diff --git a/src/components/application_manager/test/include/application_manager/mock_hmi_capabilities.h b/src/components/application_manager/test/include/application_manager/mock_hmi_capabilities.h index 2f9f40ad2a..e40197cc13 100644 --- a/src/components/application_manager/test/include/application_manager/mock_hmi_capabilities.h +++ b/src/components/application_manager/test/include/application_manager/mock_hmi_capabilities.h @@ -212,6 +212,8 @@ class MockHMICapabilities : public ::application_manager::HMICapabilities { MOCK_CONST_METHOD0(ccpu_version, const std::string&()); MOCK_METHOD1(set_ccpu_version, void(const std::string& ccpu_version)); + MOCK_CONST_METHOD0(hardware_version, const std::string&()); + MOCK_METHOD1(set_hardware_version, void(const std::string& hardware_version)); MOCK_METHOD1(OnSoftwareVersionReceived, void(const std::string& ccpu_version)); MOCK_METHOD0(UpdateCachedCapabilities, void()); diff --git a/src/components/application_manager/test/include/application_manager/mock_message_helper.h b/src/components/application_manager/test/include/application_manager/mock_message_helper.h index d7919a374b..89b2d125e5 100644 --- a/src/components/application_manager/test/include/application_manager/mock_message_helper.h +++ b/src/components/application_manager/test/include/application_manager/mock_message_helper.h @@ -182,6 +182,12 @@ class MockMessageHelper { smart_objects::SmartObjectSPtr( const ResetGlobalPropertiesResult& reset_result, ApplicationSharedPtr application)); + + MOCK_METHOD2(CreateRCResetGlobalPropertiesRequest, + smart_objects::SmartObjectSPtr( + const ResetGlobalPropertiesResult& reset_result, + ApplicationSharedPtr application)); + MOCK_METHOD2(CreateGlobalPropertiesRequestsToHMI, smart_objects::SmartObjectList(ApplicationConstSharedPtr app, ApplicationManager& app_mngr)); diff --git a/src/components/application_manager/test/mock_message_helper.cc b/src/components/application_manager/test/mock_message_helper.cc index 91f953eaf5..554b99ff72 100644 --- a/src/components/application_manager/test/mock_message_helper.cc +++ b/src/components/application_manager/test/mock_message_helper.cc @@ -582,6 +582,14 @@ MessageHelper::CreateTTSResetGlobalPropertiesRequest( ->CreateTTSResetGlobalPropertiesRequest(reset_result, application); } +smart_objects::SmartObjectSPtr +MessageHelper::CreateRCResetGlobalPropertiesRequest( + const ResetGlobalPropertiesResult& reset_result, + ApplicationSharedPtr application) { + return MockMessageHelper::message_helper_mock() + ->CreateRCResetGlobalPropertiesRequest(reset_result, application); +} + smart_objects::SmartObjectList MessageHelper::CreateGlobalPropertiesRequestsToHMI( ApplicationConstSharedPtr app, ApplicationManager& app_mngr) { diff --git a/src/components/application_manager/test/policy_handler_test.cc b/src/components/application_manager/test/policy_handler_test.cc index b9a74f14ba..1d764526b9 100644 --- a/src/components/application_manager/test/policy_handler_test.cc +++ b/src/components/application_manager/test/policy_handler_test.cc @@ -1290,19 +1290,6 @@ TEST_F(PolicyHandlerTest, OnSystemInfoChanged) { policy_handler_.OnSystemInfoChanged(language); } -TEST_F(PolicyHandlerTest, OnGetSystemInfo) { - // Arrange - ChangePolicyManagerToMock(); - // Check expectations - const std::string ccpu_version("4.1.3.B_EB355B"); - const std::string wers_country_code("WAEGB"); - const std::string language("ru-ru"); - EXPECT_CALL(*mock_policy_manager_, - SetSystemInfo(ccpu_version, wers_country_code, language)); - // Act - policy_handler_.OnGetSystemInfo(ccpu_version, wers_country_code, language); -} - TEST_F(PolicyHandlerTest, IsApplicationRevoked) { // Arrange EnablePolicy(); diff --git a/src/components/config_profile/include/config_profile/profile.h b/src/components/config_profile/include/config_profile/profile.h index bbd0a5d243..dffa2d1571 100644 --- a/src/components/config_profile/include/config_profile/profile.h +++ b/src/components/config_profile/include/config_profile/profile.h @@ -552,6 +552,11 @@ class Profile : public protocol_handler::ProtocolHandlerSettings, */ size_t update_before_hours() const; + /** + * @brief Return security level that will be configured in the OpenSSL + */ + uint32_t security_level() const; + #endif // ENABLE_SECURITY /** @@ -1073,6 +1078,7 @@ class Profile : public protocol_handler::ProtocolHandlerSettings, std::string security_manager_protocol_name_; std::vector<int> force_protected_service_; std::vector<int> force_unprotected_service_; + uint32_t security_level_; #endif /* diff --git a/src/components/config_profile/src/profile.cc b/src/components/config_profile/src/profile.cc index d9204acf90..27829d478f 100644 --- a/src/components/config_profile/src/profile.cc +++ b/src/components/config_profile/src/profile.cc @@ -140,6 +140,7 @@ const char* kSecurityKeyPathKey = "KeyPath"; const char* kSecurityCipherListKey = "CipherList"; const char* kSecurityVerifyPeerKey = "VerifyPeer"; const char* kBeforeUpdateHours = "UpdateBeforeHours"; +const char* kSecurityLevel = "SecurityLevel"; #endif const char* kAudioDataStoppedTimeoutKey = "AudioDataStoppedTimeout"; @@ -337,6 +338,7 @@ const char* kDefaultSecurityProtocol = "TLSv1.2"; const char* kDefaultSSLMode = "CLIENT"; const bool kDefaultVerifyPeer = false; const uint32_t kDefaultBeforeUpdateHours = 24; +const uint32_t kDefaultSecurityLevel = 1; #endif // ENABLE_SECURITY const uint32_t kDefaultHubProtocolIndex = 0; @@ -1117,6 +1119,10 @@ const std::vector<int>& Profile::force_protected_service() const { const std::vector<int>& Profile::force_unprotected_service() const { return force_unprotected_service_; } + +uint32_t Profile::security_level() const { + return security_level_; +} #endif // ENABLE_SECURITY bool Profile::logs_enabled() const { @@ -1308,6 +1314,11 @@ void Profile::UpdateValues() { kSecuritySection, kBeforeUpdateHours); + ReadUIntValue(&security_level_, + kDefaultSecurityLevel, + kSecuritySection, + kSecurityLevel); + #endif // ENABLE_SECURITY // Logs enabled diff --git a/src/components/connection_handler/include/connection_handler/connection_handler_impl.h b/src/components/connection_handler/include/connection_handler/connection_handler_impl.h index a7dfd29b31..25a89ea4b3 100644 --- a/src/components/connection_handler/include/connection_handler/connection_handler_impl.h +++ b/src/components/connection_handler/include/connection_handler/connection_handler_impl.h @@ -648,6 +648,8 @@ class ConnectionHandlerImpl void CreateWebEngineDevice() OVERRIDE; + bool GetProtocolVehicleData(ProtocolVehicleData& data) OVERRIDE; + private: /** * \brief Disconnect application. diff --git a/src/components/connection_handler/src/connection_handler_impl.cc b/src/components/connection_handler/src/connection_handler_impl.cc index a771f0a104..c2c70ccae8 100644 --- a/src/components/connection_handler/src/connection_handler_impl.cc +++ b/src/components/connection_handler/src/connection_handler_impl.cc @@ -547,11 +547,16 @@ void ConnectionHandlerImpl::OnSessionStartedCallback( session_key, service_type, params); - } else { + } +#ifdef BUILD_TESTS + else { + // FIXME (VSemenyuk): This code is only used in unit tests, so should be + // removed. ConnectionHandler unit tests should be fixed. if (protocol_handler_) { protocol_handler_->NotifySessionStarted(context, rejected_params); } } +#endif } void ConnectionHandlerImpl::NotifyServiceStartedResult( @@ -589,17 +594,20 @@ void ConnectionHandlerImpl::NotifyServiceStartedResult( if (!result) { SDL_LOG_WARN("Service starting forbidden by connection_handler_observer"); + context.is_start_session_failed_ = true; + } + + if (protocol_handler_) { + protocol_handler_->NotifySessionStarted(context, rejected_params, reason); + } + + if (context.is_start_session_failed_) { if (protocol_handler::kRpc == context.service_type_) { connection->RemoveSession(context.new_session_id_); } else { connection->RemoveService(context.initial_session_id_, context.service_type_); } - context.new_session_id_ = 0; - } - - if (protocol_handler_ != NULL) { - protocol_handler_->NotifySessionStarted(context, rejected_params, reason); } } @@ -919,6 +927,15 @@ void ConnectionHandlerImpl::CreateWebEngineDevice() { transport_manager_.CreateWebEngineDevice(); } +bool ConnectionHandlerImpl::GetProtocolVehicleData(ProtocolVehicleData& data) { + sync_primitives::AutoReadLock read_lock(connection_handler_observer_lock_); + if (connection_handler_observer_) { + return connection_handler_observer_->GetProtocolVehicleData(data); + } + + return false; +} + const std::string ConnectionHandlerImpl::TransportTypeProfileStringFromConnHandle( transport_manager::ConnectionUID connection_handle) const { @@ -985,7 +1002,7 @@ uint32_t ConnectionHandlerImpl::KeyFromPair( transport_manager::ConnectionUID connection_handle, uint8_t session_id) const { const uint32_t key = connection_handle | (session_id << 16); - SDL_LOG_DEBUG("Key for ConnectionHandle:" + SDL_LOG_TRACE("Key for ConnectionHandle:" << static_cast<uint32_t>(connection_handle) << " Session:" << static_cast<uint32_t>(session_id) << " is: 0x" << std::hex << static_cast<uint32_t>(key)); @@ -1003,7 +1020,7 @@ void ConnectionHandlerImpl::PairFromKey( uint8_t* session_id) const { *connection_handle = key & 0xFF00FFFF; *session_id = key >> 16; - SDL_LOG_DEBUG("ConnectionHandle: " + SDL_LOG_TRACE("ConnectionHandle: " << static_cast<int32_t>(*connection_handle) << " Session: " << static_cast<int32_t>(*session_id) << " for key: " << static_cast<int32_t>(key)); @@ -1457,6 +1474,10 @@ void ConnectionHandlerImpl::ConnectToAllDevices() { SDL_LOG_DEBUG("No need to connect to web engine device"); continue; } + if ("CLOUD_WEBSOCKET" == i->second.connection_type()) { + SDL_LOG_DEBUG("No need to connect to cloud device"); + continue; + } ConnectToDevice(i->first); } } diff --git a/src/components/connection_handler/test/connection_handler_impl_test.cc b/src/components/connection_handler/test/connection_handler_impl_test.cc index 1e66454ce7..79b237253c 100644 --- a/src/components/connection_handler/test/connection_handler_impl_test.cc +++ b/src/components/connection_handler/test/connection_handler_impl_test.cc @@ -56,6 +56,7 @@ using namespace ::connection_handler; using ::protocol_handler::ServiceType; using namespace ::protocol_handler; using ::testing::_; +using ::testing::An; using ::testing::ByRef; using ::testing::DoAll; using ::testing::InSequence; @@ -127,7 +128,8 @@ class ConnectionHandlerTest : public ::testing::Test { void AddTestSession() { protocol_handler_test::MockProtocolHandler temp_protocol_handler; connection_handler_->set_protocol_handler(&temp_protocol_handler); - EXPECT_CALL(temp_protocol_handler, NotifySessionStarted(_, _, _)) + EXPECT_CALL(temp_protocol_handler, + NotifySessionStarted(An<SessionContext&>(), _, _)) .WillOnce(SaveArg<0>(&out_context_)); connection_handler_->OnSessionStartedCallback( @@ -164,7 +166,8 @@ class ConnectionHandlerTest : public ::testing::Test { SessionContext context; protocol_handler_test::MockProtocolHandler temp_protocol_handler; connection_handler_->set_protocol_handler(&temp_protocol_handler); - EXPECT_CALL(temp_protocol_handler, NotifySessionStarted(_, _, _)) + EXPECT_CALL(temp_protocol_handler, + NotifySessionStarted(An<SessionContext&>(), _, _)) .WillOnce(SaveArg<0>(&context)); connection_handler_->OnSessionStartedCallback(uid_, @@ -371,7 +374,8 @@ TEST_F(ConnectionHandlerTest, StartSession_NoConnection) { protocol_handler::SessionContext context; connection_handler_->set_protocol_handler(&mock_protocol_handler_); - EXPECT_CALL(mock_protocol_handler_, NotifySessionStarted(_, _, _)) + EXPECT_CALL(mock_protocol_handler_, + NotifySessionStarted(An<SessionContext&>(), _, _)) .WillOnce(SaveArg<0>(&context)); connection_handler_->OnSessionStartedCallback( @@ -1268,7 +1272,8 @@ TEST_F(ConnectionHandlerTest, StartService_withServices) { SessionContext audio_context, video_context; connection_handler_->set_protocol_handler(&mock_protocol_handler_); - EXPECT_CALL(mock_protocol_handler_, NotifySessionStarted(_, _, _)) + EXPECT_CALL(mock_protocol_handler_, + NotifySessionStarted(An<SessionContext&>(), _, _)) .WillOnce(SaveArg<0>(&audio_context)) .WillOnce(SaveArg<0>(&video_context)); @@ -1309,7 +1314,8 @@ TEST_F(ConnectionHandlerTest, StartService_withServices_withParams) { std::vector<std::string> empty; BsonObject* dummy_param = reinterpret_cast<BsonObject*>(&dummy); connection_handler_->set_protocol_handler(&mock_protocol_handler_); - EXPECT_CALL(mock_protocol_handler_, NotifySessionStarted(_, empty, _)) + EXPECT_CALL(mock_protocol_handler_, + NotifySessionStarted(An<SessionContext&>(), empty, _)) .WillOnce(SaveArg<0>(&video_context)); connection_handler_->OnSessionStartedCallback(uid_, @@ -1354,7 +1360,8 @@ TEST_F(ConnectionHandlerTest, ServiceStop) { SessionContext audio_context; connection_handler_->set_protocol_handler(&mock_protocol_handler_); - EXPECT_CALL(mock_protocol_handler_, NotifySessionStarted(_, _, _)) + EXPECT_CALL(mock_protocol_handler_, + NotifySessionStarted(An<SessionContext&>(), _, _)) .WillRepeatedly(SaveArg<0>(&audio_context)); // Check ignoring hash_id on stop non-rpc service @@ -1445,7 +1452,8 @@ TEST_F(ConnectionHandlerTest, SessionStarted_WithRpc) { reason)); connection_handler_->set_protocol_handler(&mock_protocol_handler_); - EXPECT_CALL(mock_protocol_handler_, NotifySessionStarted(_, _, _)) + EXPECT_CALL(mock_protocol_handler_, + NotifySessionStarted(An<SessionContext&>(), _, _)) .WillOnce(SaveArg<0>(&out_context_)); // Start new session with RPC service @@ -1485,7 +1493,8 @@ TEST_F(ConnectionHandlerTest, ServiceStarted_Video_SUCCESS) { // confirm that NotifySessionStarted() is called connection_handler_->set_protocol_handler(&mock_protocol_handler_); - EXPECT_CALL(mock_protocol_handler_, NotifySessionStarted(_, empty, _)) + EXPECT_CALL(mock_protocol_handler_, + NotifySessionStarted(An<SessionContext&>(), empty, _)) .WillOnce(SaveArg<0>(&out_context_)); connection_handler_->OnSessionStartedCallback(uid_, @@ -1527,7 +1536,8 @@ TEST_F(ConnectionHandlerTest, ServiceStarted_Video_FAILURE) { // confirm that NotifySessionStarted() is called connection_handler_->set_protocol_handler(&mock_protocol_handler_); - EXPECT_CALL(mock_protocol_handler_, NotifySessionStarted(_, empty, _)) + EXPECT_CALL(mock_protocol_handler_, + NotifySessionStarted(An<SessionContext&>(), empty, _)) .WillOnce(SaveArg<0>(&out_context_)); connection_handler_->OnSessionStartedCallback(uid_, @@ -1536,7 +1546,7 @@ TEST_F(ConnectionHandlerTest, ServiceStarted_Video_FAILURE) { PROTECTION_OFF, dummy_params); - EXPECT_EQ(0u, out_context_.new_session_id_); + EXPECT_TRUE(out_context_.is_start_session_failed_); } /* @@ -1551,7 +1561,8 @@ TEST_F(ConnectionHandlerTest, ServiceStarted_Video_Multiple) { protocol_handler_test::MockProtocolHandler temp_protocol_handler; connection_handler_->set_protocol_handler(&temp_protocol_handler); - EXPECT_CALL(temp_protocol_handler, NotifySessionStarted(_, _, _)) + EXPECT_CALL(temp_protocol_handler, + NotifySessionStarted(An<SessionContext&>(), _, _)) .WillOnce(SaveArg<0>(&context_first)) .WillOnce(SaveArg<0>(&context_second)); @@ -1622,7 +1633,8 @@ TEST_F(ConnectionHandlerTest, ServiceStarted_Video_Multiple) { // verify that connection handler will not mix up the two results SessionContext new_context_first, new_context_second; connection_handler_->set_protocol_handler(&mock_protocol_handler_); - EXPECT_CALL(mock_protocol_handler_, NotifySessionStarted(_, empty, _)) + EXPECT_CALL(mock_protocol_handler_, + NotifySessionStarted(An<SessionContext&>(), empty, _)) .WillOnce(SaveArg<0>(&new_context_second)) .WillOnce(SaveArg<0>(&new_context_first)); @@ -1637,8 +1649,10 @@ TEST_F(ConnectionHandlerTest, ServiceStarted_Video_Multiple) { PROTECTION_OFF, dummy_params); - EXPECT_NE(0u, new_context_first.new_session_id_); // result is positive - EXPECT_EQ(0u, new_context_second.new_session_id_); // result is negative + EXPECT_FALSE( + new_context_first.is_start_session_failed_); // result is positive + EXPECT_TRUE( + new_context_second.is_start_session_failed_); // result is negative } TEST_F(ConnectionHandlerTest, @@ -1654,7 +1668,8 @@ TEST_F(ConnectionHandlerTest, SessionContext fail_context; SessionContext positive_context; connection_handler_->set_protocol_handler(&mock_protocol_handler_); - EXPECT_CALL(mock_protocol_handler_, NotifySessionStarted(_, _, _)) + EXPECT_CALL(mock_protocol_handler_, + NotifySessionStarted(An<SessionContext&>(), _, _)) .WillOnce(SaveArg<0>(&fail_context)) .WillOnce(SaveArg<0>(&positive_context)); @@ -1697,7 +1712,8 @@ TEST_F(ConnectionHandlerTest, SessionContext fail_context; SessionContext positive_context; connection_handler_->set_protocol_handler(&mock_protocol_handler_); - EXPECT_CALL(mock_protocol_handler_, NotifySessionStarted(_, _, _)) + EXPECT_CALL(mock_protocol_handler_, + NotifySessionStarted(An<SessionContext&>(), _, _)) .WillOnce(SaveArg<0>(&fail_context)) .WillOnce(SaveArg<0>(&positive_context)); @@ -1742,7 +1758,8 @@ TEST_F(ConnectionHandlerTest, SessionContext context_first, context_second; connection_handler_->set_protocol_handler(&mock_protocol_handler_); - EXPECT_CALL(mock_protocol_handler_, NotifySessionStarted(_, _, _)) + EXPECT_CALL(mock_protocol_handler_, + NotifySessionStarted(An<SessionContext&>(), _, _)) .WillOnce(SaveArg<0>(&context_first)) .WillOnce(SaveArg<0>(&context_second)); @@ -1797,7 +1814,8 @@ TEST_F(ConnectionHandlerTest, SessionContext rejected_context, positive_context; connection_handler_->set_protocol_handler(&mock_protocol_handler_); - EXPECT_CALL(mock_protocol_handler_, NotifySessionStarted(_, _, _)) + EXPECT_CALL(mock_protocol_handler_, + NotifySessionStarted(An<SessionContext&>(), _, _)) .WillOnce(SaveArg<0>(&rejected_context)) .WillOnce(SaveArg<0>(&positive_context)); @@ -1840,7 +1858,8 @@ TEST_F(ConnectionHandlerTest, SessionStarted_DelayProtect) { SessionContext context_new, context_second, context_third; connection_handler_->set_protocol_handler(&mock_protocol_handler_); - EXPECT_CALL(mock_protocol_handler_, NotifySessionStarted(_, _, _)) + EXPECT_CALL(mock_protocol_handler_, + NotifySessionStarted(An<SessionContext&>(), _, _)) .WillOnce(SaveArg<0>(&context_new)) .WillOnce(SaveArg<0>(&context_second)) .WillOnce(SaveArg<0>(&context_third)); @@ -1895,7 +1914,8 @@ TEST_F(ConnectionHandlerTest, SessionStarted_DelayProtectBulk) { SessionContext new_context; connection_handler_->set_protocol_handler(&mock_protocol_handler_); - EXPECT_CALL(mock_protocol_handler_, NotifySessionStarted(_, _, _)) + EXPECT_CALL(mock_protocol_handler_, + NotifySessionStarted(An<SessionContext&>(), _, _)) .WillOnce(SaveArg<0>(&new_context)); connection_handler_->OnSessionStartedCallback(uid_, out_context_.new_session_id_, @@ -2001,7 +2021,8 @@ TEST_F(ConnectionHandlerTest, GetSSLContext_ByProtectedService) { SessionContext new_context; connection_handler_->set_protocol_handler(&mock_protocol_handler_); - EXPECT_CALL(mock_protocol_handler_, NotifySessionStarted(_, _, _)) + EXPECT_CALL(mock_protocol_handler_, + NotifySessionStarted(An<SessionContext&>(), _, _)) .WillOnce(SaveArg<0>(&new_context)); // Open kAudio service @@ -2038,7 +2059,8 @@ TEST_F(ConnectionHandlerTest, GetSSLContext_ByDealyProtectedRPC) { SessionContext new_context; connection_handler_->set_protocol_handler(&mock_protocol_handler_); - EXPECT_CALL(mock_protocol_handler_, NotifySessionStarted(_, _, _)) + EXPECT_CALL(mock_protocol_handler_, + NotifySessionStarted(An<SessionContext&>(), _, _)) .WillOnce(SaveArg<0>(&new_context)); // Protect kRpc (Bulk will be protect also) @@ -2078,7 +2100,8 @@ TEST_F(ConnectionHandlerTest, GetSSLContext_ByDealyProtectedBulk) { SessionContext new_context; connection_handler_->set_protocol_handler(&mock_protocol_handler_); - EXPECT_CALL(mock_protocol_handler_, NotifySessionStarted(_, _, _)) + EXPECT_CALL(mock_protocol_handler_, + NotifySessionStarted(An<SessionContext&>(), _, _)) .WillOnce(SaveArg<0>(&new_context)); // Protect Bulk (kRpc will be protected also) diff --git a/src/components/hmi_message_handler/include/hmi_message_handler/websocket_session.h b/src/components/hmi_message_handler/include/hmi_message_handler/websocket_session.h index 67a46aca56..693b72eb50 100644 --- a/src/components/hmi_message_handler/include/hmi_message_handler/websocket_session.h +++ b/src/components/hmi_message_handler/include/hmi_message_handler/websocket_session.h @@ -36,7 +36,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <boost/asio/bind_executor.hpp> #include <boost/asio/ip/tcp.hpp> #include <boost/asio/placeholders.hpp> -#include <boost/asio/strand.hpp> #include <boost/beast/core.hpp> #include <boost/beast/websocket.hpp> #include <boost/make_shared.hpp> @@ -87,7 +86,6 @@ class CMessageBrokerController; class WebsocketSession : public std::enable_shared_from_this<WebsocketSession> { boost::beast::websocket::stream<boost::asio::ip::tcp::socket> ws_; - boost::asio::strand<boost::asio::io_context::executor_type> strand_; boost::beast::multi_buffer buffer_; boost::beast::multi_buffer send_buffer_; CMessageBrokerController* controller_; @@ -189,7 +187,6 @@ class WebsocketSession : public std::enable_shared_from_this<WebsocketSession> { WebsocketSession& handler_; sync_primitives::Lock queue_lock_; sync_primitives::ConditionalVariable queue_new_items_; - std::atomic_bool write_pending_; std::atomic_bool shutdown_; sync_primitives::Lock write_lock_; diff --git a/src/components/hmi_message_handler/src/websocket_session.cc b/src/components/hmi_message_handler/src/websocket_session.cc index a387b639a2..6e1c4b9bc4 100644 --- a/src/components/hmi_message_handler/src/websocket_session.cc +++ b/src/components/hmi_message_handler/src/websocket_session.cc @@ -41,7 +41,6 @@ SDL_CREATE_LOG_VARIABLE("HMIMessageHandler") WebsocketSession::WebsocketSession(boost::asio::ip::tcp::socket socket, CMessageBrokerController* controller) : ws_(std::move(socket)) - , strand_(ws_.get_executor()) , controller_(controller) , stop(false) , m_receivingBuffer("") @@ -57,10 +56,8 @@ WebsocketSession::WebsocketSession(boost::asio::ip::tcp::socket socket, WebsocketSession::~WebsocketSession() {} void WebsocketSession::Accept() { - ws_.async_accept(boost::asio::bind_executor( - strand_, - std::bind( - &WebsocketSession::Recv, shared_from_this(), std::placeholders::_1))); + ws_.async_accept(std::bind( + &WebsocketSession::Recv, shared_from_this(), std::placeholders::_1)); } void WebsocketSession::Shutdown() { @@ -90,11 +87,10 @@ void WebsocketSession::Recv(boost::system::error_code ec) { } ws_.async_read(buffer_, - boost::asio::bind_executor(strand_, - std::bind(&WebsocketSession::Read, - shared_from_this(), - std::placeholders::_1, - std::placeholders::_2))); + std::bind(&WebsocketSession::Read, + shared_from_this(), + std::placeholders::_1, + std::placeholders::_2)); } void WebsocketSession::Send(const std::string& message, diff --git a/src/components/include/application_manager/application_manager.h b/src/components/include/application_manager/application_manager.h index 2bb202c62d..54f7ab9f05 100644 --- a/src/components/include/application_manager/application_manager.h +++ b/src/components/include/application_manager/application_manager.h @@ -623,6 +623,12 @@ class ApplicationManager { virtual bool IsStopping() const = 0; + /** + * @brief Waits for HMI readiness and blocks thread if it's not ready yet + * @return true if HMI is ready and cooperating, otherwise returns false + */ + virtual bool WaitForHmiIsReady() = 0; + virtual void RemoveAppFromTTSGlobalPropertiesList(const uint32_t app_id) = 0; /** @@ -855,10 +861,15 @@ class ApplicationManager { * @brief Callback calls when application starts/stops data streaming * @param app_id Streaming application id * @param service_type Streaming service type - * @param new_state Defines new streaming state + * @param state True if streaming started, false if streaming stopped. */ virtual void OnAppStreaming(uint32_t app_id, protocol_handler::ServiceType service_type, + bool state) = 0; + + DEPRECATED + virtual void OnAppStreaming(uint32_t app_id, + protocol_handler::ServiceType service_type, const Application::StreamingState new_state) = 0; /** diff --git a/src/components/include/application_manager/hmi_capabilities.h b/src/components/include/application_manager/hmi_capabilities.h index 56ac807d63..e7d7aa485b 100644 --- a/src/components/include/application_manager/hmi_capabilities.h +++ b/src/components/include/application_manager/hmi_capabilities.h @@ -97,11 +97,26 @@ class HMICapabilities { /** * @brief Returns software version of the target - * @return TRUE if it supported, otherwise FALSE + * @return string representation of software version if supported, otherwise + * empty string */ virtual const std::string& ccpu_version() const = 0; /** + * @brief Interface used to store information about hardware version of the + * target + * @param hardware_version Received system/hmi hardware version + */ + virtual void set_hardware_version(const std::string& hardware_version) = 0; + + /** + * @brief Returns hardware version of the target + * @return string representation of hardware version if supported, otherwise + * empty string + */ + virtual const std::string& hardware_version() const = 0; + + /** * @brief Retrieves if mixing audio is supported by HMI * (ie recording TTS command and playing audio) * @return Current state of the mixing audio flag 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 d8aef7cc1a..7ada7884bf 100644 --- a/src/components/include/application_manager/policies/policy_handler_interface.h +++ b/src/components/include/application_manager/policies/policy_handler_interface.h @@ -332,12 +332,26 @@ class PolicyHandlerInterface : public VehicleDataItemProvider { const std::string& language) = 0; /** + * @brief Save hardware version from GetSystemInfo request to policy table, if + * present + * @param hardware_version Hardware version + */ + virtual void OnHardwareVersionReceived( + const std::string& hardware_version) = 0; + + /** * @brief Get information about last ccpu_version from PT * @return ccpu_version from PT */ virtual std::string GetCCPUVersionFromPT() const = 0; /** + * @brief Get information about last hardware version from PT + * @return hardware version from PT + */ + virtual std::string GetHardwareVersionFromPT() const = 0; + + /** * @brief Sends GetVehicleData request in case when Vechicle info is ready. */ virtual void OnVIIsReady() = 0; diff --git a/src/components/include/connection_handler/connection_handler.h b/src/components/include/connection_handler/connection_handler.h index cb83bec564..7cb1448a37 100644 --- a/src/components/include/connection_handler/connection_handler.h +++ b/src/components/include/connection_handler/connection_handler.h @@ -58,6 +58,18 @@ enum CloseSessionReason { class ConnectionHandlerObserver; +/** + * @brief Helper structure to collect all required vehicle data + */ +struct ProtocolVehicleData { + std::string vehicle_make; + std::string vehicle_model; + std::string vehicle_year; + std::string vehicle_trim; + std::string vehicle_system_software_version; + std::string vehicle_system_hardware_version; +}; + // The SessionConnectionMap keeps track of the primary and secondary transports // associated with a session ID typedef struct { @@ -345,6 +357,14 @@ class ConnectionHandler { const = 0; /** + * @brief Collects all vehicle data required by a protocol layer + * @param data output structure to store received vehicle data + * @return true if data has been received successfully, otherwise returns + * false + */ + virtual bool GetProtocolVehicleData(ProtocolVehicleData& data) = 0; + + /** * @brief Called when HMI cooperation is started, * creates WebSocketDevice for WebEngine */ diff --git a/src/components/include/connection_handler/connection_handler_observer.h b/src/components/include/connection_handler/connection_handler_observer.h index 7d6664a009..cfbbefefd4 100644 --- a/src/components/include/connection_handler/connection_handler_observer.h +++ b/src/components/include/connection_handler/connection_handler_observer.h @@ -177,6 +177,14 @@ class ConnectionHandlerObserver { */ virtual void OnWebEngineDeviceCreated() = 0; + /** + * @brief Collects all vehicle data required by a protocol layer + * @param data output structure to store received vehicle data + * @return true if data has been received successfully, otherwise returns + * false + */ + virtual bool GetProtocolVehicleData(ProtocolVehicleData& data) = 0; + protected: /** * \brief Destructor diff --git a/src/components/include/media_manager/media_manager.h b/src/components/include/media_manager/media_manager.h index 0729adc7d8..2d2201a949 100644 --- a/src/components/include/media_manager/media_manager.h +++ b/src/components/include/media_manager/media_manager.h @@ -70,6 +70,14 @@ class MediaManager { */ virtual const MediaManagerSettings& settings() const = 0; + /** + * \brief Convert an amount of audio bytes to an estimated time in ms + * \param data_size number of bytes to be played + * \return milliseconds required to play <data_size> many bytes with + * the current pcm stream capabilities + */ + virtual uint32_t DataSizeToMilliseconds(uint64_t data_size) const = 0; + virtual ~MediaManager() {} }; 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 9d4ad5ea57..d9844c153b 100644 --- a/src/components/include/policy/policy_external/policy/policy_manager.h +++ b/src/components/include/policy/policy_external/policy/policy_manager.h @@ -433,12 +433,25 @@ class PolicyManager : public usage_statistics::StatisticsManager, const std::string& language) = 0; /** + * @brief Set hardware version from GetSystemInfo response to policy table, if + * present + * @param hardware_version Hardware version + */ + virtual void SetHardwareVersion(const std::string& hardware_version) = 0; + + /** * @brief Get information about last ccpu_version from PT * @return ccpu_version from PT */ virtual std::string GetCCPUVersionFromPT() const = 0; /** + * @brief Get information about last hardware version from PT + * @return hardware version from PT + */ + virtual std::string GetHardwareVersionFromPT() const = 0; + + /** * @brief Send OnPermissionsUpdated for choosen application * @param device_id device identifier * @param application_id Unique application id @@ -858,6 +871,11 @@ class PolicyManager : public usage_statistics::StatisticsManager, */ virtual void ResetTimeout() = 0; + /** + * @brief Trigger a PTU once on startup if it is required + */ + virtual void TriggerPTUOnStartupIfRequired() = 0; + protected: /** * @brief Checks is PT exceeded IgnitionCycles 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 c90006928a..b4043067ab 100644 --- a/src/components/include/policy/policy_regular/policy/policy_manager.h +++ b/src/components/include/policy/policy_regular/policy/policy_manager.h @@ -424,12 +424,25 @@ class PolicyManager : public usage_statistics::StatisticsManager, const std::string& language) = 0; /** + * @brief Set hardware version from GetSystemInfo response to policy table, if + * present + * @param hardware_version Hardware version + */ + virtual void SetHardwareVersion(const std::string& hardware_version) = 0; + + /** * @brief Get information about last ccpu_version from PT * @return ccpu_version from PT */ virtual std::string GetCCPUVersionFromPT() const = 0; /** + * @brief Get information about last hardware version from PT + * @return hardware version from PT + */ + virtual std::string GetHardwareVersionFromPT() const = 0; + + /** * @brief Send OnPermissionsUpdated for choosen application * @param device_id device identifier * @param application_id Unique application id diff --git a/src/components/include/protocol/bson_object_keys.h b/src/components/include/protocol/bson_object_keys.h index f81de4cc81..830c33b3eb 100644 --- a/src/components/include/protocol/bson_object_keys.h +++ b/src/components/include/protocol/bson_object_keys.h @@ -49,6 +49,12 @@ extern const char* tcp_ip_address; extern const char* tcp_port; extern const char* reason; extern const char* auth_token; +extern const char* vehicle_make; +extern const char* vehicle_model; +extern const char* vehicle_model_year; +extern const char* vehicle_trim; +extern const char* vehicle_system_software_version; +extern const char* vehicle_system_hardware_version; } // namespace strings diff --git a/src/components/include/protocol_handler/protocol_handler.h b/src/components/include/protocol_handler/protocol_handler.h index b9cc2e9700..011592da49 100644 --- a/src/components/include/protocol_handler/protocol_handler.h +++ b/src/components/include/protocol_handler/protocol_handler.h @@ -137,11 +137,27 @@ class ProtocolHandler { * @param err_reason string with NACK reason. Only valid when * generated_session_id is 0. */ + DEPRECATED virtual void NotifySessionStarted( const SessionContext& context, std::vector<std::string>& rejected_params, const std::string err_reason = std::string()) = 0; + /** + * @brief Called by connection handler to notify the context of + * OnSessionStartedCallback(). + * @param context reference to structure with started session data + * @param rejected_params list of parameters name that are rejected. + * Only valid when generated_session_id is 0. Note, even if + * generated_session_id is 0, the list may be empty. + * @param err_reason string with NACK reason. Only valid when + * generated_session_id is 0. + */ + virtual void NotifySessionStarted( + SessionContext& context, + std::vector<std::string>& rejected_params, + const std::string err_reason = std::string()) = 0; + virtual bool IsRPCServiceSecure(const uint32_t connection_key) const = 0; virtual void ProcessFailedPTU() = 0; diff --git a/src/components/include/protocol_handler/session_observer.h b/src/components/include/protocol_handler/session_observer.h index 593ce8408c..ca12f4b6ad 100644 --- a/src/components/include/protocol_handler/session_observer.h +++ b/src/components/include/protocol_handler/session_observer.h @@ -69,6 +69,7 @@ struct SessionContext { uint32_t hash_id_; bool is_protected_; bool is_new_service_; + bool is_start_session_failed_; /** * @brief Constructor @@ -81,7 +82,8 @@ struct SessionContext { , service_type_(protocol_handler::kInvalidServiceType) , hash_id_(0) , is_protected_(false) - , is_new_service_(false) {} + , is_new_service_(false) + , is_start_session_failed_(false) {} /** * @brief Constructor @@ -111,7 +113,8 @@ struct SessionContext { , service_type_(service_type) , hash_id_(hash_id) , is_protected_(is_protected) - , is_new_service_(false) {} + , is_new_service_(false) + , is_start_session_failed_(false) {} }; /** diff --git a/src/components/include/security_manager/security_manager_settings.h b/src/components/include/security_manager/security_manager_settings.h index 0bbe0f4f96..4e601c3e0e 100644 --- a/src/components/include/security_manager/security_manager_settings.h +++ b/src/components/include/security_manager/security_manager_settings.h @@ -60,6 +60,7 @@ class CryptoManagerSettings { virtual size_t maximum_payload_size() const = 0; virtual const std::vector<int>& force_protected_service() const = 0; virtual const std::vector<int>& force_unprotected_service() const = 0; + virtual uint32_t security_level() const = 0; }; } // namespace security_manager 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 3b827b1a0d..fd7ddeac15 100644 --- a/src/components/include/test/application_manager/mock_application_manager.h +++ b/src/components/include/test/application_manager/mock_application_manager.h @@ -232,6 +232,7 @@ class MockApplicationManager : public application_manager::ApplicationManager { MOCK_CONST_METHOD1(IsAppsQueriedFrom, bool(const connection_handler::DeviceHandle handle)); MOCK_CONST_METHOD0(IsStopping, bool()); + MOCK_METHOD0(WaitForHmiIsReady, bool()); MOCK_METHOD1(RemoveAppFromTTSGlobalPropertiesList, void(const uint32_t app_id)); MOCK_METHOD2(ResetGlobalProperties, @@ -314,11 +315,16 @@ class MockApplicationManager : public application_manager::ApplicationManager { MOCK_METHOD1(OnAppUnauthorized, void(const uint32_t& app_id)); MOCK_METHOD1(ActivateApplication, bool(application_manager::ApplicationSharedPtr app)); + MOCK_METHOD3(OnAppStreaming, + void(uint32_t app_id, + protocol_handler::ServiceType service_type, + bool state)); + DEPRECATED MOCK_METHOD3( OnAppStreaming, void(uint32_t app_id, protocol_handler::ServiceType service_type, - application_manager::Application::StreamingState new_state)); + const application_manager::Application::StreamingState new_state)); MOCK_CONST_METHOD6(CreateRegularState, application_manager::HmiStatePtr( application_manager::ApplicationSharedPtr app, 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 7b6da68c51..af4019ce21 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 @@ -186,7 +186,10 @@ class MockPolicyHandlerInterface : public policy::PolicyHandlerInterface { void(const std::string& ccpu_version, const std::string& wers_country_code, const std::string& language)); + MOCK_METHOD1(OnHardwareVersionReceived, + void(const std::string& hardware_version)); MOCK_CONST_METHOD0(GetCCPUVersionFromPT, std::string()); + MOCK_CONST_METHOD0(GetHardwareVersionFromPT, std::string()); MOCK_METHOD0(OnVIIsReady, void()); MOCK_METHOD1(OnVehicleDataUpdated, void(const smart_objects::SmartObject& message)); diff --git a/src/components/include/test/connection_handler/mock_connection_handler.h b/src/components/include/test/connection_handler/mock_connection_handler.h index 78083b0abf..bdfcf55e34 100644 --- a/src/components/include/test/connection_handler/mock_connection_handler.h +++ b/src/components/include/test/connection_handler/mock_connection_handler.h @@ -139,6 +139,8 @@ class MockConnectionHandler : public connection_handler::ConnectionHandler { OnSecondaryTransportEnded, void(const transport_manager::ConnectionUID primary_connection_handle, const transport_manager::ConnectionUID secondary_connection_handle)); + MOCK_METHOD1(GetProtocolVehicleData, + bool(connection_handler::ProtocolVehicleData& data)); MOCK_METHOD0(CreateWebEngineDevice, void()); MOCK_CONST_METHOD0(GetWebEngineDeviceInfo, transport_manager::DeviceInfo&()); }; diff --git a/src/components/include/test/connection_handler/mock_connection_handler_observer.h b/src/components/include/test/connection_handler/mock_connection_handler_observer.h index 61877daa23..90174017c3 100644 --- a/src/components/include/test/connection_handler/mock_connection_handler_observer.h +++ b/src/components/include/test/connection_handler/mock_connection_handler_observer.h @@ -83,6 +83,8 @@ class MockConnectionHandlerObserver MOCK_METHOD2(SetPendingApplicationState, void(const transport_manager::ConnectionUID connection_id, const transport_manager::DeviceInfo& device_info)); + MOCK_METHOD1(GetProtocolVehicleData, + bool(connection_handler::ProtocolVehicleData& data)); }; } // namespace connection_handler_test diff --git a/src/components/include/test/media_manager/mock_media_manager.h b/src/components/include/test/media_manager/mock_media_manager.h index 36e35352d6..364c495236 100644 --- a/src/components/include/test/media_manager/mock_media_manager.h +++ b/src/components/include/test/media_manager/mock_media_manager.h @@ -64,6 +64,7 @@ class MockMediaManager : public media_manager::MediaManager { MOCK_METHOD2(FramesProcessed, void(int32_t application_key, int32_t frame_number)); MOCK_CONST_METHOD0(settings, const media_manager::MediaManagerSettings&()); + MOCK_CONST_METHOD1(DataSizeToMilliseconds, uint32_t(uint64_t data_size)); }; } // namespace media_manager_test diff --git a/src/components/include/test/policy/policy_external/policy/mock_cache_manager.h b/src/components/include/test/policy/policy_external/policy/mock_cache_manager.h index d93bdff7f7..a79918cc39 100644 --- a/src/components/include/test/policy/policy_external/policy/mock_cache_manager.h +++ b/src/components/include/test/policy/policy_external/policy/mock_cache_manager.h @@ -207,7 +207,9 @@ class MockCacheManagerInterface : public ::policy::CacheManagerInterface { bool(const std::string& ccpu_version, const std::string& wers_country_code, const std::string& language)); + MOCK_METHOD1(SetHardwareVersion, void(const std::string& hardware_version)); MOCK_CONST_METHOD0(GetCCPUVersionFromPT, std::string()); + MOCK_CONST_METHOD0(GetHardwareVersionFromPT, std::string()); MOCK_CONST_METHOD0(IsMetaInfoPresent, bool()); MOCK_METHOD1(SetSystemLanguage, bool(const std::string& language)); MOCK_METHOD1(Increment, void(usage_statistics::GlobalCounterId type)); 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 0123c6c912..22ab31307a 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 @@ -173,6 +173,7 @@ class MockPolicyManager : public PolicyManager { void(const std::string& ccpu_version, const std::string& wers_country_code, const std::string& language)); + MOCK_METHOD1(SetHardwareVersion, void(const std::string& hardware_version)); MOCK_METHOD1(SetPreloadedPtFlag, void(const bool is_preloaded)); MOCK_METHOD2(SendNotificationOnPermissionsUpdated, void(const std::string& device_id, @@ -269,6 +270,7 @@ class MockPolicyManager : public PolicyManager { MOCK_METHOD0(ExceededIgnitionCycles, bool()); MOCK_METHOD0(ExceededDays, bool()); MOCK_METHOD0(StartPTExchange, void()); + MOCK_METHOD0(TriggerPTUOnStartupIfRequired, void()); MOCK_METHOD1(Increment, void(usage_statistics::GlobalCounterId type)); MOCK_METHOD2(Increment, void(const std::string& app_id, @@ -308,6 +310,7 @@ class MockPolicyManager : public PolicyManager { MOCK_METHOD0(RetrySequenceFailed, void()); MOCK_METHOD0(ResetTimeout, void()); MOCK_CONST_METHOD0(GetCCPUVersionFromPT, std::string()); + MOCK_CONST_METHOD0(GetHardwareVersionFromPT, std::string()); }; } // namespace policy_manager_test } // namespace components diff --git a/src/components/include/test/policy/policy_regular/policy/mock_cache_manager.h b/src/components/include/test/policy/policy_regular/policy/mock_cache_manager.h index 19de301dc3..716f66f994 100644 --- a/src/components/include/test/policy/policy_regular/policy/mock_cache_manager.h +++ b/src/components/include/test/policy/policy_regular/policy/mock_cache_manager.h @@ -181,7 +181,9 @@ class MockCacheManagerInterface : public CacheManagerInterface { bool(const std::string& ccpu_version, const std::string& wers_country_code, const std::string& language)); + MOCK_METHOD1(SetHardwareVersion, void(const std::string& hardware_version)); MOCK_CONST_METHOD0(GetCCPUVersionFromPT, std::string()); + MOCK_CONST_METHOD0(GetHardwareVersionFromPT, std::string()); MOCK_CONST_METHOD0(IsMetaInfoPresent, bool()); MOCK_METHOD1(SetSystemLanguage, bool(const std::string& language)); MOCK_METHOD1(Increment, void(usage_statistics::GlobalCounterId type)); 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 4cb6455db6..076f0423ef 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 @@ -172,6 +172,7 @@ class MockPolicyManager : public PolicyManager { void(const std::string& ccpu_version, const std::string& wers_country_code, const std::string& language)); + MOCK_METHOD1(SetHardwareVersion, void(const std::string& hardware_version)); MOCK_METHOD1(SetPreloadedPtFlag, void(const bool is_preloaded)); MOCK_METHOD2(SendNotificationOnPermissionsUpdated, void(const std::string& device_id, @@ -311,6 +312,7 @@ class MockPolicyManager : public PolicyManager { RequestSubType::State(const std::string& policy_app_id)); MOCK_METHOD0(ResetTimeout, void()); MOCK_CONST_METHOD0(GetCCPUVersionFromPT, std::string()); + MOCK_CONST_METHOD0(GetHardwareVersionFromPT, std::string()); }; } // namespace policy_manager_test diff --git a/src/components/include/test/protocol_handler/mock_protocol_handler.h b/src/components/include/test/protocol_handler/mock_protocol_handler.h index da71d9bc90..aa7c1293c3 100644 --- a/src/components/include/test/protocol_handler/mock_protocol_handler.h +++ b/src/components/include/test/protocol_handler/mock_protocol_handler.h @@ -65,6 +65,10 @@ class MockProtocolHandler : public ::protocol_handler::ProtocolHandler { const ::protocol_handler::ProtocolHandlerSettings&()); MOCK_METHOD0(get_session_observer, protocol_handler::SessionObserver&()); MOCK_METHOD3(NotifySessionStarted, + void(::protocol_handler::SessionContext& context, + std::vector<std::string>& rejected_params, + const std::string err_reason)); + MOCK_METHOD3(NotifySessionStarted, void(const ::protocol_handler::SessionContext& context, std::vector<std::string>& rejected_params, const std::string err_reason)); diff --git a/src/components/include/test/security_manager/mock_security_manager_settings.h b/src/components/include/test/security_manager/mock_security_manager_settings.h index b1c869cd1b..2c62973413 100644 --- a/src/components/include/test/security_manager/mock_security_manager_settings.h +++ b/src/components/include/test/security_manager/mock_security_manager_settings.h @@ -56,6 +56,7 @@ class MockCryptoManagerSettings MOCK_CONST_METHOD0(maximum_payload_size, size_t()); MOCK_CONST_METHOD0(force_protected_service, const std::vector<int>&()); MOCK_CONST_METHOD0(force_unprotected_service, const std::vector<int>&()); + MOCK_CONST_METHOD0(security_level, uint32_t()); }; } // namespace security_manager_test diff --git a/src/components/include/utils/semantic_version.h b/src/components/include/utils/semantic_version.h index 01b04495ad..54be460bab 100644 --- a/src/components/include/utils/semantic_version.h +++ b/src/components/include/utils/semantic_version.h @@ -43,12 +43,6 @@ struct SemanticVersion { patch_version_ = patch; } - SemanticVersion(const SemanticVersion& other) { - major_version_ = other.major_version_; - minor_version_ = other.minor_version_; - patch_version_ = other.patch_version_; - } - SemanticVersion(const std::string& versionString) : major_version_(0), minor_version_(0), patch_version_(0) { int readElements = sscanf(versionString.c_str(), diff --git a/src/components/interfaces/HMI_API.xml b/src/components/interfaces/HMI_API.xml index 3ac14e4d54..92806e7372 100644 --- a/src/components/interfaces/HMI_API.xml +++ b/src/components/interfaces/HMI_API.xml @@ -34,7 +34,7 @@ <interfaces name="SmartDeviceLink HMI API"> -<interface name="Common" version="2.1.0" date="2019-03-18"> +<interface name="Common" version="2.2.0" date="2021-04-14"> <enum name="Result"> <element name="SUCCESS" value="0"/> @@ -634,6 +634,12 @@ <element name="phoneNumber"> <description> Optional phone number of intended location / establishment (if applicable) for SendLocation.</description> </element> + <element name="timeToDestination"> + <description>Optional time to destination field for ShowConstantTBT</description> + </element> + <element name="turnText"> + <description>Turn text for turnList parameter of UpdateTurnList</description> + </element> <element name="subtleAlertText1"> <description>The first line of the subtle alert text field; applies to `SubtleAlert` `alertText1`</description> </element> @@ -643,14 +649,17 @@ <element name="subtleAlertSoftButtonText"> <description>A text field in the soft button of a subtle alert; applies to `SubtleAlert` `softButtons`</description> </element> - <element name="timeToDestination"/> - <!-- TO DO to be removed --> - <element name="turnText"/> - <element name="navigationText"> - <description>Navigation text for UpdateTurnList.</description> + <element name="menuCommandSecondaryText"> + <description>Secondary text for AddCommand</description> + </element> + <element name="menuCommandTertiaryText"> + <description>Tertiary text for AddCommand</description> </element> - <element name="notificationText"> - <description>Text of notification to be displayed on screen.</description> + <element name="menuSubMenuSecondaryText"> + <description>Secondary text for AddSubMenu</description> + </element> + <element name="menuSubMenuTertiaryText"> + <description>Tertiary text for AddSubMenu</description> </element> </enum> @@ -742,6 +751,12 @@ <element name="subtleAlertIcon"> <description>The image of the subtle alert; applies to `SubtleAlert` `alertIcon`</description> </element> + <element name="menuCommandSecondaryImage"> + <description>The secondary image field for AddCommand</description> + </element> + <element name="menuSubMenuSecondaryImage"> + <description>The secondary image field for AddSubMenu</description> + </element> </enum> <enum name="TextAlignment"> @@ -832,6 +847,11 @@ </element> </enum> +<enum name="AppCapabilityType"> + <description>Enumerations of all available app capability types</description> + <element name="VIDEO_STREAMING"/> +</enum> + <!--IVI part--> <enum name="ElectronicParkBrakeStatus"> <element name="CLOSED"> @@ -1208,6 +1228,7 @@ <element name="VEHICLEDATA_FUELLEVEL_STATE" /> <element name="VEHICLEDATA_FUELCONSUMPTION" /> <element name="VEHICLEDATA_EXTERNTEMP" /> + <element name="VEHICLEDATA_CLIMATEDATA"/> <element name="VEHICLEDATA_VIN" /> <element name="VEHICLEDATA_GEARSTATUS" /> <element name="VEHICLEDATA_PRNDL" /> @@ -1327,6 +1348,7 @@ <element name="QWERTY" /> <element name="QWERTZ" /> <element name="AZERTY" /> + <element name="NUMERIC"/> </enum> <enum name="KeyboardEvent"> @@ -1336,6 +1358,15 @@ <element name="ENTRY_VOICE" /> <element name="ENTRY_CANCELLED" /> <element name="ENTRY_ABORTED" /> + <element name="INPUT_KEY_MASK_ENABLED"/> + <element name="INPUT_KEY_MASK_DISABLED"/> +</enum> + +<enum name="KeyboardInputMask"> + <description>Enumeration listing possible input character masking.</description> + <element name="ENABLE_INPUT_KEY_MASK" /> + <element name="DISABLE_INPUT_KEY_MASK" /> + <element name="USER_CHOICE_INPUT_KEY_MASK" /> </enum> <enum name="KeypressMode"> @@ -2241,7 +2272,7 @@ </enum> <struct name="Temperature"> - <param name="unit" type="TemperatureUnit" mandatory="true" > + <param name="unit" type="Common.TemperatureUnit" mandatory="true" > <description>Temperature Unit</description> </param> <param name="value" type="Float" mandatory="true" > @@ -2948,6 +2979,12 @@ <param name="menuName" type="String" maxlength="500" mandatory="true"> <description>The name of the sub menu/command.</description> </param> + <param name="secondaryText" maxlength="500" type="String" mandatory="false"> + <description>Optional secondary text to display</description> + </param> + <param name="tertiaryText" maxlength="500" type="String" mandatory="false"> + <description>Optional tertiary text to display</description> + </param> </struct> <enum name="MenuLayout"> @@ -3184,11 +3221,20 @@ If empty, the auto-complete list will be removed from the screen. </description> </param> + <param name="maskInputCharacters" type="Common.KeyboardInputMask" mandatory="false"> + <description>Allows an app to mask entered characters on HMI</description> + </param> + <param name="customKeys" type="String" maxlength="1" minsize="1" maxsize="10" array="true" mandatory="false"> + <description> + Array of special characters to show in customizable keys. + If omitted, keyboard will show default special characters + </description> + </param> </struct> <struct name="Turn"> <param name="navigationText" type="Common.TextFieldStruct" mandatory="false"> - <description>Uses navigationText from TextFieldStruct.</description> + <description>Describes the `Turn` using `TextFieldName` `turnText`</description> </param> <param name="turnIcon" type="Common.Image" mandatory="false"> </param> @@ -3662,6 +3708,20 @@ <param name="preferredFPS" type="Integer" minvalue="0" maxvalue="2147483647" mandatory="false"> <description>The preferred frame rate per second of the head unit. The mobile application / app library may take other factors into account that constrain the frame rate lower than this value, but it should not perform streaming at a higher frame rate than this value.</description> </param> + <param name="additionalVideoStreamingCapabilities" type="VideoStreamingCapability" array="true" minsize="1" maxsize="100" mandatory="false"> + </param> + </struct> + + <struct name="AppCapability"> + <param name="appCapabilityType" type="AppCapabilityType" mandatory="true"> + <description> + Used as a descriptor of what data to expect in this struct. + The corresponding param to this enum should be included and the only other param included. + </description> + </param> + <param name="videoStreamingCapability" type="VideoStreamingCapability" mandatory="false"> + <description>Describes supported capabilities for video streaming </description> + </param> </struct> <struct name="DynamicUpdateCapabilities"> @@ -3679,6 +3739,25 @@ <param name="maximumNumberOfWindows" type="Integer" mandatory="true" /> </struct> + <struct name="KeyboardLayoutCapability"> + <description> + Describes the capabilities of a single keyboard layout. + </description> + <param name="keyboardLayout" type="KeyboardLayout" mandatory="true"/> + <param name="numConfigurableKeys" type="Integer" minvalue="0" maxvalue="10" mandatory="true"> + <description>Number of keys available for special characters, App can customize as per their needs.</description> + </param> + </struct> + + <struct name="KeyboardCapabilities"> + <param name="maskInputCharactersSupported" type="Boolean" mandatory="false"> + <description>Availability of capability to mask input characters using keyboard. True: Available, False: Not Available</description> + </param> + <param name="supportedKeyboards" type="KeyboardLayoutCapability" minsize="1" maxsize="1000" array="true" mandatory="false"> + <description>Capabilities of supported keyboard layouts by HMI.</description> + </param> + </struct> + <struct name="WindowCapability"> <param name="windowID" type="Integer" mandatory="false"> <description> @@ -3713,6 +3792,9 @@ <param name="dynamicUpdateCapabilities" type="DynamicUpdateCapabilities" mandatory="false"> <description>Contains the head unit's capabilities for dynamic updating features declaring if the module will send dynamic update RPCs.</description> </param> + <param name="keyboardCapabilities" type="KeyboardCapabilities" mandatory="false"> + <description>See KeyboardCapabilities</description> + </param> </struct> <struct name="DisplayCapability"> @@ -3756,7 +3838,7 @@ </param> <param name="driverDistractionCapability" type="DriverDistractionCapability" mandatory="false"> <description>Describes capabilities when the driver is distracted</description> - </param> + </param> </struct> <struct name="RemoteControlCapabilities"> @@ -4356,6 +4438,18 @@ </param> </struct> + <struct name="ClimateData"> + <param name="externalTemperature" type="Common.Temperature" mandatory="false"> + <description>The external temperature in degrees celsius</description> + </param> + <param name="cabinTemperature" type="Common.Temperature" mandatory="false"> + <description>Internal ambient cabin temperature in degrees celsius</description> + </param> + <param name="atmosphericPressure" type="Float" minvalue="0" maxvalue="2000" mandatory="false"> + <description>Current atmospheric pressure in mBar</description> + </param> + </struct> + <struct name="GearStatus"> <param name="userSelectedGear" type="Common.PRNDL" mandatory="false"> <description>Gear position selected by the user i.e. Park, Drive, Reverse</description> @@ -4472,27 +4566,27 @@ </function> </interface> -<interface name="BasicCommunication" version="2.1.0" date="2019-03-18"> -<function name="OnServiceUpdate" messagetype="notification"> - <description> - Must be sent by SDL to HMI when there is an update on status of certain services. - Services supported with current version: Video - </description> - <param name="serviceType" type="Common.ServiceType" mandatory="true"> - <description>Specifies the service which has been updated.</description> - </param> - <param name="serviceEvent" type="Common.ServiceEvent" mandatory="false"> - <description>Specifies service update event.</description> - </param> - <param name="reason" type="Common.ServiceStatusUpdateReason" mandatory="false"> - <description> - The reason for a service event. Certain events may not have a reason, such as when a service is ACCEPTED (which is the normal expected behavior). - </description> - </param> - <param name="appID" type="Integer" mandatory="false"> - <description>ID of the application which triggered the update.</description> - </param> -</function> +<interface name="BasicCommunication" version="2.2.0" date="2021-04-14"> + <function name="OnServiceUpdate" messagetype="notification"> + <description> + Must be sent by SDL to HMI when there is an update on status of certain services. + Services supported with current version: Video + </description> + <param name="serviceType" type="Common.ServiceType" mandatory="true"> + <description>Specifies the service which has been updated.</description> + </param> + <param name="serviceEvent" type="Common.ServiceEvent" mandatory="false"> + <description>Specifies service update event.</description> + </param> + <param name="reason" type="Common.ServiceStatusUpdateReason" mandatory="false"> + <description> + The reason for a service event. Certain events may not have a reason, such as when a service is ACCEPTED (which is the normal expected behavior). + </description> + </param> + <param name="appID" type="Integer" mandatory="false"> + <description>ID of the application which triggered the update.</description> + </param> + </function> <function name="GetSystemTime" messagetype="request"> <description>Request from SDL to HMI to obtain current UTC time.</description> </function> @@ -4862,6 +4956,9 @@ <param name="wersCountryCode" type="String" maxlength="500" mandatory="true"> <description>Country code from the Ford system WERS (i.e.WAEGB).</description> </param> + <param name="systemHardwareVersion" type="String" maxlength="500" mandatory="false"> + <description>The hardware version of the system</description> + </param> </function> <function name="OnSystemInfoChanged" messagetype="notification"> <description>Issued by system to SDL to notify that some system param has changed. Currently applied for Sync Language.</description> @@ -4943,9 +5040,18 @@ <description>The new application properties</description> </param> </function> + + <function name="OnAppCapabilityUpdated" messagetype="notification"> + <description>A notification to inform HMI that a specific app capability has changed.</description> + <param name="appCapability" type="Common.AppCapability" mandatory="true"> + <description>The app capability that has been updated</description> + </param> + <param name="appID" type="Integer" mandatory="true"> + </param> + </function> </interface> -<interface name="VR" version="1.1.0" date="2017-04-27"> +<interface name="VR" version="1.2.0" date="2021-04-14"> <function name="IsReady" messagetype="request"> <description>Method is invoked at system startup. Response provides information about presence of VR module and its readiness to cooperate with SDL.</description> </function> @@ -5225,7 +5331,7 @@ </function> </interface> -<interface name="UI" version="1.4.0" date="2019-07-24"> +<interface name="UI" version="1.5.0" date="2021-04-14"> <function name="Alert" messagetype="request"> <description>Request from SDL to show an alert message on the display.</description> <param name="alertStrings" type="Common.TextFieldStruct" mandatory="true" array="true" minsize="0" maxsize="3"> @@ -5482,6 +5588,9 @@ <description>Image to be displayed for representing the command. See Image.</description> <description>If omitted, no (or the default if applicable) icon should be displayed.</description> </param> + <param name="secondaryImage" type="Common.Image" mandatory="false"> + <description>Optional secondary image struct for menu cell</description> + </param> <param name="appID" type="Integer" mandatory="true"> <description>ID of application that concerns this RPC.</description> </param> @@ -5514,6 +5623,9 @@ <param name="menuIcon" type="Common.Image" mandatory="false"> <description>The image field for AddSubMenu</description> </param> + <param name="secondaryImage" type="Common.Image" mandatory="false"> + <description>Optional secondary image struct for menu cell</description> + </param> <param name="appID" type="Integer" mandatory="true"> <description>ID of application that requested this RPC.</description> </param> @@ -5976,7 +6088,7 @@ </interface> -<interface name="Navigation" version="1.5.0" date="2017-08-15"> +<interface name="Navigation" version="1.6.0" date="2021-04-14"> <function name="IsReady" messagetype="request"> <description>Method is invoked at system startup. Response must provide the information about presence of UI Navigation module and its readiness to cooperate with SDL.</description> @@ -6200,7 +6312,7 @@ </interface> -<interface name="VehicleInfo" version="2.1.0" date="2019-03-18"> +<interface name="VehicleInfo" version="2.2.0" date="2021-04-14"> <function name="IsReady" messagetype="request"> <description>Method is invoked at system startup. Response should provide information about presence of any of vehicle information modules (ECU, GPS, etc) and their readiness to cooperate with SDL.</description> </function> @@ -6314,6 +6426,9 @@ <param name="externalTemperature" type="Boolean" mandatory="false"> <description>The external temperature in degrees celsius</description> </param> + <param name="climateData" type="Boolean" mandatory="false"> + <description>See ClimateData</description> + </param> <param name="turnSignal" type="Boolean" mandatory="false"> <description>See TurnSignal</description> </param> @@ -6425,6 +6540,9 @@ <param name="externalTemperature" type="Common.VehicleDataResult" mandatory="false"> <description>The external temperature in degrees celsius.</description> </param> + <param name="climateData" type="Common.VehicleDataResult" mandatory="false"> + <description>See ClimateData</description> + </param> <param name="turnSignal" type="Common.VehicleDataResult" mandatory="false"> <description>See TurnSignal</description> </param> @@ -6539,6 +6657,9 @@ <param name="externalTemperature" type="Boolean" mandatory="false"> <description>The external temperature in degrees celsius.</description> </param> + <param name="climateData" type="Boolean" mandatory="false"> + <description>See ClimateData</description> + </param> <param name="turnSignal" type="Boolean" mandatory="false"> <description>See TurnSignal</description> </param> @@ -6650,6 +6771,9 @@ <param name="externalTemperature" type="Common.VehicleDataResult" mandatory="false"> <description>The external temperature in degrees celsius</description> </param> + <param name="climateData" type="Common.VehicleDataResult" mandatory="false"> + <description>See ClimateData</description> + </param> <param name="turnSignal" type="Common.VehicleDataResult" mandatory="false"> <description>See TurnSignal</description> </param> @@ -6762,6 +6886,9 @@ <param name="externalTemperature" type="Boolean" mandatory="false"> <description>The external temperature in degrees celsius</description> </param> + <param name="climateData" type="Boolean" mandatory="false"> + <description>See ClimateData</description> + </param> <param name="turnSignal" type="Boolean" mandatory="false"> <description>See TurnSignal</description> </param> @@ -6876,6 +7003,9 @@ <param name="externalTemperature" type="Float" minvalue="-40" maxvalue="100" mandatory="false"> <description>The external temperature in degrees celsius</description> </param> + <param name="climateData" type="Common.ClimateData" mandatory="false"> + <description>See ClimateData</description> + </param> <param name="turnSignal" type="Common.TurnSignal" mandatory="false"> <description>See TurnSignal</description> </param> @@ -6991,6 +7121,9 @@ <param name="externalTemperature" type="Float" minvalue="-40" maxvalue="100" mandatory="false"> <description>The external temperature in degrees celsius</description> </param> + <param name="climateData" type="Common.ClimateData" mandatory="false"> + <description>See ClimateData</description> + </param> <param name="turnSignal" type="Common.TurnSignal" mandatory="false"> <description>See TurnSignal</description> </param> @@ -7080,7 +7213,7 @@ </interface> <!-- Policies --> -<interface name="SDL" version="1.2.0" date="2018-09-05"> +<interface name="SDL" version="1.3.0" date="2021-04-14"> <function name="ActivateApp" messagetype="request"> <param name="appID" type="Integer" mandatory="true"> </param> @@ -7261,7 +7394,7 @@ </function> </interface> -<interface name="RC" version="2.0.0" date="2018-09-05"> +<interface name="RC" version="2.1.0" date="2021-04-14"> <function name="IsReady" messagetype="request"> <description>Method is invoked at system startup. Response should provide information about presence of any of remote controllable module and its readiness to cooperate with SDL.</description> </function> @@ -7384,7 +7517,7 @@ </interface> -<interface name="AppService" version="1.0.0" date="2019-03-18"> +<interface name="AppService" version="1.1.0" date="2021-04-14"> <description>Interface used for interacting with app services as a producer or consumer</description> <function name="PublishAppService" messagetype="request"> <description> diff --git a/src/components/media_manager/include/media_manager/media_manager_impl.h b/src/components/media_manager/include/media_manager/media_manager_impl.h index 8d60cd0e54..3e24212ed5 100644 --- a/src/components/media_manager/include/media_manager/media_manager_impl.h +++ b/src/components/media_manager/include/media_manager/media_manager_impl.h @@ -33,6 +33,7 @@ #ifndef SRC_COMPONENTS_MEDIA_MANAGER_INCLUDE_MEDIA_MANAGER_MEDIA_MANAGER_IMPL_H_ #define SRC_COMPONENTS_MEDIA_MANAGER_INCLUDE_MEDIA_MANAGER_MEDIA_MANAGER_IMPL_H_ +#include <chrono> #include <map> #include <string> #include "interfaces/MOBILE_API.h" @@ -79,6 +80,7 @@ class MediaManagerImpl : public MediaManager, protocol_handler::ServiceType service_type); virtual void StopStreaming(int32_t application_key, protocol_handler::ServiceType service_type); + virtual void SetProtocolHandler( protocol_handler::ProtocolHandler* protocol_handler); virtual void OnMessageReceived( @@ -89,6 +91,8 @@ class MediaManagerImpl : public MediaManager, virtual const MediaManagerSettings& settings() const OVERRIDE; + virtual uint32_t DataSizeToMilliseconds(uint64_t data_size) const OVERRIDE; + #ifdef BUILD_TESTS void set_mock_a2dp_player(MediaAdapter* media_adapter); void set_mock_mic_listener(MediaListenerPtr media_listener); @@ -114,6 +118,12 @@ class MediaManagerImpl : public MediaManager, std::map<protocol_handler::ServiceType, MediaAdapterImplPtr> streamer_; std::map<protocol_handler::ServiceType, MediaListenerPtr> streamer_listener_; + uint32_t bits_per_sample_; + uint32_t sampling_rate_; + uint64_t stream_data_size_; + std::chrono::time_point<std::chrono::system_clock> + socket_audio_stream_start_time_; + application_manager::ApplicationManager& application_manager_; private: diff --git a/src/components/media_manager/src/file_streamer_adapter.cc b/src/components/media_manager/src/file_streamer_adapter.cc index 301b093829..f17d1f89ed 100644 --- a/src/components/media_manager/src/file_streamer_adapter.cc +++ b/src/components/media_manager/src/file_streamer_adapter.cc @@ -95,7 +95,7 @@ bool FileStreamerAdapter::FileStreamer::Send( return false; } - SDL_LOG_INFO("Streamer::sent " << msg->data_size()); + SDL_LOG_TRACE("Streamer::sent " << msg->data_size()); return true; } diff --git a/src/components/media_manager/src/media_manager_impl.cc b/src/components/media_manager/src/media_manager_impl.cc index 6f0a67b0c9..4fc8b38d87 100644 --- a/src/components/media_manager/src/media_manager_impl.cc +++ b/src/components/media_manager/src/media_manager_impl.cc @@ -35,6 +35,8 @@ #include "application_manager/application_impl.h" #include "application_manager/application_manager.h" #include "application_manager/message_helper.h" +#include "application_manager/smart_object_keys.h" +#include "interfaces/MOBILE_API.h" #include "media_manager/audio/from_mic_recorder_listener.h" #include "media_manager/streamer_listener.h" #include "protocol_handler/protocol_handler.h" @@ -64,6 +66,9 @@ MediaManagerImpl::MediaManagerImpl( , protocol_handler_(NULL) , a2dp_player_(NULL) , from_mic_recorder_(NULL) + , bits_per_sample_(16) + , sampling_rate_(16000) + , stream_data_size_(0ull) , application_manager_(application_manager) { Init(); } @@ -160,6 +165,23 @@ void MediaManagerImpl::Init() { streamer_[ServiceType::kAudio]->AddListener( streamer_listener_[ServiceType::kAudio]); } + + if (application_manager_.hmi_capabilities().pcm_stream_capabilities()) { + const auto pcm_caps = + application_manager_.hmi_capabilities().pcm_stream_capabilities(); + + if (pcm_caps->keyExists(application_manager::strings::bits_per_sample)) { + bits_per_sample_ = + pcm_caps->getElement(application_manager::strings::bits_per_sample) + .asUInt(); + } + + if (pcm_caps->keyExists(application_manager::strings::sampling_rate)) { + sampling_rate_ = + pcm_caps->getElement(application_manager::strings::sampling_rate) + .asUInt(); + } + } } void MediaManagerImpl::PlayA2DPSource(int32_t application_key) { @@ -276,6 +298,8 @@ void MediaManagerImpl::StopStreaming( int32_t application_key, protocol_handler::ServiceType service_type) { SDL_LOG_AUTO_TRACE(); + stream_data_size_ = 0ull; + if (streamer_[service_type]) { streamer_[service_type]->StopActivity(application_key); } @@ -313,7 +337,24 @@ void MediaManagerImpl::OnMessageReceived( ApplicationSharedPtr app = application_manager_.application(streaming_app_id); if (app) { - app->WakeUpStreaming(service_type); + if (ServiceType::kAudio == service_type) { + if (stream_data_size_ == 0) { + socket_audio_stream_start_time_ = std::chrono::system_clock::now(); + } + + stream_data_size_ += message->data_size(); + uint32_t ms_for_all_data = DataSizeToMilliseconds(stream_data_size_); + uint32_t ms_since_stream_start = + std::chrono::duration_cast<std::chrono::milliseconds>( + std::chrono::system_clock::now() - + socket_audio_stream_start_time_) + .count(); + uint32_t ms_stream_remaining = ms_for_all_data - ms_since_stream_start; + + app->WakeUpStreaming(service_type, ms_stream_remaining); + } else { + app->WakeUpStreaming(service_type); + } streamer_[service_type]->SendData(streaming_app_id, message); } } @@ -326,36 +367,16 @@ void MediaManagerImpl::FramesProcessed(int32_t application_key, if (protocol_handler_) { protocol_handler_->SendFramesNumber(application_key, frame_number); } - - application_manager::ApplicationSharedPtr app = - application_manager_.application(application_key); - - if (app) { - auto audio_stream = std::dynamic_pointer_cast<StreamerAdapter>( - streamer_[protocol_handler::ServiceType::kAudio]); - auto video_stream = std::dynamic_pointer_cast<StreamerAdapter>( - streamer_[protocol_handler::ServiceType::kMobileNav]); - - if (audio_stream.use_count() != 0) { - size_t audio_queue_size = audio_stream->GetMsgQueueSize(); - SDL_LOG_DEBUG("# Messages in audio queue = " << audio_queue_size); - if (audio_queue_size > 0) { - app->WakeUpStreaming(protocol_handler::ServiceType::kAudio); - } - } - - if (video_stream.use_count() != 0) { - size_t video_queue_size = video_stream->GetMsgQueueSize(); - SDL_LOG_DEBUG("# Messages in video queue = " << video_queue_size); - if (video_queue_size > 0) { - app->WakeUpStreaming(protocol_handler::ServiceType::kMobileNav); - } - } - } } const MediaManagerSettings& MediaManagerImpl::settings() const { return settings_; } +uint32_t MediaManagerImpl::DataSizeToMilliseconds(uint64_t data_size) const { + constexpr uint16_t latency_compensation = 500; + return 1000 * data_size / (sampling_rate_ * bits_per_sample_ / 8) + + latency_compensation; +} + } // namespace media_manager diff --git a/src/components/media_manager/src/pipe_streamer_adapter.cc b/src/components/media_manager/src/pipe_streamer_adapter.cc index 5e4c87c73d..b4e66be483 100644 --- a/src/components/media_manager/src/pipe_streamer_adapter.cc +++ b/src/components/media_manager/src/pipe_streamer_adapter.cc @@ -144,7 +144,7 @@ bool PipeStreamerAdapter::PipeStreamer::Send( // Loop to send remaining data if there is any. } while (data_remaining); - SDL_LOG_INFO("Streamer::sent " << msg->data_size()); + SDL_LOG_TRACE("Streamer::sent " << msg->data_size()); return true; } diff --git a/src/components/media_manager/src/socket_streamer_adapter.cc b/src/components/media_manager/src/socket_streamer_adapter.cc index 2f10a29c7d..134ccb8038 100644 --- a/src/components/media_manager/src/socket_streamer_adapter.cc +++ b/src/components/media_manager/src/socket_streamer_adapter.cc @@ -149,7 +149,7 @@ bool SocketStreamerAdapter::SocketStreamer::Send( SDL_LOG_WARN("Couldn't send all the data to socket " << send_socket_fd_); } - SDL_LOG_INFO("Streamer::sent " << msg->data_size()); + SDL_LOG_TRACE("Streamer::sent " << msg->data_size()); return true; } diff --git a/src/components/media_manager/src/streamer_adapter.cc b/src/components/media_manager/src/streamer_adapter.cc index 8dedd56ea5..ad61ac1f63 100644 --- a/src/components/media_manager/src/streamer_adapter.cc +++ b/src/components/media_manager/src/streamer_adapter.cc @@ -59,6 +59,7 @@ void StreamerAdapter::StartActivity(int32_t application_key) { << " has been already started"); return; } + messages_.Reset(); DCHECK(thread_); const size_t kStackSize = 16384; @@ -86,7 +87,6 @@ void StreamerAdapter::StopActivity(int32_t application_key) { DCHECK(streamer_); streamer_->exitThreadMain(); - messages_.Reset(); for (std::set<MediaListenerPtr>::iterator it = media_listeners_.begin(); media_listeners_.end() != it; @@ -150,7 +150,7 @@ void StreamerAdapter::Streamer::threadMain() { static int32_t messages_for_session = 0; ++messages_for_session; - SDL_LOG_DEBUG("Handling map streaming message. This is " + SDL_LOG_TRACE("Handling map streaming message. This is " << messages_for_session << " message for " << adapter_->current_application_); std::set<MediaListenerPtr>::iterator it = diff --git a/src/components/media_manager/test/media_manager_impl_test.cc b/src/components/media_manager/test/media_manager_impl_test.cc index a64faabe91..ab0a9cf494 100644 --- a/src/components/media_manager/test/media_manager_impl_test.cc +++ b/src/components/media_manager/test/media_manager_impl_test.cc @@ -35,6 +35,7 @@ #include "application_manager/message.h" #include "application_manager/mock_application.h" #include "application_manager/mock_application_manager.h" +#include "application_manager/mock_hmi_capabilities.h" #include "application_manager/resumption/resume_ctrl.h" #include "application_manager/state_controller.h" #include "gmock/gmock.h" @@ -109,6 +110,10 @@ class MediaManagerImplTest : public ::testing::Test { .WillByDefault(ReturnRef(kDefaultValue)); ON_CALL(mock_media_manager_settings_, audio_server_type()) .WillByDefault(ReturnRef(kDefaultValue)); + ON_CALL(mock_hmi_capabilities_, pcm_stream_capabilities()) + .WillByDefault(Return(nullptr)); + ON_CALL(app_mngr_, hmi_capabilities()) + .WillByDefault(ReturnRef(mock_hmi_capabilities_)); mock_app_ = std::make_shared<MockApp>(); media_manager_impl_.reset( new MediaManagerImpl(app_mngr_, mock_media_manager_settings_)); @@ -176,7 +181,7 @@ class MediaManagerImplTest : public ::testing::Test { .WillOnce(Return(true)); EXPECT_CALL(app_mngr_, application(kConnectionKey)) .WillOnce(Return(mock_app_)); - EXPECT_CALL(*mock_app_, WakeUpStreaming(service_type)); + EXPECT_CALL(*mock_app_, WakeUpStreaming(service_type, _)); MockMediaAdapterImplPtr mock_media_streamer = std::make_shared<MockMediaAdapterImpl>(); media_manager_impl_->set_mock_streamer(service_type, mock_media_streamer); @@ -206,6 +211,7 @@ class MediaManagerImplTest : public ::testing::Test { const ::testing::NiceMock<MockMediaManagerSettings> mock_media_manager_settings_; std::shared_ptr<MediaManagerImpl> media_manager_impl_; + application_manager_test::MockHMICapabilities mock_hmi_capabilities_; }; TEST_F(MediaManagerImplTest, @@ -410,17 +416,11 @@ TEST_F(MediaManagerImplTest, TEST_F(MediaManagerImplTest, CheckFramesProcessed_WithCorrectFramesNumber_SUCCESS) { - ON_CALL(mock_media_manager_settings_, video_server_type()) - .WillByDefault(ReturnRef(kDefaultValue)); - ON_CALL(mock_media_manager_settings_, audio_server_type()) - .WillByDefault(ReturnRef(kDefaultValue)); protocol_handler_test::MockProtocolHandler mock_protocol_handler; media_manager_impl_->SetProtocolHandler(&mock_protocol_handler); const int32_t frame_number = 10; EXPECT_CALL(mock_protocol_handler, SendFramesNumber(kApplicationKey, frame_number)); - EXPECT_CALL(app_mngr_, application(kConnectionKey)) - .WillOnce(Return(mock_app_)); media_manager_impl_->FramesProcessed(kApplicationKey, frame_number); } diff --git a/src/components/policy/policy_external/include/policy/cache_manager.h b/src/components/policy/policy_external/include/policy/cache_manager.h index 12fe8f10cd..8384f56f77 100644 --- a/src/components/policy/policy_external/include/policy/cache_manager.h +++ b/src/components/policy/policy_external/include/policy/cache_manager.h @@ -597,13 +597,11 @@ class CacheManager : public CacheManagerInterface { */ void SetPreloadedPtFlag(const bool is_preloaded) OVERRIDE; - /** - * @brief Records information about head unit system to PT - * @return bool Success of operation - */ bool SetMetaInfo(const std::string& ccpu_version, const std::string& wers_country_code, - const std::string& language); + const std::string& language) OVERRIDE; + + void SetHardwareVersion(const std::string& hardware_version) OVERRIDE; /** * @brief Get information about last ccpu_version from PT @@ -611,6 +609,8 @@ class CacheManager : public CacheManagerInterface { */ std::string GetCCPUVersionFromPT() const; + std::string GetHardwareVersionFromPT() const OVERRIDE; + /** * @brief Checks, if specific head unit is present in PT * @return boot Suceess, if present, otherwise - false diff --git a/src/components/policy/policy_external/include/policy/cache_manager_interface.h b/src/components/policy/policy_external/include/policy/cache_manager_interface.h index 8ed46e0c72..f33dabd025 100644 --- a/src/components/policy/policy_external/include/policy/cache_manager_interface.h +++ b/src/components/policy/policy_external/include/policy/cache_manager_interface.h @@ -645,7 +645,7 @@ class CacheManagerInterface { virtual void SetPreloadedPtFlag(const bool is_preloaded) = 0; /** - * @brief Records information about head unit system to PT + * @brief Records mandatory information about head unit system to PT * @return bool Success of operation */ virtual bool SetMetaInfo(const std::string& ccpu_version, @@ -653,12 +653,24 @@ class CacheManagerInterface { const std::string& language) = 0; /** + * @brief Records information about hardware version to PT + * @param hardware_version Hardware version + */ + virtual void SetHardwareVersion(const std::string& hardware_version) = 0; + + /** * @brief Get information about last ccpu_version from PT * @return ccpu_version from PT */ virtual std::string GetCCPUVersionFromPT() const = 0; /** + * @brief Get information about last hardware version from PT + * @return hardware version from PT + */ + virtual std::string GetHardwareVersionFromPT() const = 0; + + /** * @brief Checks, if specific head unit is present in PT * @return boot Suceess, if present, otherwise - false */ 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 27ce30bb3d..813af17b3f 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 @@ -435,10 +435,14 @@ class PolicyManagerImpl : public PolicyManager { const std::string& wers_country_code, const std::string& language) OVERRIDE; + void SetHardwareVersion(const std::string& hardware_version) OVERRIDE; + void SetPreloadedPtFlag(const bool is_preloaded) OVERRIDE; std::string GetCCPUVersionFromPT() const OVERRIDE; + std::string GetHardwareVersionFromPT() const OVERRIDE; + /** * @brief Get number of notification by priority * @param priority Specified priority @@ -1053,6 +1057,11 @@ class PolicyManagerImpl : public PolicyManager { void StartPTExchange() OVERRIDE; /** + * @brief Trigger a PTU once on startup if it is required + */ + void TriggerPTUOnStartupIfRequired() OVERRIDE; + + /** * @brief Checks is PT exceeded days * @return true if exceeded */ diff --git a/src/components/policy/policy_external/include/policy/policy_table/types.h b/src/components/policy/policy_external/include/policy/policy_table/types.h index 6b2f05d336..25439f835b 100644 --- a/src/components/policy/policy_external/include/policy/policy_table/types.h +++ b/src/components/policy/policy_external/include/policy/policy_table/types.h @@ -490,6 +490,7 @@ struct ModuleMeta : CompositeType { Optional<String<0, 500> > ccpu_version; Optional<String<0, 250> > language; Optional<String<0, 250> > wers_country_code; + Optional<String<0, 500> > hardware_version; Optional<Integer<uint32_t, 0, ODO_MAX> > pt_exchanged_at_odometer_x; Optional<Integer<uint16_t, 0, 65535> > pt_exchanged_x_days_after_epoch; Optional<Integer<uint16_t, 0, 65535> > ignition_cycles_since_last_exchange; diff --git a/src/components/policy/policy_external/include/policy/policy_table_interface_ext.xml b/src/components/policy/policy_external/include/policy/policy_table_interface_ext.xml index a5aa36f371..a3b91abbc5 100644 --- a/src/components/policy/policy_external/include/policy/policy_table_interface_ext.xml +++ b/src/components/policy/policy_external/include/policy/policy_table_interface_ext.xml @@ -25,6 +25,7 @@ <element name="gps" /> <element name="speed" /> <element name="engineTorque" /> + <element name="climateData" /> <element name="externalTemperature" /> <element name="turnSignal" /> <element name="fuelLevel" /> @@ -222,6 +223,7 @@ <param name="ccpu_version" type="String" maxlength="250" mandatory="false"/> <param name="language" type="String" maxlength="250" mandatory="false"/> <param name="wers_country_code" type="String" maxlength="250" mandatory="false"/> + <param name="hardware_version" type="String" maxlength="500" mandatory="false"/> <param name="pt_exchanged_at_odometer_x" type="Integer" minvalue="0" maxvalue="65535" mandatory="false"/> <param name="pt_exchanged_x_days_after_epoch" type="Integer" minvalue="0" maxvalue="65535" mandatory="false"/> <param name="ignition_cycles_since_last_exchange" type="Integer" minvalue="0" maxvalue="65535" mandatory="false"/> diff --git a/src/components/policy/policy_external/include/policy/policy_types.h b/src/components/policy/policy_external/include/policy/policy_types.h index 7e8abd5989..ff3a89d084 100644 --- a/src/components/policy/policy_external/include/policy/policy_types.h +++ b/src/components/policy/policy_external/include/policy/policy_types.h @@ -278,6 +278,7 @@ struct AppPermissions { , appRevoked(false) , appPermissionsConsentNeeded(false) , appUnauthorized(false) + , isSDLAllowed(false) , requestTypeChanged(false) , requestSubTypeChanged(false) {} diff --git a/src/components/policy/policy_external/include/policy/pt_ext_representation.h b/src/components/policy/policy_external/include/policy/pt_ext_representation.h index f03947268a..867033bc20 100644 --- a/src/components/policy/policy_external/include/policy/pt_ext_representation.h +++ b/src/components/policy/policy_external/include/policy/pt_ext_representation.h @@ -198,7 +198,7 @@ class PTExtRepresentation : public virtual PTRepresentation { const std::string& language) = 0; /** - * @brief Records information about head unit system to PT + * @brief Records mandatory information about head unit system to PT * @return bool Success of operation */ virtual bool SetMetaInfo(const std::string& ccpu_version, @@ -206,6 +206,12 @@ class PTExtRepresentation : public virtual PTRepresentation { const std::string& language) = 0; /** + * @brief Records information about hardware version to PT + * @param hardware_version Hardware version + */ + virtual void SetHardwareVersion(const std::string& hardware_version) = 0; + + /** * @brief Checks, if specific head unit is present in PT * @return boot Suceess, if present, otherwise - false */ diff --git a/src/components/policy/policy_external/include/policy/sql_pt_ext_queries.h b/src/components/policy/policy_external/include/policy/sql_pt_ext_queries.h index b8f85ec7b1..abb18d51e4 100644 --- a/src/components/policy/policy_external/include/policy/sql_pt_ext_queries.h +++ b/src/components/policy/policy_external/include/policy/sql_pt_ext_queries.h @@ -65,6 +65,7 @@ extern const std::string kInsertExternalConsentStatusGroups; extern const std::string kCountUnconsentedGroups; extern const std::string kSelectModuleMeta; extern const std::string kUpdateMetaParams; +extern const std::string kUpdateMetaHardwareVersion; extern const std::string kUpdateModuleMetaVinParam; extern const std::string kSaveModuleMeta; extern const std::string kSelectMetaParams; diff --git a/src/components/policy/policy_external/include/policy/sql_pt_ext_representation.h b/src/components/policy/policy_external/include/policy/sql_pt_ext_representation.h index 889ede9d20..de2d0c1536 100644 --- a/src/components/policy/policy_external/include/policy/sql_pt_ext_representation.h +++ b/src/components/policy/policy_external/include/policy/sql_pt_ext_representation.h @@ -94,7 +94,9 @@ class SQLPTExtRepresentation : public SQLPTRepresentation, bool SetMetaInfo(const std::string& ccpu_version, const std::string& wers_country_code, - const std::string& language); + const std::string& language) OVERRIDE; + + void SetHardwareVersion(const std::string& hardware_version) OVERRIDE; bool IsMetaInfoPresent(); diff --git a/src/components/policy/policy_external/src/cache_manager.cc b/src/components/policy/policy_external/src/cache_manager.cc index 783a622b2e..07f2df1991 100644 --- a/src/components/policy/policy_external/src/cache_manager.cc +++ b/src/components/policy/policy_external/src/cache_manager.cc @@ -2047,7 +2047,8 @@ void CacheManager::PersistData() { *(*copy_pt.policy_table.module_meta).wers_country_code, *(*copy_pt.policy_table.module_meta).language); ex_backup_->SetVINValue(*(*copy_pt.policy_table.module_meta).vin); - + ex_backup_->SetHardwareVersion( + *(*copy_pt.policy_table.module_meta).hardware_version); // Save unpaired flag for devices policy_table::DeviceData::const_iterator it_device = copy_pt.policy_table.device_data->begin(); @@ -2300,13 +2301,35 @@ bool CacheManager::SetMetaInfo(const std::string& ccpu_version, return true; } +void CacheManager::SetHardwareVersion(const std::string& hardware_version) { + SDL_LOG_AUTO_TRACE(); + CACHE_MANAGER_CHECK_VOID(); + sync_primitives::AutoLock auto_lock(cache_lock_); + + *pt_->policy_table.module_meta->hardware_version = hardware_version; + Backup(); +} + std::string CacheManager::GetCCPUVersionFromPT() const { SDL_LOG_AUTO_TRACE(); + CACHE_MANAGER_CHECK(std::string("")); + sync_primitives::AutoLock auto_lock(cache_lock_); + rpc::Optional<policy_table::ModuleMeta>& module_meta = pt_->policy_table.module_meta; return *(module_meta->ccpu_version); } +std::string CacheManager::GetHardwareVersionFromPT() const { + SDL_LOG_AUTO_TRACE(); + CACHE_MANAGER_CHECK(std::string("")); + sync_primitives::AutoLock auto_lock(cache_lock_); + + rpc::Optional<policy_table::ModuleMeta>& module_meta = + pt_->policy_table.module_meta; + return *(module_meta->hardware_version); +} + bool CacheManager::IsMetaInfoPresent() const { CACHE_MANAGER_CHECK(false); sync_primitives::AutoLock lock(cache_lock_); 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 9bcea70803..d6aa007ac1 100644 --- a/src/components/policy/policy_external/src/policy_manager_impl.cc +++ b/src/components/policy/policy_external/src/policy_manager_impl.cc @@ -762,6 +762,13 @@ void PolicyManagerImpl::StartPTExchange() { } } +void PolicyManagerImpl::TriggerPTUOnStartupIfRequired() { + SDL_LOG_AUTO_TRACE(); + if (ignition_check) { + StartPTExchange(); + } +} + void PolicyManagerImpl::OnAppsSearchStarted() { SDL_LOG_AUTO_TRACE(); update_status_manager_.OnAppsSearchStarted(); @@ -1617,11 +1624,22 @@ void PolicyManagerImpl::SetSystemInfo(const std::string& ccpu_version, cache_->SetMetaInfo(ccpu_version, wers_country_code, language); } +void PolicyManagerImpl::SetHardwareVersion( + const std::string& hardware_version) { + SDL_LOG_AUTO_TRACE(); + cache_->SetHardwareVersion(hardware_version); +} + std::string PolicyManagerImpl::GetCCPUVersionFromPT() const { SDL_LOG_AUTO_TRACE(); return cache_->GetCCPUVersionFromPT(); } +std::string PolicyManagerImpl::GetHardwareVersionFromPT() const { + SDL_LOG_AUTO_TRACE(); + return cache_->GetHardwareVersionFromPT(); +} + uint32_t PolicyManagerImpl::GetNotificationsNumber(const std::string& priority, const bool is_subtle) const { SDL_LOG_AUTO_TRACE(); diff --git a/src/components/policy/policy_external/src/policy_table/types.cc b/src/components/policy/policy_external/src/policy_table/types.cc index cb7f2bdd9d..47c4202de0 100644 --- a/src/components/policy/policy_external/src/policy_table/types.cc +++ b/src/components/policy/policy_external/src/policy_table/types.cc @@ -1424,6 +1424,7 @@ ModuleMeta::ModuleMeta(const Json::Value* value__) , ccpu_version(impl::ValueMember(value__, "ccpu_version")) , language(impl::ValueMember(value__, "language")) , wers_country_code(impl::ValueMember(value__, "wers_country_code")) + , hardware_version(impl::ValueMember(value__, "hardware_version")) , pt_exchanged_at_odometer_x( impl::ValueMember(value__, "pt_exchanged_at_odometer_x")) , pt_exchanged_x_days_after_epoch( @@ -1437,6 +1438,7 @@ Json::Value ModuleMeta::ToJsonValue() const { impl::WriteJsonField("ccpu_version", ccpu_version, &result__); impl::WriteJsonField("language", language, &result__); impl::WriteJsonField("wers_country_code", wers_country_code, &result__); + impl::WriteJsonField("hardware_version", hardware_version, &result__); impl::WriteJsonField( "pt_exchanged_at_odometer_x", pt_exchanged_at_odometer_x, &result__); impl::WriteJsonField("pt_exchanged_x_days_after_epoch", @@ -1462,6 +1464,11 @@ bool ModuleMeta::is_valid() const { if (!wers_country_code.is_valid()) { return false; } + + if (!hardware_version.is_valid()) { + return false; + } + if (!pt_exchanged_at_odometer_x.is_valid()) { return false; } @@ -1492,6 +1499,11 @@ bool ModuleMeta::struct_empty() const { if (wers_country_code.is_initialized()) { return false; } + + if (hardware_version.is_initialized()) { + return false; + } + if (pt_exchanged_at_odometer_x.is_initialized()) { return false; } @@ -1506,6 +1518,7 @@ bool ModuleMeta::struct_empty() const { if (vin.is_initialized()) { return false; } + return true; } @@ -1523,6 +1536,10 @@ void ModuleMeta::ReportErrors(rpc::ValidationReport* report__) const { wers_country_code.ReportErrors( &report__->ReportSubobject("wers_country_code")); } + if (!hardware_version.is_valid()) { + hardware_version.ReportErrors( + &report__->ReportSubobject("hardware_version")); + } if (!pt_exchanged_at_odometer_x.is_valid()) { pt_exchanged_at_odometer_x.ReportErrors( &report__->ReportSubobject("pt_exchanged_at_odometer_x")); @@ -1551,6 +1568,7 @@ void ModuleMeta::SetPolicyTableType(PolicyTableType pt_type) { ccpu_version.SetPolicyTableType(pt_type); language.SetPolicyTableType(pt_type); wers_country_code.SetPolicyTableType(pt_type); + hardware_version.SetPolicyTableType(pt_type); pt_exchanged_at_odometer_x.SetPolicyTableType(pt_type); pt_exchanged_x_days_after_epoch.SetPolicyTableType(pt_type); ignition_cycles_since_last_exchange.SetPolicyTableType(pt_type); diff --git a/src/components/policy/policy_external/src/sql_pt_ext_queries.cc b/src/components/policy/policy_external/src/sql_pt_ext_queries.cc index ea323908c0..26d2124d07 100644 --- a/src/components/policy/policy_external/src/sql_pt_ext_queries.cc +++ b/src/components/policy/policy_external/src/sql_pt_ext_queries.cc @@ -170,18 +170,27 @@ const std::string kCountUnconsentedGroups = " WHERE (`a`.`functional_group_id` = `f`.`id`" " AND`f`.`user_consent_prompt` IS NULL))"; -const std::string kSelectModuleMeta = "SELECT* FROM `module_meta`"; +const std::string kSelectModuleMeta = + "SELECT `ccpu_version`, `language`, " + "`wers_country_code`, `hardware_version`, `pt_exchanged_at_odometer_x`, " + "`pt_exchanged_x_days_after_epoch`, " + "`ignition_cycles_since_last_exchange`, `vin` " + "FROM `module_meta`"; const std::string kUpdateMetaParams = "UPDATE `module_meta` SET " - "`ccpu_version` = ?, `wers_country_code` = ?, `language` = ? "; + "`ccpu_version` = ?, `wers_country_code` = ?, `language` = ?"; + +const std::string kUpdateMetaHardwareVersion = + "UPDATE `module_meta` SET `hardware_version` = ? "; const std::string kUpdateModuleMetaVinParam = "UPDATE `module_meta` SET `vin` = ? "; const std::string kSaveModuleMeta = "UPDATE `module_meta` SET `ccpu_version` = ?, `language` = ?," - "`wers_country_code` = ?, `pt_exchanged_at_odometer_x` = ?," + "`wers_country_code` = ?, `hardware_version` = ?, " + "`pt_exchanged_at_odometer_x` = ?," "`pt_exchanged_x_days_after_epoch` = ?," "`ignition_cycles_since_last_exchange` = ?, `vin` = ?"; diff --git a/src/components/policy/policy_external/src/sql_pt_ext_representation.cc b/src/components/policy/policy_external/src/sql_pt_ext_representation.cc index 7147e0949d..fc35551808 100644 --- a/src/components/policy/policy_external/src/sql_pt_ext_representation.cc +++ b/src/components/policy/policy_external/src/sql_pt_ext_representation.cc @@ -600,6 +600,22 @@ bool SQLPTExtRepresentation::SetMetaInfo(const std::string& ccpu_version, return true; } +void SQLPTExtRepresentation::SetHardwareVersion( + const std::string& hardware_version) { + SDL_LOG_AUTO_TRACE(); + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt_ext::kUpdateMetaHardwareVersion)) { + SDL_LOG_WARN("Incorrect statement for insert to module meta."); + return; + } + + query.Bind(0, hardware_version); + + if (!query.Exec()) { + SDL_LOG_WARN("Incorrect insert to module meta."); + } +} + bool SQLPTExtRepresentation::IsMetaInfoPresent() { SDL_LOG_AUTO_TRACE(); utils::dbms::SQLQuery query(db()); @@ -1320,10 +1336,11 @@ void SQLPTExtRepresentation::GatherModuleMeta( *meta->ccpu_version = query.GetString(0); *meta->language = query.GetString(1); *meta->wers_country_code = query.GetString(2); - *meta->pt_exchanged_at_odometer_x = query.GetInteger(3); - *meta->pt_exchanged_x_days_after_epoch = query.GetInteger(4); - *meta->ignition_cycles_since_last_exchange = query.GetInteger(5); - *meta->vin = query.GetString(6); + *meta->hardware_version = query.GetString(3); + *meta->pt_exchanged_at_odometer_x = query.GetInteger(4); + *meta->pt_exchanged_x_days_after_epoch = query.GetInteger(5); + *meta->ignition_cycles_since_last_exchange = query.GetInteger(6); + *meta->vin = query.GetString(7); } } @@ -1652,10 +1669,11 @@ bool SQLPTExtRepresentation::SaveModuleMeta( query.Bind(0, *(meta.ccpu_version)); query.Bind(1, *(meta.language)); query.Bind(2, *(meta.wers_country_code)); - query.Bind(3, odometer); - query.Bind(4, *(meta.pt_exchanged_x_days_after_epoch)); - query.Bind(5, *(meta.ignition_cycles_since_last_exchange)); - query.Bind(6, *(meta.vin)); + query.Bind(3, *(meta.hardware_version)); + query.Bind(4, odometer); + query.Bind(5, *(meta.pt_exchanged_x_days_after_epoch)); + query.Bind(6, *(meta.ignition_cycles_since_last_exchange)); + query.Bind(7, *(meta.vin)); if (!query.Exec()) { SDL_LOG_WARN("Incorrect update for module_meta."); diff --git a/src/components/policy/policy_external/src/sql_pt_queries.cc b/src/components/policy/policy_external/src/sql_pt_queries.cc index 9e69d2cef8..519e51dde5 100644 --- a/src/components/policy/policy_external/src/sql_pt_queries.cc +++ b/src/components/policy/policy_external/src/sql_pt_queries.cc @@ -59,6 +59,7 @@ const std::string kCreateSchema = " `ccpu_version` VARCHAR(45), " " `language` VARCHAR(45), " " `wers_country_code` VARCHAR(45), " + " `hardware_version` VARCHAR(45), " " `pt_exchanged_at_odometer_x` INTEGER NOT NULL DEFAULT 0, " " `pt_exchanged_x_days_after_epoch` INTEGER NOT NULL DEFAULT 0, " " `ignition_cycles_since_last_exchange` INTEGER NOT NULL DEFAULT 0, " diff --git a/src/components/policy/policy_external/test/CMakeLists.txt b/src/components/policy/policy_external/test/CMakeLists.txt index 8f1b8b2539..7a28b2d3c2 100644 --- a/src/components/policy/policy_external/test/CMakeLists.txt +++ b/src/components/policy/policy_external/test/CMakeLists.txt @@ -52,6 +52,8 @@ file (GLOB POLICY_TEST_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/policy_manager_impl_test.cc ${CMAKE_CURRENT_SOURCE_DIR}/sql_pt_ext_representation_test.cc ${CMAKE_CURRENT_SOURCE_DIR}/sql_pt_representation_test.cc + ${CMAKE_CURRENT_SOURCE_DIR}/sql_pt_representation_storage_test.cc + ${CMAKE_CURRENT_SOURCE_DIR}/sql_pt_ext_representation_storage_test.cc ${CMAKE_CURRENT_SOURCE_DIR}/update_status_manager_test.cc ${CMAKE_CURRENT_SOURCE_DIR}/shared_library_test.cc) diff --git a/src/components/policy/policy_external/test/cache_manager_test.cc b/src/components/policy/policy_external/test/cache_manager_test.cc index 746d0c7221..9819811803 100644 --- a/src/components/policy/policy_external/test/cache_manager_test.cc +++ b/src/components/policy/policy_external/test/cache_manager_test.cc @@ -2169,6 +2169,18 @@ TEST_F(CacheManagerTest, RemoveAppConsentForGroup_GroupIsRemoved) { EXPECT_FALSE(unconsented_groups_after_removal.empty()); } +TEST_F(CacheManagerTest, GetHardwareVersion_ValueWasSetBefore_ReturnValue) { + std::string hardware_version = "1.1.1.1"; + cache_manager_->SetHardwareVersion(hardware_version); + EXPECT_EQ(hardware_version, cache_manager_->GetHardwareVersionFromPT()); +} + +TEST_F(CacheManagerTest, + GetHardwareVersion_ValueNotSettedBefore_ReturnEmptyString) { + std::string empty_string = ""; + EXPECT_EQ(empty_string, cache_manager_->GetHardwareVersionFromPT()); +} + } // namespace policy_test } // namespace components } // namespace test diff --git a/src/components/policy/policy_external/test/include/policy/mock_pt_ext_representation.h b/src/components/policy/policy_external/test/include/policy/mock_pt_ext_representation.h index b307270b10..f43fedcfab 100644 --- a/src/components/policy/policy_external/test/include/policy/mock_pt_ext_representation.h +++ b/src/components/policy/policy_external/test/include/policy/mock_pt_ext_representation.h @@ -105,6 +105,7 @@ class MockPTExtRepresentation : public MockPTRepresentation, bool(const std::string& ccpu_version, const std::string& wers_country_code, const std::string& vin)); + MOCK_METHOD1(SetHardwareVersion, void(const std::string& hardware_version)); MOCK_METHOD0(IsMetaInfoPresent, bool()); MOCK_METHOD1(SetSystemLanguage, bool(const std::string& language)); MOCK_METHOD0(GetKmFromSuccessfulExchange, int()); diff --git a/src/components/policy/policy_external/test/sql_pt_ext_representation_storage_test.cc b/src/components/policy/policy_external/test/sql_pt_ext_representation_storage_test.cc index 1ceb5ea1ef..09df17beb2 100644 --- a/src/components/policy/policy_external/test/sql_pt_ext_representation_storage_test.cc +++ b/src/components/policy/policy_external/test/sql_pt_ext_representation_storage_test.cc @@ -38,8 +38,6 @@ #include "policy/mock_policy_settings.h" #include "sqlite_wrapper/sql_query.h" #include "utils/file_system.h" -#include "utils/make_shared.h" -#include "utils/shared_ptr.h" using namespace ::policy; diff --git a/src/components/policy/policy_external/test/sql_pt_ext_representation_test.cc b/src/components/policy/policy_external/test/sql_pt_ext_representation_test.cc index 97613550f2..58f526d7d3 100644 --- a/src/components/policy/policy_external/test/sql_pt_ext_representation_test.cc +++ b/src/components/policy/policy_external/test/sql_pt_ext_representation_test.cc @@ -38,12 +38,14 @@ #include <utility> #include <vector> #include "gtest/gtest.h" +#include "json/reader.h" #include "policy/mock_policy_settings.h" #include "policy/policy_table/types.h" #include "rpc_base/rpc_base.h" #include "sqlite_wrapper/sql_query.h" #include "utils/file_system.h" #include "utils/gen_hash.h" +#include "utils/jsoncpp_reader_wrapper.h" using namespace ::policy; namespace policy_table = rpc::policy_table_interface_base; @@ -57,6 +59,44 @@ namespace test { namespace components { namespace policy_test { +namespace { +const std::string kSdlPreloadedPtJson = "json/sdl_preloaded_pt.json"; +const std::string kHardwareVersion = "1.1.1.0"; +const std::string kSoftwareVersion = "4.1.3.B_EB355B"; +const std::string kWersCountryCode = "WAEGB"; +const std::string kLanguage = "EN-US"; +const std::string kFunctionalGroupWithParams = "Location-1"; +const std::string kUserConsentForGroupWithParams = "Location"; +const std::string kRpcForGroupWithParams = "GetVehicleData"; +} // namespace + +policy_table::Table LoadPreloadedPT(const std::string& filename) { + std::ifstream ifile(filename); + EXPECT_TRUE(ifile.good()); + Json::CharReaderBuilder reader_builder; + Json::Value root(Json::objectValue); + Json::parseFromStream(reader_builder, ifile, &root, nullptr); + root["policy_table"]["module_config"].removeMember("preloaded_pt"); + ifile.close(); + policy_table::Table table(&root); + return table; +} + +Json::Value GetDefaultSnapshotModuleMeta(policy_table::Table& policy_table) { + auto json_table = policy_table.ToJsonValue(); + + Json::Value default_module_meta = json_table["policy_table"]["module_meta"]; + default_module_meta["ccpu_version"] = Json::Value(""); + default_module_meta["hardware_version"] = Json::Value(""); + default_module_meta["language"] = Json::Value(""); + default_module_meta["wers_country_code"] = Json::Value(""); + default_module_meta["pt_exchanged_at_odometer_x"] = Json::Value(0); + default_module_meta["pt_exchanged_x_days_after_epoch"] = Json::Value(0); + default_module_meta["ignition_cycles_since_last_exchange"] = Json::Value(0); + default_module_meta["vin"] = Json::Value(""); + return default_module_meta; +} + class SQLPTExtRepresentationTest : public ::testing::Test { public: // Collection of pairs of group alias and corresponding group name @@ -264,163 +304,147 @@ SQLPTExtRepresentationTest::GetDataInternal( } TEST_F(SQLPTExtRepresentationTest, - DISABLED_GenerateSnapshot_SetPolicyTable_SnapshotIsPresent) { - // TODO(AKutsan): APPLINK-31526 Test requires initial preloaded pt for - // preloaded date reading - // Arrange - Json::Value table(Json::objectValue); - table["policy_table"] = Json::Value(Json::objectValue); + GenerateSnapshot_DefaultContentOfModuleMeta_MetaInfoPresentInSnapshot) { + policy_table::Table update = LoadPreloadedPT(kSdlPreloadedPtJson); - Json::Value& policy_table = table["policy_table"]; - policy_table["module_config"] = Json::Value(Json::objectValue); - policy_table["functional_groupings"] = Json::Value(Json::objectValue); - policy_table["consumer_friendly_messages"] = Json::Value(Json::objectValue); - policy_table["app_policies"] = Json::Value(Json::objectValue); - - Json::Value& module_config = policy_table["module_config"]; - module_config["preloaded_date"] = Json::Value(""); - module_config["exchange_after_x_ignition_cycles"] = Json::Value(10); - module_config["exchange_after_x_kilometers"] = Json::Value(100); - module_config["exchange_after_x_days"] = Json::Value(5); - module_config["timeout_after_x_seconds"] = Json::Value(500); - module_config["seconds_between_retries"] = Json::Value(Json::arrayValue); - module_config["seconds_between_retries"][0] = Json::Value(10); - module_config["seconds_between_retries"][1] = Json::Value(20); - module_config["seconds_between_retries"][2] = Json::Value(30); - module_config["endpoints"] = Json::Value(Json::objectValue); - module_config["endpoints"]["0x00"] = Json::Value(Json::objectValue); - module_config["endpoints"]["0x00"]["default"] = Json::Value(Json::arrayValue); - module_config["endpoints"]["0x00"]["default"][0] = - Json::Value("http://ford.com/cloud/default"); - module_config["notifications_per_minute_by_priority"] = - Json::Value(Json::objectValue); - module_config["notifications_per_minute_by_priority"]["emergency"] = - Json::Value(1); - module_config["notifications_per_minute_by_priority"]["navigation"] = - Json::Value(2); - module_config["notifications_per_minute_by_priority"]["VOICECOMM"] = - Json::Value(3); - module_config["notifications_per_minute_by_priority"]["communication"] = - Json::Value(4); - module_config["notifications_per_minute_by_priority"]["normal"] = - Json::Value(5); - module_config["notifications_per_minute_by_priority"]["none"] = - Json::Value(6); - module_config["subtle_notifications_per_minute_by_priority"] = - Json::Value(Json::objectValue); - module_config["subtle_notifications_per_minute_by_priority"]["emergency"] = - Json::Value(7); - module_config["subtle_notifications_per_minute_by_priority"]["navigation"] = - Json::Value(8); - module_config["subtle_notifications_per_minute_by_priority"]["VOICECOMM"] = - Json::Value(9); - module_config["subtle_notifications_per_minute_by_priority"] - ["communication"] = Json::Value(10); - module_config["subtle_notifications_per_minute_by_priority"]["normal"] = - Json::Value(11); - module_config["subtle_notifications_per_minute_by_priority"]["none"] = - Json::Value(12); - module_config["vehicle_make"] = Json::Value("MakeT"); - module_config["vehicle_model"] = Json::Value("ModelT"); - module_config["vehicle_year"] = Json::Value("2014"); - module_config["certificate"] = Json::Value("my_cert"); + ASSERT_TRUE(IsValid(update)); + EXPECT_TRUE(reps_->Save(update)); - Json::Value& functional_groupings = policy_table["functional_groupings"]; - functional_groupings["default"] = Json::Value(Json::objectValue); - Json::Value& default_group = functional_groupings["default"]; - default_group["rpcs"] = Json::Value(Json::objectValue); - default_group["rpcs"]["Update"] = Json::Value(Json::objectValue); - default_group["rpcs"]["Update"]["hmi_levels"] = Json::Value(Json::arrayValue); - default_group["rpcs"]["Update"]["hmi_levels"][0] = Json::Value("FULL"); - default_group["rpcs"]["Update"]["parameters"] = Json::Value(Json::arrayValue); - default_group["rpcs"]["Update"]["parameters"][0] = Json::Value("speed"); - - Json::Value& consumer_friendly_messages = - policy_table["consumer_friendly_messages"]; - consumer_friendly_messages["version"] = Json::Value("1.2"); - consumer_friendly_messages["messages"] = Json::Value(Json::objectValue); - consumer_friendly_messages["messages"]["MSG1"] = - Json::Value(Json::objectValue); - Json::Value& msg1 = consumer_friendly_messages["messages"]["MSG1"]; - msg1["languages"] = Json::Value(Json::objectValue); - msg1["languages"]["en-us"] = Json::Value(Json::objectValue); - msg1["languages"]["en-us"]["tts"] = Json::Value("TTS message"); - msg1["languages"]["en-us"]["label"] = Json::Value("LABEL message"); - msg1["languages"]["en-us"]["line1"] = Json::Value("LINE1 message"); - msg1["languages"]["en-us"]["line2"] = Json::Value("LINE2 message"); - msg1["languages"]["en-us"]["textBody"] = Json::Value("TEXTBODY message"); - - Json::Value& app_policies = policy_table["app_policies"]; - app_policies["default"] = Json::Value(Json::objectValue); - app_policies["default"]["memory_kb"] = Json::Value(50); - app_policies["default"]["heart_beat_timeout_ms"] = Json::Value(100); - app_policies["default"]["groups"] = Json::Value(Json::arrayValue); - app_policies["default"]["groups"][0] = Json::Value("default"); - app_policies["default"]["priority"] = Json::Value("EMERGENCY"); - app_policies["default"]["default_hmi"] = Json::Value("FULL"); - app_policies["default"]["keep_context"] = Json::Value(true); - app_policies["default"]["steal_focus"] = Json::Value(true); - app_policies["pre_DataConsent"] = Json::Value(Json::objectValue); - app_policies["pre_DataConsent"]["memory_kb"] = Json::Value(50); - app_policies["pre_DataConsent"]["heart_beat_timeout_ms"] = Json::Value(100); - app_policies["pre_DataConsent"]["groups"] = Json::Value(Json::arrayValue); - app_policies["pre_DataConsent"]["groups"][0] = Json::Value("default"); - app_policies["pre_DataConsent"]["priority"] = Json::Value("EMERGENCY"); - app_policies["pre_DataConsent"]["default_hmi"] = Json::Value("FULL"); - app_policies["pre_DataConsent"]["keep_context"] = Json::Value(true); - app_policies["pre_DataConsent"]["steal_focus"] = Json::Value(true); - app_policies["1234"] = Json::Value(Json::objectValue); - app_policies["1234"]["memory_kb"] = Json::Value(50); - app_policies["1234"]["heart_beat_timeout_ms"] = Json::Value(100); - app_policies["1234"]["groups"] = Json::Value(Json::arrayValue); - app_policies["1234"]["groups"][0] = Json::Value("default"); - app_policies["1234"]["priority"] = Json::Value("EMERGENCY"); - app_policies["1234"]["default_hmi"] = Json::Value("FULL"); - app_policies["1234"]["keep_context"] = Json::Value(true); - app_policies["1234"]["steal_focus"] = Json::Value(true); - app_policies["device"] = Json::Value(Json::objectValue); - app_policies["device"]["groups"] = Json::Value(Json::arrayValue); - app_policies["device"]["groups"][0] = Json::Value("default"); - app_policies["device"]["priority"] = Json::Value("EMERGENCY"); - app_policies["device"]["default_hmi"] = Json::Value("FULL"); - app_policies["device"]["keep_context"] = Json::Value(true); - app_policies["device"]["steal_focus"] = Json::Value(true); - - policy_table::Table update(&table); - update.SetPolicyTableType(rpc::policy_table_interface_base::PT_UPDATE); + std::shared_ptr<policy_table::Table> snapshot = reps_->GenerateSnapshot(); + + auto expected_module_meta = GetDefaultSnapshotModuleMeta(update); + auto& snapshot_module_meta = snapshot->policy_table.module_meta; + EXPECT_EQ(expected_module_meta.toStyledString(), + snapshot_module_meta.ToJsonValue().toStyledString()); +} + +TEST_F( + SQLPTExtRepresentationTest, + GenerateSnapshot_SetMandatoryMetaInfo_MandatoryMetaInfoIsPresentInSnapshot) { + policy_table::Table update = LoadPreloadedPT(kSdlPreloadedPtJson); - // Assert ASSERT_TRUE(IsValid(update)); ASSERT_TRUE(reps_->Save(update)); - // Act + EXPECT_TRUE( + reps_->SetMetaInfo(kSoftwareVersion, kWersCountryCode, kLanguage)); + std::shared_ptr<policy_table::Table> snapshot = reps_->GenerateSnapshot(); - snapshot->SetPolicyTableType(rpc::policy_table_interface_base::PT_SNAPSHOT); - policy_table["module_meta"] = Json::Value(Json::objectValue); - policy_table["usage_and_error_counts"] = Json::Value(Json::objectValue); - policy_table["device_data"] = Json::Value(Json::objectValue); - policy_table["module_config"]["preloaded_pt"] = Json::Value(false); + auto expected_module_meta = GetDefaultSnapshotModuleMeta(update); + expected_module_meta["ccpu_version"] = Json::Value(kSoftwareVersion); + expected_module_meta["language"] = Json::Value(kLanguage); + expected_module_meta["wers_country_code"] = Json::Value(kWersCountryCode); - Json::Value& module_meta = policy_table["module_meta"]; - module_meta["ccpu_version"] = Json::Value(""); - module_meta["language"] = Json::Value(""); - module_meta["wers_country_code"] = Json::Value(""); - module_meta["pt_exchanged_at_odometer_x"] = Json::Value(0); - module_meta["pt_exchanged_x_days_after_epoch"] = Json::Value(0); - module_meta["ignition_cycles_since_last_exchange"] = Json::Value(0); - module_meta["vin"] = Json::Value(""); + auto& snapshot_module_meta = snapshot->policy_table.module_meta; + EXPECT_EQ(expected_module_meta.toStyledString(), + snapshot_module_meta.ToJsonValue().toStyledString()); +} - Json::Value& usage_and_error_counts = policy_table["usage_and_error_counts"]; - usage_and_error_counts["count_of_iap_buffer_full"] = Json::Value(0); - usage_and_error_counts["count_sync_out_of_memory"] = Json::Value(0); - usage_and_error_counts["count_of_sync_reboots"] = Json::Value(0); +TEST_F(SQLPTExtRepresentationTest, + GenerateSnapshot_SetHardwareVersion_HardwareVersionIsPresentInSnapshot) { + policy_table::Table update = LoadPreloadedPT(kSdlPreloadedPtJson); - policy_table::Table expected(&table); + ASSERT_TRUE(IsValid(update)); + EXPECT_TRUE(reps_->Save(update)); - // Assert - EXPECT_EQ(expected.ToJsonValue().toStyledString(), - snapshot->ToJsonValue().toStyledString()); + reps_->SetHardwareVersion(kHardwareVersion); + std::shared_ptr<policy_table::Table> snapshot = reps_->GenerateSnapshot(); + + auto expected_module_meta = GetDefaultSnapshotModuleMeta(update); + expected_module_meta["hardware_version"] = Json::Value(kHardwareVersion); + + auto& snapshot_module_meta = snapshot->policy_table.module_meta; + EXPECT_EQ(expected_module_meta.toStyledString(), + snapshot_module_meta.ToJsonValue().toStyledString()); +} + +TEST_F(SQLPTExtRepresentationTest, Save_ParametersPresent_ParametersSaved) { + policy_table::Table update = LoadPreloadedPT(kSdlPreloadedPtJson); + ASSERT_TRUE(IsValid(update)); + + policy_table::FunctionalGroupings func_groups; + ASSERT_TRUE(reps_->GetFunctionalGroupings(func_groups)); + EXPECT_TRUE(func_groups.empty()); + + EXPECT_TRUE(reps_->Save(update)); + ASSERT_TRUE(reps_->GetFunctionalGroupings(func_groups)); + + policy_table::FunctionalGroupings::iterator func_groups_iter = + func_groups.find(kFunctionalGroupWithParams); + ASSERT_TRUE(func_groups.end() != func_groups_iter); + policy_table::Rpcs& rpcs = func_groups_iter->second; + EXPECT_EQ(kUserConsentForGroupWithParams, + static_cast<std::string>(*rpcs.user_consent_prompt)); + policy_table::Rpc& rpc = rpcs.rpcs; + policy_table::Rpc::const_iterator rpc_iter = rpc.find(kRpcForGroupWithParams); + EXPECT_TRUE(rpc.end() != rpc_iter); + const ::policy_table::Parameters& parameters = *(rpc_iter->second.parameters); + EXPECT_TRUE(!parameters.empty()); +} + +TEST_F(SQLPTExtRepresentationTest, Save_NoParameters_NoParametersSaved) { + policy_table::Table update = LoadPreloadedPT(kSdlPreloadedPtJson); + ASSERT_TRUE(IsValid(update)); + + policy_table::FunctionalGroupings func_groups; + ASSERT_TRUE(reps_->GetFunctionalGroupings(func_groups)); + EXPECT_TRUE(func_groups.empty()); + + EXPECT_TRUE(reps_->Save(update)); + ASSERT_TRUE(reps_->GetFunctionalGroupings(func_groups)); + + const std::string func_group_without_params = "Notifications"; + const std::string user_consent = "Notifications"; + const std::string rpc_without_params = "Alert"; + + policy_table::FunctionalGroupings::iterator func_groups_iter = + func_groups.find(func_group_without_params); + ASSERT_TRUE(func_groups.end() != func_groups_iter); + policy_table::Rpcs& rpcs = func_groups_iter->second; + EXPECT_EQ(user_consent, static_cast<std::string>(*rpcs.user_consent_prompt)); + policy_table::Rpc& rpc = rpcs.rpcs; + EXPECT_EQ(1u, rpc.size()); + policy_table::Rpc::const_iterator rpc_iter = rpc.find(rpc_without_params); + EXPECT_TRUE(rpc.end() != rpc_iter); + // Check parameters + const ::policy_table::Parameters& parameters = *(rpc_iter->second.parameters); + EXPECT_FALSE(parameters.is_initialized()); + EXPECT_TRUE(parameters.empty()); +} + +TEST_F(SQLPTExtRepresentationTest, Save_EmptyParameters_ParametersEmpty) { + policy_table::Table update = LoadPreloadedPT(kSdlPreloadedPtJson); + ASSERT_TRUE(IsValid(update)); + + policy_table::FunctionalGroupings func_groups; + EXPECT_TRUE(reps_->GetFunctionalGroupings(func_groups)); + EXPECT_TRUE(func_groups.empty()); + + auto json_update = update.ToJsonValue(); + json_update["policy_table"]["functional_groupings"] + [kFunctionalGroupWithParams]["rpcs"][kRpcForGroupWithParams] + ["parameters"] = Json::Value(Json::arrayValue); + policy_table::Table update_with_empty_param(&json_update); + + EXPECT_TRUE(reps_->Save(update_with_empty_param)); + EXPECT_TRUE(reps_->GetFunctionalGroupings(func_groups)); + + policy_table::FunctionalGroupings::iterator func_groups_iter = + func_groups.find(kFunctionalGroupWithParams); + ASSERT_TRUE(func_groups.end() != func_groups_iter); + policy_table::Rpcs& rpcs = func_groups_iter->second; + EXPECT_EQ(kUserConsentForGroupWithParams, + static_cast<std::string>(*rpcs.user_consent_prompt)); + policy_table::Rpc& rpc = rpcs.rpcs; + policy_table::Rpc::const_iterator rpc_iter = rpc.find(kRpcForGroupWithParams); + EXPECT_TRUE(rpc.end() != rpc_iter); + // Check parameters + const ::policy_table::Parameters& parameters = *(rpc_iter->second.parameters); + // 'parameters' : [] - represented as initialized, but empty + // missing 'parameters' - represented as non-initialized and empty + EXPECT_TRUE(parameters.is_initialized()); + EXPECT_TRUE(parameters.empty()); } TEST_F( @@ -1159,7 +1183,8 @@ TEST_F( TEST_F(SQLPTExtRepresentationTest, SetMetaInfo_SetMetaInfo_ExpectValuesSetInParams) { // Arrange - ASSERT_TRUE(reps_->SetMetaInfo("4.1.3.B_EB355B", "WAEGB", "ru-ru")); + ASSERT_TRUE( + reps_->SetMetaInfo(kSoftwareVersion, kWersCountryCode, kLanguage)); utils::dbms::SQLQuery query(reps_->db()); const std::string query_select_ccpu = "SELECT `ccpu_version` FROM `module_meta`"; @@ -1171,13 +1196,13 @@ TEST_F(SQLPTExtRepresentationTest, // Assert query.Prepare(query_select_ccpu); query.Next(); - EXPECT_EQ("4.1.3.B_EB355B", query.GetString(0)); + EXPECT_EQ(kSoftwareVersion, query.GetString(0)); query.Prepare(query_select_wers_country_code); query.Next(); - EXPECT_EQ("WAEGB", query.GetString(0)); + EXPECT_EQ(kWersCountryCode, query.GetString(0)); query.Prepare(query_select_language); query.Next(); - EXPECT_EQ("ru-ru", query.GetString(0)); + EXPECT_EQ(kLanguage, query.GetString(0)); } TEST_F(SQLPTExtRepresentationTest, @@ -1203,6 +1228,17 @@ TEST_F(SQLPTExtRepresentationTest, EXPECT_EQ("ru-ru", query.GetString(0)); } +TEST_F(SQLPTExtRepresentationTest, SetHardwareVersion_ValueIsSetInModuleMeta) { + utils::dbms::SQLQuery query(reps_->db()); + reps_->SetHardwareVersion(kHardwareVersion); + const std::string query_select_hardware_version = + "SELECT `hardware_version` FROM `module_meta`"; + + query.Prepare(query_select_hardware_version); + query.Next(); + EXPECT_EQ(kHardwareVersion, query.GetString(0)); +} + TEST_F( SQLPTExtRepresentationTest, GetFunctionalGroupNames_SetGroupsManuallyThenGetGroupNames_ExpectAllGroupsReceived) { diff --git a/src/components/policy/policy_external/test/sql_pt_representation_test.cc b/src/components/policy/policy_external/test/sql_pt_representation_test.cc index 224c663c52..1adf9ae7c6 100644 --- a/src/components/policy/policy_external/test/sql_pt_representation_test.cc +++ b/src/components/policy/policy_external/test/sql_pt_representation_test.cc @@ -188,150 +188,6 @@ class SQLPTRepresentationTest : public SQLPTRepresentation, StringsCompare(groups, app_groups); } - void PolicyTableUpdatePrepare(Json::Value& table) { - PolicyTableUpdatePrepareNoParameters(table); - - table["policy_table"]["functional_groupings"]["default"]["rpcs"]["Update"] - ["parameters"] = Json::Value(Json::arrayValue); - table["policy_table"]["functional_groupings"]["default"]["rpcs"]["Update"] - ["parameters"][0] = Json::Value("speed"); - } - - void PolicyTableUpdatePrepareEmptyParameters(Json::Value& table) { - PolicyTableUpdatePrepareNoParameters(table); - - // Parameters are empty - table["policy_table"]["functional_groupings"]["default"]["rpcs"]["Update"] - ["parameters"] = Json::Value(Json::arrayValue); - } - - void PolicyTableUpdatePrepareNoParameters(Json::Value& table) { - table["policy_table"] = Json::Value(Json::objectValue); - Json::Value& policy_table = table["policy_table"]; - policy_table["module_config"] = Json::Value(Json::objectValue); - policy_table["functional_groupings"] = Json::Value(Json::objectValue); - policy_table["consumer_friendly_messages"] = Json::Value(Json::objectValue); - policy_table["app_policies"] = Json::Value(Json::objectValue); - - Json::Value& module_config = policy_table["module_config"]; - module_config["preloaded_date"] = Json::Value("25-04-2015"); - module_config["exchange_after_x_ignition_cycles"] = Json::Value(10); - module_config["exchange_after_x_kilometers"] = Json::Value(100); - module_config["exchange_after_x_days"] = Json::Value(5); - module_config["timeout_after_x_seconds"] = Json::Value(500); - module_config["seconds_between_retries"] = Json::Value(Json::arrayValue); - Json::Value& seconds_between_retries = - module_config["seconds_between_retries"]; - seconds_between_retries[0] = Json::Value(10); - seconds_between_retries[1] = Json::Value(20); - seconds_between_retries[2] = Json::Value(30); - module_config["endpoints"] = Json::Value(Json::objectValue); - Json::Value& endpoins = module_config["endpoints"]; - endpoins["0x00"] = Json::Value(Json::objectValue); - endpoins["0x00"]["default"] = Json::Value(Json::arrayValue); - endpoins["0x00"]["default"][0] = - Json::Value("http://ford.com/cloud/default"); - module_config["notifications_per_minute_by_priority"] = - Json::Value(Json::objectValue); - module_config["notifications_per_minute_by_priority"]["emergency"] = - Json::Value(1); - module_config["notifications_per_minute_by_priority"]["navigation"] = - Json::Value(2); - module_config["notifications_per_minute_by_priority"]["VOICECOMM"] = - Json::Value(3); - module_config["notifications_per_minute_by_priority"]["communication"] = - Json::Value(4); - module_config["notifications_per_minute_by_priority"]["normal"] = - Json::Value(5); - module_config["notifications_per_minute_by_priority"]["none"] = - Json::Value(6); - module_config["subtle_notifications_per_minute_by_priority"] = - Json::Value(Json::objectValue); - module_config["subtle_notifications_per_minute_by_priority"]["emergency"] = - Json::Value(7); - module_config["subtle_notifications_per_minute_by_priority"]["navigation"] = - Json::Value(8); - module_config["subtle_notifications_per_minute_by_priority"]["VOICECOMM"] = - Json::Value(9); - module_config["subtle_notifications_per_minute_by_priority"] - ["communication"] = Json::Value(10); - module_config["subtle_notifications_per_minute_by_priority"]["normal"] = - Json::Value(11); - module_config["subtle_notifications_per_minute_by_priority"]["none"] = - Json::Value(12); - module_config["vehicle_make"] = Json::Value("MakeT"); - module_config["vehicle_model"] = Json::Value("ModelT"); - module_config["vehicle_year"] = Json::Value("2014"); - module_config["certificate"] = Json::Value("my_cert"); - - Json::Value& functional_groupings = policy_table["functional_groupings"]; - functional_groupings["default"] = Json::Value(Json::objectValue); - Json::Value& default_group = functional_groupings["default"]; - default_group["rpcs"] = Json::Value(Json::objectValue); - default_group["rpcs"]["Update"] = Json::Value(Json::objectValue); - default_group["rpcs"]["Update"]["hmi_levels"] = - Json::Value(Json::arrayValue); - default_group["rpcs"]["Update"]["hmi_levels"][0] = Json::Value("FULL"); - // No parameters - - Json::Value& consumer_friendly_messages = - policy_table["consumer_friendly_messages"]; - consumer_friendly_messages["version"] = Json::Value("1.2"); - consumer_friendly_messages["messages"] = Json::Value(Json::objectValue); - consumer_friendly_messages["messages"]["MSG1"] = - Json::Value(Json::objectValue); - Json::Value& msg1 = consumer_friendly_messages["messages"]["MSG1"]; - msg1["languages"] = Json::Value(Json::objectValue); - msg1["languages"]["en-us"] = Json::Value(Json::objectValue); - msg1["languages"]["en-us"]["tts"] = Json::Value("TTS message"); - msg1["languages"]["en-us"]["label"] = Json::Value("LABEL message"); - msg1["languages"]["en-us"]["line1"] = Json::Value("LINE1 message"); - msg1["languages"]["en-us"]["line2"] = Json::Value("LINE2 message"); - msg1["languages"]["en-us"]["textBody"] = Json::Value("TEXTBODY message"); - - Json::Value& app_policies = policy_table["app_policies"]; - app_policies["default"] = Json::Value(Json::objectValue); - app_policies["default"]["priority"] = Json::Value("EMERGENCY"); - app_policies["default"]["memory_kb"] = Json::Value(50); - app_policies["default"]["heart_beat_timeout_ms"] = Json::Value(100); - app_policies["default"]["groups"] = Json::Value(Json::arrayValue); - app_policies["default"]["groups"][0] = Json::Value("default"); - app_policies["default"]["priority"] = Json::Value("EMERGENCY"); - app_policies["default"]["is_revoked"] = Json::Value(true); - app_policies["default"]["default_hmi"] = Json::Value("FULL"); - app_policies["default"]["keep_context"] = Json::Value(true); - app_policies["default"]["steal_focus"] = Json::Value(true); - - app_policies["pre_DataConsent"] = Json::Value(Json::objectValue); - app_policies["pre_DataConsent"]["memory_kb"] = Json::Value(40); - app_policies["pre_DataConsent"]["heart_beat_timeout_ms"] = Json::Value(90); - app_policies["pre_DataConsent"]["groups"] = Json::Value(Json::arrayValue); - app_policies["pre_DataConsent"]["groups"][0] = Json::Value("default"); - app_policies["pre_DataConsent"]["priority"] = Json::Value("EMERGENCY"); - app_policies["pre_DataConsent"]["default_hmi"] = Json::Value("FULL"); - app_policies["pre_DataConsent"]["is_revoked"] = Json::Value(false); - app_policies["pre_DataConsent"]["keep_context"] = Json::Value(true); - app_policies["pre_DataConsent"]["steal_focus"] = Json::Value(true); - app_policies["1234"] = Json::Value(Json::objectValue); - app_policies["1234"]["memory_kb"] = Json::Value(150); - app_policies["1234"]["heart_beat_timeout_ms"] = Json::Value(200); - app_policies["1234"]["groups"] = Json::Value(Json::arrayValue); - app_policies["1234"]["groups"][0] = Json::Value("default"); - app_policies["1234"]["priority"] = Json::Value("EMERGENCY"); - app_policies["1234"]["default_hmi"] = Json::Value("FULL"); - app_policies["1234"]["is_revoked"] = Json::Value(true); - app_policies["1234"]["keep_context"] = Json::Value(false); - app_policies["1234"]["steal_focus"] = Json::Value(false); - app_policies["device"] = Json::Value(Json::objectValue); - app_policies["device"]["groups"] = Json::Value(Json::arrayValue); - app_policies["device"]["groups"][0] = Json::Value("default"); - app_policies["device"]["priority"] = Json::Value("EMERGENCY"); - app_policies["device"]["is_revoked"] = Json::Value(true); - app_policies["device"]["default_hmi"] = Json::Value("FULL"); - app_policies["device"]["keep_context"] = Json::Value(true); - app_policies["device"]["steal_focus"] = Json::Value(true); - } - ::testing::AssertionResult IsValid(const policy_table::Table& table) { if (table.is_valid()) { return ::testing::AssertionSuccess(); @@ -1633,304 +1489,6 @@ TEST(SQLPTRepresentationTest3, RemoveDB_RemoveDB_ExpectFileDeleted) { EXPECT_FALSE(file_system::FileExists(path)); } -TEST_F(SQLPTRepresentationTest, - DISABLED_GenerateSnapshot_SetPolicyTable_SnapshotIsPresent) { - // TODO(AKutsan):APPLINK-31526 Test requires initial preloaded pt for - // preloaded date reading - // Arrange - Json::Value table(Json::objectValue); - PolicyTableUpdatePrepare(table); - - policy_table::Table update(&table); - update.SetPolicyTableType(rpc::policy_table_interface_base::PT_UPDATE); - - // Assert - ASSERT_TRUE(IsValid(update)); - ASSERT_TRUE(reps->Save(update)); - - // Act - std::shared_ptr<policy_table::Table> snapshot = reps->GenerateSnapshot(); - snapshot->SetPolicyTableType(rpc::policy_table_interface_base::PT_SNAPSHOT); - // Remove fields which must be absent in snapshot - table["policy_table"]["consumer_friendly_messages"].removeMember("messages"); - table["policy_table"]["app_policies"]["1234"].removeMember("default_hmi"); - table["policy_table"]["app_policies"]["1234"].removeMember("keep_context"); - table["policy_table"]["app_policies"]["1234"].removeMember("steal_focus"); - table["policy_table"]["app_policies"]["default"].removeMember("default_hmi"); - table["policy_table"]["app_policies"]["default"].removeMember("keep_context"); - table["policy_table"]["app_policies"]["default"].removeMember("steal_focus"); - table["policy_table"]["app_policies"]["pre_DataConsent"].removeMember( - "default_hmi"); - table["policy_table"]["app_policies"]["pre_DataConsent"].removeMember( - "keep_context"); - table["policy_table"]["app_policies"]["pre_DataConsent"].removeMember( - "steal_focus"); - table["policy_table"]["app_policies"]["device"].removeMember("default_hmi"); - table["policy_table"]["app_policies"]["device"].removeMember("keep_context"); - table["policy_table"]["app_policies"]["device"].removeMember("steal_focus"); - table["policy_table"]["app_policies"]["device"].removeMember("groups"); - table["policy_table"]["device_data"] = Json::Value(Json::objectValue); - table["policy_table"]["module_meta"] = Json::Value(Json::objectValue); - table["policy_table"]["module_config"]["preloaded_pt"] = Json::Value(false); - policy_table::Table expected(&table); - Json::StreamWriterBuilder writer_builder; - // Checks - Json::Value snapshot_json_value = snapshot->ToJsonValue(); - EXPECT_EQ(Json::writeString(writer_builder, expected.ToJsonValue()), - Json::writeString(writer_builder, snapshot_json_value)); - std::cout << Json::writeString(writer_builder, snapshot_json_value) - << std::endl; - EXPECT_EQ(expected.ToJsonValue().toStyledString(), - snapshot_json_value.toStyledString()); -} - -TEST_F(SQLPTRepresentationTest, - DISABLED_Save_SetPolicyTableThenSave_ExpectSavedToPT) { - // TODO(AKutsan): APPLINK-31526 Test requires initial preloaded pt for - // preloaded date reading - // Arrange - Json::Value table(Json::objectValue); - PolicyTableUpdatePrepare(table); - - policy_table::Table update(&table); - update.SetPolicyTableType(rpc::policy_table_interface_base::PT_UPDATE); - // Checks PT before Save - policy_table::FunctionalGroupings func_groups; - ASSERT_TRUE(reps->GetFunctionalGroupings(func_groups)); - // Check functional groupings section - EXPECT_EQ(0u, func_groups.size()); - - policy_table::ApplicationPoliciesSection policies; - GatherApplicationPoliciesSection(&policies); - // Check ApplicationPoliciesSection - EXPECT_EQ(0u, policies.apps.size()); - EXPECT_EQ(0u, (policies.device.preconsented_groups)->size()); - EXPECT_EQ(0u, policies.device.groups.size()); - EXPECT_EQ(policy_table::Priority::P_EMERGENCY, policies.device.priority); - EXPECT_EQ(policy_table::HmiLevel::HL_BACKGROUND, policies.device.default_hmi); - EXPECT_FALSE(policies.device.keep_context); - EXPECT_FALSE(policies.device.steal_focus); - - policy_table::ModuleConfig config; - GatherModuleConfig(&config); - // Check Module config section - EXPECT_TRUE(*config.preloaded_pt); - EXPECT_EQ(0, config.exchange_after_x_ignition_cycles); - EXPECT_EQ(0, config.exchange_after_x_kilometers); - EXPECT_EQ(0, config.exchange_after_x_days); - EXPECT_EQ(0, config.timeout_after_x_seconds); - EXPECT_EQ("", static_cast<std::string>(*config.vehicle_make)); - EXPECT_EQ("", static_cast<std::string>(*config.vehicle_model)); - EXPECT_EQ("", static_cast<std::string>(*config.vehicle_year)); - EXPECT_EQ("", static_cast<std::string>(*config.preloaded_date)); - EXPECT_EQ("", static_cast<std::string>(*config.certificate)); - EXPECT_EQ(0u, config.seconds_between_retries.size()); - EXPECT_EQ(0u, config.endpoints.size()); - EXPECT_EQ(0u, config.notifications_per_minute_by_priority.size()); - EXPECT_EQ(0u, (*config.subtle_notifications_per_minute_by_priority).size()); - - policy_table::ConsumerFriendlyMessages messages; - GatherConsumerFriendlyMessages(&messages); - EXPECT_EQ("0", static_cast<std::string>(messages.version)); - policy_table::DeviceData devices; - GatherDeviceData(&devices); - EXPECT_EQ(0u, devices.size()); - policy_table::UsageAndErrorCounts counts; - GatherUsageAndErrorCounts(&counts); - EXPECT_EQ(0u, counts.app_level->size()); - ASSERT_TRUE(IsValid(update)); - // Act - ASSERT_TRUE(reps->Save(update)); - - // Check Functional Groupings - ASSERT_TRUE(reps->GetFunctionalGroupings(func_groups)); - // Checks - EXPECT_EQ(1u, func_groups.size()); - policy_table::FunctionalGroupings::iterator func_groups_iter = - func_groups.find("default"); - ASSERT_TRUE(func_groups.end() != func_groups_iter); - policy_table::Rpcs& rpcs = func_groups_iter->second; - EXPECT_EQ("", static_cast<std::string>(*rpcs.user_consent_prompt)); - policy_table::Rpc& rpc = rpcs.rpcs; - EXPECT_EQ(1u, rpc.size()); - policy_table::Rpc::const_iterator rpc_iter = rpc.find("Update"); - EXPECT_TRUE(rpc.end() != rpc_iter); - const policy_table::HmiLevels& hmi_levels = rpc_iter->second.hmi_levels; - EXPECT_EQ(1u, hmi_levels.size()); - EXPECT_TRUE(hmi_levels.end() != std::find(hmi_levels.begin(), - hmi_levels.end(), - policy_table::HmiLevel::HL_FULL)); - - const ::policy_table::Parameters& parameters = *(rpc_iter->second.parameters); - EXPECT_EQ(1u, parameters.size()); - EXPECT_TRUE(parameters.end() != - std::find(parameters.begin(), parameters.end(), "P_SPEED")); - // Check Application Policies Section - GatherApplicationPoliciesSection(&policies); - const uint32_t apps_size = 3u; - - rpc::String<1ul, 255ul> str("default"); - policy_table::Strings groups; - groups.push_back(str); - CheckAppPoliciesSection(policies, - apps_size, - policy_table::Priority::P_EMERGENCY, - "1234", - 150u, - 200u, - groups); - CheckAppPoliciesSection(policies, - apps_size, - policy_table::Priority::P_EMERGENCY, - "default", - 50u, - 100u, - groups); - CheckAppPoliciesSection(policies, - apps_size, - policy_table::Priority::P_EMERGENCY, - "pre_DataConsent", - 40u, - 90u, - groups); - CheckAppPoliciesSection(policies, - apps_size, - policy_table::Priority::P_EMERGENCY, - "device", - 0u, - 0u, - groups); - EXPECT_EQ(0u, (policies.device.preconsented_groups)->size()); - EXPECT_EQ(0u, policies.device.groups.size()); - EXPECT_EQ(policy_table::HmiLevel::HL_BACKGROUND, policies.device.default_hmi); - EXPECT_FALSE(policies.device.keep_context); - EXPECT_FALSE(policies.device.steal_focus); - - CheckAppGroups("1234", groups); - CheckAppGroups("default", groups); - CheckAppGroups("pre_DataConsent", groups); - CheckAppGroups("device", groups); - - GatherModuleConfig(&config); - // Check Module Config section - ASSERT_FALSE(*config.preloaded_pt); - ASSERT_EQ("my_cert", static_cast<std::string>(*config.certificate)); - ASSERT_EQ("25-04-2015", static_cast<std::string>(*config.preloaded_date)); - ASSERT_EQ("2014", static_cast<std::string>(*config.vehicle_year)); - ASSERT_EQ("ModelT", static_cast<std::string>(*config.vehicle_model)); - ASSERT_EQ("MakeT", static_cast<std::string>(*config.vehicle_make)); - ASSERT_EQ(10, config.exchange_after_x_ignition_cycles); - ASSERT_EQ(100, config.exchange_after_x_kilometers); - ASSERT_EQ(5, config.exchange_after_x_days); - ASSERT_EQ(500, config.timeout_after_x_seconds); - ASSERT_EQ(3u, config.seconds_between_retries.size()); - ASSERT_EQ(10, config.seconds_between_retries[0]); - ASSERT_EQ(20, config.seconds_between_retries[1]); - ASSERT_EQ(30, config.seconds_between_retries[2]); - ASSERT_EQ(6u, config.notifications_per_minute_by_priority.size()); - ASSERT_EQ(1, config.notifications_per_minute_by_priority["emergency"]); - ASSERT_EQ(2, config.notifications_per_minute_by_priority["navigation"]); - ASSERT_EQ(3, config.notifications_per_minute_by_priority["VOICECOMM"]); - ASSERT_EQ(4, config.notifications_per_minute_by_priority["communication"]); - ASSERT_EQ(5, config.notifications_per_minute_by_priority["normal"]); - ASSERT_EQ(6, config.notifications_per_minute_by_priority["none"]); - ASSERT_EQ(6u, (*config.subtle_notifications_per_minute_by_priority).size()); - ASSERT_EQ(7, - (*config.subtle_notifications_per_minute_by_priority)["emergency"]); - ASSERT_EQ( - 8, (*config.subtle_notifications_per_minute_by_priority)["navigation"]); - ASSERT_EQ(9, - (*config.subtle_notifications_per_minute_by_priority)["VOICECOMM"]); - ASSERT_EQ( - 10, - (*config.subtle_notifications_per_minute_by_priority)["communication"]); - ASSERT_EQ(11, - (*config.subtle_notifications_per_minute_by_priority)["normal"]); - ASSERT_EQ(12, (*config.subtle_notifications_per_minute_by_priority)["none"]); - EXPECT_EQ(1u, config.endpoints.size()); - policy_table::ServiceEndpoints& service_endpoints = config.endpoints; - EXPECT_EQ("0x00", service_endpoints.begin()->first); - policy_table::URLList& url_list = service_endpoints.begin()->second; - EXPECT_EQ("default", url_list.begin()->first); - policy_table::URL& url = url_list.begin()->second; - EXPECT_EQ("http://ford.com/cloud/default", static_cast<std::string>(url[0])); - GatherConsumerFriendlyMessages(&messages); - EXPECT_EQ("1.2", static_cast<std::string>(messages.version)); -} - -TEST_F(SQLPTRepresentationTest, - Save_SavePolicyTable_EmptyParameters_ParametersEMPTY) { - // Arrange - Json::Value table(Json::objectValue); - PolicyTableUpdatePrepareEmptyParameters(table); - - policy_table::Table update(&table); - update.SetPolicyTableType(rpc::policy_table_interface_base::PT_UPDATE); - // Checks PT before Save - policy_table::FunctionalGroupings func_groups; - ASSERT_TRUE(reps->GetFunctionalGroupings(func_groups)); - // Check functional groupings section - EXPECT_EQ(0u, func_groups.size()); - - // Act - ASSERT_TRUE(reps->Save(update)); - - // Check Functional Groupings - ASSERT_TRUE(reps->GetFunctionalGroupings(func_groups)); - // Checks - EXPECT_EQ(1u, func_groups.size()); - policy_table::FunctionalGroupings::iterator func_groups_iter = - func_groups.find("default"); - ASSERT_TRUE(func_groups.end() != func_groups_iter); - policy_table::Rpcs& rpcs = func_groups_iter->second; - EXPECT_EQ("", static_cast<std::string>(*rpcs.user_consent_prompt)); - policy_table::Rpc& rpc = rpcs.rpcs; - EXPECT_EQ(1u, rpc.size()); - policy_table::Rpc::const_iterator rpc_iter = rpc.find("Update"); - EXPECT_TRUE(rpc.end() != rpc_iter); - // Check parameters - const ::policy_table::Parameters& parameters = *(rpc_iter->second.parameters); - // 'parameters' : [] - represented as initialized, but empty - // missing 'parameters' - represented as non-initialized and empty - EXPECT_TRUE(parameters.is_initialized()); - EXPECT_TRUE(parameters.empty()); -} - -TEST_F(SQLPTRepresentationTest, - Save_SavePolicyTable_NoParameters_NoParametersSaved) { - // Arrange - Json::Value table(Json::objectValue); - PolicyTableUpdatePrepareNoParameters(table); - - policy_table::Table update(&table); - update.SetPolicyTableType(rpc::policy_table_interface_base::PT_UPDATE); - // Checks PT before Save - policy_table::FunctionalGroupings func_groups; - ASSERT_TRUE(reps->GetFunctionalGroupings(func_groups)); - // Check functional groupings section - EXPECT_EQ(0u, func_groups.size()); - - // Act - ASSERT_TRUE(reps->Save(update)); - - // Check Functional Groupings - ASSERT_TRUE(reps->GetFunctionalGroupings(func_groups)); - // Checks - EXPECT_EQ(1u, func_groups.size()); - policy_table::FunctionalGroupings::iterator func_groups_iter = - func_groups.find("default"); - ASSERT_TRUE(func_groups.end() != func_groups_iter); - policy_table::Rpcs& rpcs = func_groups_iter->second; - EXPECT_EQ("", static_cast<std::string>(*rpcs.user_consent_prompt)); - policy_table::Rpc& rpc = rpcs.rpcs; - EXPECT_EQ(1u, rpc.size()); - policy_table::Rpc::const_iterator rpc_iter = rpc.find("Update"); - EXPECT_TRUE(rpc.end() != rpc_iter); - // Check parameters - const ::policy_table::Parameters& parameters = *(rpc_iter->second.parameters); - EXPECT_EQ(0u, parameters.size()); -} - } // namespace policy_test } // namespace components } // namespace test diff --git a/src/components/policy/policy_regular/include/policy/cache_manager.h b/src/components/policy/policy_regular/include/policy/cache_manager.h index 25b4a8bc18..473caef145 100644 --- a/src/components/policy/policy_regular/include/policy/cache_manager.h +++ b/src/components/policy/policy_regular/include/policy/cache_manager.h @@ -544,13 +544,11 @@ class CacheManager : public CacheManagerInterface { */ void SetPreloadedPtFlag(const bool is_preloaded) OVERRIDE; - /** - * @brief Records information about head unit system to PT - * @return bool Success of operation - */ bool SetMetaInfo(const std::string& ccpu_version, const std::string& wers_country_code, - const std::string& language); + const std::string& language) OVERRIDE; + + void SetHardwareVersion(const std::string& hardware_version) OVERRIDE; /** * @brief Get information about last ccpu_version from PT @@ -558,6 +556,8 @@ class CacheManager : public CacheManagerInterface { */ std::string GetCCPUVersionFromPT() const; + std::string GetHardwareVersionFromPT() const OVERRIDE; + /** * @brief Checks, if specific head unit is present in PT * @return boot Suceess, if present, otherwise - false diff --git a/src/components/policy/policy_regular/include/policy/cache_manager_interface.h b/src/components/policy/policy_regular/include/policy/cache_manager_interface.h index 14130c0316..5e536ef315 100644 --- a/src/components/policy/policy_regular/include/policy/cache_manager_interface.h +++ b/src/components/policy/policy_regular/include/policy/cache_manager_interface.h @@ -586,7 +586,7 @@ class CacheManagerInterface { virtual void SetPreloadedPtFlag(const bool is_preloaded) = 0; /** - * @brief Records information about head unit system to PT + * @brief Records mandatory information about head unit system to PT * @return bool Success of operation */ virtual bool SetMetaInfo(const std::string& ccpu_version, @@ -594,12 +594,24 @@ class CacheManagerInterface { const std::string& language) = 0; /** + * @brief Records information about hardware version to PT + * @param hardware_version Hardware version + */ + virtual void SetHardwareVersion(const std::string& hardware_version) = 0; + + /** * @brief Get information about last ccpu_version from PT * @return ccpu_version from PT */ virtual std::string GetCCPUVersionFromPT() const = 0; /** + * @brief Get information about last hardware version from PT + * @return string representation of hardware version from PT, empty if absent + */ + virtual std::string GetHardwareVersionFromPT() const = 0; + + /** * @brief Checks, if specific head unit is present in PT * @return boot Suceess, if present, otherwise - false */ 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 dff4802d82..32c546df62 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 @@ -451,10 +451,14 @@ class PolicyManagerImpl : public PolicyManager { const std::string& wers_country_code, const std::string& language) OVERRIDE; + void SetHardwareVersion(const std::string& hardware_version) OVERRIDE; + void SetPreloadedPtFlag(const bool is_preloaded) OVERRIDE; std::string GetCCPUVersionFromPT() const OVERRIDE; + std::string GetHardwareVersionFromPT() const OVERRIDE; + /** * @brief Get number of notification by priority * @param priority Specified priority diff --git a/src/components/policy/policy_regular/include/policy/policy_table/types.h b/src/components/policy/policy_regular/include/policy/policy_table/types.h index 673f17e32b..7eeb41f064 100644 --- a/src/components/policy/policy_regular/include/policy/policy_table/types.h +++ b/src/components/policy/policy_regular/include/policy/policy_table/types.h @@ -430,6 +430,7 @@ struct ModuleMeta : CompositeType { Optional<Integer<uint16_t, 0, 65535> > pt_exchanged_x_days_after_epoch; Optional<Integer<uint16_t, 0, 65535> > ignition_cycles_since_last_exchange; Optional<String<0, 500> > ccpu_version; + Optional<String<0, 500> > hardware_version; public: ModuleMeta(); diff --git a/src/components/policy/policy_regular/include/policy/policy_types.h b/src/components/policy/policy_regular/include/policy/policy_types.h index 7f95d9132b..fe54da6b18 100644 --- a/src/components/policy/policy_regular/include/policy/policy_types.h +++ b/src/components/policy/policy_regular/include/policy/policy_types.h @@ -280,6 +280,7 @@ struct AppPermissions { , appRevoked(false) , appPermissionsConsentNeeded(false) , appUnauthorized(false) + , isSDLAllowed(false) , requestTypeChanged(false) , requestSubTypeChanged(false) {} diff --git a/src/components/policy/policy_regular/include/policy/pt_representation.h b/src/components/policy/policy_regular/include/policy/pt_representation.h index 895b4ea6b5..9a57ed21ad 100644 --- a/src/components/policy/policy_regular/include/policy/pt_representation.h +++ b/src/components/policy/policy_regular/include/policy/pt_representation.h @@ -152,12 +152,18 @@ class PTRepresentation { virtual EndpointUrls GetUpdateUrls(int service_type) = 0; /** - * @brief Records information about head unit system to PT + * @brief Records mandatory information about head unit system to PT * @return bool Success of operation */ virtual bool SetMetaInfo(const std::string& ccpu_version) = 0; /** + * @brief Records information about hardware version to PT + * @param hardware_version Hardware version + */ + virtual void SetHardwareVersion(const std::string& hardware_version) = 0; + + /** * @brief Get allowed number of notifications * depending on application priority. * @param priority Priority of application diff --git a/src/components/policy/policy_regular/include/policy/sql_pt_queries.h b/src/components/policy/policy_regular/include/policy/sql_pt_queries.h index 5bf85a4bb5..fd7f879abf 100644 --- a/src/components/policy/policy_regular/include/policy/sql_pt_queries.h +++ b/src/components/policy/policy_regular/include/policy/sql_pt_queries.h @@ -145,6 +145,7 @@ extern const std::string kUpdateDBVersion; extern const std::string kSaveModuleMeta; extern const std::string kSelectModuleMeta; extern const std::string kUpdateMetaParams; +extern const std::string kUpdateMetaHardwareVersion; extern const std::string kInsertVehicleDataItem; extern const std::string kSelectVehicleDataItem; extern const std::string kDeleteVehicleDataItems; diff --git a/src/components/policy/policy_regular/include/policy/sql_pt_representation.h b/src/components/policy/policy_regular/include/policy/sql_pt_representation.h index 512bfd6326..18147c43f0 100644 --- a/src/components/policy/policy_regular/include/policy/sql_pt_representation.h +++ b/src/components/policy/policy_regular/include/policy/sql_pt_representation.h @@ -90,7 +90,8 @@ class SQLPTRepresentation : public virtual PTRepresentation { StringArray* nicknames = NULL, StringArray* app_hmi_types = NULL); bool GetFunctionalGroupings(policy_table::FunctionalGroupings& groups); - bool SetMetaInfo(const std::string& ccpu_version); + bool SetMetaInfo(const std::string& ccpu_version) OVERRIDE; + void SetHardwareVersion(const std::string& hardware_version) OVERRIDE; #ifdef BUILD_TESTS uint32_t open_counter() { return open_counter_; diff --git a/src/components/policy/policy_regular/src/cache_manager.cc b/src/components/policy/policy_regular/src/cache_manager.cc index d53ec4d18a..cf4164d133 100644 --- a/src/components/policy/policy_regular/src/cache_manager.cc +++ b/src/components/policy/policy_regular/src/cache_manager.cc @@ -1337,6 +1337,8 @@ void CacheManager::PersistData() { } backup_->SetMetaInfo(*(*copy_pt.policy_table.module_meta).ccpu_version); + backup_->SetHardwareVersion( + *(*copy_pt.policy_table.module_meta).hardware_version); // In case of extended policy the meta info should be backuped as well. backup_->WriteDb(); @@ -1490,13 +1492,35 @@ bool CacheManager::SetMetaInfo(const std::string& ccpu_version, return true; } +void CacheManager::SetHardwareVersion(const std::string& hardware_version) { + SDL_LOG_AUTO_TRACE(); + CACHE_MANAGER_CHECK_VOID(); + sync_primitives::AutoLock auto_lock(cache_lock_); + + *pt_->policy_table.module_meta->hardware_version = hardware_version; + Backup(); +} + std::string CacheManager::GetCCPUVersionFromPT() const { SDL_LOG_AUTO_TRACE(); + CACHE_MANAGER_CHECK(std::string("")); + sync_primitives::AutoLock auto_lock(cache_lock_); + rpc::Optional<policy_table::ModuleMeta>& module_meta = pt_->policy_table.module_meta; return *(module_meta->ccpu_version); } +std::string CacheManager::GetHardwareVersionFromPT() const { + SDL_LOG_AUTO_TRACE(); + CACHE_MANAGER_CHECK(std::string("")); + sync_primitives::AutoLock auto_lock(cache_lock_); + + rpc::Optional<policy_table::ModuleMeta>& module_meta = + pt_->policy_table.module_meta; + return *(module_meta->hardware_version); +} + bool CacheManager::IsMetaInfoPresent() const { CACHE_MANAGER_CHECK(false); bool result = true; 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 059375322a..b6101eb960 100644 --- a/src/components/policy/policy_regular/src/policy_manager_impl.cc +++ b/src/components/policy/policy_regular/src/policy_manager_impl.cc @@ -1217,11 +1217,22 @@ void PolicyManagerImpl::SetSystemInfo(const std::string& ccpu_version, cache_->SetMetaInfo(ccpu_version, wers_country_code, language); } +void PolicyManagerImpl::SetHardwareVersion( + const std::string& hardware_version) { + SDL_LOG_AUTO_TRACE(); + cache_->SetHardwareVersion(hardware_version); +} + std::string PolicyManagerImpl::GetCCPUVersionFromPT() const { SDL_LOG_AUTO_TRACE(); return cache_->GetCCPUVersionFromPT(); } +std::string PolicyManagerImpl::GetHardwareVersionFromPT() const { + SDL_LOG_AUTO_TRACE(); + return cache_->GetHardwareVersionFromPT(); +} + uint32_t PolicyManagerImpl::GetNotificationsNumber(const std::string& priority, const bool is_subtle) const { SDL_LOG_AUTO_TRACE(); diff --git a/src/components/policy/policy_regular/src/policy_table/types.cc b/src/components/policy/policy_regular/src/policy_table/types.cc index d3473bb2a7..d2a70baafe 100644 --- a/src/components/policy/policy_regular/src/policy_table/types.cc +++ b/src/components/policy/policy_regular/src/policy_table/types.cc @@ -1297,7 +1297,8 @@ ModuleMeta::ModuleMeta(const Json::Value* value__) impl::ValueMember(value__, "pt_exchanged_x_days_after_epoch")) , ignition_cycles_since_last_exchange( impl::ValueMember(value__, "ignition_cycles_since_last_exchange")) - , ccpu_version(impl::ValueMember(value__, "ccpu_version")) {} + , ccpu_version(impl::ValueMember(value__, "ccpu_version")) + , hardware_version(impl::ValueMember(value__, "hardware_version")) {} Json::Value ModuleMeta::ToJsonValue() const { Json::Value result__(Json::objectValue); @@ -1319,6 +1320,9 @@ bool ModuleMeta::is_valid() const { if (!ccpu_version.is_valid()) { return false; } + if (!hardware_version.is_valid()) { + return false; + } if (!pt_exchanged_at_odometer_x.is_valid()) { return false; } @@ -1339,6 +1343,9 @@ bool ModuleMeta::struct_empty() const { if (ccpu_version.is_initialized()) { return false; } + if (hardware_version.is_initialized()) { + return false; + } if (pt_exchanged_at_odometer_x.is_initialized()) { return false; } @@ -1359,6 +1366,10 @@ void ModuleMeta::ReportErrors(rpc::ValidationReport* report__) const { if (!ccpu_version.is_valid()) { ccpu_version.ReportErrors(&report__->ReportSubobject("ccpu_version")); } + if (!hardware_version.is_valid()) { + hardware_version.ReportErrors( + &report__->ReportSubobject("hardware_version")); + } if (!pt_exchanged_at_odometer_x.is_valid()) { pt_exchanged_at_odometer_x.ReportErrors( &report__->ReportSubobject("pt_exchanged_at_odometer_x")); diff --git a/src/components/policy/policy_regular/src/sql_pt_queries.cc b/src/components/policy/policy_regular/src/sql_pt_queries.cc index cf9167406f..ea0b7fe997 100644 --- a/src/components/policy/policy_regular/src/sql_pt_queries.cc +++ b/src/components/policy/policy_regular/src/sql_pt_queries.cc @@ -60,7 +60,8 @@ const std::string kCreateSchema = " `pt_exchanged_x_days_after_epoch` INTEGER NOT NULL DEFAULT 0, " " `ignition_cycles_since_last_exchange` INTEGER NOT NULL DEFAULT 0, " " `flag_update_required` BOOL NOT NULL, " - " `ccpu_version` VARCHAR(45) " + " `ccpu_version` VARCHAR(45), " + " `hardware_version` VARCHAR(45) " "); " "CREATE TABLE IF NOT EXISTS `module_config`( " " `preloaded_pt` BOOL NOT NULL, " @@ -1076,10 +1077,16 @@ const std::string kSaveModuleMeta = "`pt_exchanged_x_days_after_epoch` = ?, " "`ignition_cycles_since_last_exchange` = ? "; -const std::string kSelectModuleMeta = "SELECT* FROM `module_meta`"; +const std::string kSelectModuleMeta = + "SELECT `ccpu_version`, `hardware_version`, `pt_exchanged_at_odometer_x`, " + "`pt_exchanged_x_days_after_epoch`, `ignition_cycles_since_last_exchange` " + "FROM `module_meta`"; const std::string kUpdateMetaParams = "UPDATE `module_meta` SET " "`ccpu_version` = ? "; + +const std::string kUpdateMetaHardwareVersion = + "UPDATE `module_meta` SET `hardware_version` = ? "; } // namespace sql_pt } // namespace policy diff --git a/src/components/policy/policy_regular/src/sql_pt_representation.cc b/src/components/policy/policy_regular/src/sql_pt_representation.cc index 7193a06bdb..57781ae16f 100644 --- a/src/components/policy/policy_regular/src/sql_pt_representation.cc +++ b/src/components/policy/policy_regular/src/sql_pt_representation.cc @@ -472,10 +472,11 @@ void SQLPTRepresentation::GatherModuleMeta( SDL_LOG_INFO("Gather Module Meta Info"); utils::dbms::SQLQuery query(db()); if (query.Prepare(sql_pt::kSelectModuleMeta) && query.Next()) { - *meta->pt_exchanged_at_odometer_x = query.GetInteger(0); - *meta->pt_exchanged_x_days_after_epoch = query.GetInteger(1); - *meta->ignition_cycles_since_last_exchange = query.GetInteger(2); - *meta->ccpu_version = query.GetString(4); + *meta->ccpu_version = query.GetString(0); + *meta->hardware_version = query.GetString(1); + *meta->pt_exchanged_at_odometer_x = query.GetInteger(2); + *meta->pt_exchanged_x_days_after_epoch = query.GetInteger(3); + *meta->ignition_cycles_since_last_exchange = query.GetInteger(4); } } @@ -716,6 +717,22 @@ bool SQLPTRepresentation::SetMetaInfo(const std::string& ccpu_version) { return true; } +void SQLPTRepresentation::SetHardwareVersion( + const std::string& hardware_version) { + SDL_LOG_AUTO_TRACE(); + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kUpdateMetaHardwareVersion)) { + SDL_LOG_WARN("Incorrect statement for insert to module meta."); + return; + } + + query.Bind(0, hardware_version); + + if (!query.Exec()) { + SDL_LOG_WARN("Incorrect insert to module meta."); + } +} + bool SQLPTRepresentation::GatherApplicationPoliciesSection( policy_table::ApplicationPoliciesSection* policies) const { SDL_LOG_INFO("Gather applications policies"); diff --git a/src/components/policy/policy_regular/test/CMakeLists.txt b/src/components/policy/policy_regular/test/CMakeLists.txt index d2cd7be224..cdd6cc98da 100644 --- a/src/components/policy/policy_regular/test/CMakeLists.txt +++ b/src/components/policy/policy_regular/test/CMakeLists.txt @@ -49,6 +49,7 @@ file (GLOB POLICY_TEST_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/policy_manager_impl_test.cc ${CMAKE_CURRENT_SOURCE_DIR}/access_remote_impl_test.cc ${CMAKE_CURRENT_SOURCE_DIR}/sql_pt_representation_test.cc + ${CMAKE_CURRENT_SOURCE_DIR}/sql_pt_representation_storage_test.cc ${CMAKE_CURRENT_SOURCE_DIR}/update_status_manager_test.cc ${CMAKE_CURRENT_SOURCE_DIR}/vehicle_data_item_type_test.cc ${CMAKE_CURRENT_SOURCE_DIR}/shared_library_test.cc diff --git a/src/components/policy/policy_regular/test/cache_manager_test.cc b/src/components/policy/policy_regular/test/cache_manager_test.cc index 31166b8f43..00b632ac17 100644 --- a/src/components/policy/policy_regular/test/cache_manager_test.cc +++ b/src/components/policy/policy_regular/test/cache_manager_test.cc @@ -1235,6 +1235,18 @@ TEST_F(CacheManagerTest, IsApplicationRepresented_DeviceApp_ReturnTrue) { EXPECT_TRUE(cache_manager_->IsApplicationRepresented(kDeviceId)); } +TEST_F(CacheManagerTest, GetHardwareVersion_ValueWasSetBefore_ReturnValue) { + std::string hardware_version = "1.1.1.1"; + cache_manager_->SetHardwareVersion(hardware_version); + EXPECT_EQ(hardware_version, cache_manager_->GetHardwareVersionFromPT()); +} + +TEST_F(CacheManagerTest, + GetHardwareVersion_ValueNotSettedBefore_ReturnEmptyString) { + std::string empty_string = ""; + EXPECT_EQ(empty_string, cache_manager_->GetHardwareVersionFromPT()); +} + } // namespace policy_test } // namespace components } // namespace test 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 d5a66f4388..c456561328 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 @@ -599,20 +599,6 @@ TEST_F(PolicyManagerImplTest, GetHMITypes_ValidHmiTypes_ReturnTrue) { EXPECT_TRUE(policy_manager_->GetHMITypes(kValidAppId, &app_types)); } -TEST_F(PolicyManagerImplTest, SetMetaInfo_SetCCPUVersion_SUCCESS) { - const std::string ccpu_version = "ccpu_version"; - const std::string wers_country_code = "wersCountryCode"; - const std::string language = "language"; - - EXPECT_CALL(*mock_cache_manager_, - SetMetaInfo(ccpu_version, wers_country_code, language)); - policy_manager_->SetSystemInfo(ccpu_version, wers_country_code, language); - - EXPECT_CALL(*mock_cache_manager_, GetCCPUVersionFromPT()) - .WillOnce(Return(ccpu_version)); - EXPECT_EQ(ccpu_version, policy_manager_->GetCCPUVersionFromPT()); -} - } // namespace policy_test } // namespace components } // namespace test diff --git a/src/components/policy/policy_regular/test/sql_pt_representation_test.cc b/src/components/policy/policy_regular/test/sql_pt_representation_test.cc index f4efa811b6..fb64dfe7d0 100644 --- a/src/components/policy/policy_regular/test/sql_pt_representation_test.cc +++ b/src/components/policy/policy_regular/test/sql_pt_representation_test.cc @@ -72,6 +72,35 @@ namespace policy_test { using policy_handler_test::MockPolicySettings; +namespace { +const std::string kSdlPreloadedPtJson = "json/sdl_preloaded_pt.json"; +const std::string kSoftwareVersion = "4.1.3.B_EB355B"; +const std::string kHardwareVersion = "1.1.1.0"; +} // namespace + +policy_table::Table LoadPreloadedPT(const std::string& filename) { + std::ifstream ifile(filename); + EXPECT_TRUE(ifile.good()); + Json::CharReaderBuilder reader_builder; + Json::Value root(Json::objectValue); + Json::parseFromStream(reader_builder, ifile, &root, nullptr); + root["policy_table"]["module_config"].removeMember("preloaded_pt"); + ifile.close(); + policy_table::Table table(&root); + return table; +} + +Json::Value GetDefaultSnapshotModuleMeta(policy_table::Table& policy_table) { + auto json_table = policy_table.ToJsonValue(); + + Json::Value default_module_meta = json_table["policy_table"]["module_meta"]; + default_module_meta["pt_exchanged_at_odometer_x"] = Json::Value(0); + default_module_meta["pt_exchanged_x_days_after_epoch"] = Json::Value(0); + default_module_meta["ignition_cycles_since_last_exchange"] = Json::Value(0); + + return default_module_meta; +} + class SQLPTRepresentationTest : protected SQLPTRepresentation, public ::testing::Test { protected: @@ -201,180 +230,6 @@ class SQLPTRepresentationTest : protected SQLPTRepresentation, StringsCompare(groups, app_groups); } - void PolicyTableUpdatePrepare(Json::Value& table) { - // Root - table["policy_table"] = Json::Value(Json::objectValue); - - // 1st level - Json::Value& policy_table = table["policy_table"]; - policy_table["module_config"] = Json::Value(Json::objectValue); - policy_table["functional_groupings"] = Json::Value(Json::objectValue); - policy_table["consumer_friendly_messages"] = Json::Value(Json::objectValue); - policy_table["app_policies"] = Json::Value(Json::objectValue); - policy_table["usage_and_error_counts"] = Json::Value(Json::objectValue); - policy_table["device_data"] = Json::Value(Json::objectValue); - - // 'module_config' section start - Json::Value& module_config = policy_table["module_config"]; - module_config["preloaded_pt"] = Json::Value(false); - module_config["preloaded_date"] = Json::Value(""); - module_config["exchange_after_x_ignition_cycles"] = Json::Value(10); - module_config["exchange_after_x_kilometers"] = Json::Value(100); - module_config["exchange_after_x_days"] = Json::Value(5); - module_config["timeout_after_x_seconds"] = Json::Value(500); - module_config["seconds_between_retries"] = Json::Value(Json::arrayValue); - - Json::Value& seconds_between_retries = - module_config["seconds_between_retries"]; - seconds_between_retries[0] = Json::Value(10); - seconds_between_retries[1] = Json::Value(20); - seconds_between_retries[2] = Json::Value(30); - module_config["endpoints"] = Json::Value(Json::objectValue); - - Json::Value& endpoins = module_config["endpoints"]; - endpoins["0x00"] = Json::Value(Json::objectValue); - endpoins["0x00"]["default"] = Json::Value(Json::arrayValue); - endpoins["0x00"]["default"][0] = - Json::Value("http://ford.com/cloud/default"); - module_config["notifications_per_minute_by_priority"] = - Json::Value(Json::objectValue); - module_config["notifications_per_minute_by_priority"]["emergency"] = - Json::Value(1); - module_config["notifications_per_minute_by_priority"]["navigation"] = - Json::Value(2); - module_config["notifications_per_minute_by_priority"]["VOICECOMM"] = - Json::Value(3); - module_config["notifications_per_minute_by_priority"]["communication"] = - Json::Value(4); - module_config["notifications_per_minute_by_priority"]["normal"] = - Json::Value(5); - module_config["notifications_per_minute_by_priority"]["none"] = - Json::Value(6); - module_config["subtle_notifications_per_minute_by_priority"] = - Json::Value(Json::objectValue); - module_config["subtle_notifications_per_minute_by_priority"]["emergency"] = - Json::Value(7); - module_config["subtle_notifications_per_minute_by_priority"]["navigation"] = - Json::Value(8); - module_config["subtle_notifications_per_minute_by_priority"]["VOICECOMM"] = - Json::Value(9); - module_config["subtle_notifications_per_minute_by_priority"] - ["communication"] = Json::Value(10); - module_config["subtle_notifications_per_minute_by_priority"]["normal"] = - Json::Value(11); - module_config["subtle_notifications_per_minute_by_priority"]["none"] = - Json::Value(12); - module_config["vehicle_make"] = Json::Value(""); - module_config["vehicle_model"] = Json::Value(""); - module_config["vehicle_year"] = Json::Value(""); - module_config["certificate"] = Json::Value("encrypted_certificate_content"); - // 'module_config' section end - - // 'functional_groupings' section start - Json::Value& functional_groupings = policy_table["functional_groupings"]; - functional_groupings["default"] = Json::Value(Json::objectValue); - Json::Value& default_group = functional_groupings["default"]; - default_group["rpcs"] = Json::Value(Json::objectValue); - default_group["rpcs"]["Update"] = Json::Value(Json::objectValue); - default_group["rpcs"]["Update"]["hmi_levels"] = - Json::Value(Json::arrayValue); - default_group["rpcs"]["Update"]["hmi_levels"][0] = Json::Value("FULL"); - default_group["rpcs"]["Update"]["parameters"] = - Json::Value(Json::arrayValue); - default_group["rpcs"]["Update"]["parameters"][0] = Json::Value("speed"); - - Json::Value& consumer_friendly_messages = - policy_table["consumer_friendly_messages"]; - consumer_friendly_messages["version"] = Json::Value("some_msg_version"); - consumer_friendly_messages["messages"] = Json::Value(Json::objectValue); - consumer_friendly_messages["messages"]["MSG_CODE"] = - Json::Value(Json::objectValue); - Json::Value& msg1 = consumer_friendly_messages["messages"]["MSG_CODE"]; - msg1["languages"] = Json::Value(Json::objectValue); - msg1["languages"]["en-us"] = Json::Value(Json::objectValue); - // 'functional_groupings' section end - - // 'app_policies' section start - Json::Value& app_policies = policy_table["app_policies"]; - app_policies["default"] = Json::Value(Json::objectValue); - app_policies["default"]["priority"] = Json::Value("EMERGENCY"); - app_policies["default"]["memory_kb"] = Json::Value(50); - app_policies["default"]["heart_beat_timeout_ms"] = Json::Value(100); - app_policies["default"]["groups"] = Json::Value(Json::arrayValue); - app_policies["default"]["groups"][0] = Json::Value("default"); - app_policies["default"]["priority"] = Json::Value("EMERGENCY"); - app_policies["default"]["is_revoked"] = Json::Value(true); - app_policies["default"]["default_hmi"] = Json::Value("FULL"); - app_policies["default"]["keep_context"] = Json::Value(true); - app_policies["default"]["steal_focus"] = Json::Value(true); - app_policies["default"]["RequestType"] = Json::Value(Json::arrayValue); - - app_policies["pre_DataConsent"] = Json::Value(Json::objectValue); - app_policies["pre_DataConsent"]["memory_kb"] = Json::Value(40); - app_policies["pre_DataConsent"]["heart_beat_timeout_ms"] = Json::Value(90); - app_policies["pre_DataConsent"]["groups"] = Json::Value(Json::arrayValue); - app_policies["pre_DataConsent"]["groups"][0] = Json::Value("default"); - app_policies["pre_DataConsent"]["priority"] = Json::Value("EMERGENCY"); - app_policies["pre_DataConsent"]["default_hmi"] = Json::Value("FULL"); - app_policies["pre_DataConsent"]["is_revoked"] = Json::Value(false); - app_policies["pre_DataConsent"]["keep_context"] = Json::Value(true); - app_policies["pre_DataConsent"]["steal_focus"] = Json::Value(true); - app_policies["pre_DataConsent"]["RequestType"] = - Json::Value(Json::arrayValue); - - app_policies["1234"] = Json::Value(Json::objectValue); - app_policies["1234"]["memory_kb"] = Json::Value(150); - app_policies["1234"]["heart_beat_timeout_ms"] = Json::Value(200); - app_policies["1234"]["groups"] = Json::Value(Json::arrayValue); - app_policies["1234"]["groups"][0] = Json::Value("default"); - app_policies["1234"]["priority"] = Json::Value("EMERGENCY"); - app_policies["1234"]["default_hmi"] = Json::Value("FULL"); - app_policies["1234"]["is_revoked"] = Json::Value(true); - app_policies["1234"]["keep_context"] = Json::Value(false); - app_policies["1234"]["steal_focus"] = Json::Value(false); - app_policies["1234"]["RequestType"] = Json::Value(Json::arrayValue); - app_policies["1234"]["app_services"] = Json::Value(Json::objectValue); - app_policies["1234"]["icon_url"] = - Json::Value("http:://www.sdl.com/image.png"); - app_policies["1234"]["app_services"]["MEDIA"] = - Json::Value(Json::objectValue); - app_policies["1234"]["app_services"]["MEDIA"]["service_names"] = - Json::Value(Json::arrayValue); - app_policies["1234"]["app_services"]["MEDIA"]["service_names"][0] = - Json::Value("SDL App"); - app_policies["1234"]["app_services"]["MEDIA"]["service_names"][1] = - Json::Value("SDL Music"); - app_policies["1234"]["app_services"]["MEDIA"]["handled_rpcs"] = - Json::Value(Json::arrayValue); - app_policies["1234"]["app_services"]["MEDIA"]["handled_rpcs"][0] = - Json::Value(Json::objectValue); - app_policies["1234"]["app_services"]["MEDIA"]["handled_rpcs"][0] - ["function_id"] = Json::Value(41); - - app_policies["device"] = Json::Value(Json::objectValue); - app_policies["device"]["groups"] = Json::Value(Json::arrayValue); - app_policies["device"]["groups"][0] = Json::Value("default"); - app_policies["device"]["priority"] = Json::Value("EMERGENCY"); - app_policies["device"]["is_revoked"] = Json::Value(true); - app_policies["device"]["default_hmi"] = Json::Value("FULL"); - app_policies["device"]["keep_context"] = Json::Value(true); - app_policies["device"]["steal_focus"] = Json::Value(true); - // 'app_policies' section end - - Json::Value& usage_and_error_counts = - policy_table["usage_and_error_counts"]; - usage_and_error_counts["app_level"] = Json::Value(Json::objectValue); - usage_and_error_counts["app_level"]["some_app_id"] = - Json::Value(Json::objectValue); - usage_and_error_counts["app_level"]["some_app_id"]["count_of_tls_errors"] = - Json::Value(5); - - Json::Value& device_data = policy_table["device_data"]; - device_data["device_id_hash_1"] = Json::Value(Json::objectValue); - device_data["device_id_hash_2"] = Json::Value(Json::objectValue); - device_data["device_id_hash_3"] = Json::Value(Json::objectValue); - } - ::testing::AssertionResult IsValid(const policy_table::Table& table) { if (table.is_valid()) { return ::testing::AssertionSuccess(); @@ -1812,252 +1667,77 @@ TEST_F(SQLPTRepresentationTest3, RemoveDB_RemoveDB_ExpectFileDeleted) { EXPECT_FALSE(file_system::FileExists(path)); } -// TODO {AKozoriz} : Snapshot must have module meta section, but test -// generates snapshot without it. TEST_F(SQLPTRepresentationTest, - DISABLED_GenerateSnapshot_SetPolicyTable_SnapshotIsPresent) { - // Arrange - Json::Value table(Json::objectValue); - PolicyTableUpdatePrepare(table); + GenerateSnapshot_DefaultContentOfModuleMeta_MetaInfoPresentInSnapshot) { + policy_table::Table update = LoadPreloadedPT(kSdlPreloadedPtJson); - policy_table::Table update(&table); - update.SetPolicyTableType(rpc::policy_table_interface_base::PT_UPDATE); + ASSERT_TRUE(IsValid(update)); + EXPECT_TRUE(reps->Save(update)); - // Assert - // ASSERT_TRUE(IsValid(update)); - ASSERT_TRUE(reps->Save(update)); + std::shared_ptr<policy_table::Table> snapshot = reps->GenerateSnapshot(); + + auto expected_module_meta = GetDefaultSnapshotModuleMeta(update); + auto& snapshot_module_meta = snapshot->policy_table.module_meta; + EXPECT_EQ(expected_module_meta.toStyledString(), + snapshot_module_meta.ToJsonValue().toStyledString()); +} + +TEST_F(SQLPTRepresentationTest, + GenerateSnapshot_SetMetaInfo_NoSoftwareVersionInSnapshot) { + policy_table::Table update = LoadPreloadedPT(kSdlPreloadedPtJson); + + ASSERT_TRUE(IsValid(update)); + EXPECT_TRUE(reps->Save(update)); + EXPECT_TRUE(reps->SetMetaInfo(kSoftwareVersion)); - // Act std::shared_ptr<policy_table::Table> snapshot = reps->GenerateSnapshot(); - snapshot->SetPolicyTableType(rpc::policy_table_interface_base::PT_SNAPSHOT); - // Remove fields which must be absent in snapshot - table["policy_table"]["consumer_friendly_messages"].removeMember("messages"); - table["policy_table"]["app_policies"]["1234"].removeMember("default_hmi"); - table["policy_table"]["app_policies"]["1234"].removeMember("keep_context"); - table["policy_table"]["app_policies"]["1234"].removeMember("steal_focus"); - table["policy_table"]["app_policies"]["default"].removeMember("default_hmi"); - table["policy_table"]["app_policies"]["default"].removeMember("keep_context"); - table["policy_table"]["app_policies"]["default"].removeMember("steal_focus"); - table["policy_table"]["app_policies"]["pre_DataConsent"].removeMember( - "default_hmi"); - table["policy_table"]["app_policies"]["pre_DataConsent"].removeMember( - "keep_context"); - table["policy_table"]["app_policies"]["pre_DataConsent"].removeMember( - "steal_focus"); - table["policy_table"]["app_policies"]["device"].removeMember("default_hmi"); - table["policy_table"]["app_policies"]["device"].removeMember("keep_context"); - table["policy_table"]["app_policies"]["device"].removeMember("steal_focus"); - table["policy_table"]["app_policies"]["device"].removeMember("groups"); - table["policy_table"]["device_data"] = Json::Value(Json::objectValue); - table["policy_table"]["module_meta"] = Json::Value(Json::objectValue); - policy_table::Table expected(&table); - Json::StreamWriterBuilder writer_builder; - // Checks - EXPECT_EQ(Json::writeString(writer_builder, expected.ToJsonValue()), - Json::writeString(writer_builder, snapshot->ToJsonValue())); - EXPECT_EQ(expected.ToJsonValue().toStyledString(), - snapshot->ToJsonValue().toStyledString()); + + auto expected_module_meta = GetDefaultSnapshotModuleMeta(update); + auto& snapshot_module_meta = snapshot->policy_table.module_meta; + EXPECT_EQ(expected_module_meta.toStyledString(), + snapshot_module_meta.ToJsonValue().toStyledString()); } -TEST_F(SQLPTRepresentationTest, Save_SetPolicyTableThenSave_ExpectSavedToPT) { - // Arrange - Json::Value table(Json::objectValue); - PolicyTableUpdatePrepare(table); +TEST_F(SQLPTRepresentationTest, + GenerateSnapshot_SetHardwareVersion_NoHardwareVersionInSnapshot) { + policy_table::Table update = LoadPreloadedPT(kSdlPreloadedPtJson); - policy_table::Table update(&table); - update.SetPolicyTableType(rpc::policy_table_interface_base::PT_UPDATE); - // Checks PT before Save - policy_table::FunctionalGroupings func_groups; - ASSERT_TRUE(reps->GetFunctionalGroupings(func_groups)); - // Check functional groupings section - EXPECT_EQ(0u, func_groups.size()); - - policy_table::ApplicationPoliciesSection policies; - GatherApplicationPoliciesSection(&policies); - // Check ApplicationPoliciesSection - EXPECT_EQ(0u, policies.apps.size()); - EXPECT_EQ(policy_table::Priority::P_EMERGENCY, policies.device.priority); - - policy_table::ModuleConfig config; - GatherModuleConfig(&config); - // Check Module config section - EXPECT_TRUE(*config.preloaded_pt); - EXPECT_EQ(0, config.exchange_after_x_ignition_cycles); - EXPECT_EQ(0, config.exchange_after_x_kilometers); - EXPECT_EQ(0, config.exchange_after_x_days); - EXPECT_EQ(0, config.timeout_after_x_seconds); - EXPECT_EQ("", static_cast<std::string>(*config.vehicle_make)); - EXPECT_EQ("", static_cast<std::string>(*config.vehicle_model)); - EXPECT_EQ("", static_cast<std::string>(*config.vehicle_year)); - EXPECT_EQ("", static_cast<std::string>(*config.preloaded_date)); - EXPECT_EQ("", static_cast<std::string>(*config.certificate)); - EXPECT_EQ(0u, config.seconds_between_retries.size()); - EXPECT_EQ(0u, config.endpoints.size()); - EXPECT_EQ(0u, config.notifications_per_minute_by_priority.size()); - EXPECT_EQ(0u, (*config.subtle_notifications_per_minute_by_priority).size()); - - policy_table::ConsumerFriendlyMessages messages; - GatherConsumerFriendlyMessages(&messages); - EXPECT_EQ("0", static_cast<std::string>(messages.version)); - - policy_table::DeviceData devices; - GatherDeviceData(&devices); - EXPECT_EQ(0u, devices.size()); - - policy_table::UsageAndErrorCounts counts; - GatherUsageAndErrorCounts(&counts); - EXPECT_TRUE(0u == counts.app_level->size()); - - // ASSERT_TRUE(IsValid(update)); - // Act - ASSERT_TRUE(reps->Save(update)); + ASSERT_TRUE(IsValid(update)); + EXPECT_TRUE(reps->Save(update)); + reps->SetHardwareVersion(kHardwareVersion); - // Check Functional Groupings - ASSERT_TRUE(reps->GetFunctionalGroupings(func_groups)); - // Checks - EXPECT_EQ(1u, func_groups.size()); - policy_table::FunctionalGroupings::iterator func_groups_iter = - func_groups.find("default"); - ASSERT_TRUE(func_groups.end() != func_groups_iter); - policy_table::Rpcs& rpcs = func_groups_iter->second; - EXPECT_EQ("", static_cast<std::string>(*rpcs.user_consent_prompt)); - policy_table::Rpc& rpc = rpcs.rpcs; - EXPECT_EQ(1u, rpc.size()); - policy_table::Rpc::const_iterator rpc_iter = rpc.find("Update"); - EXPECT_TRUE(rpc.end() != rpc_iter); - const policy_table::HmiLevels& hmi_levels = rpc_iter->second.hmi_levels; - EXPECT_EQ(1u, hmi_levels.size()); - EXPECT_TRUE(hmi_levels.end() != std::find(hmi_levels.begin(), - hmi_levels.end(), - policy_table::HmiLevel::HL_FULL)); - - const ::policy_table::Parameters& parameters = *(rpc_iter->second.parameters); - EXPECT_EQ(1u, parameters.size()); - EXPECT_TRUE(parameters.end() != - std::find(parameters.begin(), - parameters.end(), - policy_table::EnumToJsonString( - policy_table::Parameter::P_SPEED))); - // Check Application Policies Section - GatherApplicationPoliciesSection(&policies); - const uint32_t apps_size = 3u; - - rpc::String<1ul, 255ul> str("default"); - policy_table::Strings groups; - groups.push_back(str); - CheckAppPoliciesSection(policies, - apps_size, - policy_table::Priority::P_EMERGENCY, - "1234", - 150u, - 200u, - groups); - CheckAppPoliciesSection(policies, - apps_size, - policy_table::Priority::P_EMERGENCY, - "default", - 50u, - 100u, - groups); - CheckAppPoliciesSection(policies, - apps_size, - policy_table::Priority::P_EMERGENCY, - "pre_DataConsent", - 40u, - 90u, - groups); - CheckAppPoliciesSection(policies, - apps_size, - policy_table::Priority::P_EMERGENCY, - "device", - 0u, - 0u, - groups); - - CheckAppGroups("1234", groups); - CheckAppGroups("default", groups); - CheckAppGroups("pre_DataConsent", groups); - - GatherModuleConfig(&config); - // Check Module Config section - ASSERT_FALSE(*config.preloaded_pt); - ASSERT_EQ("encrypted_certificate_content", - static_cast<std::string>(*config.certificate)); - ASSERT_EQ("", static_cast<std::string>(*config.preloaded_date)); - ASSERT_EQ("", static_cast<std::string>(*config.vehicle_year)); - ASSERT_EQ("", static_cast<std::string>(*config.vehicle_model)); - ASSERT_EQ("", static_cast<std::string>(*config.vehicle_make)); - ASSERT_EQ(10, config.exchange_after_x_ignition_cycles); - ASSERT_EQ(100, config.exchange_after_x_kilometers); - ASSERT_EQ(5, config.exchange_after_x_days); - ASSERT_EQ(500, config.timeout_after_x_seconds); - ASSERT_EQ(3u, config.seconds_between_retries.size()); - ASSERT_EQ(10, config.seconds_between_retries[0]); - ASSERT_EQ(20, config.seconds_between_retries[1]); - ASSERT_EQ(30, config.seconds_between_retries[2]); - ASSERT_EQ(6u, config.notifications_per_minute_by_priority.size()); - ASSERT_EQ(1, config.notifications_per_minute_by_priority["emergency"]); - ASSERT_EQ(2, config.notifications_per_minute_by_priority["navigation"]); - ASSERT_EQ(3, config.notifications_per_minute_by_priority["VOICECOMM"]); - ASSERT_EQ(4, config.notifications_per_minute_by_priority["communication"]); - ASSERT_EQ(5, config.notifications_per_minute_by_priority["normal"]); - ASSERT_EQ(6, config.notifications_per_minute_by_priority["none"]); - ASSERT_EQ(6u, (*config.subtle_notifications_per_minute_by_priority).size()); - ASSERT_EQ(7, - (*config.subtle_notifications_per_minute_by_priority)["emergency"]); - ASSERT_EQ( - 8, (*config.subtle_notifications_per_minute_by_priority)["navigation"]); - ASSERT_EQ(9, - (*config.subtle_notifications_per_minute_by_priority)["VOICECOMM"]); - ASSERT_EQ( - 10, - (*config.subtle_notifications_per_minute_by_priority)["communication"]); - ASSERT_EQ(11, - (*config.subtle_notifications_per_minute_by_priority)["normal"]); - ASSERT_EQ(12, (*config.subtle_notifications_per_minute_by_priority)["none"]); - EXPECT_EQ(1u, config.endpoints.size()); - policy_table::ServiceEndpoints& service_endpoints = config.endpoints; - EXPECT_EQ("0x00", service_endpoints.begin()->first); - policy_table::URLList& url_list = service_endpoints.begin()->second; - EXPECT_EQ("default", url_list.begin()->first); - policy_table::URL& url = url_list.begin()->second; - EXPECT_EQ("http://ford.com/cloud/default", static_cast<std::string>(url[0])); - - GatherConsumerFriendlyMessages(&messages); - EXPECT_EQ("some_msg_version", static_cast<std::string>(messages.version)); - EXPECT_TRUE(0u != messages.messages->size()); - EXPECT_TRUE(0u != (*messages.messages)["MSG_CODE"].languages.size()); - - GatherUsageAndErrorCounts(&counts); - EXPECT_FALSE(0u == counts.app_level->size()); - EXPECT_EQ(5u, (*counts.app_level)["some_app_id"].count_of_tls_errors); - - GatherDeviceData(&devices); - EXPECT_EQ(3u, devices.size()); - - const std::string kAppId = "1234"; - const std::string kServiceType = "MEDIA"; - policy_table::AppServiceParameters app_service_parameters; - GatherAppServiceParameters(kAppId, &app_service_parameters); - ASSERT_FALSE(app_service_parameters.find(kServiceType) == - app_service_parameters.end()); - auto service_names = *(app_service_parameters[kServiceType].service_names); - EXPECT_TRUE(service_names.is_initialized()); - ASSERT_EQ(service_names.size(), 2u); - EXPECT_EQ(static_cast<std::string>(service_names[0]), "SDL App"); - EXPECT_EQ(static_cast<std::string>(service_names[1]), "SDL Music"); - - auto handled_rpcs = app_service_parameters[kServiceType].handled_rpcs; - - EXPECT_TRUE(handled_rpcs.is_initialized()); - EXPECT_EQ(handled_rpcs[0].function_id, 41); - - policy_table::ApplicationPolicies& apps = policies.apps; - auto icon_url = *(apps[kAppId].icon_url); - - EXPECT_EQ(std::string(icon_url), "http:://www.sdl.com/image.png"); + std::shared_ptr<policy_table::Table> snapshot = reps->GenerateSnapshot(); + + auto expected_module_meta = GetDefaultSnapshotModuleMeta(update); + auto& snapshot_module_meta = snapshot->policy_table.module_meta; + EXPECT_EQ(expected_module_meta.toStyledString(), + snapshot_module_meta.ToJsonValue().toStyledString()); } +TEST_F(SQLPTRepresentationTest, + SetMetaInfo_SetSoftwareVersion_ValueIsSetInModuleMeta) { + EXPECT_TRUE(reps->SetMetaInfo(kSoftwareVersion)); + + utils::dbms::SQLQuery query(reps->db()); + const std::string query_select_ccpu = + "SELECT `ccpu_version` FROM `module_meta`"; + + query.Prepare(query_select_ccpu); + query.Next(); + EXPECT_EQ(kSoftwareVersion, query.GetString(0)); +} + +TEST_F(SQLPTRepresentationTest, SetHardwareVersion_ValueIsSetInModuleMeta) { + reps->SetHardwareVersion(kHardwareVersion); + + utils::dbms::SQLQuery query(reps->db()); + const std::string query_select_hardware_version = + "SELECT `hardware_version` FROM `module_meta`"; + + query.Prepare(query_select_hardware_version); + query.Next(); + EXPECT_EQ(kHardwareVersion, query.GetString(0)); +} } // namespace policy_test } // namespace components } // namespace test diff --git a/src/components/protocol/src/bson_object_keys.cc b/src/components/protocol/src/bson_object_keys.cc index acafd3dbd2..7e1656955f 100644 --- a/src/components/protocol/src/bson_object_keys.cc +++ b/src/components/protocol/src/bson_object_keys.cc @@ -19,6 +19,12 @@ const char* tcp_ip_address = "tcpIpAddress"; const char* tcp_port = "tcpPort"; const char* reason = "reason"; const char* auth_token = "authToken"; +const char* vehicle_make = "make"; +const char* vehicle_model = "model"; +const char* vehicle_model_year = "modelYear"; +const char* vehicle_trim = "trim"; +const char* vehicle_system_software_version = "systemSoftwareVersion"; +const char* vehicle_system_hardware_version = "systemHardwareVersion"; } // namespace strings diff --git a/src/components/protocol_handler/include/protocol_handler/protocol_handler_impl.h b/src/components/protocol_handler/include/protocol_handler/protocol_handler_impl.h index e54608bb9e..02c96fc3c7 100644 --- a/src/components/protocol_handler/include/protocol_handler/protocol_handler_impl.h +++ b/src/components/protocol_handler/include/protocol_handler/protocol_handler_impl.h @@ -375,12 +375,15 @@ class ProtocolHandlerImpl * \param protocol_version Version of protocol used for communication * \param service_type Type of session: RPC or BULK Data. RPC by default * \param reason String stating the reason for the rejecting the start service + * \param full_version full protocol version (major.minor.patch) used by the + * mobile proxy */ void SendStartSessionNAck(ConnectionID connection_id, uint8_t session_id, uint8_t protocol_version, uint8_t service_type, - const std::string& reason); + const std::string& reason, + utils::SemanticVersion& full_version); /** * \brief Sends fail of starting session to mobile application @@ -390,13 +393,16 @@ class ProtocolHandlerImpl * \param service_type Type of session: RPC or BULK Data. RPC by default * \param rejected_params List of rejected params to send in payload * \param reason String stating the reason for the rejecting the start service + * \param full_version full protocol version (major.minor.patch) used by the + * mobile proxy */ void SendStartSessionNAck(ConnectionID connection_id, uint8_t session_id, uint8_t protocol_version, uint8_t service_type, std::vector<std::string>& rejectedParams, - const std::string& reason); + const std::string& reason, + utils::SemanticVersion& full_version); /** * \brief Sends acknowledgement of end session/service to mobile application @@ -456,10 +462,15 @@ class ProtocolHandlerImpl * Only valid when generated_session_id is 0. Note, even if * generated_session_id is 0, the list may be empty. */ + DEPRECATED void NotifySessionStarted(const SessionContext& context, std::vector<std::string>& rejected_params, const std::string err_reason) OVERRIDE; + void NotifySessionStarted(SessionContext& context, + std::vector<std::string>& rejected_params, + const std::string err_reason) OVERRIDE; + #ifdef BUILD_TESTS const impl::FromMobileQueue& get_from_mobile_queue() const { return raw_ford_messages_from_mobile_; @@ -733,6 +744,24 @@ class ProtocolHandlerImpl const uint8_t session_id, const bool protection) const; + /** + * @brief Writes available protocol vehicle data into structured bson + * @param params bson params to write into + * @param data data to write + */ + void WriteProtocolVehicleData( + BsonObject& params, const connection_handler::ProtocolVehicleData& data); + + /** + * \brief Parces full protocol version from start service message headers bson + * \param full_version full protocol version (major.minor.patch) used by the + * mobile proxy + * \param packet Sart service message + * \return true if version successfully parsed, otherwise false + */ + bool ParseFullVersion(utils::SemanticVersion& full_version, + const ProtocolFramePtr& packet) const; + const ProtocolHandlerSettings& settings_; /** diff --git a/src/components/protocol_handler/src/handshake_handler.cc b/src/components/protocol_handler/src/handshake_handler.cc index 4d306fd330..78f324e0ae 100644 --- a/src/components/protocol_handler/src/handshake_handler.cc +++ b/src/components/protocol_handler/src/handshake_handler.cc @@ -232,7 +232,8 @@ void HandshakeHandler::ProcessSuccessfulHandshake(const uint32_t connection_key, context_.service_type_, (is_service_already_protected) ? "Service is already protected" - : "Service cannot be protected"); + : "Service cannot be protected", + full_version_); } } @@ -284,7 +285,8 @@ void HandshakeHandler::ProcessFailedHandshake(BsonObject& params, context_.new_session_id_, protocol_version_, context_.service_type_, - reason_msg + (err_reason.empty() ? "" : ": " + err_reason)); + reason_msg + (err_reason.empty() ? "" : ": " + err_reason), + full_version_); } } diff --git a/src/components/protocol_handler/src/incoming_data_handler.cc b/src/components/protocol_handler/src/incoming_data_handler.cc index 08997acaac..c7a3f095a8 100644 --- a/src/components/protocol_handler/src/incoming_data_handler.cc +++ b/src/components/protocol_handler/src/incoming_data_handler.cc @@ -63,8 +63,8 @@ ProtocolFramePtrList IncomingDataHandler::ProcessData( out_result = RESULT_FAIL; return ProtocolFramePtrList(); } - SDL_LOG_INFO("Processing incoming data of size " - << tm_message_size << " for connection " << connection_id); + SDL_LOG_TRACE("Processing incoming data of size " + << tm_message_size << " for connection " << connection_id); ConnectionsDataMap::iterator it = connections_data_.find(connection_id); if (connections_data_.end() == it) { SDL_LOG_WARN("ProcessData requested for unknown connection"); @@ -73,16 +73,16 @@ ProtocolFramePtrList IncomingDataHandler::ProcessData( } std::vector<uint8_t>& connection_data = it->second; connection_data.insert(connection_data.end(), data, data + tm_message_size); - SDL_LOG_DEBUG("Total data size for connection " << connection_id << " is " + SDL_LOG_TRACE("Total data size for connection " << connection_id << " is " << connection_data.size()); ProtocolFramePtrList out_frames; *malformed_occurrence = 0; out_result = CreateFrame( connection_data, out_frames, *malformed_occurrence, connection_id); - SDL_LOG_DEBUG("New data size for connection " << connection_id << " is " + SDL_LOG_TRACE("New data size for connection " << connection_id << " is " << connection_data.size()); if (!out_frames.empty()) { - SDL_LOG_INFO("Created and passed " << out_frames.size() << " packets"); + SDL_LOG_TRACE("Created and passed " << out_frames.size() << " packets"); } else { if (RESULT_DEFERRED == out_result) { SDL_LOG_DEBUG( @@ -156,7 +156,7 @@ RESULT_CODE IncomingDataHandler::CreateFrame( << std::hex << static_cast<const void*>(&*data_it)); continue; } - SDL_LOG_DEBUG("Payload size " << header_.dataSize); + SDL_LOG_TRACE("Payload size " << header_.dataSize); const uint32_t packet_size = GetPacketSize(header_); if (packet_size == 0) { SDL_LOG_WARN("Null packet size"); @@ -167,14 +167,14 @@ RESULT_CODE IncomingDataHandler::CreateFrame( continue; } if (data_size < packet_size) { - SDL_LOG_DEBUG("Packet data is not available yet"); + SDL_LOG_TRACE("Packet data is not available yet"); incoming_data.erase(incoming_data.begin(), data_it); return RESULT_DEFERRED; } ProtocolFramePtr frame(new protocol_handler::ProtocolPacket(connection_id)); const RESULT_CODE deserialize_result = frame->deserializePacket(&*data_it, packet_size); - SDL_LOG_DEBUG("Deserialized frame " << frame); + SDL_LOG_TRACE("Deserialized frame " << frame); if (deserialize_result != RESULT_OK) { SDL_LOG_WARN("Packet deserialization failed"); incoming_data.erase(incoming_data.begin(), data_it); @@ -183,7 +183,7 @@ RESULT_CODE IncomingDataHandler::CreateFrame( out_frames.push_back(frame); last_portion_of_data_was_malformed_ = false; - SDL_LOG_DEBUG("Frame added. " + SDL_LOG_TRACE("Frame added. " << "Connection ID " << connection_id); data_it += packet_size; diff --git a/src/components/protocol_handler/src/multiframe_builder.cc b/src/components/protocol_handler/src/multiframe_builder.cc index 0cffe724c7..875b5b5933 100644 --- a/src/components/protocol_handler/src/multiframe_builder.cc +++ b/src/components/protocol_handler/src/multiframe_builder.cc @@ -91,8 +91,8 @@ bool MultiFrameBuilder::RemoveConnection(const ConnectionID connection_id) { ProtocolFramePtrList MultiFrameBuilder::PopMultiframes() { SDL_LOG_AUTO_TRACE(); sync_primitives::AutoLock lock(multiframes_map_lock_); - SDL_LOG_DEBUG("Current state is: " << multiframes_map_); - SDL_LOG_DEBUG("Current multiframe map size is: " << multiframes_map_.size()); + SDL_LOG_TRACE("Current state is: " << multiframes_map_); + SDL_LOG_TRACE("Current multiframe map size is: " << multiframes_map_.size()); ProtocolFramePtrList outpute_frame_list; for (MultiFrameMap::iterator connection_it = multiframes_map_.begin(); connection_it != multiframes_map_.end(); @@ -115,7 +115,7 @@ ProtocolFramePtrList MultiFrameBuilder::PopMultiframes() { if (frame && frame->frame_data() == FRAME_DATA_LAST_CONSECUTIVE && frame->payload_size() > 0u) { - SDL_LOG_DEBUG("Ready frame: " << frame); + SDL_LOG_TRACE("Ready frame: " << frame); outpute_frame_list.push_back(frame); messageId_map.erase(messageId_it++); continue; @@ -136,7 +136,7 @@ ProtocolFramePtrList MultiFrameBuilder::PopMultiframes() { } // iteration over messageId_map } // iteration over session_map } // iteration over multiframes_map_ - SDL_LOG_DEBUG("Result frames count: " << outpute_frame_list.size()); + SDL_LOG_TRACE("Result frames count: " << outpute_frame_list.size()); return outpute_frame_list; } @@ -164,8 +164,8 @@ RESULT_CODE MultiFrameBuilder::AddFrame(const ProtocolFramePtr packet) { RESULT_CODE MultiFrameBuilder::HandleFirstFrame(const ProtocolFramePtr packet) { DCHECK_OR_RETURN(packet->frame_type() == FRAME_TYPE_FIRST, RESULT_FAIL); sync_primitives::AutoLock lock(multiframes_map_lock_); - SDL_LOG_DEBUG("Waiting : " << multiframes_map_); - SDL_LOG_DEBUG("Handling FIRST frame: " << packet); + SDL_LOG_TRACE("Waiting : " << multiframes_map_); + SDL_LOG_TRACE("Handling FIRST frame: " << packet); if (packet->payload_size() != 0u) { SDL_LOG_ERROR("First frame shall have no data:" << packet); return RESULT_FAIL; @@ -193,7 +193,7 @@ RESULT_CODE MultiFrameBuilder::HandleFirstFrame(const ProtocolFramePtr packet) { return RESULT_FAIL; } - SDL_LOG_DEBUG("Start waiting frames for connection_id: " + SDL_LOG_TRACE("Start waiting frames for connection_id: " << connection_id << ", session_id: " << static_cast<int>(session_id) << ", message_id: " << message_id); @@ -240,7 +240,7 @@ RESULT_CODE MultiFrameBuilder::HandleConsecutiveFrame( if (is_last_consecutive) { // TODO(EZamakhov): implement count of frames and result size verification - SDL_LOG_DEBUG("Last CONSECUTIVE frame"); + SDL_LOG_TRACE("Last CONSECUTIVE frame"); } else { uint8_t previous_frame_data = assembling_frame->frame_data(); if (previous_frame_data == std::numeric_limits<uint8_t>::max()) { @@ -275,8 +275,8 @@ RESULT_CODE MultiFrameBuilder::HandleConsecutiveFrame( SDL_LOG_ERROR("Failed to append frame for multiframe message."); return RESULT_FAIL; } - SDL_LOG_INFO("Assembled frame with payload size: " - << assembling_frame->payload_size()); + SDL_LOG_TRACE("Assembled frame with payload size: " + << assembling_frame->payload_size()); frame_data.append_time = date_time::getCurrentTime(); return RESULT_OK; } diff --git a/src/components/protocol_handler/src/protocol_handler_impl.cc b/src/components/protocol_handler/src/protocol_handler_impl.cc index f3bb3d1e91..ae1721c6c0 100644 --- a/src/components/protocol_handler/src/protocol_handler_impl.cc +++ b/src/components/protocol_handler/src/protocol_handler_impl.cc @@ -54,10 +54,11 @@ SDL_CREATE_LOG_VARIABLE("ProtocolHandler") const size_t kStackSize = 131072; -const utils::SemanticVersion default_protocol_version(5, 3, 0); +const utils::SemanticVersion default_protocol_version(5, 4, 0); const utils::SemanticVersion min_multiple_transports_version(5, 1, 0); const utils::SemanticVersion min_cloud_app_version(5, 2, 0); const utils::SemanticVersion min_reason_param_version(5, 3, 0); +const utils::SemanticVersion min_vehicle_data_version(5, 4, 0); ProtocolHandlerImpl::ProtocolHandlerImpl( const ProtocolHandlerSettings& settings, @@ -226,6 +227,39 @@ void ProtocolHandlerImpl::SendStartSessionAck( bson_object_deinitialize(&empty_param); } +void ProtocolHandlerImpl::WriteProtocolVehicleData( + BsonObject& params, const connection_handler::ProtocolVehicleData& data) { + auto write_string_to_bson = [¶ms](const std::string& param_name, + const std::string& param_value) { + if (param_value.empty()) { + return; + } + + const uint16_t max_string_length = 500; + char value_buffer[max_string_length + 1]; // extra byte for NULL symbol + strncpy(value_buffer, param_value.c_str(), sizeof(value_buffer)); + value_buffer[max_string_length] = 0; + + if (bson_object_put_string(¶ms, param_name.c_str(), value_buffer)) { + SDL_LOG_DEBUG("Parameter " + << param_name << " has been written to bson with value: " + << bson_object_get_string(¶ms, param_name.c_str())); + } else { + SDL_LOG_DEBUG("Failed to write parameter " << param_name + << " into bson structure"); + } + }; + + write_string_to_bson(strings::vehicle_make, data.vehicle_make); + write_string_to_bson(strings::vehicle_model, data.vehicle_model); + write_string_to_bson(strings::vehicle_model_year, data.vehicle_year); + write_string_to_bson(strings::vehicle_trim, data.vehicle_trim); + write_string_to_bson(strings::vehicle_system_software_version, + data.vehicle_system_software_version); + write_string_to_bson(strings::vehicle_system_hardware_version, + data.vehicle_system_hardware_version); +} + void ProtocolHandlerImpl::SendStartSessionAck( ConnectionID connection_id, uint8_t session_id, @@ -289,6 +323,13 @@ void ProtocolHandlerImpl::SendStartSessionAck( << static_cast<int32_t>(bson_object_get_int64(¶ms, strings::mtu))); if (serviceTypeValue == kRpc) { + SDL_LOG_DEBUG("Collecting protocol vehicle data"); + connection_handler::ProtocolVehicleData data; + if (full_version >= min_vehicle_data_version && + connection_handler_.GetProtocolVehicleData(data)) { + WriteProtocolVehicleData(params, data); + } + // Hash ID is only used in RPC case const bool hash_written = bson_object_put_int32( ¶ms, strings::hash_id, static_cast<int32_t>(hash_id)); @@ -440,18 +481,21 @@ void ProtocolHandlerImpl::SendStartSessionAck( } } -void ProtocolHandlerImpl::SendStartSessionNAck(ConnectionID connection_id, - uint8_t session_id, - uint8_t protocol_version, - uint8_t service_type, - const std::string& reason) { +void ProtocolHandlerImpl::SendStartSessionNAck( + ConnectionID connection_id, + uint8_t session_id, + uint8_t protocol_version, + uint8_t service_type, + const std::string& reason, + utils::SemanticVersion& full_version) { std::vector<std::string> rejectedParams; SendStartSessionNAck(connection_id, session_id, protocol_version, service_type, rejectedParams, - reason); + reason, + full_version); } void ProtocolHandlerImpl::SendStartSessionNAck( @@ -460,9 +504,18 @@ void ProtocolHandlerImpl::SendStartSessionNAck( uint8_t protocol_version, uint8_t service_type, std::vector<std::string>& rejectedParams, - const std::string& reason) { + const std::string& reason, + utils::SemanticVersion& full_version) { SDL_LOG_AUTO_TRACE(); + if (!full_version.isValid()) { + if (!session_observer_.ProtocolVersionUsed( + connection_id, session_id, full_version)) { + SDL_LOG_WARN("Connection: " << connection_id << " and/or session: " + << session_id << "no longer exist(s)."); + } + } + ProtocolFramePtr ptr( new protocol_handler::ProtocolPacket(connection_id, protocol_version, @@ -476,14 +529,6 @@ void ProtocolHandlerImpl::SendStartSessionNAck( uint8_t maxProtocolVersion = SupportedSDLProtocolVersion(); - utils::SemanticVersion full_version; - if (!session_observer_.ProtocolVersionUsed( - connection_id, session_id, full_version)) { - SDL_LOG_WARN("Connection: " << connection_id << " and/or session: " - << session_id << "no longer exist(s)."); - return; - } - if (protocol_version >= PROTOCOL_VERSION_5 && maxProtocolVersion >= PROTOCOL_VERSION_5) { BsonObject payloadObj; @@ -976,7 +1021,7 @@ void ProtocolHandlerImpl::OnTMMessageReceived(const RawMessagePtr tm_message) { } const uint32_t connection_key = tm_message->connection_key(); - SDL_LOG_DEBUG("Received data from TM with connection id " + SDL_LOG_TRACE("Received data from TM with connection id " << connection_key << " msg data_size " << tm_message->data_size()); @@ -985,7 +1030,7 @@ void ProtocolHandlerImpl::OnTMMessageReceived(const RawMessagePtr tm_message) { const ProtocolFramePtrList protocol_frames = incoming_data_handler_.ProcessData( *tm_message, result, &malformed_occurs); - SDL_LOG_DEBUG("Processed " << protocol_frames.size() << " frames"); + SDL_LOG_TRACE("Processed " << protocol_frames.size() << " frames"); if (result != RESULT_OK) { if (result == RESULT_MALFORMED_OCCURS) { SDL_LOG_WARN("Malformed message occurs, connection id " @@ -1377,7 +1422,7 @@ RESULT_CODE ProtocolHandlerImpl::SendMultiFrameMessage( const ProtocolFramePtr firstPacket( new protocol_handler::ProtocolPacket(connection_id, protocol_version, - needs_encryption, + false, FRAME_TYPE_FIRST, service_type, FRAME_DATA_FIRST, @@ -1419,7 +1464,7 @@ RESULT_CODE ProtocolHandlerImpl::SendMultiFrameMessage( RESULT_CODE ProtocolHandlerImpl::HandleMessage(const ProtocolFramePtr packet) { DCHECK_OR_RETURN(packet, RESULT_UNKNOWN); - SDL_LOG_DEBUG("Handling message " << packet); + SDL_LOG_TRACE("Handling message " << packet); switch (packet->frame_type()) { case FRAME_TYPE_CONTROL: SDL_LOG_TRACE("FRAME_TYPE_CONTROL"); @@ -1443,7 +1488,7 @@ RESULT_CODE ProtocolHandlerImpl::HandleSingleFrameMessage( const ProtocolFramePtr packet) { SDL_LOG_AUTO_TRACE(); - SDL_LOG_DEBUG( + SDL_LOG_TRACE( "FRAME_TYPE_SINGLE message of size " << packet->data_size() << "; message " << utils::ConvertBinaryDataToString(packet->data(), packet->data_size())); @@ -1737,8 +1782,17 @@ RESULT_CODE ProtocolHandlerImpl::HandleControlMessageStartSession( reason += " Allowed only in unprotected mode"; } - SendStartSessionNAck( - connection_id, session_id, protocol_version, service_type, reason); + utils::SemanticVersion version; + if (packet->service_type() == kRpc && packet->data() != NULL) { + ParseFullVersion(version, packet); + } + + SendStartSessionNAck(connection_id, + session_id, + protocol_version, + service_type, + reason, + version); return RESULT_OK; } @@ -1814,8 +1868,34 @@ RESULT_CODE ProtocolHandlerImpl::HandleControlMessageRegisterSecondaryTransport( return RESULT_OK; } +bool ProtocolHandlerImpl::ParseFullVersion( + utils::SemanticVersion& full_version, + const ProtocolFramePtr& packet) const { + SDL_LOG_AUTO_TRACE(); + + BsonObject request_params; + size_t request_params_size = bson_object_from_bytes_len( + &request_params, packet->data(), packet->total_data_bytes()); + if (request_params_size > 0) { + char* version_param = + bson_object_get_string(&request_params, strings::protocol_version); + std::string version_string(version_param == NULL ? "" : version_param); + full_version = version_string; + + // Constructed payloads added in Protocol v5 + if (full_version.major_version_ < PROTOCOL_VERSION_5) { + return false; + } + bson_object_deinitialize(&request_params); + } else { + SDL_LOG_WARN("Failed to parse start service packet for version string"); + } + + return true; +} + void ProtocolHandlerImpl::NotifySessionStarted( - const SessionContext& context, + SessionContext& context, std::vector<std::string>& rejected_params, const std::string err_reason) { SDL_LOG_AUTO_TRACE(); @@ -1835,8 +1915,23 @@ void ProtocolHandlerImpl::NotifySessionStarted( const ServiceType service_type = ServiceTypeFromByte(packet->service_type()); const uint8_t protocol_version = packet->protocol_version(); + utils::SemanticVersion full_version; + + // Can't check protocol_version because the first packet is v1, but there + // could still be a payload, in which case we can get the real protocol + // version + if (packet->service_type() == kRpc && packet->data() != NULL) { + if (ParseFullVersion(full_version, packet)) { + const auto connection_key = session_observer_.KeyFromPair( + packet->connection_id(), context.new_session_id_); + connection_handler_.BindProtocolVersionWithSession(connection_key, + full_version); + } else { + rejected_params.push_back(std::string(strings::protocol_version)); + } + } - if (0 == context.new_session_id_) { + if (context.is_start_session_failed_ || !context.new_session_id_) { SDL_LOG_WARN("Refused by session_observer to create service " << static_cast<int32_t>(service_type) << " type."); const auto session_id = packet->session_id(); @@ -1851,7 +1946,8 @@ void ProtocolHandlerImpl::NotifySessionStarted( protocol_version, packet->service_type(), rejected_params, - err_reason); + err_reason, + full_version); return; } @@ -1901,38 +1997,6 @@ void ProtocolHandlerImpl::NotifySessionStarted( } } - std::shared_ptr<utils::SemanticVersion> fullVersion; - - // Can't check protocol_version because the first packet is v1, but there - // could still be a payload, in which case we can get the real protocol - // version - if (packet->service_type() == kRpc && packet->data() != NULL) { - BsonObject request_params; - size_t request_params_size = bson_object_from_bytes_len( - &request_params, packet->data(), packet->total_data_bytes()); - if (request_params_size > 0) { - char* version_param = - bson_object_get_string(&request_params, strings::protocol_version); - std::string version_string(version_param == NULL ? "" : version_param); - fullVersion = std::make_shared<utils::SemanticVersion>(version_string); - - const auto connection_key = session_observer_.KeyFromPair( - packet->connection_id(), context.new_session_id_); - connection_handler_.BindProtocolVersionWithSession(connection_key, - *fullVersion); - // Constructed payloads added in Protocol v5 - if (fullVersion->major_version_ < PROTOCOL_VERSION_5) { - rejected_params.push_back(std::string(strings::protocol_version)); - } - bson_object_deinitialize(&request_params); - } else { - SDL_LOG_WARN("Failed to parse start service packet for version string"); - fullVersion = std::make_shared<utils::SemanticVersion>(); - } - } else { - fullVersion = std::make_shared<utils::SemanticVersion>(); - } - #ifdef ENABLE_SECURITY // for packet is encrypted and security plugin is enable if (context.is_protected_ && security_manager_) { @@ -1943,7 +2007,7 @@ void ProtocolHandlerImpl::NotifySessionStarted( std::make_shared<HandshakeHandler>( *this, session_observer_, - *fullVersion, + full_version, context, packet->protocol_version(), start_session_ack_params, @@ -1969,12 +2033,20 @@ void ProtocolHandlerImpl::NotifySessionStarted( } if (!rejected_params.empty()) { + service_status_update_handler_->OnServiceUpdate( + connection_key, + context.service_type_, + ServiceStatus::SERVICE_START_FAILED); SendStartSessionNAck(context.connection_id_, packet->session_id(), protocol_version, packet->service_type(), rejected_params, - "SSL Handshake failed due to rejected parameters"); + "SSL Handshake failed due to rejected parameters", + full_version); + if (packet->service_type() != kRpc) { + context.is_start_session_failed_ = true; + } } else if (ssl_context->IsInitCompleted()) { // mark service as protected session_observer_.SetProtectionFlag(connection_key, service_type); @@ -1989,7 +2061,7 @@ void ProtocolHandlerImpl::NotifySessionStarted( context.hash_id_, packet->service_type(), PROTECTION_ON, - *fullVersion, + full_version, *start_session_ack_params); } else { SDL_LOG_DEBUG("Adding Handshake handler to listeners: " << handler.get()); @@ -2003,12 +2075,20 @@ void ProtocolHandlerImpl::NotifySessionStarted( if (!security_manager_->IsSystemTimeProviderReady()) { security_manager_->RemoveListener(listener); + service_status_update_handler_->OnServiceUpdate( + connection_key, + context.service_type_, + ServiceStatus::SERVICE_START_FAILED); SendStartSessionNAck(context.connection_id_, packet->session_id(), protocol_version, packet->service_type(), rejected_params, - "System time provider is not ready"); + "System time provider is not ready", + full_version); + if (packet->service_type() != kRpc) { + context.is_start_session_failed_ = true; + } } } } @@ -2029,7 +2109,7 @@ void ProtocolHandlerImpl::NotifySessionStarted( context.hash_id_, packet->service_type(), PROTECTION_OFF, - *fullVersion, + full_version, *start_session_ack_params); } else { service_status_update_handler_->OnServiceUpdate( @@ -2042,10 +2122,20 @@ void ProtocolHandlerImpl::NotifySessionStarted( protocol_version, packet->service_type(), rejected_params, - "Certain parameters in the StartService request were rejected"); + "Certain parameters in the StartService request were rejected", + full_version); + context.is_start_session_failed_ = true; } } +void ProtocolHandlerImpl::NotifySessionStarted( + const SessionContext& context, + std::vector<std::string>& rejected_params, + const std::string err_reason) { + SessionContext context_copy = context; + NotifySessionStarted(context_copy, rejected_params, err_reason); +} + RESULT_CODE ProtocolHandlerImpl::HandleControlMessageHeartBeat( const ProtocolPacket& packet) { const ConnectionID connection_id = packet.connection_id(); @@ -2092,7 +2182,7 @@ void ProtocolHandlerImpl::PopValidAndExpiredMultiframes() { const uint32_t connection_key = session_observer_.KeyFromPair( frame->connection_id(), frame->session_id()); - SDL_LOG_DEBUG("Result frame" << frame << "for connection " + SDL_LOG_TRACE("Result frame" << frame << "for connection " << connection_key); const RawMessagePtr rawMessage(new RawMessage(connection_key, frame->protocol_version(), @@ -2171,7 +2261,7 @@ void ProtocolHandlerImpl::Handle(const impl::RawFordMessageFromMobile message) { } } break; } - SDL_LOG_DEBUG("Message : " << message.get()); + SDL_LOG_TRACE("Message : " << message.get()); const uint8_t c_id = message->connection_id(); const uint32_t m_id = message->session_id(); @@ -2183,7 +2273,7 @@ void ProtocolHandlerImpl::Handle(const impl::RawFordMessageFromMobile message) { if (((0 != message->data()) && (0 != message->data_size())) || FRAME_TYPE_CONTROL == message->frame_type() || FRAME_TYPE_FIRST == message->frame_type()) { - SDL_LOG_DEBUG("Packet: dataSize " << message->data_size()); + SDL_LOG_TRACE("Packet: dataSize " << message->data_size()); HandleMessage(message); PopValidAndExpiredMultiframes(); } else { @@ -2358,7 +2448,7 @@ RESULT_CODE ProtocolHandlerImpl::DecryptFrame(ProtocolFramePtr packet) { void ProtocolHandlerImpl::SendFramesNumber(uint32_t connection_key, int32_t number_of_frames) { - SDL_LOG_DEBUG("SendFramesNumber MobileNaviAck for session " + SDL_LOG_TRACE("SendFramesNumber MobileNaviAck for session " << connection_key); transport_manager::ConnectionUID connection_id = 0; diff --git a/src/components/protocol_handler/src/protocol_packet.cc b/src/components/protocol_handler/src/protocol_packet.cc index db2f124c53..9c3dd03141 100644 --- a/src/components/protocol_handler/src/protocol_packet.cc +++ b/src/components/protocol_handler/src/protocol_packet.cc @@ -262,7 +262,7 @@ ProtocolPacket::ProtocolHeaderValidator::max_payload_size_by_service_type( RESULT_CODE ProtocolPacket::ProtocolHeaderValidator::validate( const ProtocolHeader& header) const { - SDL_LOG_DEBUG("Validating header - " << header); + SDL_LOG_TRACE("Validating header - " << header); // expected payload size will be calculated depending // on used protocol version and service type size_t payload_size = MAXIMUM_FRAME_DATA_V2_SIZE; @@ -390,7 +390,7 @@ RESULT_CODE ProtocolPacket::ProtocolHeaderValidator::validate( return RESULT_FAIL; } } - SDL_LOG_DEBUG("Message header is completely correct."); + SDL_LOG_TRACE("Message header is completely correct."); return RESULT_OK; } diff --git a/src/components/protocol_handler/test/protocol_handler_tm_test.cc b/src/components/protocol_handler/test/protocol_handler_tm_test.cc index 86c39e3551..ae5b7fb1ae 100644 --- a/src/components/protocol_handler/test/protocol_handler_tm_test.cc +++ b/src/components/protocol_handler/test/protocol_handler_tm_test.cc @@ -287,7 +287,7 @@ class ProtocolHandlerImplTest : public ::testing::Test { const bool callback_protection_flag = PROTECTION_OFF; #endif // ENABLE_SECURITY - const protocol_handler::SessionContext context = + protocol_handler::SessionContext context = GetSessionContext(connection_id, NEW_SESSION_ID, session_id, @@ -321,11 +321,15 @@ class ProtocolHandlerImplTest : public ::testing::Test { // Return sessions start success WillOnce(DoAll( NotifyTestAsyncWaiter(waiter), - InvokeMemberFuncWithArg3(protocol_handler_impl.get(), - &ProtocolHandler::NotifySessionStarted, - context, - ByRef(empty_rejected_param_), - std::string()))); + InvokeMemberFuncWithArg3( + protocol_handler_impl.get(), + static_cast<void (ProtocolHandler::*)(SessionContext&, + std::vector<std::string>&, + const std::string)>( + &ProtocolHandler::NotifySessionStarted), + ByRef(context), + ByRef(empty_rejected_param_), + std::string()))); times++; // Expect send Ack with PROTECTION_OFF (on no Security Manager) @@ -570,6 +574,14 @@ TEST_F(ProtocolHandlerImplTest, .Times(call_times) .WillRepeatedly(ReturnRef(video_service_transports)); + protocol_handler::SessionContext context = + GetSessionContext(connection_id, + NEW_SESSION_ID, + SESSION_START_REJECT, + service_type, + HASH_ID_WRONG, + PROTECTION_OFF); + // Expect ConnectionHandler check EXPECT_CALL( session_observer_mock, @@ -581,19 +593,18 @@ TEST_F(ProtocolHandlerImplTest, .Times(call_times) . // Return sessions start rejection - WillRepeatedly( - DoAll(NotifyTestAsyncWaiter(waiter), - SaveArg<2>(&service_type), - InvokeMemberFuncWithArg3(protocol_handler_impl.get(), - &ProtocolHandler::NotifySessionStarted, - GetSessionContext(connection_id, - NEW_SESSION_ID, - SESSION_START_REJECT, - service_type, - HASH_ID_WRONG, - PROTECTION_OFF), - ByRef(empty_rejected_param_), - std::string()))); + WillRepeatedly(DoAll( + NotifyTestAsyncWaiter(waiter), + SaveArg<2>(&service_type), + InvokeMemberFuncWithArg3( + protocol_handler_impl.get(), + static_cast<void (ProtocolHandler::*)(SessionContext&, + std::vector<std::string>&, + const std::string)>( + &ProtocolHandler::NotifySessionStarted), + ByRef(context), + ByRef(empty_rejected_param_), + std::string()))); times += call_times; // Expect send NAck @@ -662,6 +673,14 @@ TEST_F(ProtocolHandlerImplTest, StartSession_Protected_SessionObserverReject) { .Times(call_times) .WillRepeatedly(ReturnRef(video_service_transports)); + protocol_handler::SessionContext context = + GetSessionContext(connection_id, + NEW_SESSION_ID, + SESSION_START_REJECT, + service_type, + HASH_ID_WRONG, + callback_protection_flag); + // Expect ConnectionHandler check EXPECT_CALL( session_observer_mock, @@ -676,16 +695,15 @@ TEST_F(ProtocolHandlerImplTest, StartSession_Protected_SessionObserverReject) { WillRepeatedly(DoAll( NotifyTestAsyncWaiter(waiter), SaveArg<2>(&service_type), - InvokeMemberFuncWithArg3(protocol_handler_impl.get(), - &ProtocolHandler::NotifySessionStarted, - GetSessionContext(connection_id, - NEW_SESSION_ID, - SESSION_START_REJECT, - service_type, - HASH_ID_WRONG, - callback_protection_flag), - ByRef(empty_rejected_param_), - std::string()))); + InvokeMemberFuncWithArg3( + protocol_handler_impl.get(), + static_cast<void (ProtocolHandler::*)(SessionContext&, + std::vector<std::string>&, + const std::string)>( + &ProtocolHandler::NotifySessionStarted), + ByRef(context), + ByRef(empty_rejected_param_), + std::string()))); times += call_times; // Expect send NAck with encryption OFF @@ -741,6 +759,13 @@ TEST_F(ProtocolHandlerImplTest, EXPECT_CALL(protocol_handler_settings_mock, video_service_transports()) .WillOnce(ReturnRef(video_service_transports)); + protocol_handler::SessionContext context = GetSessionContext(connection_id, + NEW_SESSION_ID, + session_id, + start_service, + HASH_ID_WRONG, + PROTECTION_OFF); + // Expect ConnectionHandler check EXPECT_CALL(session_observer_mock, OnSessionStartedCallback(connection_id, @@ -750,18 +775,17 @@ TEST_F(ProtocolHandlerImplTest, An<const BsonObject*>())) . // Return sessions start success - WillOnce( - DoAll(NotifyTestAsyncWaiter(waiter), - InvokeMemberFuncWithArg3(protocol_handler_impl.get(), - &ProtocolHandler::NotifySessionStarted, - GetSessionContext(connection_id, - NEW_SESSION_ID, - session_id, - start_service, - HASH_ID_WRONG, - PROTECTION_OFF), - ByRef(empty_rejected_param_), - std::string()))); + WillOnce(DoAll( + NotifyTestAsyncWaiter(waiter), + InvokeMemberFuncWithArg3( + protocol_handler_impl.get(), + static_cast<void (ProtocolHandler::*)(SessionContext&, + std::vector<std::string>&, + const std::string)>( + &ProtocolHandler::NotifySessionStarted), + ByRef(context), + ByRef(empty_rejected_param_), + std::string()))); times++; SetProtocolVersion2(); @@ -916,6 +940,22 @@ TEST_F(ProtocolHandlerImplTest, EXPECT_CALL(session_observer_mock, ProtocolVersionUsed(_, _, An<utils::SemanticVersion&>())) .WillOnce(Return(true)); + + protocol_handler::SessionContext rejected_context = + GetSessionContext(connection_id2, + session_id2, + SESSION_START_REJECT, + start_service, + HASH_ID_WRONG, + PROTECTION_OFF); + + protocol_handler::SessionContext context = + GetSessionContext(connection_id1, + session_id1, + generated_session_id1, + start_service, + HASH_ID_WRONG, + PROTECTION_OFF); EXPECT_CALL(session_observer_mock, OnSessionStartedCallback(connection_id2, session_id2, @@ -924,26 +964,24 @@ TEST_F(ProtocolHandlerImplTest, An<const BsonObject*>())) .WillOnce(DoAll( NotifyTestAsyncWaiter(waiter), - InvokeMemberFuncWithArg3(protocol_handler_impl.get(), - &ProtocolHandler::NotifySessionStarted, - GetSessionContext(connection_id2, - session_id2, - SESSION_START_REJECT, - start_service, - HASH_ID_WRONG, - PROTECTION_OFF), - ByRef(rejected_param_list), - std::string()), - InvokeMemberFuncWithArg3(protocol_handler_impl.get(), - &ProtocolHandler::NotifySessionStarted, - GetSessionContext(connection_id1, - session_id1, - generated_session_id1, - start_service, - HASH_ID_WRONG, - PROTECTION_OFF), - ByRef(empty_rejected_param_), - std::string()))); + InvokeMemberFuncWithArg3( + protocol_handler_impl.get(), + static_cast<void (ProtocolHandler::*)(SessionContext&, + std::vector<std::string>&, + const std::string)>( + &ProtocolHandler::NotifySessionStarted), + ByRef(rejected_context), + ByRef(rejected_param_list), + std::string()), + InvokeMemberFuncWithArg3( + protocol_handler_impl.get(), + static_cast<void (ProtocolHandler::*)(SessionContext&, + std::vector<std::string>&, + const std::string)>( + &ProtocolHandler::NotifySessionStarted), + ByRef(context), + ByRef(empty_rejected_param_), + std::string()))); times++; BsonObject bson_ack_params; @@ -1208,6 +1246,12 @@ TEST_F(ProtocolHandlerImplTest, SecurityEnable_StartSessionProtocoloV1) { EXPECT_CALL(protocol_handler_settings_mock, video_service_transports()) .WillOnce(ReturnRef(video_service_transports)); + protocol_handler::SessionContext context = GetSessionContext(connection_id, + NEW_SESSION_ID, + session_id, + start_service, + HASH_ID_WRONG, + PROTECTION_OFF); // Expect ConnectionHandler check EXPECT_CALL(session_observer_mock, OnSessionStartedCallback(connection_id, @@ -1217,18 +1261,17 @@ TEST_F(ProtocolHandlerImplTest, SecurityEnable_StartSessionProtocoloV1) { An<const BsonObject*>())) . // Return sessions start success - WillOnce( - DoAll(NotifyTestAsyncWaiter(waiter), - InvokeMemberFuncWithArg3(protocol_handler_impl.get(), - &ProtocolHandler::NotifySessionStarted, - GetSessionContext(connection_id, - NEW_SESSION_ID, - session_id, - start_service, - HASH_ID_WRONG, - PROTECTION_OFF), - ByRef(empty_rejected_param_), - std::string()))); + WillOnce(DoAll( + NotifyTestAsyncWaiter(waiter), + InvokeMemberFuncWithArg3( + protocol_handler_impl.get(), + static_cast<void (ProtocolHandler::*)(SessionContext&, + std::vector<std::string>&, + const std::string)>( + &ProtocolHandler::NotifySessionStarted), + ByRef(context), + ByRef(empty_rejected_param_), + std::string()))); times++; SetProtocolVersion2(); @@ -1280,6 +1323,13 @@ TEST_F(ProtocolHandlerImplTest, SecurityEnable_StartSessionUnprotected) { EXPECT_CALL(protocol_handler_settings_mock, video_service_transports()) .WillOnce(ReturnRef(video_service_transports)); + protocol_handler::SessionContext context = GetSessionContext(connection_id, + NEW_SESSION_ID, + session_id, + start_service, + HASH_ID_WRONG, + PROTECTION_OFF); + // Expect ConnectionHandler check EXPECT_CALL(session_observer_mock, OnSessionStartedCallback(connection_id, @@ -1289,18 +1339,17 @@ TEST_F(ProtocolHandlerImplTest, SecurityEnable_StartSessionUnprotected) { An<const BsonObject*>())) . // Return sessions start success - WillOnce( - DoAll(NotifyTestAsyncWaiter(waiter), - InvokeMemberFuncWithArg3(protocol_handler_impl.get(), - &ProtocolHandler::NotifySessionStarted, - GetSessionContext(connection_id, - NEW_SESSION_ID, - session_id, - start_service, - HASH_ID_WRONG, - PROTECTION_OFF), - ByRef(empty_rejected_param_), - std::string()))); + WillOnce(DoAll( + NotifyTestAsyncWaiter(waiter), + InvokeMemberFuncWithArg3( + protocol_handler_impl.get(), + static_cast<void (ProtocolHandler::*)(SessionContext&, + std::vector<std::string>&, + const std::string)>( + &ProtocolHandler::NotifySessionStarted), + ByRef(context), + ByRef(empty_rejected_param_), + std::string()))); times++; SetProtocolVersion2(); @@ -1334,6 +1383,7 @@ TEST_F(ProtocolHandlerImplTest, SecurityEnable_StartSessionProtected_Fail) { start_service, HASH_ID_WRONG, PROTECTION_ON); + context.is_new_service_ = true; // Expect verification of allowed transport @@ -1360,13 +1410,17 @@ TEST_F(ProtocolHandlerImplTest, SecurityEnable_StartSessionProtected_Fail) { An<const BsonObject*>())) . // Return sessions start success - WillOnce( - DoAll(NotifyTestAsyncWaiter(waiter), - InvokeMemberFuncWithArg3(protocol_handler_impl.get(), - &ProtocolHandler::NotifySessionStarted, - context, - ByRef(empty_rejected_param_), - std::string()))); + WillOnce(DoAll( + NotifyTestAsyncWaiter(waiter), + InvokeMemberFuncWithArg3( + protocol_handler_impl.get(), + static_cast<void (ProtocolHandler::*)(SessionContext&, + std::vector<std::string>&, + const std::string)>( + &ProtocolHandler::NotifySessionStarted), + ByRef(context), + ByRef(empty_rejected_param_), + std::string()))); times++; SetProtocolVersion2(); @@ -1420,6 +1474,13 @@ TEST_F(ProtocolHandlerImplTest, EXPECT_CALL(protocol_handler_settings_mock, video_service_transports()) .WillOnce(ReturnRef(video_service_transports)); + protocol_handler::SessionContext context = GetSessionContext(connection_id, + NEW_SESSION_ID, + session_id, + start_service, + HASH_ID_WRONG, + PROTECTION_ON); + // Expect ConnectionHandler check EXPECT_CALL(session_observer_mock, OnSessionStartedCallback(connection_id, @@ -1429,18 +1490,17 @@ TEST_F(ProtocolHandlerImplTest, An<const BsonObject*>())) . // Return sessions start success - WillOnce( - DoAll(NotifyTestAsyncWaiter(waiter), - InvokeMemberFuncWithArg3(protocol_handler_impl.get(), - &ProtocolHandler::NotifySessionStarted, - GetSessionContext(connection_id, - NEW_SESSION_ID, - session_id, - start_service, - HASH_ID_WRONG, - PROTECTION_ON), - ByRef(empty_rejected_param_), - std::string()))); + WillOnce(DoAll( + NotifyTestAsyncWaiter(waiter), + InvokeMemberFuncWithArg3( + protocol_handler_impl.get(), + static_cast<void (ProtocolHandler::*)(SessionContext&, + std::vector<std::string>&, + const std::string)>( + &ProtocolHandler::NotifySessionStarted), + ByRef(context), + ByRef(empty_rejected_param_), + std::string()))); times++; SetProtocolVersion2(); @@ -1520,13 +1580,17 @@ TEST_F(ProtocolHandlerImplTest, An<const BsonObject*>())) . // Return sessions start success - WillOnce( - DoAll(NotifyTestAsyncWaiter(waiter), - InvokeMemberFuncWithArg3(protocol_handler_impl.get(), - &ProtocolHandler::NotifySessionStarted, - context, - ByRef(empty_rejected_param_), - std::string()))); + WillOnce(DoAll( + NotifyTestAsyncWaiter(waiter), + InvokeMemberFuncWithArg3( + protocol_handler_impl.get(), + static_cast<void (ProtocolHandler::*)(SessionContext&, + std::vector<std::string>&, + const std::string)>( + &ProtocolHandler::NotifySessionStarted), + ByRef(context), + ByRef(empty_rejected_param_), + std::string()))); times++; std::vector<int> services; @@ -1608,6 +1672,13 @@ TEST_F(ProtocolHandlerImplTest, EXPECT_CALL(protocol_handler_settings_mock, video_service_transports()) .WillOnce(ReturnRef(video_service_transports)); + protocol_handler::SessionContext context = GetSessionContext(connection_id, + NEW_SESSION_ID, + session_id, + start_service, + HASH_ID_WRONG, + PROTECTION_ON); + // Expect ConnectionHandler check EXPECT_CALL(session_observer_mock, OnSessionStartedCallback(connection_id, @@ -1617,18 +1688,17 @@ TEST_F(ProtocolHandlerImplTest, An<const BsonObject*>())) . // Return sessions start success - WillOnce( - DoAll(NotifyTestAsyncWaiter(waiter), - InvokeMemberFuncWithArg3(protocol_handler_impl.get(), - &ProtocolHandler::NotifySessionStarted, - GetSessionContext(connection_id, - NEW_SESSION_ID, - session_id, - start_service, - HASH_ID_WRONG, - PROTECTION_ON), - ByRef(empty_rejected_param_), - std::string()))); + WillOnce(DoAll( + NotifyTestAsyncWaiter(waiter), + InvokeMemberFuncWithArg3( + protocol_handler_impl.get(), + static_cast<void (ProtocolHandler::*)(SessionContext&, + std::vector<std::string>&, + const std::string)>( + &ProtocolHandler::NotifySessionStarted), + ByRef(context), + ByRef(empty_rejected_param_), + std::string()))); times++; // call new SSLContext creation @@ -1721,6 +1791,13 @@ TEST_F( EXPECT_CALL(protocol_handler_settings_mock, video_service_transports()) .WillOnce(ReturnRef(video_service_transports)); + protocol_handler::SessionContext context = GetSessionContext(connection_id, + NEW_SESSION_ID, + session_id, + start_service, + HASH_ID_WRONG, + PROTECTION_ON); + // Expect ConnectionHandler check EXPECT_CALL(session_observer_mock, OnSessionStartedCallback(connection_id, @@ -1730,18 +1807,17 @@ TEST_F( An<const BsonObject*>())) . // Return sessions start success - WillOnce( - DoAll(NotifyTestAsyncWaiter(waiter), - InvokeMemberFuncWithArg3(protocol_handler_impl.get(), - &ProtocolHandler::NotifySessionStarted, - GetSessionContext(connection_id, - NEW_SESSION_ID, - session_id, - start_service, - HASH_ID_WRONG, - PROTECTION_ON), - ByRef(empty_rejected_param_), - std::string()))); + WillOnce(DoAll( + NotifyTestAsyncWaiter(waiter), + InvokeMemberFuncWithArg3( + protocol_handler_impl.get(), + static_cast<void (ProtocolHandler::*)(SessionContext&, + std::vector<std::string>&, + const std::string)>( + &ProtocolHandler::NotifySessionStarted), + ByRef(context), + ByRef(empty_rejected_param_), + std::string()))); times++; // call new SSLContext creation @@ -1832,6 +1908,13 @@ TEST_F(ProtocolHandlerImplTest, EXPECT_CALL(protocol_handler_settings_mock, video_service_transports()) .WillOnce(ReturnRef(video_service_transports)); + protocol_handler::SessionContext context = GetSessionContext(connection_id, + NEW_SESSION_ID, + session_id, + start_service, + HASH_ID_WRONG, + PROTECTION_ON); + // Expect ConnectionHandler check EXPECT_CALL(session_observer_mock, OnSessionStartedCallback(connection_id, @@ -1841,18 +1924,17 @@ TEST_F(ProtocolHandlerImplTest, An<const BsonObject*>())) . // Return sessions start success - WillOnce( - DoAll(NotifyTestAsyncWaiter(waiter), - InvokeMemberFuncWithArg3(protocol_handler_impl.get(), - &ProtocolHandler::NotifySessionStarted, - GetSessionContext(connection_id, - NEW_SESSION_ID, - session_id, - start_service, - HASH_ID_WRONG, - PROTECTION_ON), - ByRef(empty_rejected_param_), - std::string()))); + WillOnce(DoAll( + NotifyTestAsyncWaiter(waiter), + InvokeMemberFuncWithArg3( + protocol_handler_impl.get(), + static_cast<void (ProtocolHandler::*)(SessionContext&, + std::vector<std::string>&, + const std::string)>( + &ProtocolHandler::NotifySessionStarted), + ByRef(context), + ByRef(empty_rejected_param_), + std::string()))); times++; // call new SSLContext creation @@ -4068,6 +4150,7 @@ TEST_F(ProtocolHandlerImplTest, EXPECT_TRUE(waiter->WaitFor(times, kAsyncExpectationsTimeout)); } +#ifdef ENABLE_SECURITY TEST_F(ProtocolHandlerImplTest, OnTMMessageSend_ReadyToCloseConnection_Disconnect) { OnTMMessageSend(); @@ -4097,6 +4180,7 @@ TEST_F(ProtocolHandlerImplTest, tm_listener->OnTMMessageSend(message); } +#endif TEST_F(ProtocolHandlerImplTest, OnTMMessageSend_InvalidData_Cancelled) { const uint8_t data_size = 8u; @@ -5170,7 +5254,6 @@ TEST_F(ProtocolHandlerImplTest, SendServiceDataAck_AfterVersion5) { TEST_F(ProtocolHandlerImplTest, StartSession_NACKReason_DisallowedBySettings) { const ServiceType service_type = kMobileNav; const utils::SemanticVersion min_reason_param_version(5, 3, 0); - #ifdef ENABLE_SECURITY AddSecurityManager(); @@ -5207,6 +5290,7 @@ TEST_F(ProtocolHandlerImplTest, StartSession_NACKReason_DisallowedBySettings) { bson_object_put_string(&bson_nack_params, protocol_handler::strings::reason, const_cast<char*>(reason.c_str())); + std::vector<uint8_t> nack_params = CreateVectorFromBsonObject(&bson_nack_params); bson_object_deinitialize(&bson_nack_params); @@ -5267,6 +5351,14 @@ TEST_F(ProtocolHandlerImplTest, StartSession_NACKReason_SessionObserverReject) { .Times(call_times) .WillRepeatedly(ReturnRef(allowed_transports)); + protocol_handler::SessionContext context = + GetSessionContext(connection_id, + NEW_SESSION_ID, + SESSION_START_REJECT, + service_type, + protocol_handler::HASH_ID_WRONG, + PROTECTION_OFF); + // Expect ConnectionHandler check EXPECT_CALL( session_observer_mock, @@ -5278,20 +5370,19 @@ TEST_F(ProtocolHandlerImplTest, StartSession_NACKReason_SessionObserverReject) { .Times(call_times) . // Return sessions start rejection - WillRepeatedly( - DoAll(NotifyTestAsyncWaiter(waiter), - SaveArg<2>(&service_type), - InvokeMemberFuncWithArg3( - protocol_handler_impl.get(), - &protocol_handler::ProtocolHandler::NotifySessionStarted, - GetSessionContext(connection_id, - NEW_SESSION_ID, - SESSION_START_REJECT, - service_type, - protocol_handler::HASH_ID_WRONG, - PROTECTION_OFF), - ByRef(empty_rejected_param_), - err_reason))); + WillRepeatedly(DoAll( + NotifyTestAsyncWaiter(waiter), + SaveArg<2>(&service_type), + InvokeMemberFuncWithArg3( + protocol_handler_impl.get(), + static_cast<void (protocol_handler::ProtocolHandler::*)( + protocol_handler::SessionContext&, + std::vector<std::string>&, + const std::string)>( + &protocol_handler::ProtocolHandler::NotifySessionStarted), + ByRef(context), + ByRef(empty_rejected_param_), + err_reason))); times += call_times; // Expect send NAck @@ -5413,6 +5504,140 @@ TEST_F(ProtocolHandlerImplTest, EXPECT_TRUE(waiter->WaitFor(times, kAsyncExpectationsTimeout)); } +TEST_F(ProtocolHandlerImplTest, + StartSessionAck_ProtocolVehicleData_VehicleDataParamsForV5) { + auto waiter = TestAsyncWaiter::createInstance(); + + const size_t maximum_rpc_payload_size = 1500; + EXPECT_CALL(protocol_handler_settings_mock, maximum_rpc_payload_size()) + .WillOnce(Return(maximum_rpc_payload_size)); + InitProtocolHandlerImpl(0u, 0u); + + EXPECT_CALL(protocol_handler_settings_mock, max_supported_protocol_version()) + .WillOnce(Return(PROTOCOL_VERSION_5)); + + std::map<std::string, std::string> vehicle_mapping = { + {protocol_handler::strings::vehicle_make, "TestMake"}, + {protocol_handler::strings::vehicle_model, "TestModel"}, + {protocol_handler::strings::vehicle_model_year, "2021"}, + {protocol_handler::strings::vehicle_trim, "TestTrim"}, + {protocol_handler::strings::vehicle_system_hardware_version, "TestHW"}, + {protocol_handler::strings::vehicle_system_software_version, "TestSW"}}; + + connection_handler::ProtocolVehicleData data{ + vehicle_mapping[protocol_handler::strings::vehicle_make], + vehicle_mapping[protocol_handler::strings::vehicle_model], + vehicle_mapping[protocol_handler::strings::vehicle_model_year], + vehicle_mapping[protocol_handler::strings::vehicle_trim], + vehicle_mapping + [protocol_handler::strings::vehicle_system_software_version], + vehicle_mapping + [protocol_handler::strings::vehicle_system_hardware_version]}; + + EXPECT_CALL(connection_handler_mock, GetProtocolVehicleData(_)) + .WillOnce(DoAll(SetArgReferee<0>(data), Return(true))); + + const uint32_t hash_id = 123456; + char full_version_string[] = "5.4.0"; + + BsonObject expected_obj; + bson_object_initialize_default(&expected_obj); + // mtu + bson_object_put_int64(&expected_obj, + protocol_handler::strings::mtu, + static_cast<int64_t>(maximum_rpc_payload_size)); + // hashId + bson_object_put_int32(&expected_obj, + protocol_handler::strings::hash_id, + static_cast<int32_t>(hash_id)); + // protocolVersion + bson_object_put_string(&expected_obj, + protocol_handler::strings::protocol_version, + full_version_string); + + // vehicle data + const uint16_t max_string_length = 500; + for (auto& data_pair : vehicle_mapping) { + char value_buffer[max_string_length + 1]; // extra byte for NULL symbol + strncpy(value_buffer, data_pair.second.c_str(), sizeof(value_buffer)); + value_buffer[max_string_length] = 0; + + bson_object_put_string( + &expected_obj, data_pair.first.c_str(), value_buffer); + } + + // secondaryTransports + BsonArray secondary_transports; + bson_array_initialize(&secondary_transports, 0); + bson_object_put_array(&expected_obj, + protocol_handler::strings::secondary_transports, + &secondary_transports); + + BsonArray audio_service_transports; + bson_array_initialize(&audio_service_transports, 1); + bson_array_add_int32(&audio_service_transports, 1); + bson_object_put_array(&expected_obj, + protocol_handler::strings::audio_service_transports, + &audio_service_transports); + + BsonArray video_service_transports; + bson_array_initialize(&video_service_transports, 1); + bson_array_add_int32(&video_service_transports, 1); + bson_object_put_array(&expected_obj, + protocol_handler::strings::video_service_transports, + &video_service_transports); + + std::vector<uint8_t> expected_param = + CreateVectorFromBsonObject(&expected_obj); + + bson_object_deinitialize(&expected_obj); + + EXPECT_CALL(transport_manager_mock, + SendMessageToDevice(ControlMessage(FRAME_DATA_START_SERVICE_ACK, + PROTECTION_OFF, + connection_id, + Eq(expected_param)))) + .WillOnce(DoAll(NotifyTestAsyncWaiter(waiter), Return(E_SUCCESS))); + + connection_handler::SessionTransports dummy_st = {0, 0}; + EXPECT_CALL(connection_handler_mock, + SetSecondaryTransportID(_, kDisabledSecondary)) + .WillOnce(Return(dummy_st)); + EXPECT_CALL(protocol_handler_settings_mock, multiple_transports_enabled()) + .WillRepeatedly(Return(false)); + std::vector<std::string> empty_vec; + EXPECT_CALL(protocol_handler_settings_mock, audio_service_transports()) + .WillRepeatedly(ReturnRef(empty_vec)); + EXPECT_CALL(protocol_handler_settings_mock, video_service_transports()) + .WillRepeatedly(ReturnRef(empty_vec)); + EXPECT_CALL(session_observer_mock, + TransportTypeProfileStringFromConnHandle(connection_id)) + .WillRepeatedly(Return("WEBSOCKET")); + +#ifdef ENABLE_SECURITY + AddSecurityManager(); + + EXPECT_CALL(session_observer_mock, KeyFromPair(connection_id, session_id)) + .WillRepeatedly(Return(connection_key)); + + EXPECT_CALL(session_observer_mock, GetSSLContext(connection_key, kRpc)) + .WillOnce(ReturnNull()); +#endif // ENABLE_SECURITY + + const uint8_t input_protocol_version = 5; + utils::SemanticVersion full_version(5, 4, 0); + + protocol_handler_impl->SendStartSessionAck(connection_id, + session_id, + input_protocol_version, + hash_id, + kRpc, + false /* protection */, + full_version); + + EXPECT_TRUE(waiter->WaitFor(1, kAsyncExpectationsTimeout)); +} + } // namespace protocol_handler_test } // namespace components } // namespace test diff --git a/src/components/security_manager/include/security_manager/crypto_manager_settings_impl.h b/src/components/security_manager/include/security_manager/crypto_manager_settings_impl.h index f170ef90a7..d6658a79bc 100644 --- a/src/components/security_manager/include/security_manager/crypto_manager_settings_impl.h +++ b/src/components/security_manager/include/security_manager/crypto_manager_settings_impl.h @@ -83,6 +83,10 @@ class CryptoManagerSettingsImpl : public CryptoManagerSettings { return profile_.force_unprotected_service(); } + uint32_t security_level() const OVERRIDE { + return profile_.security_level(); + } + private: const profile::Profile& profile_; const std::string certificate_data_; diff --git a/src/components/security_manager/src/crypto_manager_impl.cc b/src/components/security_manager/src/crypto_manager_impl.cc index 7d3b7869f2..717991cf5c 100644 --- a/src/components/security_manager/src/crypto_manager_impl.cc +++ b/src/components/security_manager/src/crypto_manager_impl.cc @@ -171,6 +171,7 @@ bool CryptoManagerImpl::Init() { #else SDL_LOG_DEBUG("SSLv3 is used"); method = is_server ? SSLv3_server_method() : SSLv3_client_method(); + SSL_CTX_set_max_proto_version(context_, SSL3_VERSION); break; #endif case TLSv1: @@ -179,6 +180,7 @@ bool CryptoManagerImpl::Init() { method = is_server ? TLSv1_server_method() : TLSv1_client_method(); #else method = is_server ? TLS_server_method() : TLS_client_method(); + SSL_CTX_set_max_proto_version(context_, TLS1_VERSION); #endif break; case TLSv1_1: @@ -191,6 +193,7 @@ bool CryptoManagerImpl::Init() { method = is_server ? TLSv1_1_server_method() : TLSv1_1_client_method(); #else method = is_server ? TLS_server_method() : TLS_client_method(); + SSL_CTX_set_max_proto_version(context_, TLS1_1_VERSION); #endif break; case TLSv1_2: @@ -203,6 +206,7 @@ bool CryptoManagerImpl::Init() { method = is_server ? TLSv1_2_server_method() : TLSv1_2_client_method(); #else method = is_server ? TLS_server_method() : TLS_client_method(); + SSL_CTX_set_max_proto_version(context_, TLS1_2_VERSION); #endif break; case DTLSv1: @@ -211,6 +215,7 @@ bool CryptoManagerImpl::Init() { method = is_server ? DTLSv1_server_method() : DTLSv1_client_method(); #else method = is_server ? DTLS_server_method() : DTLS_client_method(); + SSL_CTX_set_max_proto_version(context_, DTLS1_VERSION); #endif break; default: @@ -226,6 +231,7 @@ bool CryptoManagerImpl::Init() { utils::ScopeGuard guard = utils::MakeGuard(free_ctx, &context_); // Disable SSL2 as deprecated + // TLS 1.2 is the max supported TLS version for SDL SSL_CTX_set_options(context_, SSL_OP_NO_SSLv2); SaveCertificateData(get_settings().certificate_data()); @@ -234,14 +240,31 @@ bool CryptoManagerImpl::Init() { SDL_LOG_WARN("Empty ciphers list"); } else { SDL_LOG_DEBUG("Cipher list: " << get_settings().ciphers_list()); + // If using openssl 1.1.1, this method may always return true + // https://github.com/openssl/openssl/issues/7196#issue-359287519 if (!SSL_CTX_set_cipher_list(context_, get_settings().ciphers_list().c_str())) { SDL_LOG_ERROR( "Could not set cipher list: " << get_settings().ciphers_list()); return false; } +#if OPENSSL_VERSION_NUMBER > OPENSSL1_1_VERSION + auto sk = SSL_CTX_get_ciphers(context_); + const char* p; + for (int i = 0; i < sk_SSL_CIPHER_num(sk); i++) { + const SSL_CIPHER* c = sk_SSL_CIPHER_value(sk, i); + p = SSL_CIPHER_get_name(c); + if (p == NULL) + break; + SDL_LOG_DEBUG("Using Cipher: " << p); + } +#endif } +#if OPENSSL_VERSION_NUMBER >= OPENSSL1_1_VERSION + SSL_CTX_set_security_level(context_, get_settings().security_level()); +#endif + if (get_settings().ca_cert_path().empty()) { SDL_LOG_WARN("Setting up empty CA certificate location"); } diff --git a/src/components/security_manager/src/ssl_context_impl.cc b/src/components/security_manager/src/ssl_context_impl.cc index 3e1b7db0bb..1c8b009097 100644 --- a/src/components/security_manager/src/ssl_context_impl.cc +++ b/src/components/security_manager/src/ssl_context_impl.cc @@ -131,6 +131,8 @@ CryptoManagerImpl::SSLContextImpl::create_max_block_sizes() { rc.insert(std::make_pair("AES128-SHA", seed_sha_max_block_size)); rc.insert( std::make_pair("AES256-GCM-SHA384", aes128_gcm_sha256_max_block_size)); + rc.insert(std::make_pair("ECDHE-RSA-AES256-GCM-SHA384", + aes128_gcm_sha256_max_block_size)); rc.insert(std::make_pair("AES256-SHA256", aes128_sha256_max_block_size)); rc.insert(std::make_pair("AES256-SHA", seed_sha_max_block_size)); rc.insert(std::make_pair("CAMELLIA128-SHA", seed_sha_max_block_size)); @@ -522,16 +524,15 @@ bool CryptoManagerImpl::SSLContextImpl::Decrypt(const uint8_t* const in_data, size_t CryptoManagerImpl::SSLContextImpl::get_max_block_size(size_t mtu) const { SDL_LOG_AUTO_TRACE(); + const auto max_allowed_block_size = + mtu > SSL3_RT_MAX_PLAIN_LENGTH ? SSL3_RT_MAX_PLAIN_LENGTH : mtu; if (!max_block_size_) { // FIXME(EZamakhov): add correct logics for TLS1/1.2/SSL3 // For SSL3.0 set temporary value 90, old TLS1.2 value is 29 - assert(mtu > 90); - return mtu - 90; + assert(max_allowed_block_size > 90); + return max_allowed_block_size - 90; } - const auto max_allowed_block_size = - mtu > SSL3_RT_MAX_PLAIN_LENGTH ? SSL3_RT_MAX_PLAIN_LENGTH : mtu; - return max_block_size_(max_allowed_block_size); } diff --git a/src/components/security_manager/test/crypto_manager_impl_test.cc b/src/components/security_manager/test/crypto_manager_impl_test.cc index d30fa5ef23..85e1ad3129 100644 --- a/src/components/security_manager/test/crypto_manager_impl_test.cc +++ b/src/components/security_manager/test/crypto_manager_impl_test.cc @@ -33,6 +33,7 @@ #ifdef __QNXNTO__ #include <openssl/ssl3.h> #else +#include <openssl/opensslv.h> #include <openssl/ssl.h> #endif //__QNXNTO__ #include <fstream> @@ -43,6 +44,8 @@ #include "security_manager/crypto_manager_impl.h" #include "security_manager/mock_security_manager_settings.h" +#define OPENSSL1_1_VERSION 0x1010000fL + using ::testing::NiceMock; using ::testing::Return; using ::testing::ReturnRef; @@ -158,6 +161,9 @@ TEST_F(CryptoManagerTest, WrongInit) { EXPECT_FALSE(crypto_manager_->Init()); EXPECT_NE(std::string(), crypto_manager_->LastError()); +#if OPENSSL1_1_VERSION >= OPENSSL_VERSION_NUMBER + // Legacy test, openssl 1.1.1 changed the error behavior of + // SSL_CTX_set_cipher_list EXPECT_CALL(*mock_security_manager_settings_, security_manager_protocol_name()) .WillOnce(Return(security_manager::TLSv1_2)); @@ -167,6 +173,7 @@ TEST_F(CryptoManagerTest, WrongInit) { .WillRepeatedly(ReturnRef(invalid_cipher)); EXPECT_FALSE(crypto_manager_->Init()); EXPECT_NE(std::string(), crypto_manager_->LastError()); +#endif } // #ifndef __QNXNTO__ diff --git a/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_device_scanner.h b/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_device_scanner.h index 768d9ebb54..9bfe05758f 100644 --- a/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_device_scanner.h +++ b/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_device_scanner.h @@ -171,16 +171,16 @@ class BluetoothDeviceScanner : public DeviceScanner { TransportAdapterController* controller_; threads::Thread* thread_; - bool shutdown_requested_; + std::atomic<bool> shutdown_requested_; bool ready_; bool device_scan_requested_; sync_primitives::Lock device_scan_requested_lock_; + sync_primitives::Lock terminate_lock_; sync_primitives::ConditionalVariable device_scan_requested_cv_; std::vector<bdaddr_t> paired_devices_; DeviceVector paired_devices_with_sdl_; - DeviceVector found_devices_with_sdl_; /** * @brief UUID of SmartDeviceLink service. diff --git a/src/components/transport_manager/include/transport_manager/cloud/websocket_client_connection.h b/src/components/transport_manager/include/transport_manager/cloud/websocket_client_connection.h index 76c8ca73cd..0465effa94 100644 --- a/src/components/transport_manager/include/transport_manager/cloud/websocket_client_connection.h +++ b/src/components/transport_manager/include/transport_manager/cloud/websocket_client_connection.h @@ -183,7 +183,6 @@ class WebsocketClientConnection WebsocketClientConnection& handler_; sync_primitives::Lock queue_lock_; sync_primitives::ConditionalVariable queue_new_items_; - std::atomic_bool write_pending_; std::atomic_bool shutdown_; sync_primitives::Lock write_lock_; diff --git a/src/components/transport_manager/include/transport_manager/websocket_server/websocket_device.h b/src/components/transport_manager/include/transport_manager/websocket_server/websocket_device.h index 10c6e54424..84235eefa4 100644 --- a/src/components/transport_manager/include/transport_manager/websocket_server/websocket_device.h +++ b/src/components/transport_manager/include/transport_manager/websocket_server/websocket_device.h @@ -38,8 +38,10 @@ #ifndef SRC_COMPONENTS_TRANSPORT_MANAGER_INCLUDE_TRANSPORT_MANAGER_WEBSOCKET_SERVER_WEBSOCKET_DEVICE_H_ #define SRC_COMPONENTS_TRANSPORT_MANAGER_INCLUDE_TRANSPORT_MANAGER_WEBSOCKET_SERVER_WEBSOCKET_DEVICE_H_ +#include <boost/asio/ip/tcp.hpp> #include <boost/beast/websocket.hpp> #include <string> + #include "transport_manager/transport_adapter/device.h" namespace transport_manager { diff --git a/src/components/transport_manager/include/transport_manager/websocket_server/websocket_session.h b/src/components/transport_manager/include/transport_manager/websocket_server/websocket_session.h index f1be1a3b54..009d2fe07c 100644 --- a/src/components/transport_manager/include/transport_manager/websocket_server/websocket_session.h +++ b/src/components/transport_manager/include/transport_manager/websocket_server/websocket_session.h @@ -32,7 +32,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define SRC_COMPONENTS_TRANSPORT_MANAGER_INCLUDE_TRANSPORT_MANAGER_WEBSOCKET_SERVER_WEBSOCKET_SESSION_H_ #include <boost/asio/bind_executor.hpp> -#include <boost/asio/strand.hpp> #include <boost/beast/core.hpp> #include <boost/beast/websocket.hpp> #include <functional> @@ -99,7 +98,6 @@ class WebSocketSession protected: tcp::socket socket_; websocket::stream<ExecutorType> ws_; - boost::asio::strand<boost::asio::io_context::executor_type> strand_; boost::beast::flat_buffer buffer_; DataReceiveCallback data_receive_; DataSendDoneCallback data_send_done_; diff --git a/src/components/transport_manager/src/bluetooth/bluetooth_device_scanner.cc b/src/components/transport_manager/src/bluetooth/bluetooth_device_scanner.cc index f152f1f78d..ce0c2900b7 100644 --- a/src/components/transport_manager/src/bluetooth/bluetooth_device_scanner.cc +++ b/src/components/transport_manager/src/bluetooth/bluetooth_device_scanner.cc @@ -95,10 +95,10 @@ int FindPairedDevs(std::vector<bdaddr_t>* result) { delete[] buffer; buffer = new char[1028]; } - pclose(pipe); + int status = pclose(pipe); SDL_LOG_TRACE("exit with 0"); delete[] buffer; - return 0; + return status; } } // namespace @@ -112,6 +112,7 @@ BluetoothDeviceScanner::BluetoothDeviceScanner( , ready_(true) , device_scan_requested_(false) , device_scan_requested_lock_() + , terminate_lock_() , device_scan_requested_cv_() , auto_repeat_search_(auto_repeat_search) , auto_repeat_pause_sec_(auto_repeat_pause_sec) { @@ -148,6 +149,7 @@ BluetoothDeviceScanner::BluetoothDeviceScanner( , ready_(true) , device_scan_requested_(false) , device_scan_requested_lock_() + , terminate_lock_() , device_scan_requested_cv_() , auto_repeat_search_(auto_repeat_search) , auto_repeat_pause_sec_(auto_repeat_pause_sec) { @@ -173,9 +175,6 @@ void BluetoothDeviceScanner::UpdateTotalDeviceList() { devices.insert(devices.end(), paired_devices_with_sdl_.begin(), paired_devices_with_sdl_.end()); - devices.insert(devices.end(), - found_devices_with_sdl_.begin(), - found_devices_with_sdl_.end()); controller_->SearchDeviceDone(devices); } @@ -212,38 +211,9 @@ void BluetoothDeviceScanner::DoInquiry() { paired_devices_, device_handle, &paired_devices_with_sdl_); UpdateTotalDeviceList(); - SDL_LOG_INFO("Starting hci_inquiry on device " << device_id); - const uint8_t inquiry_time = 8u; // Time unit is 1.28 seconds - const size_t max_devices = 256u; - inquiry_info* inquiry_info_list = new inquiry_info[max_devices]; - - const int number_of_devices = hci_inquiry(device_id, - inquiry_time, - max_devices, - 0, - &inquiry_info_list, - IREQ_CACHE_FLUSH); - - if (number_of_devices >= 0) { - SDL_LOG_INFO("hci_inquiry: found " << number_of_devices << " devices"); - std::vector<bdaddr_t> found_devices(number_of_devices); - for (int i = 0; i < number_of_devices; ++i) { - found_devices[i] = inquiry_info_list[i].bdaddr; - } - found_devices_with_sdl_.clear(); - CheckSDLServiceOnDevices( - found_devices, device_handle, &found_devices_with_sdl_); - } - UpdateTotalDeviceList(); controller_->FindNewApplicationsRequest(); close(device_handle); - delete[] inquiry_info_list; - - if (number_of_devices < 0) { - SDL_LOG_DEBUG("number_of_devices < 0"); - controller_->SearchDeviceFailed(SearchDeviceError()); - } } void BluetoothDeviceScanner::CheckSDLServiceOnDevices( @@ -424,7 +394,10 @@ void BluetoothDeviceScanner::Thread() { if (auto_repeat_search_) { while (!shutdown_requested_) { DoInquiry(); - device_scan_requested_ = false; + { + sync_primitives::AutoLock auto_lock(device_scan_requested_lock_); + device_scan_requested_ = false; + } TimedWaitForDeviceScanRequest(); } } else { // search only on demand @@ -452,12 +425,22 @@ void BluetoothDeviceScanner::TimedWaitForDeviceScanRequest() { return; } + if (shutdown_requested_) { + SDL_LOG_INFO("Bluetooth scanner Condition: shutdown_requested_ == true"); + return; + } + { sync_primitives::AutoLock auto_lock(device_scan_requested_lock_); while (!(device_scan_requested_ || shutdown_requested_)) { + if (!terminate_lock_.Try()) { + // Lock is taken by terminate thread, return + return; + } const sync_primitives::ConditionalVariable::WaitStatus wait_status = device_scan_requested_cv_.WaitFor(auto_lock, auto_repeat_pause_sec_ * 1000); + terminate_lock_.Release(); if (wait_status == sync_primitives::ConditionalVariable::kTimeout) { SDL_LOG_INFO("Bluetooth scanner timeout, performing scan"); device_scan_requested_ = true; @@ -478,13 +461,16 @@ TransportAdapter::Error BluetoothDeviceScanner::Init() { void BluetoothDeviceScanner::Terminate() { SDL_LOG_AUTO_TRACE(); + if (shutdown_requested_) + return; shutdown_requested_ = true; if (thread_) { + device_scan_requested_cv_.NotifyOne(); { sync_primitives::AutoLock auto_lock(device_scan_requested_lock_); device_scan_requested_ = false; - device_scan_requested_cv_.NotifyOne(); } + sync_primitives::AutoLock auto_lock(terminate_lock_); SDL_LOG_INFO("Waiting for bluetooth device scanner thread termination"); thread_->Stop(threads::Thread::kThreadStopDelegate); SDL_LOG_INFO("Bluetooth device scanner thread stopped"); diff --git a/src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc b/src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc index abeb50e798..88a219f57e 100644 --- a/src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc +++ b/src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc @@ -58,7 +58,7 @@ BluetoothTransportAdapter::BluetoothTransportAdapter( resumption::LastStateWrapperPtr last_state_wrapper, const TransportManagerSettings& settings) : TransportAdapterImpl( - new BluetoothDeviceScanner(this, true, 0, settings.bluetooth_uuid()), + new BluetoothDeviceScanner(this, true, 15, settings.bluetooth_uuid()), new BluetoothConnectionFactory(this), NULL, last_state_wrapper, diff --git a/src/components/transport_manager/src/cloud/websocket_client_connection.cc b/src/components/transport_manager/src/cloud/websocket_client_connection.cc index b190e73cb6..a84723d2a1 100644 --- a/src/components/transport_manager/src/cloud/websocket_client_connection.cc +++ b/src/components/transport_manager/src/cloud/websocket_client_connection.cc @@ -240,7 +240,7 @@ void WebsocketClientConnection::OnRead(boost::system::error_code ec, if (ec) { std::string str_err = "ErrorMessage: " + ec.message(); SDL_LOG_ERROR(str_err); - ws_.lowest_layer().close(); + boost::beast::get_lowest_layer(ws_).close(); ioc_.stop(); Shutdown(); return; diff --git a/src/components/transport_manager/src/transport_adapter/threaded_socket_connection.cc b/src/components/transport_manager/src/transport_adapter/threaded_socket_connection.cc index eb92599ae5..61562d88c0 100644 --- a/src/components/transport_manager/src/transport_adapter/threaded_socket_connection.cc +++ b/src/components/transport_manager/src/transport_adapter/threaded_socket_connection.cc @@ -237,13 +237,13 @@ void ThreadedSocketConnection::Transmit() { poll_fds[1].fd = read_fd_; poll_fds[1].events = POLLIN | POLLPRI; - SDL_LOG_DEBUG("poll " << this); + SDL_LOG_TRACE("poll " << this); if (-1 == poll(poll_fds, kPollFdsSize, -1)) { SDL_LOG_ERROR_WITH_ERRNO("poll failed for connection " << this); Abort(); return; } - SDL_LOG_DEBUG("poll is ok " << this << " revents0: " << std::hex + SDL_LOG_TRACE("poll is ok " << this << " revents0: " << std::hex << poll_fds[0].revents << " revents1:" << std::hex << poll_fds[1].revents); // error check @@ -307,7 +307,7 @@ bool ThreadedSocketConnection::Receive() { bytes_read = recv(socket_, buffer, sizeof(buffer), MSG_DONTWAIT); if (bytes_read > 0) { - SDL_LOG_DEBUG("Received " << bytes_read << " bytes for connection " + SDL_LOG_TRACE("Received " << bytes_read << " bytes for connection " << this); ::protocol_handler::RawMessagePtr frame( new protocol_handler::RawMessage(0, 0, buffer, bytes_read, false)); diff --git a/src/components/transport_manager/src/transport_manager_impl.cc b/src/components/transport_manager/src/transport_manager_impl.cc index ee6398db44..bb6f3626e1 100644 --- a/src/components/transport_manager/src/transport_manager_impl.cc +++ b/src/components/transport_manager/src/transport_manager_impl.cc @@ -768,7 +768,7 @@ void TransportManagerImpl::PostMessage( void TransportManagerImpl::PostEvent(const TransportAdapterEvent& event) { SDL_LOG_AUTO_TRACE(); - SDL_LOG_DEBUG("TransportAdapterEvent: " << &event); + SDL_LOG_TRACE("TransportAdapterEvent: " << &event); event_queue_.PostMessage(event); } @@ -823,12 +823,12 @@ void TransportManagerImpl::DeactivateDeviceConnections( TransportManagerImpl::ConnectionInternal* TransportManagerImpl::GetConnection( const ConnectionUID id) { SDL_LOG_AUTO_TRACE(); - SDL_LOG_DEBUG("ConnectionUID: " << id); + SDL_LOG_TRACE("ConnectionUID: " << id); for (std::vector<ConnectionInternal>::iterator it = connections_.begin(); it != connections_.end(); ++it) { if (it->id == id) { - SDL_LOG_DEBUG("ConnectionInternal. It's address: " << &*it); + SDL_LOG_TRACE("ConnectionInternal. It's address: " << &*it); return &*it; } } @@ -838,13 +838,13 @@ TransportManagerImpl::ConnectionInternal* TransportManagerImpl::GetConnection( TransportManagerImpl::ConnectionInternal* TransportManagerImpl::GetConnection( const DeviceUID& device, const ApplicationHandle& application) { SDL_LOG_AUTO_TRACE(); - SDL_LOG_DEBUG("DeviceUID: " << device + SDL_LOG_TRACE("DeviceUID: " << device << "ApplicationHandle: " << application); for (std::vector<ConnectionInternal>::iterator it = connections_.begin(); it != connections_.end(); ++it) { if (it->device == device && it->application == application) { - SDL_LOG_DEBUG("ConnectionInternal. It's address: " << &*it); + SDL_LOG_TRACE("ConnectionInternal. It's address: " << &*it); return &*it; } } @@ -1297,7 +1297,7 @@ void TransportManagerImpl::Handle(TransportAdapterEvent event) { #endif // TELEMETRY_MONITOR RaiseEvent(&TransportManagerListener::OnTMMessageReceived, event.event_data); - SDL_LOG_DEBUG("event_type = ON_RECEIVED_DONE"); + SDL_LOG_TRACE("event_type = ON_RECEIVED_DONE"); break; } case EventTypeEnum::ON_RECEIVED_FAIL: { diff --git a/src/components/transport_manager/src/websocket_server/websocket_secure_session.cc b/src/components/transport_manager/src/websocket_server/websocket_secure_session.cc index a533bdcffc..699d2757fd 100644 --- a/src/components/transport_manager/src/websocket_server/websocket_secure_session.cc +++ b/src/components/transport_manager/src/websocket_server/websocket_secure_session.cc @@ -60,11 +60,9 @@ void WebSocketSecureSession<ExecutorType>::AsyncAccept() { // Perform the SSL handshake WebSocketSecureSession<ExecutorType>::ws_.next_layer().async_handshake( ssl::stream_base::server, - boost::asio::bind_executor( - WebSocketSecureSession<ExecutorType>::strand_, - std::bind(&WebSocketSecureSession::AsyncHandshake, - this->shared_from_this(), - std::placeholders::_1))); + std::bind(&WebSocketSecureSession::AsyncHandshake, + this->shared_from_this(), + std::placeholders::_1)); } template <typename ExecutorType> diff --git a/src/components/transport_manager/src/websocket_server/websocket_session.cc b/src/components/transport_manager/src/websocket_server/websocket_session.cc index 8a05b9d9aa..1def04d700 100644 --- a/src/components/transport_manager/src/websocket_server/websocket_session.cc +++ b/src/components/transport_manager/src/websocket_server/websocket_session.cc @@ -48,7 +48,6 @@ WebSocketSession<tcp::socket&>::WebSocketSession( OnIOErrorCallback on_error) : socket_(std::move(socket)) , ws_(socket_) - , strand_(ws_.get_executor()) , data_receive_(data_receive) , data_send_done_(data_send_done) , data_send_failed_(data_send_failed) @@ -67,7 +66,6 @@ WebSocketSession<ssl::stream<tcp::socket&> >::WebSocketSession( OnIOErrorCallback on_error) : socket_(std::move(socket)) , ws_(socket_, ctx) - , strand_(ws_.get_executor()) , data_receive_(data_receive) , data_send_done_(data_send_done) , data_send_failed_(data_send_failed) @@ -83,11 +81,9 @@ WebSocketSession<ExecutorType>::~WebSocketSession() {} template <typename ExecutorType> void WebSocketSession<ExecutorType>::AsyncAccept() { SDL_LOG_AUTO_TRACE(); - ws_.async_accept( - boost::asio::bind_executor(strand_, - std::bind(&WebSocketSession::AsyncRead, - this->shared_from_this(), - std::placeholders::_1))); + ws_.async_accept(std::bind(&WebSocketSession::AsyncRead, + this->shared_from_this(), + std::placeholders::_1)); } template <typename ExecutorType> @@ -100,11 +96,10 @@ void WebSocketSession<ExecutorType>::AsyncRead(boost::system::error_code ec) { } ws_.async_read(buffer_, - boost::asio::bind_executor(strand_, - std::bind(&WebSocketSession::Read, - this->shared_from_this(), - std::placeholders::_1, - std::placeholders::_2))); + std::bind(&WebSocketSession::Read, + this->shared_from_this(), + std::placeholders::_1, + std::placeholders::_2)); } template <typename ExecutorType> diff --git a/src/components/transport_manager/test/include/transport_manager/cloud/sample_websocket_server.h b/src/components/transport_manager/test/include/transport_manager/cloud/sample_websocket_server.h index e29f182059..d1bbde05a8 100644 --- a/src/components/transport_manager/test/include/transport_manager/cloud/sample_websocket_server.h +++ b/src/components/transport_manager/test/include/transport_manager/cloud/sample_websocket_server.h @@ -38,7 +38,6 @@ #include <boost/asio/ip/tcp.hpp> #include <boost/asio/placeholders.hpp> #include <boost/asio/ssl/stream.hpp> -#include <boost/asio/strand.hpp> #include <boost/asio/thread_pool.hpp> #include <boost/beast/core.hpp> #include <boost/beast/websocket.hpp> @@ -80,7 +79,6 @@ class WSSession : public std::enable_shared_from_this<WSSession> { websocket::stream<tcp::socket> ws_; beast::flat_buffer buffer_; - boost::asio::strand<boost::asio::io_context::executor_type> strand_; http::request<http::string_body> req_; std::set<std::string> url_routes_; }; diff --git a/src/components/transport_manager/test/include/transport_manager/websocket_server/websocket_sample_client.h b/src/components/transport_manager/test/include/transport_manager/websocket_server/websocket_sample_client.h index 138502e02c..0a447a118d 100644 --- a/src/components/transport_manager/test/include/transport_manager/websocket_server/websocket_sample_client.h +++ b/src/components/transport_manager/test/include/transport_manager/websocket_server/websocket_sample_client.h @@ -39,7 +39,6 @@ #include <boost/asio/bind_executor.hpp> #include <boost/asio/connect.hpp> #include <boost/asio/ssl/stream.hpp> -#include <boost/asio/strand.hpp> #include <boost/asio/thread_pool.hpp> #include <boost/beast/core.hpp> #include <boost/beast/websocket.hpp> diff --git a/src/components/transport_manager/test/sample_websocket_server.cc b/src/components/transport_manager/test/sample_websocket_server.cc index 9b0e5b59d5..bd153adad4 100644 --- a/src/components/transport_manager/test/sample_websocket_server.cc +++ b/src/components/transport_manager/test/sample_websocket_server.cc @@ -42,8 +42,7 @@ void Fail(char const* tag, boost::system::error_code ec) { namespace sample { namespace websocket { -WSSession::WSServer::WSServer(tcp::socket&& socket) - : ws_(std::move(socket)), strand_(ws_.get_executor()) {} +WSSession::WSServer::WSServer(tcp::socket&& socket) : ws_(std::move(socket)) {} void WSSession::WSServer::AddURLRoute(const std::string& target) { url_routes_.insert(ParseRouteFromTarget(target)); @@ -76,10 +75,8 @@ void WSSession::WSServer::OnWebsocketHandshake( // Accept the websocket handshake ws_.async_accept( req_, - boost::asio::bind_executor(strand_, - std::bind(&WSServer::OnAccept, - shared_from_this(), - std::placeholders::_1))); + std::bind( + &WSServer::OnAccept, shared_from_this(), std::placeholders::_1)); } } diff --git a/src/components/transport_manager/test/websocket_sample_client/websocket_sample_client.cc b/src/components/transport_manager/test/websocket_sample_client/websocket_sample_client.cc index 6c2ff12bfd..8cf3cb38f1 100644 --- a/src/components/transport_manager/test/websocket_sample_client/websocket_sample_client.cc +++ b/src/components/transport_manager/test/websocket_sample_client/websocket_sample_client.cc @@ -113,7 +113,8 @@ bool WSSampleClient<WS>::Connect(tcp::resolver::results_type& results) { template <> bool WSSampleClient<WSS>::Connect(tcp::resolver::results_type& results) { boost::system::error_code ec; - boost::asio::connect(ws_->lowest_layer(), results.begin(), results.end(), ec); + boost::asio::connect( + boost::beast::get_lowest_layer(*ws_), results.begin(), results.end(), ec); if (ec) { return false; } @@ -134,7 +135,7 @@ bool WSSampleClient<WS>::Handshake(const std::string& host, template <> void WSSampleClient<WS>::Stop() { ioc_.stop(); - ws_->lowest_layer().close(); + boost::beast::get_lowest_layer(*ws_).close(); io_pool_.stop(); io_pool_.join(); @@ -165,7 +166,7 @@ void WSSampleClient<WSS>::Stop() { ioc_.stop(); ws_->next_layer().next_layer().shutdown( boost::asio::ip::tcp::socket::shutdown_both); - ws_->lowest_layer().close(); + boost::beast::get_lowest_layer(*ws_).close(); io_pool_.stop(); io_pool_.join(); diff --git a/src/components/utils/test/policy.sql b/src/components/utils/test/policy.sql index d588d695a6..ed627b5fdc 100644 --- a/src/components/utils/test/policy.sql +++ b/src/components/utils/test/policy.sql @@ -22,6 +22,7 @@ BEGIN TRANSACTION; `ccpu_version` VARCHAR(45), `language` VARCHAR(45), `wers_country_code` VARCHAR(45), + `hardware_version` VARCHAR(45), `pt_exchanged_at_odometer_x` INTEGER NOT NULL DEFAULT 0, `pt_exchanged_x_days_after_epoch` INTEGER NOT NULL DEFAULT 0, `ignition_cycles_since_last_exchange` INTEGER NOT NULL DEFAULT 0, diff --git a/tools/InterfaceGenerator/generator/generators/SmartFactoryBase.py b/tools/InterfaceGenerator/generator/generators/SmartFactoryBase.py index bec5912d54..736a95f7ac 100755 --- a/tools/InterfaceGenerator/generator/generators/SmartFactoryBase.py +++ b/tools/InterfaceGenerator/generator/generators/SmartFactoryBase.py @@ -564,6 +564,7 @@ class CodeGenerator(object): struct_name=struct.name, code=self._indent_code( self._struct_impl_code_tempate.substitute( + struct_name=struct.name, schema_loc_decl=self._gen_schema_loc_decls( struct.members.values(), processed_enums), schema_items_decl=self._gen_schema_items_decls( @@ -1879,11 +1880,9 @@ class CodeGenerator(object): _struct_schema_item_template = string.Template( u'''std::shared_ptr<ISchemaItem> struct_schema_item_${name} = ''' u'''InitStructSchemaItem_${name}(struct_schema_items);\n''' - u'''struct_schema_items.insert(std::make_pair(''' - u'''StructIdentifiers::${name}, struct_schema_item_${name}));\n''' u'''structs_schemes_.insert(std::make_pair(''' u'''StructIdentifiers::${name}, CSmartSchema(''' - u'''struct_schema_item_${name})));''') + u'''struct_schema_item_${name})));\n''') _function_schema_template = string.Template( u'''functions_schemes_.insert(std::make_pair(ns_smart_device_link::''' @@ -1896,17 +1895,21 @@ class CodeGenerator(object): _struct_impl_template = string.Template( u'''std::shared_ptr<ISchemaItem> $namespace::$class_name::''' u'''InitStructSchemaItem_${struct_name}(\n''' - u''' const TStructsSchemaItems &struct_schema_items) {\n''' + u''' TStructsSchemaItems &struct_schema_items) {\n''' u'''$code''' u'''}\n''') _struct_impl_code_tempate = string.Template( + u'''Members ''' + u'''schema_members;\n''' + u'''std::shared_ptr<ISchemaItem> struct_schema = CObjectSchemaItem::create(schema_members);\n''' + u'''struct_schema_items.insert(std::make_pair(StructIdentifiers::${struct_name}, CObjectSchemaItem::create(schema_members)));\n''' + u'''struct_schema_items[StructIdentifiers::${struct_name}] = struct_schema;\n\n''' u'''${schema_loc_decl}''' u'''${schema_items_decl}''' - u'''Members ''' - u'''schema_members;\n\n''' u'''${schema_item_fill}''' - u'''return CObjectSchemaItem::create(schema_members);''') + u'''for(auto& member : schema_members) {struct_schema->AddMemberSchemaItem(member.first, member.second);}\n''' + u'''return struct_schema;''') _impl_code_loc_decl_enum_template = string.Template( u'''std::set<${type}::eType> ${var_name};''') @@ -2113,7 +2116,7 @@ class CodeGenerator(object): u'''static ''' u'''std::shared_ptr<ns_smart_device_link::ns_smart_objects::ISchemaItem> ''' u'''InitStructSchemaItem_${struct_name}(\n''' - u''' const TStructsSchemaItems &struct_schema_items);''') + u''' TStructsSchemaItems &struct_schema_items);''') _class_comment_template = string.Template( u'''/**\n''' diff --git a/tools/infrastructure/api_compare.py b/tools/infrastructure/api_compare.py index 0129119673..ca1279ab61 100644..100755 --- a/tools/infrastructure/api_compare.py +++ b/tools/infrastructure/api_compare.py @@ -1,4 +1,5 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- import json import sys @@ -7,11 +8,6 @@ import argparse import xml.etree.ElementTree as ElementTree from collections import namedtuple -reload(sys) -# Enable Utf-8 support. Needed if script will be run under Windows -sys.setdefaultencoding('utf-8') - - class colors: """Class defining colorful output. Works under UNIX ONLY as Windows does not support ANSI escape sequences @@ -206,53 +202,53 @@ def print_parameters(common_params, hmi_params, mob_params): """Function which prints parameters in mobile, hmi api and common parameters """ - print "Parameters to check: ", common_params, "\n" + print("Parameters to check: ", common_params, "\n") for param in common_params: mob_items = sorted(mob_params[param].items()) hmi_items = sorted(hmi_params[param].items()) - print colors.UNDERLINE + colors.BOLD + param + colors.ENDC, ":" - print "In Mobile API :\t", dict(mob_items) - print "In HMI API :\t", dict(hmi_items) + print(colors.UNDERLINE + colors.BOLD + param + colors.ENDC, ":") + print("In Mobile API :\t", dict(mob_items)) + print("In HMI API :\t", dict(hmi_items)) def print_full_info(hmi_absent_params, hmi_params, mob_absent_params, mob_params, rpc_name): """Function prints full detailed info about every rpc""" - print "\n" + "---" * 60 + "\n" + print("\n" + "---" * 60 + "\n") rpc_color = colors.BOLD + colors.HEADER - print rpc_color + rpc_name + colors.ENDC - print colors.BOLD + "\nMobile API: " + colors.ENDC - print "Parameters quantity: ", len(mob_params) - print "Parameters list: ", sorted(mob_params.keys()) - print colors.BOLD + "HMI API: " + colors.ENDC - print "Parameters quantity: ", len(hmi_params) - print "Parameters list: ", sorted(hmi_params.keys()) - print "\n" + print(rpc_color + rpc_name + colors.ENDC) + print(colors.BOLD + "\nMobile API: " + colors.ENDC) + print("Parameters quantity: ", len(mob_params)) + print("Parameters list: ", sorted(mob_params.keys())) + print(colors.BOLD + "HMI API: " + colors.ENDC) + print("Parameters quantity: ", len(hmi_params)) + print("Parameters list: ", sorted(hmi_params.keys())) + print("\n") print("{}Parameters absent in Mobile APIs: {}{}". format(colors.WARN, mob_absent_params, colors.ENDC)) print("{}Parameters absent in HMI APIs: {}{}". format(colors.WARN, hmi_absent_params, colors.ENDC)) - print "\n" + print("\n") def console_print(summary_result): """Function which prints summary result to console""" for rpc_name in sorted(summary_result.keys()): - print "\n" + "---" * 60 - print colors.HEADER + rpc_name + colors.ENDC + print("\n" + "---" * 60) + print(colors.HEADER + rpc_name + colors.ENDC) for problematic_item in summary_result[rpc_name]: item = summary_result[rpc_name][problematic_item] if len(item) > 0: - print colors.UNDERLINE + problematic_item + colors.ENDC + print(colors.UNDERLINE + problematic_item + colors.ENDC) if type(item) is not dict: print("{}{}{}".format(colors.WARN, item, colors.ENDC)) elif type(item) is dict: for param in item.keys(): item_print = colors.UNDERLINE + param + colors.ENDC - print "{} {}".format("Parameter name: ", item_print) + print("{} {}".format("Parameter name: ", item_print)) res_val = item[param] for key in res_val: - print key, ":", colors.FAIL, res_val[key], colors.ENDC + print(key, ":", colors.FAIL, res_val[key], colors.ENDC) def print_summary_info(summary_result, args): @@ -260,21 +256,21 @@ def print_summary_info(summary_result, args): Output type depends on command line args """ summary_color = colors.UNDERLINE + colors.BOLD + colors.BLUE - print "\n" - print summary_color, "SUMMARY COMPARISON RESULT:\n", colors.ENDC + print("\n") + print(summary_color, "SUMMARY COMPARISON RESULT:\n", colors.ENDC) if len(summary_result) == 0: - print colors.BOLD + " === NO PROBLEMS FOUND ===" + colors.ENDC + print(colors.BOLD + " === NO PROBLEMS FOUND ===" + colors.ENDC) return if args.output == "console": console_print(summary_result) if args.output == "json": json_summary_result = dict_to_json(summary_result) - print json_summary_result + print(json_summary_result) if args.output == "xml": json_summary_result = dict_to_json(summary_result) temp = json.loads(json_summary_result) xml_summary_result = json_to_xml(temp) - print xml_summary_result + print(xml_summary_result) def handle_absent_params(area, absent_params, rpc_name, summary_result): @@ -365,7 +361,7 @@ def all_compare_rule(mob_param_attributes, hmi_param_attributes): """Function used for all common arrtibutes comparison""" mobile_result = {} hmi_result = {} - attr_names = mob_param_attributes.keys() + hmi_param_attributes.keys() + attr_names = [*mob_param_attributes] + [*hmi_param_attributes] attr_names = set(attr_names) for attr_name in attr_names: mobile_attribute_value = None @@ -393,8 +389,8 @@ global_compare_rules = [ mob_param_attributes["type"] == "String", string_compare_rule), # Comparison rule when attribute "array" = "true" (lambda mob_param_attributes, hmi_param_attributes: - 'array' in mob_param_attributes.keys() + - hmi_param_attributes.keys(), array_compare_rule), + 'array' in [*mob_param_attributes] + + [*hmi_param_attributes], array_compare_rule), # Common comparison function for all attributes (lambda mob_param_attributes, hmi_param_attributes: True, all_compare_rule) diff --git a/tools/infrastructure/format_src.py b/tools/infrastructure/format_src.py deleted file mode 100644 index b7927b2708..0000000000 --- a/tools/infrastructure/format_src.py +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -""" -Format all sources with clang-format. All *.cc and *h in the src dir -are affected. Excluded from formatting sources in the "3rd_party" and -in the "3rd_party-static" dirs. For the formatting used ".clang-format" -in the project root. -""" - -import os -from utils import setup_working_dir, walk_dir, run_cmd -import re - - -INCLUDE_PATTERNS = ['^.*\.cc$', '^.*\.h$', '^.*\.cpp$', '^.*\.hpp$'] -EXCLUDE_PATTERNS = ['^.*3rd_party.*$'] -FORMAT_CMD = 'clang-format -i -style=file {}' - - -def main(): - ''' Main logic ''' - setup_working_dir() - print 'Current working dir is {}'.format(os.getcwd()) - - def action(file_path): - if re.match('|'.join(INCLUDE_PATTERNS), file_path, re.M | re.I): - if not re.match('|'.join(EXCLUDE_PATTERNS), - file_path, - re.M | re.I): - print 'Formatting file {}'.format(file_path) - run_cmd(FORMAT_CMD.format(file_path)) - walk_dir('src', action) - - -if __name__ == '__main__': - main() diff --git a/tools/infrastructure/install_hooks.py b/tools/infrastructure/install_hooks.py index 6f93e02c41..1e1f63de43 100644 --- a/tools/infrastructure/install_hooks.py +++ b/tools/infrastructure/install_hooks.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ @@ -12,14 +12,14 @@ from utils import setup_working_dir def uninstall_hooks(hooks_dir): - print 'Deleting existing pre-commit hooks from {}'.format(hooks_dir) + print('Deleting existing pre-commit hooks from {}'.format(hooks_dir)) files = glob.glob(os.path.join(hooks_dir, 'pre-commit*')) for item in files: os.remove(item) def install_hooks(src_dir, dst_dir): - print 'Installing pre-commit hooks' + print('Installing pre-commit hooks') src_files = glob.glob(os.path.join(src_dir, 'pre-commit*')) for item in src_files: shutil.copy(item, dst_dir) @@ -28,7 +28,7 @@ def install_hooks(src_dir, dst_dir): def main(): ''' Main logic ''' setup_working_dir() - print 'Current working dir is {}'.format(os.getcwd()) + print('Current working dir is {}'.format(os.getcwd())) hooks_src_dir = os.path.join( os.getcwd(), 'tools', 'infrastructure', 'git-hooks') hooks_dst_dir = os.path.join(os.getcwd(), '.git', 'hooks') diff --git a/tools/intergen/test/test_hmi_interface.xml b/tools/intergen/test/test_hmi_interface.xml index 7573d35ef9..c5978c543c 100644 --- a/tools/intergen/test/test_hmi_interface.xml +++ b/tools/intergen/test/test_hmi_interface.xml @@ -456,9 +456,6 @@ <element name="totalDistance"> <description> Total distance to destination for navigation</description> </element> - <element name="navigationText"> - <description>Navigation text for UpdateTurnList.</description> - </element> <element name="audioPassThruDisplayText1"> <description> First line of text for audio pass thru</description> </element> @@ -471,9 +468,6 @@ <element name="sliderFooter"> <description> Footer text for slider</description> </element> - <element name="notificationText"> - <description>Text of notification to be displayed on screen.</description> - </element> <element name="menuName"> <description> Primary text for Choice</description> </element> diff --git a/tools/rpc_spec b/tools/rpc_spec -Subproject 390394de357d3f097aef33ead9d17ef0f4c3d34 +Subproject 72632f946941d63a57ee5e99896e3eae3627f7d |