From 8306670b753ad64ae4704c701ef62077fadefe5b Mon Sep 17 00:00:00 2001 From: Collin Date: Thu, 7 Oct 2021 14:46:08 -0400 Subject: print to console on crash from signal handler (#3789) --- src/appMain/life_cycle_impl.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/appMain/life_cycle_impl.cc b/src/appMain/life_cycle_impl.cc index 8b67877ac8..762f506814 100644 --- a/src/appMain/life_cycle_impl.cc +++ b/src/appMain/life_cycle_impl.cc @@ -237,12 +237,14 @@ void sig_handler(int sig) { SDL_LOG_DEBUG("SIGTERM signal has been caught"); break; case SIGSEGV: + std::cerr << "SIGSEGV caught" << std::endl; SDL_LOG_DEBUG("SIGSEGV signal has been caught"); SDL_FLUSH_LOGGER(); // exit need to prevent endless sending SIGSEGV // http://stackoverflow.com/questions/2663456/how-to-write-a-signal-handler-to-catch-sigsegv abort(); default: + std::cerr << "Unexpected signal " << sig << " caught" << std::endl; SDL_LOG_DEBUG("Unexpected signal has been caught"); exit(EXIT_FAILURE); } -- cgit v1.2.1 From 3a8d0cb7292894d952a573c630e030b359b91e5c Mon Sep 17 00:00:00 2001 From: "Mykhailo Vorobiov (GitHub)" <61186891+mvorobio@users.noreply.github.com> Date: Mon, 11 Oct 2021 16:36:40 +0300 Subject: Prevent restoring resumption-related data after MASTER_RESET (#3287) Co-authored-by: Andrii Kalinich --- src/components/resumption/src/last_state_impl.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/resumption/src/last_state_impl.cc b/src/components/resumption/src/last_state_impl.cc index 9920a1499b..45fcdb2e8e 100644 --- a/src/components/resumption/src/last_state_impl.cc +++ b/src/components/resumption/src/last_state_impl.cc @@ -49,7 +49,6 @@ LastStateImpl::LastStateImpl(const std::string& app_storage_folder, LastStateImpl::~LastStateImpl() { SDL_LOG_AUTO_TRACE(); - SaveToFileSystem(); } void LastStateImpl::SaveToFileSystem() { -- cgit v1.2.1 From b73364623ee5c8185c3eea29750ed58b8ea0263c Mon Sep 17 00:00:00 2001 From: "Andrii Kalinich (GitHub)" Date: Mon, 11 Oct 2021 13:39:24 -0400 Subject: Added build path to lcov command (#3786) Co-authored-by: OlhaVorobiova --- tools/infrastructure/collect_coverage.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/infrastructure/collect_coverage.sh b/tools/infrastructure/collect_coverage.sh index 47559e6c47..498eee7f65 100755 --- a/tools/infrastructure/collect_coverage.sh +++ b/tools/infrastructure/collect_coverage.sh @@ -17,7 +17,7 @@ rm -rf $COVERAGE_DIR rm -rf $REPORTS_DIR - mkdir $COVERAGE_DIR -lcov --quiet --capture --directory . --output-file $COVERAGE_DIR/full_report.info +lcov --quiet --capture --directory $BUILD_DIR --output-file $COVERAGE_DIR/full_report.info lcov --quiet --remove $COVERAGE_DIR/full_report.info '/usr/*' '*/test/*' '*/src/3rd*' '*/build/src/*' --output-file $COVERAGE_DIR/coverage.info mkdir $REPORTS_DIR -- cgit v1.2.1 From a5924f853078e8bb7f9f6432ecfd9c45b913d6ab Mon Sep 17 00:00:00 2001 From: "Andrii Kalinich (GitHub)" Date: Tue, 12 Oct 2021 14:52:28 -0400 Subject: Fix applying functional group consent for all applications (#3770) Co-authored-by: OlhaVorobiova --- src/components/application_manager/src/policies/policy_handler.cc | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/components/application_manager/src/policies/policy_handler.cc b/src/components/application_manager/src/policies/policy_handler.cc index c8c2a25a6d..202b62ced4 100644 --- a/src/components/application_manager/src/policies/policy_handler.cc +++ b/src/components/application_manager/src/policies/policy_handler.cc @@ -720,7 +720,7 @@ void PolicyHandler::OnAppPermissionConsentInternal( policy_manager->SetUserConsentForApp(out_permissions); #endif } - } else if (!app_to_device_link_.empty()) { + } else { const ApplicationSet& accessor = application_manager_.applications().GetData(); for (const auto& app : accessor) { @@ -759,10 +759,6 @@ void PolicyHandler::OnAppPermissionConsentInternal( policy_manager->SetUserConsentForApp(out_permissions); #endif } - } else { - SDL_LOG_WARN( - "There are no applications previously stored for " - "setting common permissions."); } #ifdef EXTERNAL_PROPRIETARY_MODE if (!policy_manager->SetExternalConsentStatus(external_consent_status)) { -- cgit v1.2.1 From 43b9863109763d703ad90ab318681a08d98dd345 Mon Sep 17 00:00:00 2001 From: "Andrii Kalinich (GitHub)" Date: Thu, 14 Oct 2021 11:46:24 -0400 Subject: Remove unused policy table fields (#3771) * Removes 'memory_kb' * Removes 'device_certificates' Co-authored-by: OlhaVorobiova --- .../application_manager/test/sdl_pt_update.json | 7 -- .../include/policy/policy_table/types.h | 1 - .../include/policy/policy_table_interface_ext.xml | 2 - .../policy_external/src/policy_table/types.cc | 12 --- .../policy_external/src/sql_pt_ext_queries.cc | 6 +- .../src/sql_pt_ext_representation.cc | 67 ++++++++-------- .../policy/policy_external/src/sql_pt_queries.cc | 13 ++-- .../policy_external/src/sql_pt_representation.cc | 66 ++++++++-------- .../test/sql_pt_ext_representation_storage_test.cc | 8 +- .../test/sql_pt_ext_representation_test.cc | 48 ++++++------ .../test/sql_pt_representation_storage_test.cc | 4 +- .../test/sql_pt_representation_test.cc | 90 +++++++++++----------- .../include/policy/policy_table/types.h | 2 - .../policy_regular/src/policy_table/types.cc | 19 ----- .../policy/policy_regular/src/sql_pt_queries.cc | 13 ++-- .../policy_regular/src/sql_pt_representation.cc | 67 ++++++++-------- .../test/sql_pt_representation_storage_test.cc | 4 +- .../test/sql_pt_representation_test.cc | 90 +++++++++++----------- src/components/utils/test/policy.sql | 1 - 19 files changed, 231 insertions(+), 289 deletions(-) diff --git a/src/components/application_manager/test/sdl_pt_update.json b/src/components/application_manager/test/sdl_pt_update.json index bb69933497..e3c9c15861 100644 --- a/src/components/application_manager/test/sdl_pt_update.json +++ b/src/components/application_manager/test/sdl_pt_update.json @@ -16,7 +16,6 @@ "Emergency-1" ], "keep_context" : true, - "memory_kb" : 1000, "nicknames" : [ "SyncProxyTester" ], "priority" : "EMERGENCY", "steal_focus" : true, @@ -32,7 +31,6 @@ "default_hmi" : "NONE", "groups" : [ "Base-4" ], "keep_context" : false, - "memory_kb" : 1000, "priority" : "NONE", "steal_focus" : false, "watchdog_timer_ms" : 20000 @@ -40,7 +38,6 @@ "device" : { "default_hmi" : "NONE", "groups" : [ "Base-4" ], - "memory_kb" : 1000, "watchdog_timer_ms" : 20000, "keep_context" : false, "priority" : "NONE", @@ -50,7 +47,6 @@ "default_hmi" : "NONE", "groups" : [ "pre_Base-1" ], "keep_context" : false, - "memory_kb" : 1000, "priority" : "NONE", "steal_focus" : false, "watchdog_timer_ms" : 20000 @@ -1607,9 +1603,6 @@ } }, "module_config" : { - "device_certificates" : { - "HUU40DAS7F970UEI17A73JH32L41K32JH4L1K234H3K4" : "aldhfkahfgkafrblgjr" - }, "endpoints" : { "0x07" : { "default" : [ "http://x.x.x.x:3000/api/1/policies" ] 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 25439f835b..98f86d6ea1 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 @@ -226,7 +226,6 @@ struct ApplicationParams : PolicyBase { Optional AppHMIType; Optional RequestType; Optional RequestSubType; - Optional > memory_kb; Optional > heart_beat_timeout_ms; mutable Optional moduleType; Optional > certificate; 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 a3b91abbc5..b8ea5cf22f 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 @@ -101,7 +101,6 @@ - - ReportSubobject("steal_focus")); } - if (!memory_kb.is_valid()) { - memory_kb.ReportErrors(&report__->ReportSubobject("memory_kb")); - } if (!heart_beat_timeout_ms.is_valid()) { heart_beat_timeout_ms.ReportErrors( &report__->ReportSubobject("heart_beat_timeout_ms")); @@ -590,7 +579,6 @@ void ApplicationParams::SetPolicyTableType(PolicyTableType pt_type) { AppHMIType.SetPolicyTableType(pt_type); RequestType.SetPolicyTableType(pt_type); RequestSubType.SetPolicyTableType(pt_type); - memory_kb.SetPolicyTableType(pt_type); heart_beat_timeout_ms.SetPolicyTableType(pt_type); moduleType.SetPolicyTableType(pt_type); certificate.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 26d2124d07..1e7e169fe7 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 @@ -213,13 +213,13 @@ const std::string kUpdateGroupPermissions = const std::string kInsertApplication = "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, `steal_focus`, " - " `default_hmi`, `priority_value`, `is_revoked`, `memory_kb`, " + " `default_hmi`, `priority_value`, `is_revoked`, " " `heart_beat_timeout_ms`, `certificate`, `hybrid_app_preference_value`, " " `endpoint`, `enabled`, `auth_token`, " " `cloud_transport_type`, `icon_url`, `allow_unknown_rpc_passthrough`, " "`encryption_required`) " "VALUES " - "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; const std::string kCollectFriendlyMsg = "SELECT * FROM `message`"; @@ -246,7 +246,7 @@ const std::string kSelectPreconsentedGroupsId = const std::string kSelectAppPolicies = "SELECT `id`, `priority_value`, `default_hmi`, `keep_context`, " - " `steal_focus`, `memory_kb`, `heart_beat_timeout_ms`, `certificate`, " + " `steal_focus`, `heart_beat_timeout_ms`, `certificate`, " " `hybrid_app_preference_value`, `endpoint`, `enabled`, `auth_token`, " " `cloud_transport_type`, `icon_url`, `allow_unknown_rpc_passthrough`, " "`encryption_required`" 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 fc35551808..b98f14f1c8 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 @@ -774,36 +774,34 @@ bool SQLPTExtRepresentation::SaveSpecificAppPolicy( app_query.Bind( 4, std::string(policy_table::EnumToJsonString(app.second.priority))); app_query.Bind(5, app.second.is_null()); - app_query.Bind(6, *app.second.memory_kb); - app_query.Bind(7, static_cast(*app.second.heart_beat_timeout_ms)); + app_query.Bind(6, static_cast(*app.second.heart_beat_timeout_ms)); app.second.certificate.is_initialized() - ? app_query.Bind(8, *app.second.certificate) - : app_query.Bind(8); + ? app_query.Bind(7, *app.second.certificate) + : app_query.Bind(7); app.second.hybrid_app_preference.is_initialized() - ? app_query.Bind(9, + ? app_query.Bind(8, std::string(policy_table::EnumToJsonString( *app.second.hybrid_app_preference))) - : app_query.Bind(9); - app.second.endpoint.is_initialized() - ? app_query.Bind(10, *app.second.endpoint) - : app_query.Bind(10); - app.second.enabled.is_initialized() ? app_query.Bind(11, *app.second.enabled) - : app_query.Bind(11); + : app_query.Bind(8); + app.second.endpoint.is_initialized() ? app_query.Bind(9, *app.second.endpoint) + : app_query.Bind(9); + app.second.enabled.is_initialized() ? app_query.Bind(10, *app.second.enabled) + : app_query.Bind(10); app.second.auth_token.is_initialized() - ? app_query.Bind(12, *app.second.auth_token) - : app_query.Bind(12); + ? app_query.Bind(11, *app.second.auth_token) + : app_query.Bind(11); app.second.cloud_transport_type.is_initialized() - ? app_query.Bind(13, *app.second.cloud_transport_type) - : app_query.Bind(13); + ? app_query.Bind(12, *app.second.cloud_transport_type) + : app_query.Bind(12); app.second.icon_url.is_initialized() - ? app_query.Bind(14, *app.second.icon_url) - : app_query.Bind(14); + ? app_query.Bind(13, *app.second.icon_url) + : app_query.Bind(13); app.second.allow_unknown_rpc_passthrough.is_initialized() - ? app_query.Bind(15, *app.second.allow_unknown_rpc_passthrough) - : app_query.Bind(15); + ? app_query.Bind(14, *app.second.allow_unknown_rpc_passthrough) + : app_query.Bind(14); app.second.encryption_required.is_initialized() - ? app_query.Bind(16, *app.second.encryption_required) - : app_query.Bind(16); + ? app_query.Bind(15, *app.second.encryption_required) + : app_query.Bind(15); if (!app_query.Exec() || !app_query.Reset()) { SDL_LOG_WARN("Incorrect insert into application."); @@ -927,28 +925,27 @@ bool SQLPTExtRepresentation::GatherApplicationPoliciesSection( params.default_hmi = hmi; params.keep_context = query.GetBoolean(3); params.steal_focus = query.GetBoolean(4); - *params.memory_kb = query.GetInteger(5); - *params.heart_beat_timeout_ms = query.GetUInteger(6); - if (!query.IsNull(7)) { - *params.certificate = query.GetString(7); + *params.heart_beat_timeout_ms = query.GetUInteger(5); + if (!query.IsNull(6)) { + *params.certificate = query.GetString(6); } // Read cloud app properties policy_table::HybridAppPreference hap; - bool valid = policy_table::EnumFromJsonString(query.GetString(8), &hap); + bool valid = policy_table::EnumFromJsonString(query.GetString(7), &hap); if (valid) { *params.hybrid_app_preference = hap; } - *params.endpoint = query.GetString(9); - if (!query.IsNull(10)) { - *params.enabled = query.GetBoolean(10); + *params.endpoint = query.GetString(8); + if (!query.IsNull(9)) { + *params.enabled = query.GetBoolean(9); } - *params.auth_token = query.GetString(11); - *params.cloud_transport_type = query.GetString(12); - *params.icon_url = query.GetString(13); - *params.allow_unknown_rpc_passthrough = query.GetBoolean(14); - if (!query.IsNull(15)) { - *params.encryption_required = query.GetBoolean(15); + *params.auth_token = query.GetString(10); + *params.cloud_transport_type = query.GetString(11); + *params.icon_url = query.GetString(12); + *params.allow_unknown_rpc_passthrough = query.GetBoolean(13); + if (!query.IsNull(14)) { + *params.encryption_required = query.GetBoolean(14); } const auto& gather_app_id = ((*policies).apps[app_id].is_string()) ? (*policies).apps[app_id].get_string() 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 c5fc3a9e92..91dd6fb713 100644 --- a/src/components/policy/policy_external/src/sql_pt_queries.cc +++ b/src/components/policy/policy_external/src/sql_pt_queries.cc @@ -162,7 +162,6 @@ const std::string kCreateSchema = " `is_revoked` BOOLEAN, " " `is_default` BOOLEAN, " " `is_predata` BOOLEAN, " - " `memory_kb` INTEGER NOT NULL, " " `heart_beat_timeout_ms` INTEGER NOT NULL, " " `certificate` VARCHAR(65535), " " `hybrid_app_preference_value` VARCHAR(255), " @@ -821,12 +820,12 @@ const std::string kInsertRpcWithParameter = const std::string kInsertApplication = "INSERT OR IGNORE INTO `application` (`id`, `priority_value`, " - "`is_revoked`, `memory_kb`, `heart_beat_timeout_ms`, `certificate`, " + "`is_revoked`, `heart_beat_timeout_ms`, `certificate`, " "`hybrid_app_preference_value`, `endpoint`, `enabled`, `auth_token`, " "`cloud_transport_type`, `icon_url`, `allow_unknown_rpc_passthrough`, " "`encryption_required`) " "VALUES " - "(?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + "(?,?,?,?,?,?,?,?,?,?,?,?,?)"; const std::string kInsertAppGroup = "INSERT INTO `app_group` (`application_id`, `functional_group_id`)" @@ -972,7 +971,7 @@ const std::string kSelectUserMsgsVersion = "SELECT DISTINCT `number` FROM `version`"; const std::string kSelectAppPolicies = - "SELECT `id`, `priority_value`, `memory_kb`, " + "SELECT `id`, `priority_value`, " " `heart_beat_timeout_ms`, `certificate`, `hybrid_app_preference_value`, " " `endpoint`, `enabled`, `auth_token`, `cloud_transport_type`, `icon_url`, " " `allow_unknown_rpc_passthrough`, `encryption_required` " @@ -1103,15 +1102,15 @@ const std::string kDeleteAppGroupByApplicationId = const std::string kInsertApplicationFull = "INSERT OR IGNORE INTO `application` (`id`, `keep_context`, `steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - " `is_predata`, `memory_kb`, `heart_beat_timeout_ms`, " + " `is_predata`, `heart_beat_timeout_ms`, " " `certificate`, `hybrid_app_preference_value`, `endpoint`, `enabled`, " " `auth_token`, `cloud_transport_type`, `icon_url`, " "`allow_unknown_rpc_passthrough`, `encryption_required`) " - " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; const std::string kSelectApplicationFull = "SELECT `keep_context`, `steal_focus`, `default_hmi`, `priority_value`, " - " `is_revoked`, `is_default`, `is_predata`, `memory_kb`," + " `is_revoked`, `is_default`, `is_predata`, " " `heart_beat_timeout_ms`, `certificate`, `hybrid_app_preference_value`, " " `endpoint`, `enabled`, `auth_token`, `cloud_transport_type`, " "`icon_url`, " diff --git a/src/components/policy/policy_external/src/sql_pt_representation.cc b/src/components/policy/policy_external/src/sql_pt_representation.cc index 3309893db0..1570675cf9 100644 --- a/src/components/policy/policy_external/src/sql_pt_representation.cc +++ b/src/components/policy/policy_external/src/sql_pt_representation.cc @@ -766,33 +766,32 @@ bool SQLPTRepresentation::GatherApplicationPoliciesSection( policy_table::EnumFromJsonString(query.GetString(1), &priority); params.priority = priority; - *params.memory_kb = query.GetInteger(2); - *params.heart_beat_timeout_ms = query.GetUInteger(3); + *params.heart_beat_timeout_ms = query.GetUInteger(2); - if (!query.IsNull(4)) { - *params.certificate = query.GetString(4); + if (!query.IsNull(3)) { + *params.certificate = query.GetString(3); } // Read cloud app properties policy_table::HybridAppPreference hap; - bool valid = policy_table::EnumFromJsonString(query.GetString(5), &hap); + bool valid = policy_table::EnumFromJsonString(query.GetString(4), &hap); if (valid) { *params.hybrid_app_preference = hap; } - *params.endpoint = query.GetString(6); - if (!query.IsNull(7)) { - *params.enabled = query.GetBoolean(7); + *params.endpoint = query.GetString(5); + if (!query.IsNull(6)) { + *params.enabled = query.GetBoolean(6); } - *params.auth_token = query.GetString(8); - *params.cloud_transport_type = query.GetString(9); - *params.icon_url = query.GetString(10); - *params.allow_unknown_rpc_passthrough = query.GetBoolean(11); + *params.auth_token = query.GetString(7); + *params.cloud_transport_type = query.GetString(8); + *params.icon_url = query.GetString(9); + *params.allow_unknown_rpc_passthrough = query.GetBoolean(10); const auto& gather_app_id = ((*policies).apps[app_id].is_string()) ? (*policies).apps[app_id].get_string() : app_id; - if (!query.IsNull(12)) { - *params.encryption_required = query.GetBoolean(12); + if (!query.IsNull(11)) { + *params.encryption_required = query.GetBoolean(11); } // Data should be gathered from db by "default" key if application has // default policies @@ -1122,36 +1121,35 @@ bool SQLPTRepresentation::SaveSpecificAppPolicy( app_query.Bind( 1, std::string(policy_table::EnumToJsonString(app.second.priority))); app_query.Bind(2, app.second.is_null()); - app_query.Bind(3, *app.second.memory_kb); - app_query.Bind(4, static_cast(*app.second.heart_beat_timeout_ms)); + app_query.Bind(3, static_cast(*app.second.heart_beat_timeout_ms)); app.second.certificate.is_initialized() - ? app_query.Bind(5, *app.second.certificate) - : app_query.Bind(5); + ? app_query.Bind(4, *app.second.certificate) + : app_query.Bind(4); app.second.hybrid_app_preference.is_initialized() - ? app_query.Bind(6, + ? app_query.Bind(5, std::string(policy_table::EnumToJsonString( *app.second.hybrid_app_preference))) - : app_query.Bind(6); - app.second.endpoint.is_initialized() ? app_query.Bind(7, *app.second.endpoint) - : app_query.Bind(7); - app.second.enabled.is_initialized() ? app_query.Bind(8, *app.second.enabled) - : app_query.Bind(8); + : app_query.Bind(5); + app.second.endpoint.is_initialized() ? app_query.Bind(6, *app.second.endpoint) + : app_query.Bind(6); + app.second.enabled.is_initialized() ? app_query.Bind(7, *app.second.enabled) + : app_query.Bind(7); app.second.auth_token.is_initialized() - ? app_query.Bind(9, *app.second.auth_token) - : app_query.Bind(9); + ? app_query.Bind(8, *app.second.auth_token) + : app_query.Bind(8); app.second.cloud_transport_type.is_initialized() - ? app_query.Bind(10, *app.second.cloud_transport_type) - : app_query.Bind(10); + ? app_query.Bind(9, *app.second.cloud_transport_type) + : app_query.Bind(9); app.second.icon_url.is_initialized() - ? app_query.Bind(11, *app.second.icon_url) - : app_query.Bind(11); + ? app_query.Bind(10, *app.second.icon_url) + : app_query.Bind(10); app.second.allow_unknown_rpc_passthrough.is_initialized() - ? app_query.Bind(12, *app.second.allow_unknown_rpc_passthrough) - : app_query.Bind(12); + ? app_query.Bind(11, *app.second.allow_unknown_rpc_passthrough) + : app_query.Bind(11); app.second.encryption_required.is_initialized() - ? app_query.Bind(13, *app.second.encryption_required) - : app_query.Bind(13); + ? app_query.Bind(12, *app.second.encryption_required) + : app_query.Bind(12); if (!app_query.Exec() || !app_query.Reset()) { SDL_LOG_WARN("Incorrect insert into application."); 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 09df17beb2..3bbdc05378 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 @@ -98,9 +98,9 @@ TEST_F( // Act const std::string value_12345 = "12345"; const std::string query_insert_12345 = - "INSERT INTO `application` (`id`, `memory_kb`," + "INSERT INTO `application` (`id`, " " `heart_beat_timeout_ms`, `keep_context`) VALUES ('" + - value_12345 + "', 5, 10, 1)"; + value_12345 + "', 10, 1)"; // Assert ASSERT_TRUE(query_wrapper_->Exec(query_insert_12345)); @@ -110,9 +110,9 @@ TEST_F( // Act const std::string value_123 = "123"; const std::string query_insert_123 = - "INSERT INTO `application` (`id`, `memory_kb`," + "INSERT INTO `application` (`id`, " " `heart_beat_timeout_ms`, `keep_context`) VALUES ('" + - value_123 + "', 10, 7, 0)"; + value_123 + "', 7, 0)"; // Assert ASSERT_TRUE(query_wrapper_->Exec(query_insert_123)); 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 58f526d7d3..c677392ef9 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 @@ -456,8 +456,8 @@ TEST_F( ASSERT_TRUE(query_wrapper_->Exec(query_delete)); // Act const std::string query_insert_12345 = - "INSERT INTO `application` (`id`, `memory_kb`," - " `heart_beat_timeout_ms`, `keep_context`) VALUES ('12345', 5, 10, 1)"; + "INSERT INTO `application` (`id`, " + " `heart_beat_timeout_ms`, `keep_context`) VALUES ('12345', 10, 1)"; // Assert ASSERT_TRUE(query_wrapper_->Exec(query_insert_12345)); @@ -465,8 +465,8 @@ TEST_F( EXPECT_TRUE(reps_->CanAppKeepContext("12345")); // Act const std::string query_insert_123 = - "INSERT INTO `application` (`id`, `memory_kb`," - " `heart_beat_timeout_ms`, `keep_context`) VALUES ('123', 10, 7, 0)"; + "INSERT INTO `application` (`id`, " + " `heart_beat_timeout_ms`, `keep_context`) VALUES ('123', 7, 0)"; // Assert ASSERT_TRUE(query_wrapper_->Exec(query_insert_123)); @@ -481,8 +481,8 @@ TEST_F(SQLPTExtRepresentationTest, ASSERT_TRUE(query_wrapper_->Exec(query_delete)); // Act const std::string query_insert_12345 = - "INSERT INTO `application` (`id`, `memory_kb`," - " `heart_beat_timeout_ms`, `steal_focus`) VALUES ('12345', 5, 10, 1)"; + "INSERT INTO `application` (`id`, " + " `heart_beat_timeout_ms`, `steal_focus`) VALUES ('12345', 10, 1)"; // Assert ASSERT_TRUE(query_wrapper_->Exec(query_insert_12345)); @@ -490,8 +490,8 @@ TEST_F(SQLPTExtRepresentationTest, EXPECT_FALSE(reps_->CanAppStealFocus("0")); // Act const std::string query_insert_123 = - "INSERT INTO `application` (`id`, `memory_kb`," - " `heart_beat_timeout_ms`, `steal_focus`) VALUES ('123', 10, 7, 0)"; + "INSERT INTO `application` (`id`, " + " `heart_beat_timeout_ms`, `steal_focus`) VALUES ('123', 7, 0)"; // Assert ASSERT_TRUE(query_wrapper_->Exec(query_insert_123)); @@ -506,8 +506,8 @@ TEST_F(SQLPTExtRepresentationTest, ASSERT_TRUE(query_wrapper_->Exec(query_delete)); // Act const std::string query_insert_12345 = - "INSERT INTO `application` (`id`, `memory_kb`," - " `heart_beat_timeout_ms`, `default_hmi`) VALUES ('12345', 5, 10, " + "INSERT INTO `application` (`id`, " + " `heart_beat_timeout_ms`, `default_hmi`) VALUES ('12345', 10, " "'NONE')"; std::string result; // Assert @@ -515,8 +515,8 @@ TEST_F(SQLPTExtRepresentationTest, EXPECT_TRUE(reps_->GetDefaultHMI("12345", &result)); EXPECT_EQ("NONE", result); const std::string query_insert_123 = - "INSERT INTO `application` (`id`, `memory_kb`," - " `heart_beat_timeout_ms`, `default_hmi`) VALUES ('123', 5, 10, " + "INSERT INTO `application` (`id`, " + " `heart_beat_timeout_ms`, `default_hmi`) VALUES ('123', 10, " "'LIMITED')"; // Assert @@ -898,9 +898,9 @@ TEST_F( ASSERT_TRUE(query_wrapper_->Exec(query_insert_functional_group)); const std::string query_insert_application = - "INSERT INTO `application` (`id`, `memory_kb`," + "INSERT INTO `application` (`id`, " " `heart_beat_timeout_ms`, `is_predata`, `keep_context`) VALUES ('1234', " - "5, 10, 1, 0)"; + "10, 1, 0)"; // Assert ASSERT_TRUE(query_wrapper_->Exec(query_insert_application)); @@ -967,9 +967,9 @@ TEST_F( ASSERT_TRUE(query_wrapper_->Exec(query_insert_preconsented_group)); const std::string query_insert_application = - "INSERT INTO `application` (`id`, `memory_kb`," + "INSERT INTO `application` (`id`, " " `heart_beat_timeout_ms`, `is_predata`, `keep_context`) VALUES ('1234', " - "5, 10, 0, 0)"; + "10, 0, 0)"; // Assert ASSERT_TRUE(query_wrapper_->Exec(query_insert_application)); FunctionalIdType group_types; @@ -1417,9 +1417,9 @@ TEST_F( "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( '12345', 0, 0, 'NONE', 'NONE', 0, 0, " - "0, 64, 10) "; + "0, 10) "; ASSERT_TRUE(query_wrapper_->Exec(query_insert_app)); GroupsAliasNameCollection allowed_groups; @@ -1447,9 +1447,9 @@ TEST_F(SQLPTExtRepresentationTest, "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( '12345', 0, 0, 'NONE', 'NONE', 0, 0, " - "0, 64, 10) "; + "0, 10) "; ASSERT_TRUE(query_wrapper_->Exec(query_insert_app)); GroupsAliasNameCollection allowed_groups; @@ -1479,9 +1479,9 @@ TEST_F( "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( '12345', 0, 0, 'NONE', 'NONE', 0, 0, " - "0, 64, 10) "; + "0, 10) "; ASSERT_TRUE(query_wrapper_->Exec(query_insert_app)); GroupsAliasNameCollection allowed_groups; @@ -1506,9 +1506,9 @@ TEST_F(SQLPTExtRepresentationTest, "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( '12345', 0, 0, 'NONE', 'NONE', 0, 0, " - "1, 64, 10) "; + "1, 10) "; ASSERT_TRUE(query_wrapper_->Exec(query_insert_app)); // Check EXPECT_TRUE(reps_->IsPredataPolicy("12345")); diff --git a/src/components/policy/policy_external/test/sql_pt_representation_storage_test.cc b/src/components/policy/policy_external/test/sql_pt_representation_storage_test.cc index 7214ecba81..f9d36eb013 100644 --- a/src/components/policy/policy_external/test/sql_pt_representation_storage_test.cc +++ b/src/components/policy/policy_external/test/sql_pt_representation_storage_test.cc @@ -90,10 +90,10 @@ TEST_F( const std::string gps = "gps"; const std::string speed = "speed"; const std::string query = - "INSERT OR REPLACE INTO `application` (`id`, `memory_kb`," + "INSERT OR REPLACE INTO `application` (`id`," " `heart_beat_timeout_ms`) VALUES ('" + value_12345 + - "', 5, 10); " + "', 10); " "INSERT OR REPLACE INTO functional_group (`id`, `name`)" " VALUES (1, 'Base-4'); " "INSERT OR REPLACE INTO `app_group` (`application_id`," 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 548b6f3666..9047949860 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 @@ -149,7 +149,6 @@ class SQLPTRepresentationTest : public SQLPTRepresentation, uint16_t apps_size, policy_table::Priority prio, const std::string& section, - uint16_t memory_kb, uint32_t heart_beat_timeout_ms, policy_table::Strings& groups) const { if (section != "device") { @@ -163,7 +162,6 @@ class SQLPTRepresentationTest : public SQLPTRepresentation, EXPECT_EQ(0u, (*(apps_iter->second.nicknames)).size()); EXPECT_EQ(prio, (apps_iter->second).priority); EXPECT_EQ(0u, (*(apps_iter->second.AppHMIType)).size()); - EXPECT_EQ(memory_kb, (*(apps_iter->second.memory_kb))); EXPECT_EQ(heart_beat_timeout_ms, (*(apps_iter->second.heart_beat_timeout_ms))); } else { @@ -461,8 +459,8 @@ TEST_F( CheckPermissionsAllowed_SetValuesInAppGroupRpcFunctionalGroup_GetEqualParamsInCheckPermissionResult) { // Arrange const std::string query = - "INSERT OR REPLACE INTO `application` (`id`, `memory_kb`," - " `heart_beat_timeout_ms`) VALUES ('12345', 5, 10); " + "INSERT OR REPLACE INTO `application` (`id`, " + " `heart_beat_timeout_ms`) VALUES ('12345', 10); " "INSERT OR REPLACE INTO functional_group (`id`, `name`)" " VALUES (1, 'Base-4'); " "INSERT OR REPLACE INTO `app_group` (`application_id`," @@ -493,8 +491,8 @@ TEST_F( CheckPermissionsAllowedWithoutParameters_SetLimitedPermissions_ExpectEmptyListOfAllowedParams) { // Arrange const std::string query = - "INSERT OR REPLACE INTO `application` (`id`, `memory_kb`," - " `heart_beat_timeout_ms`) VALUES ('12345', 5, 10); " + "INSERT OR REPLACE INTO `application` (`id`, " + " `heart_beat_timeout_ms`) VALUES ('12345', 10); " "INSERT OR REPLACE INTO functional_group (`id`, `name`)" " VALUES (1, 'Base-4'); " "INSERT OR REPLACE INTO `app_group` (`application_id`," @@ -961,40 +959,40 @@ TEST_F(SQLPTRepresentationTest, "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( 'default', 0, 0, 'NONE', 'NONE', 0, " "0, " - "0, 64, 10) "; + "0, 10) "; ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_default)); const std::string query_insert_app_pre_DataConsent = "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( 'pre_DataConsent', 0, 0, 'NONE', " "'NONE', 0, 0, " - "0, 64, 10) "; + "0, 10) "; ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_pre_DataConsent)); const std::string query_insert_app_device = "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( 'device', 0, 0, 'NONE', " "'COMMUNICATION', 0, 0, " - "0, 64, 10) "; + "0, 10) "; ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_device)); const std::string query_insert_app_12345 = "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( '12345', 0, 0, 'NONE', 'EMERGENCY', " "0, 0, " - "0, 64, 10) "; + "0, 10) "; ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_12345)); std::string priority; @@ -1051,40 +1049,40 @@ TEST_F(SQLPTRepresentationTest, "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( 'default', 0, 0, 'NONE', 'NONE', 0, " "0, " - "0, 64, 10) "; + "0, 10) "; ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_default)); const std::string query_insert_app_pre_DataConsent = "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( 'pre_DataConsent', 0, 0, 'NONE', " "'NONE', 0, 0, " - "0, 64, 10) "; + "0, 10) "; ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_pre_DataConsent)); const std::string query_insert_app_device = "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( 'device', 0, 0, 'NONE', " "'COMMUNICATION', 0, 0, " - "0, 64, 10) "; + "0, 10) "; ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_device)); const std::string query_insert_app_12345 = "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( '12345', 0, 0, 'NONE', 'EMERGENCY', " "0, 0, " - "0, 64, 10) "; + "0, 10) "; ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_12345)); const std::string query_insert = @@ -1241,29 +1239,29 @@ TEST_F(SQLPTRepresentationTest, "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( 'default', 0, 0, 'NONE', 'NONE', 0, " "0, " - "0, 64, 10) "; + "0, 10) "; ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_default)); const std::string query_insert_app_device = "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( 'device', 0, 0, 'NONE', " - "'COMMUNICATION', 0, 0, 0, 64, 10) "; + "'COMMUNICATION', 0, 0, 0, 10) "; ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_device)); const std::string query_insert_app_12345 = "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( '12345', 0, 0, 'NONE', 'EMERGENCY', " "0, 0, " - "0, 64, 10) "; + "0, 10) "; ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_12345)); // Checks EXPECT_TRUE(reps->IsApplicationRepresented("default")); @@ -1279,20 +1277,20 @@ TEST_F(SQLPTRepresentationTest, "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( '7777', 0, 0, 'NONE', 'NONE', 1, " "0, " - "0, 64, 10) "; + "0, 10) "; ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_7777)); const std::string query_insert_app_12345 = "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( '12345', 0, 0, 'NONE', 'EMERGENCY', " "0, 0, " - "0, 64, 10) "; + "0, 10) "; ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_12345)); // Checks EXPECT_TRUE(reps->IsApplicationRevoked("7777")); @@ -1306,19 +1304,19 @@ TEST_F(SQLPTRepresentationTest, "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( 'default', 0, 0, 'NONE', 'NONE', 0, " "1, " - "0, 64, 10) "; + "0, 10) "; ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_default)); const std::string query_insert_app_123 = "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( '123', 1, 0, 'FULL', " - "'COMMUNICATION', 1, 1, 0, 64, 10) "; + "'COMMUNICATION', 1, 1, 0, 10) "; ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_123)); EXPECT_FALSE(reps->IsApplicationRepresented("7777")); EXPECT_FALSE(reps->IsApplicationRepresented("9999")); @@ -1348,10 +1346,10 @@ TEST_F(SQLPTRepresentationTest, "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( '12345', 0, 0, 'NONE', 'NONE', 0, " "0, " - "1, 64, 10) "; + "1, 10) "; ASSERT_TRUE(query_wrapper_->Exec(query_insert_app)); // Check EXPECT_FALSE(reps->IsDefaultPolicy("12345")); @@ -1363,8 +1361,8 @@ TEST_F(SQLPTRepresentationTest, const std::string query_insert_app = "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, `default_hmi`, `priority_value`, `is_revoked`, " - "`is_default`, `is_predata`, `memory_kb`, `heart_beat_timeout_ms`) " - "VALUES( '1234567', 0, 0, 'NONE', 'NONE', 0, 1, 0, 64, 10) "; + "`is_default`, `is_predata`, `heart_beat_timeout_ms`) " + "VALUES( '1234567', 0, 0, 'NONE', 'NONE', 0, 1, 0, 10) "; ASSERT_TRUE(query_wrapper_->Exec(query_insert_app)); // Check @@ -1404,17 +1402,17 @@ TEST_F(SQLPTRepresentationTest, "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( 'default', 0, 0, 'NONE', 'NONE', 0, " "0, " - "0, 64, 10) "; + "0, 10) "; ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_default)); const std::string query_insert_app_1234567 = "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, `default_hmi`, `priority_value`, `is_revoked`, " - "`is_default`, `is_predata`, `memory_kb`, `heart_beat_timeout_ms`) " - "VALUES( '1234567', 0, 0, 'NONE', 'NONE', 0, 0, 1, 64, 10) "; + "`is_default`, `is_predata`, `heart_beat_timeout_ms`) " + "VALUES( '1234567', 0, 0, 'NONE', 'NONE', 0, 0, 1, 10) "; ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_1234567)); EXPECT_FALSE(reps->IsDefaultPolicy("1234567")); // Act @@ -1448,8 +1446,8 @@ TEST_F(SQLPTRepresentationTest, const std::string query_insert_app = "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, `default_hmi`, `priority_value`, `is_revoked`, " - "`is_default`, `is_predata`, `memory_kb`, `heart_beat_timeout_ms`) " - "VALUES( '1234567', 0, 0, 'NONE', 'NONE', 0, 0, 1, 64, 10) "; + "`is_default`, `is_predata`, `heart_beat_timeout_ms`) " + "VALUES( '1234567', 0, 0, 'NONE', 'NONE', 0, 0, 1, 10) "; ASSERT_TRUE(query_wrapper_->Exec(query_insert_app)); const std::string query_select = "SELECT `is_default` FROM `application`WHERE`id`= '1234567' "; 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 7eeb41f064..664987b70f 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 @@ -193,7 +193,6 @@ struct ApplicationParams : PolicyBase { Optional AppHMIType; Optional RequestType; Optional RequestSubType; - Optional > memory_kb; Optional > heart_beat_timeout_ms; Optional > certificate; mutable Optional moduleType; @@ -312,7 +311,6 @@ struct EndpointProperty : CompositeType { struct ModuleConfig : CompositeType { public: - Optional, 0, 255> > device_certificates; Optional preloaded_pt; Optional full_app_id_supported; Integer exchange_after_x_ignition_cycles; 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 8b937f3142..6b1ba15cfd 100644 --- a/src/components/policy/policy_regular/src/policy_table/types.cc +++ b/src/components/policy/policy_regular/src/policy_table/types.cc @@ -272,7 +272,6 @@ ApplicationParams::ApplicationParams(const Json::Value* value__) , AppHMIType(impl::ValueMember(value__, "AppHMIType")) , RequestType(impl::ValueMember(value__, "RequestType")) , RequestSubType(impl::ValueMember(value__, "RequestSubType")) - , memory_kb(impl::ValueMember(value__, "memory_kb"), 0) , heart_beat_timeout_ms(impl::ValueMember(value__, "heart_beat_timeout_ms")) , certificate(impl::ValueMember(value__, "certificate")) , moduleType(impl::ValueMember(value__, "moduleType")) @@ -294,7 +293,6 @@ Json::Value ApplicationParams::ToJsonValue() const { impl::WriteJsonField("AppHMIType", AppHMIType, &result__); impl::WriteJsonField("RequestType", RequestType, &result__); impl::WriteJsonField("RequestSubType", RequestSubType, &result__); - impl::WriteJsonField("memory_kb", memory_kb, &result__); impl::WriteJsonField( "heart_beat_timeout_ms", heart_beat_timeout_ms, &result__); impl::WriteJsonField("certificate", certificate, &result__); @@ -331,9 +329,6 @@ bool ApplicationParams::is_valid() const { if (!AppHMIType.is_valid()) { return false; } - if (!memory_kb.is_valid()) { - return false; - } if (!heart_beat_timeout_ms.is_valid()) { return false; } @@ -396,9 +391,6 @@ bool ApplicationParams::struct_empty() const { if (RequestSubType.is_initialized()) { return false; } - if (memory_kb.is_initialized()) { - return false; - } if (heart_beat_timeout_ms.is_initialized()) { return false; } @@ -460,9 +452,6 @@ void ApplicationParams::ReportErrors(rpc::ValidationReport* report__) const { if (!priority.is_valid()) { priority.ReportErrors(&report__->ReportSubobject("priority")); } - if (!memory_kb.is_valid()) { - memory_kb.ReportErrors(&report__->ReportSubobject("memory_kb")); - } if (!heart_beat_timeout_ms.is_valid()) { heart_beat_timeout_ms.ReportErrors( &report__->ReportSubobject("heart_beat_timeout_ms")); @@ -512,7 +501,6 @@ void ApplicationParams::SetPolicyTableType(PolicyTableType pt_type) { AppHMIType.SetPolicyTableType(pt_type); RequestType.SetPolicyTableType(pt_type); RequestSubType.SetPolicyTableType(pt_type); - memory_kb.SetPolicyTableType(pt_type); heart_beat_timeout_ms.SetPolicyTableType(pt_type); certificate.SetPolicyTableType(pt_type); moduleType.SetPolicyTableType(pt_type); @@ -741,7 +729,6 @@ ModuleConfig::~ModuleConfig() {} ModuleConfig::ModuleConfig(const Json::Value* value__) : CompositeType(InitHelper(value__, &Json::Value::isObject)) - , device_certificates(impl::ValueMember(value__, "device_certificates")) , preloaded_pt(impl::ValueMember(value__, "preloaded_pt")) , full_app_id_supported(impl::ValueMember(value__, "full_app_id_supported")) , exchange_after_x_ignition_cycles( @@ -768,8 +755,6 @@ ModuleConfig::ModuleConfig(const Json::Value* value__) impl::ValueMember(value__, "lock_screen_dismissal_enabled")) {} void ModuleConfig::SafeCopyFrom(const ModuleConfig& from) { - // device_certificates = from.device_certificates; // According to the - // requirements this is optional. exchange_after_x_ignition_cycles = from.exchange_after_x_ignition_cycles; exchange_after_x_kilometers = from.exchange_after_x_kilometers; exchange_after_x_days = from.exchange_after_x_days; @@ -944,10 +929,6 @@ void ModuleConfig::ReportErrors(rpc::ValidationReport* report__) const { if (struct_empty()) { rpc::CompositeType::ReportErrors(report__); } - if (!device_certificates.is_valid()) { - device_certificates.ReportErrors( - &report__->ReportSubobject("device_certificates")); - } if (!preloaded_pt.is_valid()) { preloaded_pt.ReportErrors(&report__->ReportSubobject("preloaded_pt")); } 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 a58867966c..6e0bfd8c89 100644 --- a/src/components/policy/policy_regular/src/sql_pt_queries.cc +++ b/src/components/policy/policy_regular/src/sql_pt_queries.cc @@ -152,7 +152,6 @@ const std::string kCreateSchema = " `is_revoked` BOOLEAN, " " `is_default` BOOLEAN, " " `is_predata` BOOLEAN, " - " `memory_kb` INTEGER NOT NULL, " " `heart_beat_timeout_ms` INTEGER NOT NULL, " " `certificate` VARCHAR(65535), " " `hybrid_app_preference_value` VARCHAR(255), " @@ -778,12 +777,12 @@ const std::string kInsertRpcWithParameter = const std::string kInsertApplication = "INSERT OR IGNORE INTO `application` (`id`, `priority_value`, " - "`is_revoked`, `memory_kb`, `heart_beat_timeout_ms`, `certificate`, " + "`is_revoked`, `heart_beat_timeout_ms`, `certificate`, " "`hybrid_app_preference_value`, `endpoint`, `enabled`, `auth_token`, " "`cloud_transport_type`, `icon_url`, `allow_unknown_rpc_passthrough` " ",`encryption_required`) " "VALUES " - "(?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + "(?,?,?,?,?,?,?,?,?,?,?,?,?)"; const std::string kInsertAppGroup = "INSERT INTO `app_group` (`application_id`, `functional_group_id`)" @@ -916,7 +915,7 @@ const std::string kSelectUserMsgsVersion = "SELECT DISTINCT `number` FROM `version`"; const std::string kSelectAppPolicies = - "SELECT `id`, `priority_value`, `memory_kb`, " + "SELECT `id`, `priority_value`, " " `heart_beat_timeout_ms`, `certificate`, `hybrid_app_preference_value`, " " `endpoint`, `enabled`, `auth_token`, `cloud_transport_type`, `icon_url`, " " `allow_unknown_rpc_passthrough`, `encryption_required`" @@ -1047,16 +1046,16 @@ const std::string kDeleteAppGroupByApplicationId = const std::string kInsertApplicationFull = "INSERT OR IGNORE INTO `application` (`id`, `keep_context`, `steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - " `is_predata`, `memory_kb`, `heart_beat_timeout_ms`, " + " `is_predata`, `heart_beat_timeout_ms`, " " `certificate`, `hybrid_app_preference_value`, `endpoint`, `enabled`, " " `auth_token`, `cloud_transport_type`, `icon_url`, " "`allow_unknown_rpc_passthrough`, `encryption_required`)" - " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; const std::string kSelectApplicationFull = "SELECT `keep_context`, `steal_focus`, `default_hmi`, " "`priority_value`, " - " `is_revoked`, `is_default`, `is_predata`, `memory_kb`," + " `is_revoked`, `is_default`, `is_predata`, " " `heart_beat_timeout_ms`, `certificate`, `hybrid_app_preference_value`, " " `endpoint`, `enabled`, `auth_token`, `cloud_transport_type`, " "`icon_url`, " 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 1f24ca9472..0496896b60 100644 --- a/src/components/policy/policy_regular/src/sql_pt_representation.cc +++ b/src/components/policy/policy_regular/src/sql_pt_representation.cc @@ -772,30 +772,28 @@ bool SQLPTRepresentation::GatherApplicationPoliciesSection( policy_table::EnumFromJsonString(query.GetString(1), &priority); params.priority = priority; - *params.memory_kb = query.GetInteger(2); - - *params.heart_beat_timeout_ms = query.GetUInteger(3); - if (!query.IsNull(4)) { - *params.certificate = query.GetString(4); + *params.heart_beat_timeout_ms = query.GetUInteger(2); + if (!query.IsNull(3)) { + *params.certificate = query.GetString(3); } // Read cloud app properties policy_table::HybridAppPreference hap; - bool valid = policy_table::EnumFromJsonString(query.GetString(5), &hap); + bool valid = policy_table::EnumFromJsonString(query.GetString(4), &hap); if (valid) { *params.hybrid_app_preference = hap; } - *params.endpoint = query.GetString(6); - if (!query.IsNull(7)) { - *params.enabled = query.GetBoolean(7); + *params.endpoint = query.GetString(5); + if (!query.IsNull(6)) { + *params.enabled = query.GetBoolean(6); } - *params.auth_token = query.GetString(8); - *params.cloud_transport_type = query.GetString(9); - *params.icon_url = query.GetString(10); - *params.allow_unknown_rpc_passthrough = query.GetBoolean(11); + *params.auth_token = query.GetString(7); + *params.cloud_transport_type = query.GetString(8); + *params.icon_url = query.GetString(9); + *params.allow_unknown_rpc_passthrough = query.GetBoolean(10); - if (!query.IsNull(12)) { - *params.encryption_required = query.GetBoolean(12); + if (!query.IsNull(11)) { + *params.encryption_required = query.GetBoolean(11); } const auto& gather_app_id = ((*policies).apps[app_id].is_string()) @@ -1116,36 +1114,35 @@ bool SQLPTRepresentation::SaveSpecificAppPolicy( app_query.Bind( 1, std::string(policy_table::EnumToJsonString(app.second.priority))); app_query.Bind(2, app.second.is_null()); - app_query.Bind(3, *app.second.memory_kb); - app_query.Bind(4, static_cast(*app.second.heart_beat_timeout_ms)); + app_query.Bind(3, static_cast(*app.second.heart_beat_timeout_ms)); app.second.certificate.is_initialized() - ? app_query.Bind(5, *app.second.certificate) - : app_query.Bind(5); + ? app_query.Bind(4, *app.second.certificate) + : app_query.Bind(4); app.second.hybrid_app_preference.is_initialized() - ? app_query.Bind(6, + ? app_query.Bind(5, std::string(policy_table::EnumToJsonString( *app.second.hybrid_app_preference))) - : app_query.Bind(6); - app.second.endpoint.is_initialized() ? app_query.Bind(7, *app.second.endpoint) - : app_query.Bind(7); - app.second.enabled.is_initialized() ? app_query.Bind(8, *app.second.enabled) - : app_query.Bind(8); + : app_query.Bind(5); + app.second.endpoint.is_initialized() ? app_query.Bind(6, *app.second.endpoint) + : app_query.Bind(6); + app.second.enabled.is_initialized() ? app_query.Bind(7, *app.second.enabled) + : app_query.Bind(7); app.second.auth_token.is_initialized() - ? app_query.Bind(9, *app.second.auth_token) - : app_query.Bind(9); + ? app_query.Bind(8, *app.second.auth_token) + : app_query.Bind(8); app.second.cloud_transport_type.is_initialized() - ? app_query.Bind(10, *app.second.cloud_transport_type) - : app_query.Bind(10); + ? app_query.Bind(9, *app.second.cloud_transport_type) + : app_query.Bind(9); app.second.icon_url.is_initialized() - ? app_query.Bind(11, *app.second.icon_url) - : app_query.Bind(11); + ? app_query.Bind(10, *app.second.icon_url) + : app_query.Bind(10); app.second.allow_unknown_rpc_passthrough.is_initialized() - ? app_query.Bind(12, *app.second.allow_unknown_rpc_passthrough) - : app_query.Bind(12); + ? app_query.Bind(11, *app.second.allow_unknown_rpc_passthrough) + : app_query.Bind(11); app.second.encryption_required.is_initialized() - ? app_query.Bind(13, *app.second.encryption_required) - : app_query.Bind(13); + ? app_query.Bind(12, *app.second.encryption_required) + : app_query.Bind(12); if (!app_query.Exec() || !app_query.Reset()) { SDL_LOG_WARN("Incorrect insert into application."); diff --git a/src/components/policy/policy_regular/test/sql_pt_representation_storage_test.cc b/src/components/policy/policy_regular/test/sql_pt_representation_storage_test.cc index f719edf391..3277706dfc 100644 --- a/src/components/policy/policy_regular/test/sql_pt_representation_storage_test.cc +++ b/src/components/policy/policy_regular/test/sql_pt_representation_storage_test.cc @@ -102,10 +102,10 @@ TEST_F( // Arrange const std::string value_12345 = "12345"; const std::string query = - "INSERT OR REPLACE INTO `application` (`id`, `memory_kb`," + "INSERT OR REPLACE INTO `application` (`id`," " `heart_beat_timeout_ms`) VALUES ('" + value_12345 + - "', 5, 10); " + "', 10); " "INSERT OR REPLACE INTO functional_group (`id`, `name`)" " VALUES (1, 'Base-4'); " "INSERT OR REPLACE INTO `app_group` (`application_id`," 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 fb64dfe7d0..d0044c7b75 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 @@ -192,7 +192,6 @@ class SQLPTRepresentationTest : protected SQLPTRepresentation, uint16_t apps_size, policy_table::Priority prio, const std::string& section, - uint16_t memory_kb, uint32_t heart_beat_timeout_ms, policy_table::Strings& groups) const { if (section != "device") { @@ -206,7 +205,6 @@ class SQLPTRepresentationTest : protected SQLPTRepresentation, EXPECT_EQ(0u, (*(apps_iter->second.nicknames)).size()); EXPECT_EQ(prio, apps_iter->second.priority); EXPECT_EQ(0u, (*(apps_iter->second.AppHMIType)).size()); - EXPECT_EQ(memory_kb, (*(apps_iter->second.memory_kb))); EXPECT_EQ(heart_beat_timeout_ms, (*(apps_iter->second.heart_beat_timeout_ms))); } else { @@ -532,8 +530,8 @@ TEST_F( CheckPermissionsAllowed_SetValuesInAppGroupRpcFunctionalGroup_GetEqualParamsInCheckPermissionResult) { // Arrange const std::string query = - "INSERT OR REPLACE INTO `application` (`id`, `memory_kb`," - " `heart_beat_timeout_ms`) VALUES ('12345', 5, 10); " + "INSERT OR REPLACE INTO `application` (`id`," + " `heart_beat_timeout_ms`) VALUES ('12345', 10); " "INSERT OR REPLACE INTO functional_group (`id`, `name`)" " VALUES (1, 'Base-4'); " "INSERT OR REPLACE INTO `app_group` (`application_id`," @@ -563,8 +561,8 @@ TEST_F( CheckPermissionsAllowedWithoutParameters_SetLimitedPermissions_ExpectEmptyListOfAllowedParams) { // Arrange const std::string query = - "INSERT OR REPLACE INTO `application` (`id`, `memory_kb`," - " `heart_beat_timeout_ms`) VALUES ('12345', 5, 10); " + "INSERT OR REPLACE INTO `application` (`id`, " + " `heart_beat_timeout_ms`) VALUES ('12345', 10); " "INSERT OR REPLACE INTO functional_group (`id`, `name`)" " VALUES (1, 'Base-4'); " "INSERT OR REPLACE INTO `app_group` (`application_id`," @@ -1050,10 +1048,10 @@ TEST_F(SQLPTRepresentationTest, "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( 'default', 0, 0, 'NONE', 'NONE', 0, " "0, " - "0, 64, 10) "; + "0, 10) "; // Assert ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_default)); @@ -1062,10 +1060,10 @@ TEST_F(SQLPTRepresentationTest, "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( 'pre_DataConsent', 0, 0, 'NONE', " "'NONE', 0, 0, " - "0, 64, 10) "; + "0, 10) "; // Assert ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_predataconsent)); @@ -1074,10 +1072,10 @@ TEST_F(SQLPTRepresentationTest, "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( 'device', 0, 0, 'NONE', " "'COMMUNICATION', 0, 0, " - "0, 64, 10) "; + "0, 10) "; // Assert ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_device)); @@ -1086,10 +1084,10 @@ TEST_F(SQLPTRepresentationTest, "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( '12345', 0, 0, 'NONE', 'EMERGENCY', " "0, 0, " - "0, 64, 10) "; + "0, 10) "; // Assert ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_12345)); @@ -1146,10 +1144,10 @@ TEST_F(SQLPTRepresentationTest, "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( 'default', 0, 0, 'NONE', 'NONE', 0, " "0, " - "0, 64, 10) "; + "0, 10) "; // Assert ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_default)); @@ -1158,10 +1156,10 @@ TEST_F(SQLPTRepresentationTest, "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( 'pre_DataConsent', 0, 0, 'NONE', " "'NONE', 0, 0, " - "0, 64, 10) "; + "0, 10) "; // Assert ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_predataconsent)); @@ -1170,10 +1168,10 @@ TEST_F(SQLPTRepresentationTest, "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( 'device', 0, 0, 'NONE', " "'COMMUNICATION', 0, 0, " - "0, 64, 10) "; + "0, 10) "; // Assert ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_device)); @@ -1182,10 +1180,10 @@ TEST_F(SQLPTRepresentationTest, "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( '12345', 0, 0, 'NONE', 'EMERGENCY', " "0, 0, " - "0, 64, 10) "; + "0, 10) "; // Assert ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_12345)); @@ -1361,10 +1359,10 @@ TEST_F(SQLPTRepresentationTest, "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( 'default', 0, 0, 'NONE', 'NONE', 0, " "0, " - "0, 64, 10) "; + "0, 10) "; // Assert ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_default)); @@ -1373,9 +1371,9 @@ TEST_F(SQLPTRepresentationTest, "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( 'device', 0, 0, 'NONE', " - "'COMMUNICATION', 0, 0, 0, 64, 10) "; + "'COMMUNICATION', 0, 0, 0, 10) "; // Assert ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_device)); @@ -1384,10 +1382,10 @@ TEST_F(SQLPTRepresentationTest, "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( '12345', 0, 0, 'NONE', 'EMERGENCY', " "0, 0, " - "0, 64, 10) "; + "0, 10) "; // Assert ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_12345)); @@ -1406,10 +1404,10 @@ TEST_F(SQLPTRepresentationTest, "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( '7777', 0, 0, 'NONE', 'NONE', 1, " "0, " - "0, 64, 10) "; + "0, 10) "; // Assert ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_7777)); @@ -1418,10 +1416,10 @@ TEST_F(SQLPTRepresentationTest, "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( '12345', 0, 0, 'NONE', 'EMERGENCY', " "0, 0, " - "0, 64, 10) "; + "0, 10) "; // Assert ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_12345)); @@ -1438,10 +1436,10 @@ TEST_F(SQLPTRepresentationTest, "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( 'default', 0, 0, 'NONE', 'NONE', 0, " "1, " - "0, 64, 10) "; + "0, 10) "; // Assert ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_default)); @@ -1450,9 +1448,9 @@ TEST_F(SQLPTRepresentationTest, "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( '123', 1, 0, 'FULL', " - "'COMMUNICATION', 1, 1, 0, 64, 10) "; + "'COMMUNICATION', 1, 1, 0, 10) "; // Assert ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_123)); @@ -1487,10 +1485,10 @@ TEST_F(SQLPTRepresentationTest, "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) VALUES( '12345', 0, 0, 'NONE', 'NONE', 0, " "0, " - "1, 64, 10) "; + "1, 10) "; // Assert ASSERT_TRUE(query_wrapper_->Exec(query_insert_app)); @@ -1505,8 +1503,8 @@ TEST_F(SQLPTRepresentationTest, const std::string query_insert_app = "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, `default_hmi`, `priority_value`, `is_revoked`, " - "`is_default`, `is_predata`, `memory_kb`, `heart_beat_timeout_ms`) " - "VALUES( '1234567', 0, 0, 'NONE', 'NONE', 0, 1, 0, 64, 10) "; + "`is_default`, `is_predata`, `heart_beat_timeout_ms`) " + "VALUES( '1234567', 0, 0, 'NONE', 'NONE', 0, 1, 0, 10) "; // Assert ASSERT_TRUE(query_wrapper_->Exec(query_insert_app)); @@ -1547,10 +1545,10 @@ TEST_F(SQLPTRepresentationTest, "INSERT INTO `application`(`id`, `keep_context`, " "`steal_focus`, " " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " - "`is_predata`, `memory_kb`, " + "`is_predata`, " " `heart_beat_timeout_ms`) " "VALUES( '" + - kDefaultId + "', 0, 0, 'NONE', 'NONE', 0, 0, 0, 64, 10) "; + kDefaultId + "', 0, 0, 'NONE', 'NONE', 0, 0, 0, 10) "; // Assert ASSERT_TRUE(query_wrapper_->Exec(query_insert_default_app)); @@ -1574,9 +1572,9 @@ TEST_F(SQLPTRepresentationTest, const std::string query_insert_new_app = "INSERT INTO `application`(`id`, `keep_context`, " "`steal_focus`, `default_hmi`, `priority_value`, `is_revoked`, " - "`is_default`, `is_predata`, `memory_kb`, `heart_beat_timeout_ms`) " + "`is_default`, `is_predata`, `heart_beat_timeout_ms`) " "VALUES('" + - kAppId + "', 0, 0, 'NONE', 'NONE', 0, 0, 1, 64, 10)"; + kAppId + "', 0, 0, 'NONE', 'NONE', 0, 0, 1, 10)"; // Assert ASSERT_TRUE(query_wrapper_->Exec(query_insert_new_app)); @@ -1631,8 +1629,8 @@ TEST_F(SQLPTRepresentationTest, const std::string query_insert_app = "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " "`steal_focus`, `default_hmi`, `priority_value`, `is_revoked`, " - "`is_default`, `is_predata`, `memory_kb`, `heart_beat_timeout_ms`) " - "VALUES( '1234567', 0, 0, 'NONE', 'NONE', 0, 0, 1, 64, 10) "; + "`is_default`, `is_predata`, `heart_beat_timeout_ms`) " + "VALUES( '1234567', 0, 0, 'NONE', 'NONE', 0, 0, 1, 10) "; // Assert ASSERT_TRUE(query_wrapper_->Exec(query_insert_app)); diff --git a/src/components/utils/test/policy.sql b/src/components/utils/test/policy.sql index ed627b5fdc..7eaf572b71 100644 --- a/src/components/utils/test/policy.sql +++ b/src/components/utils/test/policy.sql @@ -117,7 +117,6 @@ BEGIN TRANSACTION; `is_revoked` BOOLEAN, `is_default` BOOLEAN, `is_predata` BOOLEAN, - `memory_kb` INTEGER NOT NULL, `heart_beat_timeout_ms` INTEGER NOT NULL, `certificate` VARCHAR(45), CONSTRAINT `fk_application_hmi_level1` -- cgit v1.2.1 From a0bde744aceaf3c989dccf6bf5c7de04c363a675 Mon Sep 17 00:00:00 2001 From: "Andrii Kalinich (GitHub)" Date: Fri, 15 Oct 2021 14:24:10 -0400 Subject: Added python packages' check (#3776) Co-authored-by: OlhaVorobiova --- .github/workflows/sdl_core_github_ci.yml | 4 ++-- .github/workflows/sdl_core_github_ci_coverity.yml | 4 ++-- src/components/interfaces/CMakeLists.txt | 15 +++++++++++++-- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/.github/workflows/sdl_core_github_ci.yml b/.github/workflows/sdl_core_github_ci.yml index 14ff51c2fe..47e13f9673 100644 --- a/.github/workflows/sdl_core_github_ci.yml +++ b/.github/workflows/sdl_core_github_ci.yml @@ -9,7 +9,7 @@ jobs: run: git -C ${{ github.workspace }} submodule update --init --recursive # Install Dependencies - name: Apt Get Dependencies - run: sudo apt-get update && sudo apt-get install libssl-dev libbluetooth3 libbluetooth-dev libudev-dev cmake html2text lcov git cmake automake1.11 build-essential libavahi-client-dev sqlite3 libsqlite3-dev libgtest-dev bluez-tools libpulse-dev libusb-1.0.0-dev cppcheck python3-pip python3-setuptools && sudo apt-get install -f clang-format-8 + run: sudo apt-get update && sudo apt-get install libssl-dev libbluetooth3 libbluetooth-dev libudev-dev cmake html2text lcov git cmake automake1.11 build-essential libavahi-client-dev sqlite3 libsqlite3-dev libgtest-dev bluez-tools libpulse-dev libusb-1.0.0-dev cppcheck python3-pip python3-setuptools python3-wheel && sudo apt-get install -f clang-format-8 - name: Setup CMAKE uses: jwlawson/actions-setup-cmake@v1.8 with: @@ -36,7 +36,7 @@ jobs: - name: Configure run: cmake ../sdl_core -DBUILD_TESTS=ON -DLOGGER_NAME=BOOST - name: Build - run: make install-3rd_party && make -j `nproc` install + run: make install-3rd_party && make install_python_dependencies && make -j `nproc` install - name: Set Library Path run: echo "LD_LIBRARY_PATH=$THIRD_PARTY_INSTALL_PREFIX/lib:." >> $GITHUB_ENV # run tests diff --git a/.github/workflows/sdl_core_github_ci_coverity.yml b/.github/workflows/sdl_core_github_ci_coverity.yml index c60482d30f..84769c26ea 100644 --- a/.github/workflows/sdl_core_github_ci_coverity.yml +++ b/.github/workflows/sdl_core_github_ci_coverity.yml @@ -21,7 +21,7 @@ jobs: run: git -C ${{ github.workspace }} submodule update --init --recursive # Install Dependencies - name: Apt Get Dependencies - run: sudo apt-get update && sudo apt-get install libssl-dev libbluetooth3 libbluetooth-dev libudev-dev cmake html2text lcov git cmake automake1.11 build-essential libavahi-client-dev sqlite3 libsqlite3-dev libgtest-dev bluez-tools libpulse-dev libusb-1.0.0-dev cppcheck python3-pip python3-setuptools && sudo apt-get install -f clang-format-6.0 + run: sudo apt-get update && sudo apt-get install libssl-dev libbluetooth3 libbluetooth-dev libudev-dev cmake html2text lcov git cmake automake1.11 build-essential libavahi-client-dev sqlite3 libsqlite3-dev libgtest-dev bluez-tools libpulse-dev libusb-1.0.0-dev cppcheck python3-pip python3-setuptools python3-wheel && sudo apt-get install -f clang-format-6.0 - name: Setup CMAKE uses: jwlawson/actions-setup-cmake@v1.8 with: @@ -51,7 +51,7 @@ jobs: - name: unzip run: tar zxvf coverity_tool.tgz - name: Build - run: make install-3rd_party && ./cov-analysis-linux64-2020.09/bin/cov-build --dir cov-int make -j `nproc` install + run: make install-3rd_party && make install_python_dependencies && ./cov-analysis-linux64-2020.09/bin/cov-build --dir cov-int make -j `nproc` install - name: Set Library Path run: echo "LD_LIBRARY_PATH=$THIRD_PARTY_INSTALL_PREFIX/lib:." >> $GITHUB_ENV - name: Compress Coverity diff --git a/src/components/interfaces/CMakeLists.txt b/src/components/interfaces/CMakeLists.txt index 7f1a65277d..9679ccf0b4 100644 --- a/src/components/interfaces/CMakeLists.txt +++ b/src/components/interfaces/CMakeLists.txt @@ -52,9 +52,20 @@ include_directories ( ${CMAKE_BINARY_DIR} ) -execute_process(COMMAND /usr/bin/env python3 -m pip install --upgrade --user pip setuptools wheel) set(GENERATOR_REQUIREMENTS "${CMAKE_SOURCE_DIR}/tools/InterfaceGenerator/requirements.txt") -execute_process(COMMAND /usr/bin/env python3 -m pip install --user --requirement ${GENERATOR_REQUIREMENTS}) +file(STRINGS ${GENERATOR_REQUIREMENTS} REQUIREMENTS_LIST) +execute_process(COMMAND /usr/bin/env python3 -m pip list --user OUTPUT_VARIABLE PYTHON_PACKAGES_LIST) + +foreach(REQUIREMENT_PACKAGE IN LISTS REQUIREMENTS_LIST) + string(FIND "${PYTHON_PACKAGES_LIST}" "${REQUIREMENT_PACKAGE}" PACKAGE_FOUND) + if (PACKAGE_FOUND EQUAL -1) + message(WARNING "${REQUIREMENT_PACKAGE} not found!") + endif() +endforeach() + +add_custom_target(install_python_dependencies + COMMAND /usr/bin/env python3 -m pip install --user --requirement ${GENERATOR_REQUIREMENTS} +) generate_interface("v4_protocol_v1_2_no_extra.xml" "ns_smart_device_link_rpc::V1" "sdlrpcv1") add_library(v4_protocol_v1_2_no_extra ${CMAKE_CURRENT_BINARY_DIR}/v4_protocol_v1_2_no_extra_schema.cc) -- cgit v1.2.1 From b7d79fbde866feb8936053578a8790101fbfd292 Mon Sep 17 00:00:00 2001 From: RomanReznichenkoLuxoft <85177915+RomanReznichenkoLuxoft@users.noreply.github.com> Date: Fri, 15 Oct 2021 21:47:00 +0300 Subject: Send a request when the policy table is disabled. (#3767) --- src/components/application_manager/src/policies/policy_handler.cc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/components/application_manager/src/policies/policy_handler.cc b/src/components/application_manager/src/policies/policy_handler.cc index 202b62ced4..500981a5a8 100644 --- a/src/components/application_manager/src/policies/policy_handler.cc +++ b/src/components/application_manager/src/policies/policy_handler.cc @@ -2869,6 +2869,10 @@ void PolicyHandler::UpdateHMILevel(ApplicationSharedPtr app, bool PolicyHandler::CheckModule(const PTString& app_id, const PTString& module) { + if (!PolicyEnabled()) { + SDL_LOG_DEBUG("Policy table is disabled"); + return true; + } const auto policy_manager = LoadPolicyManager(); POLICY_LIB_CHECK_OR_RETURN(policy_manager, false); return policy_manager->CheckModule(app_id, module); @@ -2939,6 +2943,10 @@ bool PolicyHandler::CheckHMIType(const std::string& application_id, mobile_apis::AppHMIType::eType hmi, const smart_objects::SmartObject* app_types) { SDL_LOG_AUTO_TRACE(); + if (!PolicyEnabled()) { + SDL_LOG_DEBUG("Policy table is disabled"); + return true; + } const auto policy_manager = LoadPolicyManager(); POLICY_LIB_CHECK_OR_RETURN(policy_manager, false); std::vector policy_hmi_types; -- cgit v1.2.1 From c8d240b5da201f87f1802fe85851237b6453022a Mon Sep 17 00:00:00 2001 From: "Andrii Kalinich (GitHub)" Date: Fri, 15 Oct 2021 15:38:29 -0400 Subject: Changed clang-format version from 6 to 8 (#3777) Co-authored-by: OlhaVorobiova --- .github/workflows/sdl_core_github_ci_coverity.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sdl_core_github_ci_coverity.yml b/.github/workflows/sdl_core_github_ci_coverity.yml index 84769c26ea..c3cbec5893 100644 --- a/.github/workflows/sdl_core_github_ci_coverity.yml +++ b/.github/workflows/sdl_core_github_ci_coverity.yml @@ -21,7 +21,7 @@ jobs: run: git -C ${{ github.workspace }} submodule update --init --recursive # Install Dependencies - name: Apt Get Dependencies - run: sudo apt-get update && sudo apt-get install libssl-dev libbluetooth3 libbluetooth-dev libudev-dev cmake html2text lcov git cmake automake1.11 build-essential libavahi-client-dev sqlite3 libsqlite3-dev libgtest-dev bluez-tools libpulse-dev libusb-1.0.0-dev cppcheck python3-pip python3-setuptools python3-wheel && sudo apt-get install -f clang-format-6.0 + run: sudo apt-get update && sudo apt-get install libssl-dev libbluetooth3 libbluetooth-dev libudev-dev cmake html2text lcov git cmake automake1.11 build-essential libavahi-client-dev sqlite3 libsqlite3-dev libgtest-dev bluez-tools libpulse-dev libusb-1.0.0-dev cppcheck python3-pip python3-setuptools python3-wheel && sudo apt-get install -f clang-format-8 - name: Setup CMAKE uses: jwlawson/actions-setup-cmake@v1.8 with: -- cgit v1.2.1 From b8211bc97723ab474c78ffe4972f0494b08789c2 Mon Sep 17 00:00:00 2001 From: Jacob Keeler Date: Thu, 4 Nov 2021 11:18:33 -0400 Subject: Update minimum value of MaxSupportedProtocolVersion to 2 (#3801) If this value is set to 1, no apps can register because SDL Core responds with UNSUPPORTED_VERSION to protocol V1 messages (besides the initial StartService) --- src/appMain/smartDeviceLink.ini | 2 +- src/components/config_profile/src/profile.cc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/appMain/smartDeviceLink.ini b/src/appMain/smartDeviceLink.ini index 56822db0ef..15bba13b86 100644 --- a/src/appMain/smartDeviceLink.ini +++ b/src/appMain/smartDeviceLink.ini @@ -237,7 +237,7 @@ CloudAppRetryTimeout = 1000 CloudAppMaxRetryAttempts = 5 [ProtocolHandler] -; SDL supported protocol version +; SDL supported protocol version. Minimum value is 2 MaxSupportedProtocolVersion = 5 ; Packet with payload bigger than next value will be marked as a malformed ; for protocol v3 or higher diff --git a/src/components/config_profile/src/profile.cc b/src/components/config_profile/src/profile.cc index f318ec98f5..38be86c72f 100644 --- a/src/components/config_profile/src/profile.cc +++ b/src/components/config_profile/src/profile.cc @@ -2298,8 +2298,8 @@ void Profile::UpdateValues() { kProtocolHandlerSection, kMaxSupportedProtocolVersionKey); - if (max_supported_protocol_version_ < 1) { - max_supported_protocol_version_ = 1; + if (max_supported_protocol_version_ < 2) { + max_supported_protocol_version_ = 2; } else if (max_supported_protocol_version_ > kDefaultMaxSupportedProtocolVersion) { max_supported_protocol_version_ = kDefaultMaxSupportedProtocolVersion; -- cgit v1.2.1 From 95512d7beba6be8598102be2ab49ed37197132ae Mon Sep 17 00:00:00 2001 From: "Andrii Kalinich (GitHub)" Date: Fri, 5 Nov 2021 15:51:47 -0400 Subject: Fix unstable unit test (#3809) Looks like we have to properly shutdown message queue in the unit test which emulates data sending over the secured websocket session. Otherwise, unit test might be terminated earlier and data sending will be failed which causes a core crash. --- src/components/transport_manager/test/websocket_connection_test.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/components/transport_manager/test/websocket_connection_test.cc b/src/components/transport_manager/test/websocket_connection_test.cc index 306bdc4784..1c65fd3f14 100644 --- a/src/components/transport_manager/test/websocket_connection_test.cc +++ b/src/components/transport_manager/test/websocket_connection_test.cc @@ -141,6 +141,10 @@ TEST_F(WebsocketNotSecureSessionConnectionTest, SUCCESS_SendData) { auto error = websocket_connection_->SendData(message); ASSERT_EQ(TransportAdapter::Error::OK, error); + + auto disconnect_error = websocket_connection_->Disconnect(); + + ASSERT_EQ(TransportAdapter::Error::OK, disconnect_error); } TEST_F(WebsocketNotSecureSessionConnectionTest, UNSUCCESS_SendData_BAD_STATE) { -- cgit v1.2.1 From a626f4205e5f6aaefb29b38336b75524d1a3643f Mon Sep 17 00:00:00 2001 From: "Andrii Kalinich (GitHub)" Date: Mon, 8 Nov 2021 09:10:25 -0500 Subject: Fix unstable policy handler test (#3810) * Fix unstable policy handler unit tests Looks like there was a missing async waiter in some unit tests so Async thread is still working when unit test is already finalized. That causes a core crashes and random unit tests failures. Was added `UnloadPolicyLibrary()` call to stop the async thread before finalizing the unit test. * Increase timeout for tests --- .../test/policy_handler_test.cc | 54 ++++++++++------------ 1 file changed, 25 insertions(+), 29 deletions(-) diff --git a/src/components/application_manager/test/policy_handler_test.cc b/src/components/application_manager/test/policy_handler_test.cc index 353f3f05b7..50f2153616 100644 --- a/src/components/application_manager/test/policy_handler_test.cc +++ b/src/components/application_manager/test/policy_handler_test.cc @@ -127,7 +127,7 @@ class PolicyHandlerTest : public ::testing::Test { , kGroupNameAllowed_("name_allowed") , kGroupNameDisallowed_("name_disallowed") , kCallsCount_(1u) - , kTimeout_(1000u) + , kTimeout_(2000u) , mock_message_helper_(*MockMessageHelper::message_helper_mock()) { Mock::VerifyAndClearExpectations(&mock_message_helper_); } @@ -195,13 +195,15 @@ class PolicyHandlerTest : public ::testing::Test { .WillByDefault(ReturnRef(mock_session_observer)); mock_app_ = std::make_shared(); + ON_CALL(*mock_app_, IsRegistered()).WillByDefault(Return(true)); } virtual void TearDown() OVERRIDE { - Mock::VerifyAndClearExpectations(&mock_message_helper_); + EXPECT_TRUE(policy_handler_.UnloadPolicyLibrary()); ON_CALL( mock_event_dispatcher_, remove_observer(_, testing::Matcher(_))); + Mock::VerifyAndClearExpectations(&mock_message_helper_); } void ChangePolicyManagerToMock() { @@ -2268,34 +2270,26 @@ TEST_F(PolicyHandlerTest, EXPECT_CALL(*mock_app_, policy_app_id()).WillOnce(Return(kPolicyAppId_)); EXPECT_CALL(*mock_app_, device()).WillOnce(Return(device)); - auto waiter_first = TestAsyncWaiter::createInstance(); -#ifdef EXTERNAL_PROPRIETARY_MODE - EXPECT_CALL(*mock_policy_manager_, SetUserConsentForApp(_, _)) - .WillOnce(NotifyTestAsyncWaiter(waiter_first)); -#else - EXPECT_CALL(*mock_policy_manager_, SetUserConsentForApp(_)) - .WillOnce(NotifyTestAsyncWaiter(waiter_first)); -#endif ExternalConsentStatusItem item(1u, 1u, kStatusOn); ExternalConsentStatus external_consent_status; external_consent_status.insert(item); + auto waiter = TestAsyncWaiter::createInstance(); #ifdef EXTERNAL_PROPRIETARY_MODE - auto waiter_second = TestAsyncWaiter::createInstance(); - EXPECT_CALL(*mock_policy_manager_, SetExternalConsentStatus(external_consent_status)) - .WillOnce(Return(true)); + .WillOnce(DoAll(NotifyTestAsyncWaiter(waiter), Return(true))); + policy_handler_.OnAppPermissionConsent( kConnectionKey_, permissions, external_consent_status); #else - policy_handler_.OnAppPermissionConsent(kConnectionKey_, permissions); + EXPECT_CALL(*mock_policy_manager_, SetUserConsentForApp(_)) + .WillOnce(NotifyTestAsyncWaiter(waiter)); + policy_handler_.OnAppPermissionConsent(kConnectionKey_, permissions); #endif - EXPECT_TRUE(waiter_first->WaitFor(kCallsCount_, kTimeout_)); -#ifdef EXTERNAL_PROPRIETARY_MODE - EXPECT_TRUE(waiter_second->WaitFor(kCallsCount_, kTimeout_)); -#endif + + EXPECT_TRUE(waiter->WaitFor(kCallsCount_, kTimeout_)); } TEST_F(PolicyHandlerTest, @@ -2401,6 +2395,7 @@ TEST_F(PolicyHandlerTest, EXPECT_CALL(*mock_app_, device()).WillRepeatedly(Return(1u)); EXPECT_CALL(*mock_app_, policy_app_id()) .WillRepeatedly(Return(kPolicyAppId_)); + EXPECT_CALL(*mock_app_, mac_address()).WillRepeatedly(ReturnRef(kMacAddr_)); EXPECT_CALL( mock_session_observer, @@ -2418,22 +2413,21 @@ TEST_F(PolicyHandlerTest, ExternalConsentStatusItem item = {1u, 1u, kStatusOn}; ExternalConsentStatus external_consent_status; external_consent_status.insert(item); -#ifdef EXTERNAL_PROPRIETARY_MODE - auto waiter = TestAsyncWaiter::createInstance(); + auto waiter = TestAsyncWaiter::createInstance(); +#ifdef EXTERNAL_PROPRIETARY_MODE EXPECT_CALL(*mock_policy_manager_, SetExternalConsentStatus(external_consent_status)) .WillOnce(DoAll(NotifyTestAsyncWaiter(waiter), Return(true))); policy_handler_.OnAppPermissionConsent( invalid_connection_key, permissions, external_consent_status); #else + EXPECT_CALL(*mock_policy_manager_, SetUserConsentForApp(_)) + .WillOnce(NotifyTestAsyncWaiter(waiter)); policy_handler_.OnAppPermissionConsent(invalid_connection_key, permissions); #endif - Mock::VerifyAndClearExpectations(mock_app_.get()); -#ifdef EXTERNAL_PROPRIETARY_MODE EXPECT_TRUE(waiter->WaitFor(kCallsCount_, kTimeout_)); -#endif } TEST_F(PolicyHandlerTest, @@ -2463,6 +2457,7 @@ TEST_F(PolicyHandlerTest, EXPECT_CALL(*mock_app_, device()).WillRepeatedly(Return(1u)); EXPECT_CALL(*mock_app_, policy_app_id()) .WillRepeatedly(Return(kPolicyAppId_)); + EXPECT_CALL(*mock_app_, mac_address()).WillRepeatedly(ReturnRef(kMacAddr_)); EXPECT_CALL( mock_session_observer, @@ -2480,24 +2475,25 @@ TEST_F(PolicyHandlerTest, ExternalConsentStatusItem item = {1u, 1u, kStatusOn}; ExternalConsentStatus external_consent_status; external_consent_status.insert(item); -#ifdef EXTERNAL_PROPRIETARY_MODE - auto waiter = TestAsyncWaiter::createInstance(); + auto waiter = TestAsyncWaiter::createInstance(); +#ifdef EXTERNAL_PROPRIETARY_MODE ON_CALL(*mock_policy_manager_, IsNeedToUpdateExternalConsentStatus(_)) .WillByDefault(Return(false)); EXPECT_CALL(*mock_policy_manager_, SetExternalConsentStatus(external_consent_status)) .WillOnce(Return(true)); + EXPECT_CALL(*mock_policy_manager_, SetUserConsentForApp(_, _)) + .WillOnce(NotifyTestAsyncWaiter(waiter)); policy_handler_.OnAppPermissionConsent( invalid_connection_key, permissions, external_consent_status); #else + EXPECT_CALL(*mock_policy_manager_, SetUserConsentForApp(_)) + .WillOnce(NotifyTestAsyncWaiter(waiter)); policy_handler_.OnAppPermissionConsent(invalid_connection_key, permissions); #endif - Mock::VerifyAndClearExpectations(mock_app_.get()); -#ifdef EXTERNAL_PROPRIETARY_MODE - EXPECT_FALSE(waiter->WaitFor(kCallsCount_, kTimeout_)); -#endif + EXPECT_TRUE(waiter->WaitFor(kCallsCount_, kTimeout_)); } ACTION_P(SetEndpoint, endpoint) { -- cgit v1.2.1 From 3ca6d944a42d6abf96be9a4a5265e69498091918 Mon Sep 17 00:00:00 2001 From: Jacob Keeler Date: Mon, 8 Nov 2021 15:14:25 -0500 Subject: Reset display_capabilities_ pointer after merging capabilities (#3812) --- src/components/application_manager/src/application_data_impl.cc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/components/application_manager/src/application_data_impl.cc b/src/components/application_manager/src/application_data_impl.cc index 1d6ea8afe8..57f7932246 100644 --- a/src/components/application_manager/src/application_data_impl.cc +++ b/src/components/application_manager/src/application_data_impl.cc @@ -610,8 +610,7 @@ void DynamicApplicationDataImpl::set_display_capabilities( (*display_capabilities_)[0][strings::window_capabilities]; } - display_capabilities_.reset( - new smart_objects::SmartObject(display_capabilities)); + smart_objects::SmartObject merged_capabilities = display_capabilities; auto get_window_index = [&tmp_window_capabilities](const WindowID window_id) { const auto tmp_window_capabilities_arr = tmp_window_capabilities.asArray(); @@ -647,8 +646,11 @@ void DynamicApplicationDataImpl::set_display_capabilities( } } - (*display_capabilities_)[0][strings::window_capabilities] = + merged_capabilities[0][strings::window_capabilities] = tmp_window_capabilities; + + display_capabilities_.reset( + new smart_objects::SmartObject(merged_capabilities)); } void DynamicApplicationDataImpl::remove_window_capability( -- cgit v1.2.1 From 18095c1be36c318200aa7a67c86e66bc021862af Mon Sep 17 00:00:00 2001 From: "Andrii Kalinich (GitHub)" Date: Tue, 9 Nov 2021 09:45:29 -0500 Subject: Fix ThreadedSocket disconnect logic (#3566) * Fix ThreadedSocket disconnect logic There was noticed an issue with ThreadedSocket connection which often closes connection like an "unexpected disconnect" calling `ConnectionAborted()` every time even if it is handled disconnect. Also, there were no any events raised to Transport Manager for rare cases when disconnect is expected. To fix that, flow has been separated for handling expected and unexpected disconnect. Expected disconnect will be handled in case when external component calls `Disconnect()` and socket thread is alive. In that case should be called `DisconnectDone()` when thread is stopped. Unexpected disconnect will be handled in case when internal thread has been aborted and `Abort()` was called. In that case internal thread `ConnectionAborted()` will be called from internal thread to notify Transport Manager that physical disconnect has happened. This issue is pretty hard to detect just because business logic handles both disconnect types in the same way for now, but this might be changed in the future. * Update Boost Download URL Co-authored-by: JackLivio --- .../transport_adapter/threaded_socket_connection.h | 4 +- .../threaded_socket_connection.cc | 67 ++++++++++++++-------- 2 files changed, 46 insertions(+), 25 deletions(-) diff --git a/src/components/transport_manager/include/transport_manager/transport_adapter/threaded_socket_connection.h b/src/components/transport_manager/include/transport_manager/transport_adapter/threaded_socket_connection.h index 7c4e07fa59..9241d9e1db 100644 --- a/src/components/transport_manager/include/transport_manager/transport_adapter/threaded_socket_connection.h +++ b/src/components/transport_manager/include/transport_manager/transport_adapter/threaded_socket_connection.h @@ -189,7 +189,9 @@ class ThreadedSocketConnection : public Connection { int write_fd_; void threadMain(); void Transmit(); - void Finalize(); + void FinalizeExpectedDisconnect(); + void FinalizeUnexpectedDisconnect(); + void NotifyAboutAbortedMessages(); TransportAdapter::Error Notify() const; bool Receive(); bool Send(); 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 61562d88c0..03e0869180 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 @@ -81,7 +81,8 @@ ThreadedSocketConnection::~ThreadedSocketConnection() { } void ThreadedSocketConnection::StopAndJoinThread() { - Disconnect(); + SDL_LOG_AUTO_TRACE(); + terminate_flag_ = true; if (thread_) { thread_->Stop(threads::Thread::kThreadSoftStop); delete thread_->GetDelegate(); @@ -92,8 +93,10 @@ void ThreadedSocketConnection::StopAndJoinThread() { void ThreadedSocketConnection::Abort() { SDL_LOG_AUTO_TRACE(); - unexpected_disconnect_ = true; - terminate_flag_ = true; + if (!terminate_flag_) { + unexpected_disconnect_ = true; + terminate_flag_ = true; + } } TransportAdapter::Error ThreadedSocketConnection::Start() { @@ -123,18 +126,33 @@ TransportAdapter::Error ThreadedSocketConnection::Start() { return TransportAdapter::OK; } -void ThreadedSocketConnection::Finalize() { - SDL_LOG_AUTO_TRACE(); - if (unexpected_disconnect_) { - SDL_LOG_DEBUG("unexpected_disconnect"); - controller_->ConnectionAborted( - device_handle(), application_handle(), CommunicationError()); - } else { - SDL_LOG_DEBUG("not unexpected_disconnect"); - controller_->ConnectionFinished(device_handle(), application_handle()); +void ThreadedSocketConnection::NotifyAboutAbortedMessages() { + sync_primitives::AutoLock auto_lock(frames_to_send_mutex_); + while (!frames_to_send_.empty()) { + SDL_LOG_INFO("removing message"); + ::protocol_handler::RawMessagePtr message = frames_to_send_.front(); + frames_to_send_.pop(); + controller_->DataSendFailed( + device_handle(), application_handle(), message, DataSendError()); } +} + +void ThreadedSocketConnection::FinalizeUnexpectedDisconnect() { + SDL_LOG_DEBUG("Finalizing unexpected disconnect"); + controller_->ConnectionAborted( + device_handle(), application_handle(), CommunicationError()); + + ShutdownAndCloseSocket(); + NotifyAboutAbortedMessages(); +} + +void ThreadedSocketConnection::FinalizeExpectedDisconnect() { + SDL_LOG_DEBUG("Finalizing expected disconnect"); + controller_->ConnectionFinished(device_handle(), application_handle()); ShutdownAndCloseSocket(); + NotifyAboutAbortedMessages(); + controller_->DisconnectDone(device_handle(), application_handle()); } TransportAdapter::Error ThreadedSocketConnection::Notify() const { @@ -164,9 +182,14 @@ TransportAdapter::Error ThreadedSocketConnection::SendData( TransportAdapter::Error ThreadedSocketConnection::Disconnect() { SDL_LOG_AUTO_TRACE(); - terminate_flag_ = true; - ShutdownAndCloseSocket(); - return Notify(); + + if (!unexpected_disconnect_) { + terminate_flag_ = true; + FinalizeExpectedDisconnect(); + return TransportAdapter::OK; + } + + return TransportAdapter::FAIL; } void ThreadedSocketConnection::Terminate() { @@ -189,16 +212,12 @@ void ThreadedSocketConnection::threadMain() { while (!terminate_flag_) { Transmit(); } - SDL_LOG_DEBUG("Connection is to finalize"); - Finalize(); - sync_primitives::AutoLock auto_lock(frames_to_send_mutex_); - while (!frames_to_send_.empty()) { - SDL_LOG_INFO("removing message"); - ::protocol_handler::RawMessagePtr message = frames_to_send_.front(); - frames_to_send_.pop(); - controller_->DataSendFailed( - device_handle(), application_handle(), message, DataSendError()); + + if (unexpected_disconnect_) { + FinalizeUnexpectedDisconnect(); } + + SDL_LOG_ERROR("Socket connection thread is closed"); } bool ThreadedSocketConnection::IsFramesToSendQueueEmpty() const { -- cgit v1.2.1 From dbb573689e674ce91da47c5dd8a916838148dde9 Mon Sep 17 00:00:00 2001 From: Collin Date: Tue, 9 Nov 2021 12:27:50 -0500 Subject: Do not modify application list while iterating it (#3806) * do not modify applications array while iterating it * remove unnecessary and dangerous iterator++ * fixup! do not modify applications array while iterating it restore sending on language change to mobile * deref app ptr while holding app list lock * SendNotificationToMobile can also invalidate apps list iterator by calling unregister application * apply fix to TTS and VR on language change * Revert "Fix early IsRegistered() state of application (#3796)" This reverts commit 0ed38e8d2f7cb3a61a303cca2806a06ce9a1d58d. * revert #3799 * prevent crash with null app in rai response * do not deactivate app before unregistering in case of vr language change * make copy of ApplicationSet instead of pushing app_ids to vector * address failure of 3797_3798 atf test in extprop policy mode * fixup! address failure of 3797_3798 atf test in extprop policy mode only send NO_APPS_REGISTERED when no apps are registered * fix ext prop unit test and APPLICATION_NOT_REGISTERED log message * fixup! fix ext prop unit test and APPLICATION_NOT_REGISTERED log message fix style * simplify code copying applicationset --- .../hmi/on_tts_language_change_notification.cc | 16 ++--- .../hmi/on_ui_language_change_notification.cc | 15 ++--- .../hmi/on_vr_language_change_notification.cc | 22 ++----- .../src/commands/hmi/sdl_activate_app_request.cc | 68 +++++++++------------- .../mobile/register_app_interface_request.cc | 3 +- .../mobile/register_app_interface_response.cc | 2 +- .../test/commands/hmi/hmi_notifications_test.cc | 10 ---- .../commands/hmi/sdl_activate_app_request_test.cc | 24 ++++---- .../src/application_manager_impl.cc | 5 +- .../src/message_helper/message_helper.cc | 2 +- 10 files changed, 58 insertions(+), 109 deletions(-) diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_tts_language_change_notification.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_tts_language_change_notification.cc index d693c00ac3..51df69d0bc 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_tts_language_change_notification.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_tts_language_change_notification.cc @@ -88,20 +88,14 @@ void OnTTSLanguageChangeNotification::Run() { (*message_)[strings::params][strings::function_id] = static_cast(mobile_apis::FunctionID::OnLanguageChangeID); - const auto applications = application_manager_.applications().GetData(); - for (const auto& app : applications) { - if (!app->IsRegistered()) { - SDL_LOG_DEBUG("Skipping app " - << app->app_id() - << " which has not finished the registration process"); - continue; - } + auto apps = ApplicationSet(application_manager_.applications().GetData()); + auto message_language = + (*message_)[strings::msg_params][strings::language].asInt(); + for (auto app : apps) { (*message_)[strings::params][strings::connection_key] = app->app_id(); SendNotificationToMobile(message_); - - if (static_cast(app->language()) != - (*message_)[strings::msg_params][strings::language].asInt()) { + if (app->language() != message_language) { rpc_service_.ManageMobileCommand( MessageHelper::GetOnAppInterfaceUnregisteredNotificationToMobile( app->app_id(), diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_ui_language_change_notification.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_ui_language_change_notification.cc index 7f6ffaa4eb..8da7da28e7 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_ui_language_change_notification.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_ui_language_change_notification.cc @@ -80,19 +80,14 @@ void OnUILanguageChangeNotification::Run() { (*message_)[strings::params][strings::function_id] = static_cast(mobile_apis::FunctionID::OnLanguageChangeID); - const ApplicationSet& accessor = - application_manager_.applications().GetData(); + auto apps = ApplicationSet(application_manager_.applications().GetData()); - ApplicationSetConstIt it = accessor.begin(); - for (; accessor.end() != it;) { - ApplicationSharedPtr app = *it; - ++it; + auto message_language = + (*message_)[strings::msg_params][strings::hmi_display_language].asInt(); + for (auto app : apps) { (*message_)[strings::params][strings::connection_key] = app->app_id(); SendNotificationToMobile(message_); - - if (app->ui_language() != - (*message_)[strings::msg_params][strings::hmi_display_language] - .asInt()) { + if (app->ui_language() != message_language) { rpc_service_.ManageMobileCommand( MessageHelper::GetOnAppInterfaceUnregisteredNotificationToMobile( app->app_id(), diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_vr_language_change_notification.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_vr_language_change_notification.cc index 23c1ec1b80..9cb4653548 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_vr_language_change_notification.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_vr_language_change_notification.cc @@ -78,26 +78,14 @@ void OnVRLanguageChangeNotification::Run() { (*message_)[strings::params][strings::function_id] = static_cast(mobile_apis::FunctionID::OnLanguageChangeID); - const auto applications = application_manager_.applications().GetData(); - for (auto app : applications) { - if (!app->IsRegistered()) { - SDL_LOG_DEBUG("Skipping app " - << app->app_id() - << " which has not finished the registration process"); - continue; - } + auto apps = ApplicationSet(application_manager_.applications().GetData()); + auto message_language = + (*message_)[strings::msg_params][strings::language].asInt(); + for (auto app : apps) { (*message_)[strings::params][strings::connection_key] = app->app_id(); SendNotificationToMobile(message_); - - if (static_cast(app->language()) != - (*message_)[strings::msg_params][strings::language].asInt()) { - application_manager_.state_controller().SetRegularState( - app, - mobile_apis::PredefinedWindows::DEFAULT_WINDOW, - mobile_apis::HMILevel::HMI_NONE, - false); - + if (app->language() != message_language) { rpc_service_.ManageMobileCommand( MessageHelper::GetOnAppInterfaceUnregisteredNotificationToMobile( app->app_id(), diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/sdl_activate_app_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/sdl_activate_app_request.cc index e25ee93400..d79a397651 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/sdl_activate_app_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/sdl_activate_app_request.cc @@ -136,10 +136,27 @@ void SDLActivateAppRequest::Run() { static_cast(function_id()), hmi_apis::Common_Result::REJECTED, "HMIDeactivate is active"); - return; - } - - if (app->app_id() > 0 || app->IsRegistered()) { + } else if (!app->IsRegistered()) { + if (app->is_cloud_app()) { + SDL_LOG_DEBUG("Starting cloud application."); + const ApplicationManagerSettings& settings = + application_manager_.get_settings(); + uint32_t total_retry_timeout = (settings.cloud_app_retry_timeout() * + settings.cloud_app_max_retry_attempts()); + application_manager_.UpdateRequestTimeout( + 0, correlation_id(), default_timeout_ + total_retry_timeout); + subscribe_on_event(BasicCommunication_OnAppRegistered); + application_manager_.connection_handler().ConnectToDevice(app->device()); + } else { + SDL_LOG_ERROR( + "Can't find registered app with the specified app id: " << app_id()); + SendErrorResponse(correlation_id(), + SDL_ActivateApp, + hmi_apis::Common_Result::APPLICATION_NOT_REGISTERED, + "Application is not registered"); + } + } else { + const uint32_t application_id = app_id(); auto main_state = app->CurrentHmiState(mobile_apis::PredefinedWindows::DEFAULT_WINDOW); if (mobile_apis::HMILevel::INVALID_ENUM == main_state->hmi_level()) { @@ -148,40 +165,12 @@ void SDLActivateAppRequest::Run() { "yet, postpone activation"); auto& postponed_activation_ctrl = application_manager_.state_controller() .GetPostponedActivationController(); - postponed_activation_ctrl.AddAppToActivate(app->app_id(), + postponed_activation_ctrl.AddAppToActivate(application_id, correlation_id()); return; } - } - - const uint32_t application_id = app_id(); - if (app->IsRegistered()) { - SDL_LOG_DEBUG("Application is registered. Activating."); policy_handler_.OnActivateApp(application_id, correlation_id()); - return; - } - - if (app->is_cloud_app()) { - SDL_LOG_DEBUG("Starting cloud application."); - const ApplicationManagerSettings& settings = - application_manager_.get_settings(); - uint32_t total_retry_timeout = (settings.cloud_app_retry_timeout() * - settings.cloud_app_max_retry_attempts()); - application_manager_.UpdateRequestTimeout( - 0, correlation_id(), default_timeout_ + total_retry_timeout); - subscribe_on_event(BasicCommunication_OnAppRegistered); - application_manager_.connection_handler().ConnectToDevice(app->device()); - return; } - - connection_handler::DeviceHandle device_handle = app->device(); - SDL_LOG_ERROR( - "Can't find regular foreground app with the same connection id: " - << device_handle); - SendErrorResponse(correlation_id(), - SDL_ActivateApp, - hmi_apis::Common_Result::NO_APPS_REGISTERED, - ""); } #else // EXTERNAL_PROPRIETARY_MODE @@ -225,7 +214,8 @@ void SDLActivateAppRequest::Run() { return; } - if (app_to_activate->app_id() > 0 || app_to_activate->IsRegistered()) { + if (app_to_activate->IsRegistered()) { + SDL_LOG_DEBUG("Application is registered. Activating."); auto main_state = app_to_activate->CurrentHmiState( mobile_apis::PredefinedWindows::DEFAULT_WINDOW); if (mobile_apis::HMILevel::INVALID_ENUM == main_state->hmi_level()) { @@ -234,19 +224,13 @@ void SDLActivateAppRequest::Run() { "yet, postpone activation"); auto& postponed_activation_ctrl = application_manager_.state_controller() .GetPostponedActivationController(); - postponed_activation_ctrl.AddAppToActivate(app_to_activate->app_id(), + postponed_activation_ctrl.AddAppToActivate(application_id, correlation_id()); return; } - } - - if (app_to_activate->IsRegistered()) { - SDL_LOG_DEBUG("Application is registered. Activating."); policy_handler_.OnActivateApp(application_id, correlation_id()); return; - } - - if (app_to_activate->is_cloud_app()) { + } else if (app_to_activate->is_cloud_app()) { SDL_LOG_DEBUG("Starting cloud application."); const ApplicationManagerSettings& settings = application_manager_.get_settings(); 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 9a9aa0c533..2224f17c4e 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 @@ -440,8 +440,6 @@ void FinishSendingResponseToMobile(const smart_objects::SmartObject& msg_params, &(msg_params[strings::app_hmi_type])); } - application->MarkRegistered(); - // Default HMI level should be set before any permissions validation, since // it relies on HMI level. app_manager.OnApplicationRegistered(application); @@ -734,6 +732,7 @@ void RegisterAppInterfaceRequest::Run() { } CheckLanguage(); + SendRegisterAppInterfaceResponseToMobile( ApplicationType::kNewApplication, status_notifier, add_info); } diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_response.cc index 0c74105e56..6e751a9b91 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_response.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_response.cc @@ -96,7 +96,7 @@ void RegisterAppInterfaceResponse::Run() { } SendResponse(success, result_code, last_message); - if (success) { + if (app && success) { app->set_is_ready(true); } event_engine::MobileEvent event( diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/hmi_notifications_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/hmi_notifications_test.cc index 53b1fdfc67..b4d34e180e 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/hmi_notifications_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/hmi_notifications_test.cc @@ -1368,7 +1368,6 @@ TEST_F(HMICommandsNotificationsTest, EXPECT_CALL(mock_hmi_capabilities_, set_active_vr_language(_)); EXPECT_CALL(mock_rpc_service_, ManageMobileCommand(_, Command::CommandSource::SOURCE_SDL)); - EXPECT_CALL(*app_ptr_, IsRegistered()).WillOnce(Return(true)); EXPECT_CALL(*app_ptr_, app_id()).WillOnce(Return(kAppId_)); EXPECT_CALL(*app_ptr_, language()).WillRepeatedly(ReturnRef(kLang)); @@ -1413,15 +1412,8 @@ TEST_F(HMICommandsNotificationsTest, EXPECT_CALL(mock_hmi_capabilities_, set_active_vr_language(_)); EXPECT_CALL(mock_rpc_service_, ManageMobileCommand(_, Command::CommandSource::SOURCE_SDL)); - EXPECT_CALL(*app_ptr_, IsRegistered()).WillOnce(Return(true)); EXPECT_CALL(*app_ptr_, app_id()).WillRepeatedly(Return(kAppId_)); EXPECT_CALL(*app_ptr_, language()).WillRepeatedly(ReturnRef(kLang)); - EXPECT_CALL(app_mngr_, state_controller()) - .WillOnce(ReturnRef(mock_state_controller_)); - EXPECT_CALL( - mock_state_controller_, - SetRegularState( - app_, kDefaultWindowId, mobile_apis::HMILevel::HMI_NONE, false)); EXPECT_CALL(mock_message_helper_, GetOnAppInterfaceUnregisteredNotificationToMobile( kAppId_, @@ -1699,7 +1691,6 @@ TEST_F(HMICommandsNotificationsTest, EXPECT_CALL(mock_hmi_capabilities_, set_active_tts_language(_)); EXPECT_CALL(mock_rpc_service_, ManageMobileCommand(_, Command::CommandSource::SOURCE_SDL)); - EXPECT_CALL(*app_ptr_, IsRegistered()).WillOnce(Return(true)); EXPECT_CALL(*app_ptr_, app_id()).WillOnce(Return(kAppId_)); EXPECT_CALL(*app_ptr_, language()).WillRepeatedly(ReturnRef(kLang)); @@ -1745,7 +1736,6 @@ TEST_F(HMICommandsNotificationsTest, EXPECT_CALL(mock_hmi_capabilities_, set_active_tts_language(_)); EXPECT_CALL(mock_rpc_service_, ManageMobileCommand(_, Command::CommandSource::SOURCE_SDL)); - EXPECT_CALL(*app_ptr_, IsRegistered()).WillOnce(Return(true)); EXPECT_CALL(*app_ptr_, app_id()).WillRepeatedly(Return(kAppId_)); EXPECT_CALL(*app_ptr_, language()).WillRepeatedly(ReturnRef(kLang)); EXPECT_CALL(mock_message_helper_, diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/sdl_activate_app_request_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/sdl_activate_app_request_test.cc index b110d4bf9e..8057a2c518 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/sdl_activate_app_request_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/sdl_activate_app_request_test.cc @@ -157,7 +157,6 @@ TEST_F(SDLActivateAppRequestTest, Run_ActivateApp_SUCCESS) { CurrentHmiState(mobile_apis::PredefinedWindows::DEFAULT_WINDOW)) .WillOnce(Return(state)); - EXPECT_CALL(*mock_app, app_id()).WillOnce(Return(kAppID)); EXPECT_CALL(*mock_app, IsRegistered()).WillOnce(Return(true)); EXPECT_CALL(mock_policy_handler_, OnActivateApp(kAppID, kCorrelationID)); @@ -205,8 +204,8 @@ TEST_F(SDLActivateAppRequestTest, FindAppToRegister_SUCCESS) { IsStateActive(am::HmiState::StateID::STATE_ID_DEACTIVATE_HMI)) .WillOnce(Return(false)); - ON_CALL(*mock_app, IsRegistered()).WillByDefault(Return(false)); - ON_CALL(*mock_app, is_cloud_app()).WillByDefault(Return(false)); + EXPECT_CALL(*mock_app, IsRegistered()).WillOnce(Return(false)); + EXPECT_CALL(*mock_app, is_cloud_app()).WillOnce(Return(false)); ON_CALL(*mock_app, device()).WillByDefault(Return(kHandle)); MockAppPtr mock_app_first(CreateMockApp()); @@ -267,8 +266,8 @@ TEST_F(SDLActivateAppRequestTest, DevicesAppsEmpty_SUCCESS) { IsStateActive(am::HmiState::StateID::STATE_ID_DEACTIVATE_HMI)) .WillOnce(Return(false)); - ON_CALL(*mock_app, IsRegistered()).WillByDefault(Return(false)); - ON_CALL(*mock_app, is_cloud_app()).WillByDefault(Return(false)); + EXPECT_CALL(*mock_app, IsRegistered()).WillOnce(Return(false)); + EXPECT_CALL(*mock_app, is_cloud_app()).WillOnce(Return(false)); ON_CALL(*mock_app, device()).WillByDefault(Return(kHandle)); DataAccessor accessor(app_list_, lock_); @@ -330,11 +329,10 @@ TEST_F(SDLActivateAppRequestTest, FirstAppNotActiveNONE_SUCCESS) { EXPECT_CALL(mock_state_controller_, IsStateActive(am::HmiState::StateID::STATE_ID_DEACTIVATE_HMI)) .WillOnce(Return(false)); - - ON_CALL(*mock_app, IsRegistered()).WillByDefault(Return(true)); - + EXPECT_CALL(*mock_app, IsRegistered()).WillOnce(Return(true)); am::HmiStatePtr state = std::make_shared(mock_app, app_mngr_); state->set_hmi_level(mobile_apis::HMILevel::HMI_NONE); + EXPECT_CALL(*mock_app, CurrentHmiState(mobile_apis::PredefinedWindows::DEFAULT_WINDOW)) .WillOnce(Return(state)); @@ -361,9 +359,8 @@ TEST_F(SDLActivateAppRequestTest, FirstAppIsForeground_SUCCESS) { ON_CALL(app_mngr_, application(kAppID)).WillByDefault(Return(mock_app)); EXPECT_CALL(*mock_app, device()).WillOnce(Return(kHandle)); - ON_CALL(*mock_app, IsRegistered()).WillByDefault(Return(false)); - ON_CALL(*mock_app, is_cloud_app()).WillByDefault(Return(false)); - + EXPECT_CALL(*mock_app, IsRegistered()).WillOnce(Return(false)); + EXPECT_CALL(*mock_app, is_cloud_app()).WillOnce(Return(false)); EXPECT_CALL(app_mngr_, state_controller()) .WillOnce(ReturnRef(mock_state_controller_)); EXPECT_CALL(mock_state_controller_, @@ -434,7 +431,6 @@ TEST_F(SDLActivateAppRequestTest, FirstAppNotRegistered_SUCCESS) { EXPECT_CALL(mock_state_controller_, IsStateActive(am::HmiState::StateID::STATE_ID_DEACTIVATE_HMI)) .WillOnce(Return(false)); - DataAccessor accessor(app_list_, lock_); EXPECT_CALL(app_mngr_, applications()).WillRepeatedly(Return(accessor)); @@ -466,8 +462,8 @@ TEST_F(SDLActivateAppRequestTest, WaitingCloudApplication_ConnectDevice) { MockAppPtr mock_app(CreateMockApp()); EXPECT_CALL(*mock_app, device()).WillOnce(Return(kHandle)); - ON_CALL(*mock_app, IsRegistered()).WillByDefault(Return(false)); - ON_CALL(*mock_app, is_cloud_app()).WillByDefault(Return(true)); + EXPECT_CALL(*mock_app, IsRegistered()).WillOnce(Return(false)); + EXPECT_CALL(*mock_app, is_cloud_app()).WillOnce(Return(true)); #ifndef EXTERNAL_PROPRIETARY_MODE EXPECT_CALL(app_mngr_, application(kAppID)) diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc index 7a5d5fc0dc..6065743d1d 100644 --- a/src/components/application_manager/src/application_manager_impl.cc +++ b/src/components/application_manager/src/application_manager_impl.cc @@ -3344,7 +3344,7 @@ void ApplicationManagerImpl::UnregisterApplication( while (applications_.end() != it_app) { if (app_id == (*it_app)->app_id()) { app_to_remove = *it_app; - applications_.erase(it_app++); + applications_.erase(it_app); break; } else { ++it_app; @@ -4770,6 +4770,9 @@ void ApplicationManagerImpl::AddAppToRegisteredAppList( SDL_LOG_AUTO_TRACE(); DCHECK_OR_RETURN_VOID(application); sync_primitives::AutoLock lock(applications_list_lock_ptr_); + + // Add application to registered app list and set appropriate mark. + application->MarkRegistered(); applications_.insert(application); SDL_LOG_DEBUG("App with app_id: " << application->app_id() 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 bbe6189bc9..606bc4c3f0 100644 --- a/src/components/application_manager/src/message_helper/message_helper.cc +++ b/src/components/application_manager/src/message_helper/message_helper.cc @@ -1848,7 +1848,7 @@ bool MessageHelper::CreateHMIApplicationStruct( if (file_system::FileExists(app->app_icon_path())) { message[strings::icon] = icon_path; } - if (app->app_id() > 0 || app->IsRegistered()) { + if (app->IsRegistered()) { message[strings::hmi_display_language_desired] = app->ui_language(); message[strings::is_media_application] = app->is_media_application(); } else { -- cgit v1.2.1 From 1e88e6f390bbee10b1b19bea873200ad91558c8a Mon Sep 17 00:00:00 2001 From: RomanReznichenkoLuxoft <85177915+RomanReznichenkoLuxoft@users.noreply.github.com> Date: Wed, 10 Nov 2021 20:04:30 +0200 Subject: added an ontimeout method to handle a timeout request (#3803) --- .../rc_rpc_plugin/commands/hmi/rc_set_global_properties_request.h | 2 ++ .../src/commands/hmi/rc_set_global_properties_request.cc | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/commands/hmi/rc_set_global_properties_request.h b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/commands/hmi/rc_set_global_properties_request.h index 64b11c3d7b..680d642a98 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/commands/hmi/rc_set_global_properties_request.h +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/commands/hmi/rc_set_global_properties_request.h @@ -58,6 +58,8 @@ class RCSetGlobalPropertiesRequest : public app_mngr::commands::RequestToHMI { */ void Run() OVERRIDE; + void OnTimeOut() OVERRIDE; + ~RCSetGlobalPropertiesRequest(); }; } // namespace commands diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/hmi/rc_set_global_properties_request.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/hmi/rc_set_global_properties_request.cc index f0ff1afbb3..0a4b72ff64 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/hmi/rc_set_global_properties_request.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/hmi/rc_set_global_properties_request.cc @@ -31,6 +31,7 @@ */ #include "rc_rpc_plugin/commands/hmi/rc_set_global_properties_request.h" +#include "application_manager/resumption/resume_ctrl.h" namespace rc_rpc_plugin { namespace app_mngr = application_manager; @@ -53,6 +54,13 @@ void RCSetGlobalPropertiesRequest::Run() { SendRequest(); } +void RCSetGlobalPropertiesRequest::OnTimeOut() { + auto& resume_ctrl = application_manager_.resume_controller(); + resume_ctrl.HandleOnTimeOut( + correlation_id(), + static_cast(function_id())); +} + RCSetGlobalPropertiesRequest::~RCSetGlobalPropertiesRequest() {} } // namespace commands -- cgit v1.2.1 From 36c02047bc819d5811405d9711e3cc501754949f Mon Sep 17 00:00:00 2001 From: Collin Date: Tue, 23 Nov 2021 10:18:51 -0500 Subject: Ensure valid application pointer in RAI::CheckLanguage and FinishSendingResponseToMobile (#3815) * don't use null application ptr in RAI::CheckLanguage or FinishSendingResponseToMobile * prevent application nullptr deref in SendRegisterAppInterfaceResponseToMobile * check application valid in ApplicationDataShouldBeResumed * restore ResumeCtrlImpl DCHECKs --- .../commands/mobile/register_app_interface_request.h | 2 +- .../mobile/register_app_interface_request.cc | 20 ++++++++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) 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 d54f061228..351c108573 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 @@ -301,7 +301,7 @@ class RegisterAppInterfaceRequest * @brief CheckLanguage check if language in RAI matches hmi_capabilities * Setup result_code variable in case of does not match */ - void CheckLanguage(); + void CheckLanguage(application_manager::ApplicationSharedPtr application); std::string response_info_; bool are_tts_chunks_invalid_; 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 2224f17c4e..519d70e1d8 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 @@ -274,6 +274,11 @@ bool RegisterAppInterfaceRequest::ApplicationDataShouldBeResumed( const uint32_t key = connection_key(); ApplicationSharedPtr application = application_manager_.application(key); + if (!application) { + SDL_LOG_DEBUG("Application not found, no resumption required"); + return false; + } + const bool hash_id_present = msg_params.keyExists(strings::hash_id); const std::string hash_id = msg_params[strings::hash_id].asString(); const bool resumption = hash_id_present && !hash_id.empty(); @@ -348,9 +353,8 @@ policy::StatusNotifier RegisterAppInterfaceRequest::AddApplicationDataToPolicy( application->mac_address(), application->policy_app_id(), hmi_types); } -void RegisterAppInterfaceRequest::CheckLanguage() { - ApplicationSharedPtr application = - application_manager_.application(connection_key()); +void RegisterAppInterfaceRequest::CheckLanguage( + ApplicationSharedPtr application) { DCHECK_OR_RETURN_VOID(application); const auto& msg_params = (*message_)[strings::msg_params]; if (msg_params[strings::language_desired].asInt() != @@ -430,6 +434,9 @@ void FinishSendingResponseToMobile(const smart_objects::SmartObject& msg_params, policy::StatusNotifier notify_upd_manager) { resumption::ResumeCtrl& resume_ctrl = app_manager.resume_controller(); auto application = app_manager.application(connection_key); + if (!application) { + return; + } policy::PolicyHandlerInterface& policy_handler = app_manager.GetPolicyHandler(); @@ -731,7 +738,7 @@ void RegisterAppInterfaceRequest::Run() { return; } - CheckLanguage(); + CheckLanguage(application); SendRegisterAppInterfaceResponseToMobile( ApplicationType::kNewApplication, status_notifier, add_info); @@ -874,6 +881,11 @@ void RegisterAppInterfaceRequest::SendRegisterAppInterfaceResponseToMobile( const uint32_t key = connection_key(); ApplicationSharedPtr application = application_manager_.application(key); + + if (!application) { + return; + } + utils::SemanticVersion negotiated_version = application->msg_version(); response_params[strings::sync_msg_version][strings::major_version] = -- cgit v1.2.1 From 014d13faff80ca076d07ece2244b54b013826d23 Mon Sep 17 00:00:00 2001 From: "Olha Vorobiova (GitHub)" <86727408+OlhaVorobiova@users.noreply.github.com> Date: Wed, 22 Dec 2021 18:04:36 +0200 Subject: Fix rare crash during streaming switching (#3833) --- src/components/application_manager/src/application_manager_impl.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc index 6065743d1d..e8e3912f9a 100644 --- a/src/components/application_manager/src/application_manager_impl.cc +++ b/src/components/application_manager/src/application_manager_impl.cc @@ -1956,8 +1956,9 @@ bool ApplicationManagerImpl::StartNaviService( /* Fix: For NaviApp1 Switch to NaviApp2, App1's Endcallback() arrives later than App2's Startcallback(). Cause streaming issue on HMI. */ - auto accessor = applications(); - for (auto app : accessor.GetData()) { + + const ApplicationSet apps = applications().GetData(); + for (auto app : apps) { if (!app || (!app->is_navi() && !app->mobile_projection_enabled())) { SDL_LOG_DEBUG("Continue, Not Navi App Id: " << app->app_id()); continue; -- cgit v1.2.1 From 50a6f8a2d62954a5e31c795c48cf3c258af2b690 Mon Sep 17 00:00:00 2001 From: "Vadym Luchko (GitHub)" <76956836+VadymLuchko@users.noreply.github.com> Date: Thu, 6 Jan 2022 19:44:10 +0200 Subject: state_controller subscription (#3836) --- .../application_manager/src/state_controller_impl.cc | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/components/application_manager/src/state_controller_impl.cc b/src/components/application_manager/src/state_controller_impl.cc index b8dbb69f50..28146a1adc 100644 --- a/src/components/application_manager/src/state_controller_impl.cc +++ b/src/components/application_manager/src/state_controller_impl.cc @@ -78,7 +78,9 @@ void StateControllerImpl::SetRegularState(ApplicationSharedPtr app, DCHECK_OR_RETURN_VOID(state); DCHECK_OR_RETURN_VOID(HmiState::STATE_ID_REGULAR == state->state_id()); - SDL_LOG_DEBUG("Set window #" << window_id << " regular state " << *state); + SDL_LOG_DEBUG("Set window #" << window_id << " regular state " << *state + << " hmi_state_change " + << request_hmi_state_change); if (state->hmi_level() == mobile_apis::HMILevel::INVALID_ENUM || state->audio_streaming_state() == @@ -113,11 +115,12 @@ void StateControllerImpl::SetRegularState(ApplicationSharedPtr app, const int64_t result = RequestHMIStateChange(app, hmi_level, true); if (-1 != result) { const uint32_t corr_id = static_cast(result); + subscribe_on_event( - hmi_apis::Common_HMILevel::NONE == hmi_level - ? hmi_apis::FunctionID::BasicCommunication_CloseApplication - : hmi_apis::FunctionID::BasicCommunication_ActivateApp, - corr_id); + hmi_apis::FunctionID::BasicCommunication_CloseApplication, corr_id); + subscribe_on_event(hmi_apis::FunctionID::BasicCommunication_ActivateApp, + corr_id); + waiting_for_response_[app->app_id()] = resolved_state; app_mngr_.set_application_id(corr_id, app->hmi_app_id()); return; @@ -782,6 +785,10 @@ void StateControllerImpl::HandleOnEvent(const event_engine::Event& event) { case FunctionID::BasicCommunication_ActivateApp: case FunctionID::BasicCommunication_CloseApplication: { OnHMIResponse(message); + unsubscribe_from_event( + hmi_apis::FunctionID::BasicCommunication_CloseApplication); + unsubscribe_from_event( + hmi_apis::FunctionID::BasicCommunication_ActivateApp); break; } case FunctionID::BasicCommunication_OnAppActivated: { -- cgit v1.2.1 From 69e0ae4dd28191eca502ee23a781dceb51385c9b Mon Sep 17 00:00:00 2001 From: "Yana Chernysheva (GitHub)" <59469418+ychernysheva@users.noreply.github.com> Date: Sat, 8 Jan 2022 00:10:06 +0200 Subject: Replace clusterModeStatus with clusterModes and vise versa (#3830) --- .../src/commands/mobile/subscribe_vehicle_data_request.cc | 15 ++++++++++----- .../commands/mobile/unsubscribe_vehicle_data_request.cc | 3 ++- .../src/vehicle_info_pending_resumption_handler.cc | 7 +++++++ 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/mobile/subscribe_vehicle_data_request.cc b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/mobile/subscribe_vehicle_data_request.cc index db3922e1a2..da79342681 100644 --- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/mobile/subscribe_vehicle_data_request.cc +++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/mobile/subscribe_vehicle_data_request.cc @@ -226,9 +226,12 @@ bool SubscribeVehicleDataRequest::SubscribePendingVehicleData( } else { auto res_code = static_cast( - msg_params[*vi_name][strings::result_code].asInt()); + msg_params[ConvertRequestToResponseName(*vi_name)] + [strings::result_code] + .asInt()); if (skiped_result_codes.find(res_code) != skiped_result_codes.end()) { - msg_params[*vi_name][strings::result_code] = res_code; + msg_params[ConvertRequestToResponseName(*vi_name)] + [strings::result_code] = res_code; vi_name = vi_waiting_for_subscribe_.erase(vi_name); } else { ++vi_name; @@ -325,11 +328,13 @@ void SubscribeVehicleDataRequest::CheckVISubscriptions( } SDL_LOG_DEBUG("App with connection key " << connection_key() - << " have been subscribed for VehicleDataType: " + << " has been subscribed for VehicleDataType: " << key_name); vi_already_subscribed_by_another_apps_.insert(key_name); - out_response_params[key_name][strings::data_type] = vd_type; - out_response_params[key_name][strings::result_code] = + const std::string converted_name = + ConvertRequestToResponseName(key_name); + out_response_params[converted_name][strings::data_type] = vd_type; + out_response_params[converted_name][strings::result_code] = mobile_apis::VehicleDataResultCode::VDRC_SUCCESS; ++subscribed_items; }; diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/mobile/unsubscribe_vehicle_data_request.cc b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/mobile/unsubscribe_vehicle_data_request.cc index e04e529a67..e6d0ff5d4c 100644 --- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/mobile/unsubscribe_vehicle_data_request.cc +++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/mobile/unsubscribe_vehicle_data_request.cc @@ -98,7 +98,8 @@ void UnsubscribeVehicleDataRequest::Run() { "VehicleDataType: " << key_name); vi_still_subscribed_by_another_apps_.insert(key_name); - response_params_[key_name][strings::result_code] = + const std::string converted_name = ConvertRequestToResponseName(key_name); + response_params_[converted_name][strings::result_code] = mobile_apis::VehicleDataResultCode::VDRC_SUCCESS; }; diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_pending_resumption_handler.cc b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_pending_resumption_handler.cc index c9affa5760..faa7aa258e 100644 --- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_pending_resumption_handler.cc +++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_pending_resumption_handler.cc @@ -223,6 +223,13 @@ void VehicleInfoPendingResumptionHandler::HandleOnEvent( custom_vehicle_data_manager_.CreateMobileMessageParams(converted_msg_params); response_message[strings::msg_params] = converted_msg_params; + if (converted_msg_params.enumerate().end() != + converted_msg_params.enumerate().find(strings::cluster_modes)) { + response_message[strings::msg_params][strings::cluster_mode_status] = + response_message[strings::msg_params][strings::cluster_modes]; + response_message[strings::msg_params].erase(strings::cluster_modes); + } + const auto vs_count_in_response = response_message[application_manager::strings::msg_params].length(); -- cgit v1.2.1 From eb14596e25cf6f49dd2ab21d39f32d3453615faa Mon Sep 17 00:00:00 2001 From: RomanReznichenkoLuxoft <85177915+RomanReznichenkoLuxoft@users.noreply.github.com> Date: Mon, 10 Jan 2022 20:16:44 +0200 Subject: use files from the rps_spec folder without copying to the sdl_core (#3778) --- src/components/interfaces/CMakeLists.txt | 9 +-------- src/components/policy/policy_external/CMakeLists.txt | 2 +- src/components/policy/policy_regular/CMakeLists.txt | 2 +- src/components/utils/test/test_generator/CMakeLists.txt | 2 +- tools/cmake/helpers/generators.cmake | 6 +++++- 5 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/components/interfaces/CMakeLists.txt b/src/components/interfaces/CMakeLists.txt index 9679ccf0b4..5a87e69add 100644 --- a/src/components/interfaces/CMakeLists.txt +++ b/src/components/interfaces/CMakeLists.txt @@ -29,14 +29,7 @@ # POSSIBILITY OF SUCH DAMAGE. # Copy RPC spec submodule files to interfaces directory -if(EXISTS ${CMAKE_SOURCE_DIR}/tools/rpc_spec/) - execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different - ${CMAKE_SOURCE_DIR}/tools/rpc_spec/MOBILE_API.xml - ${CMAKE_CURRENT_SOURCE_DIR}/MOBILE_API.xml) - execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different - ${CMAKE_SOURCE_DIR}/tools/rpc_spec/MOBILE_API.xsd - ${CMAKE_CURRENT_SOURCE_DIR}/MOBILE_API.xsd) -else () +if(NOT EXISTS ${CMAKE_SOURCE_DIR}/tools/rpc_spec/) message( FATAL_ERROR "Missing the RPC Spec submodule" ) message( FATAL_ERROR "Please run `git submodule update --init` in the SDL Core source directory" ) endif () diff --git a/src/components/policy/policy_external/CMakeLists.txt b/src/components/policy/policy_external/CMakeLists.txt index 0e3735093f..8b0572ba72 100644 --- a/src/components/policy/policy_external/CMakeLists.txt +++ b/src/components/policy/policy_external/CMakeLists.txt @@ -76,7 +76,7 @@ set(GENERATED_MOBILE_POLICY_TYPES ${GENERATED_MOBILE_POLICY_TYPES_CPP}) generate_policy_types("${GENERATED_MOBILE_POLICY_TYPES}" - "${COMPONENTS_DIR}/interfaces/MOBILE_API.xml" + "${CMAKE_SOURCE_DIR}/tools/rpc_spec/MOBILE_API.xml" "rpc::policy_table_interface_base" "mobile-policy-types") diff --git a/src/components/policy/policy_regular/CMakeLists.txt b/src/components/policy/policy_regular/CMakeLists.txt index 39c520a0e3..cc87e2c630 100644 --- a/src/components/policy/policy_regular/CMakeLists.txt +++ b/src/components/policy/policy_regular/CMakeLists.txt @@ -61,7 +61,7 @@ set(GENERATED_MOBILE_POLICY_TYPES ${GENERATED_MOBILE_POLICY_TYPES_CPP}) generate_policy_types("${GENERATED_MOBILE_POLICY_TYPES}" - "${COMPONENTS_DIR}/interfaces/MOBILE_API.xml" + "${CMAKE_SOURCE_DIR}/tools/rpc_spec/MOBILE_API.xml" "rpc::policy_table_interface_base" "mobile-policy-types") diff --git a/src/components/utils/test/test_generator/CMakeLists.txt b/src/components/utils/test/test_generator/CMakeLists.txt index cd4243930a..4667a9b5f7 100644 --- a/src/components/utils/test/test_generator/CMakeLists.txt +++ b/src/components/utils/test/test_generator/CMakeLists.txt @@ -39,7 +39,7 @@ include_directories ( ${GMOCK_INCLUDE_DIRECTORY} ) -set(XML_NAME ${CMAKE_SOURCE_DIR}/src/components/interfaces/MOBILE_API.xml) +set(XML_NAME ${CMAKE_SOURCE_DIR}/tools/rpc_spec/MOBILE_API.xml) add_custom_target(generate_version COMMAND ${INTEFRACE_GENERATOR_CMD} "--source-xml" "${XML_NAME}" "--namespace" "mobile_apis" "--output-dir" "${CMAKE_CURRENT_BINARY_DIR}" "--parser-type" "sdlrpcv2" "-y" diff --git a/tools/cmake/helpers/generators.cmake b/tools/cmake/helpers/generators.cmake index 1a5a4b8fa1..ae315ab1c6 100644 --- a/tools/cmake/helpers/generators.cmake +++ b/tools/cmake/helpers/generators.cmake @@ -63,7 +63,11 @@ macro(generate_interface ARG_XML_NAME ARG_NAMESPACE PARSER_TYPE) ) set(CPP_FILE "${CMAKE_CURRENT_BINARY_DIR}/${FILE_NAME}_schema.cc") - set(FULL_XML_NAME "${CMAKE_CURRENT_SOURCE_DIR}/${ARG_XML_NAME}") + if("${ARG_XML_NAME}" STREQUAL "MOBILE_API.xml") + set(FULL_XML_NAME "${CMAKE_SOURCE_DIR}/tools/rpc_spec/${ARG_XML_NAME}") + else() + set(FULL_XML_NAME "${CMAKE_CURRENT_SOURCE_DIR}/${ARG_XML_NAME}") +endif() add_custom_command( OUTPUT ${HPP_FILE} ${CPP_FILE} -- cgit v1.2.1 From 7aecb63a17bdc9f38d75cb381143b7eacd9d85fc Mon Sep 17 00:00:00 2001 From: RomanReznichenkoLuxoft <85177915+RomanReznichenkoLuxoft@users.noreply.github.com> Date: Tue, 11 Jan 2022 17:13:23 +0200 Subject: changed the way you add soft buttons in the subscription method (#3839) --- .../sdl_rpc_plugin/src/commands/mobile/show_constant_tbt_response.cc | 2 -- .../sdl_rpc_plugin/src/commands/mobile/update_turn_list_response.cc | 2 -- .../test/commands/mobile/simple_response_commands_test.cc | 1 - src/components/application_manager/src/application_impl.cc | 3 ++- 4 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/show_constant_tbt_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/show_constant_tbt_response.cc index a2362a74bc..7d546079e8 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/show_constant_tbt_response.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/show_constant_tbt_response.cc @@ -60,8 +60,6 @@ ShowConstantTBTResponse::~ShowConstantTBTResponse() {} void ShowConstantTBTResponse::Run() { SDL_LOG_AUTO_TRACE(); - application_manager_.UnsubscribeAppFromSoftButtons(message_); - rpc_service_.SendMessageToMobile(message_); } diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/update_turn_list_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/update_turn_list_response.cc index bf2658128d..bedf91b45c 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/update_turn_list_response.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/update_turn_list_response.cc @@ -59,8 +59,6 @@ UpdateTurnListResponse::~UpdateTurnListResponse() {} void UpdateTurnListResponse::Run() { SDL_LOG_AUTO_TRACE(); - application_manager_.UnsubscribeAppFromSoftButtons(message_); - rpc_service_.SendMessageToMobile(message_); } diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/simple_response_commands_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/simple_response_commands_test.cc index d091fdc8c5..a6bdf2a874 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/simple_response_commands_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/simple_response_commands_test.cc @@ -149,7 +149,6 @@ TYPED_TEST(MobileResponseWithUnsubscribeCommandsTest, std::shared_ptr command = this->template CreateCommand(); - EXPECT_CALL(this->app_mngr_, UnsubscribeAppFromSoftButtons(_)); EXPECT_CALL(this->mock_rpc_service_, SendMessageToMobile(NotNull(), _)); command->Init(); diff --git a/src/components/application_manager/src/application_impl.cc b/src/components/application_manager/src/application_impl.cc index 42afd93459..9b6e4457d0 100644 --- a/src/components/application_manager/src/application_impl.cc +++ b/src/components/application_manager/src/application_impl.cc @@ -1165,7 +1165,8 @@ void ApplicationImpl::SubscribeToSoftButtons( return; } - WindowSoftButtons new_window_soft_buttons = *subscribed_window_buttons; + WindowSoftButtons new_window_soft_buttons; + new_window_soft_buttons.first = window_id; new_window_soft_buttons.second.insert(window_softbuttons.second.begin(), window_softbuttons.second.end()); command_soft_buttons.erase(subscribed_window_buttons); -- cgit v1.2.1 From faa56860daf9b7f4f2916b256beea2b13ca1c0c7 Mon Sep 17 00:00:00 2001 From: "Vadym Luchko (GitHub)" <76956836+VadymLuchko@users.noreply.github.com> Date: Tue, 11 Jan 2022 18:22:23 +0200 Subject: Fix JSON validation for QUERY_APPS (#3827) fix validation of synonyms in QUERY_APPS system request --- .../src/commands/mobile/system_request.cc | 72 ++++++++++++---------- 1 file changed, 41 insertions(+), 31 deletions(-) diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/system_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/system_request.cc index 10be518409..97b2d2ff37 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/system_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/system_request.cc @@ -75,34 +75,37 @@ const unsigned int kLanguageArraySizeMax = 100U; typedef std::set SynonymsSet; typedef std::map SynonymsMap; -bool ValidateSynonymsAtLanguage(const smart_objects::SmartObject& language, - const std::string& language_name, - SynonymsMap& synonyms_map) { +enum class ValidateSynonymsResult { OK, NOT_EXIST, INVALID }; + +ValidateSynonymsResult ValidateSynonymsAtLanguage( + const smart_objects::SmartObject& language, + const std::string& language_name, + SynonymsMap& synonyms_map) { if (!language[language_name].keyExists(json::vrSynonyms)) { SDL_LOG_WARN(kQueryAppsValidationFailedPrefix << "'languages.vrSynonyms' doesn't exist"); - return false; + return ValidateSynonymsResult::NOT_EXIST; } const smart_objects::SmartArray* synonyms_array = language[language_name][json::vrSynonyms].asArray(); if (!synonyms_array) { SDL_LOG_WARN(kQueryAppsValidationFailedPrefix << "vrSynonyms is not array."); - return false; + return ValidateSynonymsResult::INVALID; } const size_t synonyms_array_size = synonyms_array->size(); if (synonyms_array_size < kVrArraySizeMin) { SDL_LOG_WARN(kQueryAppsValidationFailedPrefix << "vrSynomyms array has [" << synonyms_array_size << "] size < allowed min size [" << kVrArraySizeMin << "]"); - return false; + return ValidateSynonymsResult::INVALID; } if (synonyms_array_size > kVrArraySizeMax) { SDL_LOG_WARN(kQueryAppsValidationFailedPrefix << "vrSynomyms array size [" << synonyms_array_size << "] exceeds maximum allowed size [" << kVrArraySizeMax << "]"); - return false; + return ValidateSynonymsResult::INVALID; } for (std::size_t idx = 0; idx < synonyms_array_size; ++idx) { @@ -113,14 +116,14 @@ bool ValidateSynonymsAtLanguage(const smart_objects::SmartObject& language, << "vrSYnomym item [" << idx << "] exceeds max length [" << vrSynonym.length() << "]>[" << kVrSynonymLengthMax << "]"); - return false; + return ValidateSynonymsResult::INVALID; } if (vrSynonym.length() < kVrSynonymLengthMin) { SDL_LOG_WARN(kQueryAppsValidationFailedPrefix << "vrSYnomym item [" << idx << "] length [" << vrSynonym.length() << "] is less then min length [" << kVrSynonymLengthMin << "] allowed."); - return false; + return ValidateSynonymsResult::INVALID; } // Verify duplicates SynonymsMap::iterator synonyms_map_iter = synonyms_map.find(language_name); @@ -129,11 +132,11 @@ bool ValidateSynonymsAtLanguage(const smart_objects::SmartObject& language, SDL_LOG_WARN(kQueryAppsValidationFailedPrefix << "vrSYnomym item already defined [" << vrSynonym.c_str() << "] for language [" << language_name << "]"); - return false; + return ValidateSynonymsResult::INVALID; } } } - return true; + return ValidateSynonymsResult::OK; } bool CheckMandatoryParametersPresent( @@ -278,6 +281,7 @@ class QueryAppsDataValidator { } bool ValidateAppIdAndAppName(const smart_objects::SmartObject& app_data) { + SDL_LOG_AUTO_TRACE(); // Verify appid length const std::string app_id(app_data[json::appId].asString()); if (app_id.length() > kAppIdLengthMax) { @@ -315,6 +319,7 @@ class QueryAppsDataValidator { bool ValidateLanguages(const smart_objects::SmartObject& languages, SynonymsMap& synonyms_map) const { + SDL_LOG_AUTO_TRACE(); bool default_language_found = false; const size_t languages_array_size = languages.length(); if (languages_array_size > kLanguageArraySizeMax) { @@ -351,32 +356,37 @@ class QueryAppsDataValidator { if (synonyms_map.find(language_name) == synonyms_map.end()) { synonyms_map[language_name] = SynonymsSet(); } - // ttsName verification - if (!language[language_name].keyExists(json::ttsName)) { - SDL_LOG_WARN(kQueryAppsValidationFailedPrefix - << "'languages.ttsName' doesn't exist"); - return false; - } - const smart_objects::SmartObject& ttsNameObject = - language[language_name][json::ttsName]; - // ttsName is string - if (smart_objects::SmartType_String == ttsNameObject.getType()) { - const std::string ttsName = - language[language_name][json::ttsName].asString(); - if (ttsName.length() > kTtsNameLengthMax) { + + const bool ttsNameExist = + language[language_name].keyExists(json::ttsName); + + if (ttsNameExist) { + const smart_objects::SmartObject& ttsNameObject = + language[language_name][json::ttsName]; + // ttsName is string + if (smart_objects::SmartType_String == ttsNameObject.getType()) { + const std::string ttsName = + language[language_name][json::ttsName].asString(); + if (ttsName.length() > kTtsNameLengthMax) { + SDL_LOG_WARN(kQueryAppsValidationFailedPrefix + << "ttsName string exceeds max length [" + << ttsName.length() << "]>[" << kTtsNameLengthMax + << "]"); + return false; + } + } else { SDL_LOG_WARN(kQueryAppsValidationFailedPrefix - << "ttsName string exceeds max length [" - << ttsName.length() << "]>[" << kTtsNameLengthMax - << "]"); + << "ttsName is not the string type."); return false; } } else { - SDL_LOG_WARN(kQueryAppsValidationFailedPrefix - << "ttsName is not the string type."); - return false; + SDL_LOG_WARN("ttsName does not exist."); } - if (!ValidateSynonymsAtLanguage(language, language_name, synonyms_map)) { + const auto result = + ValidateSynonymsAtLanguage(language, language_name, synonyms_map); + + if (result == ValidateSynonymsResult::INVALID) { return false; } } -- cgit v1.2.1 From 47c10a0fff783b485264593a689f355912823835 Mon Sep 17 00:00:00 2001 From: RomanReznichenkoLuxoft <85177915+RomanReznichenkoLuxoft@users.noreply.github.com> Date: Tue, 11 Jan 2022 20:57:59 +0200 Subject: fix/sdl_did_not_read_correctly_value_of_hmicapabilities_from_hmicapabilitiescachefile (#3820) * sdl_read_value_navigation_and_phonecall_from_hmicapabilities_and_did_not_from_systemcapabilities * Update src/appMain/hmi_capabilities.json Co-authored-by: Jacob Keeler Co-authored-by: Jacob Keeler --- src/appMain/hmi_capabilities.json | 5 ++ .../application_manager/hmi_capabilities_impl.h | 6 +++ .../commands/hmi/ui_get_capabilities_response.cc | 2 + .../src/hmi_capabilities_impl.cc | 51 +++++++++++++++---- .../test/hmi_capabilities_sc1.json | 5 ++ .../test/hmi_capabilities_sc2.json | 5 ++ .../test/hmi_capabilities_test.cc | 57 +++++++++++++++++++++- .../application_manager/mock_hmi_capabilities.h | 5 ++ .../include/application_manager/hmi_capabilities.h | 13 +++++ 9 files changed, 139 insertions(+), 10 deletions(-) diff --git a/src/appMain/hmi_capabilities.json b/src/appMain/hmi_capabilities.json index e5ee4f00b6..a0df3d9731 100755 --- a/src/appMain/hmi_capabilities.json +++ b/src/appMain/hmi_capabilities.json @@ -322,6 +322,11 @@ "audioType": "PCM" }, "hmiZoneCapabilities": "FRONT", + "hmiCapabilities":{ + "navigation":true, + "phoneCall":true, + "videoStreaming":true + }, "softButtonCapabilities": [{ "shortPressAvailable": true, "longPressAvailable": true, 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 9a22b2a4aa..ee424aecc4 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 @@ -135,6 +135,11 @@ class HMICapabilitiesImpl : public HMICapabilities { void set_hmi_zone_capabilities( const smart_objects::SmartObject& hmi_zone_capabilities) OVERRIDE; + const smart_objects::SmartObjectSPtr ui_hmi_capabilities() const OVERRIDE; + + void set_ui_hmi_capabilities( + const smart_objects::SmartObject& ui_hmi_capabilities) OVERRIDE; + const smart_objects::SmartObjectSPtr soft_button_capabilities() const OVERRIDE; @@ -463,6 +468,7 @@ class HMICapabilitiesImpl : public HMICapabilities { smart_objects::SmartObjectSPtr display_capabilities_; smart_objects::SmartObjectSPtr system_display_capabilities_; smart_objects::SmartObjectSPtr hmi_zone_capabilities_; + smart_objects::SmartObjectSPtr ui_hmi_capabilities_; smart_objects::SmartObjectSPtr soft_buttons_capabilities_; smart_objects::SmartObjectSPtr button_capabilities_; smart_objects::SmartObjectSPtr preset_bank_capabilities_; 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 128f41e01f..73e00f0f09 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 @@ -104,6 +104,8 @@ void UIGetCapabilitiesResponse::Run() { } if (msg_params.keyExists(strings::hmi_capabilities)) { + hmi_capabilities_.set_ui_hmi_capabilities( + msg_params[strings::hmi_capabilities]); if (msg_params[strings::hmi_capabilities].keyExists(strings::navigation)) { sections_to_update.push_back(strings::navigation); hmi_capabilities_.set_navigation_supported( diff --git a/src/components/application_manager/src/hmi_capabilities_impl.cc b/src/components/application_manager/src/hmi_capabilities_impl.cc index a8001eba91..a1a85a7a44 100644 --- a/src/components/application_manager/src/hmi_capabilities_impl.cc +++ b/src/components/application_manager/src/hmi_capabilities_impl.cc @@ -97,6 +97,7 @@ HMICapabilitiesImpl::HMICapabilitiesImpl(ApplicationManager& app_mngr) , vr_supported_languages_(NULL) , display_capabilities_(NULL) , hmi_zone_capabilities_(NULL) + , ui_hmi_capabilities_(NULL) , soft_buttons_capabilities_(NULL) , button_capabilities_(NULL) , preset_bank_capabilities_(NULL) @@ -281,6 +282,14 @@ void HMICapabilitiesImpl::set_hmi_zone_capabilities( hmi_zone_capabilities_.swap(new_value); } +void HMICapabilitiesImpl::set_ui_hmi_capabilities( + const smart_objects::SmartObject& ui_hmi_capabilities) { + auto new_value = + std::make_shared(ui_hmi_capabilities); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); + ui_hmi_capabilities_.swap(new_value); +} + void HMICapabilitiesImpl::set_soft_button_capabilities( const smart_objects::SmartObject& soft_button_capabilities) { auto new_value = @@ -491,6 +500,12 @@ HMICapabilitiesImpl::hmi_zone_capabilities() const { return hmi_zone_capabilities_; } +const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::ui_hmi_capabilities() + const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); + return ui_hmi_capabilities_; +} + const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::soft_button_capabilities() const { sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); @@ -1017,6 +1032,33 @@ bool HMICapabilitiesImpl::LoadCapabilitiesFromFile() { set_soft_button_capabilities(soft_button_capabilities_so); } + auto ui_hmi_capabilities_node = + json_ui_getter.GetCachedJsonMember(strings::hmi_capabilities); + + if (!ui_hmi_capabilities_node.isNull()) { + smart_objects::SmartObject ui_hmi_capabilities_so; + formatters::CFormatterJsonBase::jsonValueToObj(ui_hmi_capabilities_node, + ui_hmi_capabilities_so); + set_ui_hmi_capabilities(ui_hmi_capabilities_so); + + if (JsonIsMemberSafe(ui_hmi_capabilities_node, strings::navigation)) { + Json::Value navigation = + ui_hmi_capabilities_node.get(strings::navigation, ""); + set_navigation_supported(navigation.asBool()); + } + if (JsonIsMemberSafe(ui_hmi_capabilities_node, strings::phone_call)) { + Json::Value phoneCall = + ui_hmi_capabilities_node.get(strings::phone_call, ""); + set_phone_call_supported(phoneCall.asBool()); + } + if (JsonIsMemberSafe(ui_hmi_capabilities_node, + strings::video_streaming)) { + Json::Value video_streaming = + ui_hmi_capabilities_node.get(strings::video_streaming, ""); + set_video_streaming_supported(video_streaming.asBool()); + } + } + auto ui_system_capabilities_node = json_ui_getter.GetJsonMember(strings::system_capabilities, hmi_apis::FunctionID::UI_GetCapabilities, @@ -1030,9 +1072,6 @@ bool HMICapabilitiesImpl::LoadCapabilitiesFromFile() { formatters::CFormatterJsonBase::jsonValueToObj( navigation_capability, navigation_capability_so); set_navigation_capability(navigation_capability_so); - if (!navigation_capability_so.empty()) { - set_navigation_supported(true); - } } if (JsonIsMemberSafe(ui_system_capabilities_node, strings::phone_capability)) { @@ -1042,9 +1081,6 @@ bool HMICapabilitiesImpl::LoadCapabilitiesFromFile() { formatters::CFormatterJsonBase::jsonValueToObj(phone_capability, phone_capability_so); set_phone_capability(phone_capability_so); - if (!phone_capability_so.empty()) { - set_phone_call_supported(true); - } } if (JsonIsMemberSafe(ui_system_capabilities_node, strings::video_streaming_capability)) { @@ -1090,9 +1126,6 @@ bool HMICapabilitiesImpl::LoadCapabilitiesFromFile() { vs_capability_so[strings::supported_formats] = converted_array; } set_video_streaming_capability(vs_capability_so); - if (!vs_capability_so.empty()) { - set_video_streaming_supported(true); - } } if (JsonIsMemberSafe(ui_system_capabilities_node, diff --git a/src/components/application_manager/test/hmi_capabilities_sc1.json b/src/components/application_manager/test/hmi_capabilities_sc1.json index 3731f8eb78..4f17f031f0 100644 --- a/src/components/application_manager/test/hmi_capabilities_sc1.json +++ b/src/components/application_manager/test/hmi_capabilities_sc1.json @@ -1,5 +1,10 @@ { "UI": { + "hmiCapabilities":{ + "navigation":false, + "phoneCall":true, + "videoStreaming":false + }, "systemCapabilities": { "phoneCapability": { "dialNumberEnabled": true diff --git a/src/components/application_manager/test/hmi_capabilities_sc2.json b/src/components/application_manager/test/hmi_capabilities_sc2.json index 318fcf7a3e..0105a63ff6 100644 --- a/src/components/application_manager/test/hmi_capabilities_sc2.json +++ b/src/components/application_manager/test/hmi_capabilities_sc2.json @@ -1,5 +1,10 @@ { "UI": { + "hmiCapabilities":{ + "navigation":true, + "phoneCall":false, + "videoStreaming":false + }, "language": "EN_US", "languages": [ "EN_US", diff --git a/src/components/application_manager/test/hmi_capabilities_test.cc b/src/components/application_manager/test/hmi_capabilities_test.cc index 2127f46b69..2ebcb386d4 100644 --- a/src/components/application_manager/test/hmi_capabilities_test.cc +++ b/src/components/application_manager/test/hmi_capabilities_test.cc @@ -504,6 +504,15 @@ TEST_F(HMICapabilitiesTest, TEST_F( HMICapabilitiesTest, LoadCapabilitiesFromFile_CheckNavigationCapabilities_SuccessLoadAndConvert) { + const std::string content_to_save = + "{\"UI\": {\"hmiCapabilities\": {\"navigation\":true}}}"; + + CreateFile(kHmiCapabilitiesCacheFile); + + const std::vector binary_data_to_save(content_to_save.begin(), + content_to_save.end()); + file_system::Write(kHmiCapabilitiesCacheFile, binary_data_to_save); + hmi_capabilities_->Init(last_state_wrapper_); const auto navigation_capability_so = *(hmi_capabilities_->navigation_capability()); @@ -524,13 +533,42 @@ TEST_F(HMICapabilitiesTest, EXPECT_TRUE(phone_capability_so.keyExists("dialNumberEnabled")); EXPECT_TRUE(phone_capability_so["dialNumberEnabled"].asBool()); +} + +TEST_F(HMICapabilitiesTest, + LoadCapabilitiesFromFile_CheckHMICapabilities_SuccessLoadAndConvert) { + const std::string content_to_save = + "{\"UI\": {\"hmiCapabilities\": " + "{\"navigation\":true,\"phoneCall\":true,\"videoStreaming\":true}}}"; + + CreateFile(kHmiCapabilitiesCacheFile); + + const std::vector binary_data_to_save(content_to_save.begin(), + content_to_save.end()); + file_system::Write(kHmiCapabilitiesCacheFile, binary_data_to_save); + hmi_capabilities_->Init(last_state_wrapper_); + + const auto ui_hmi_capability_so = *(hmi_capabilities_->ui_hmi_capabilities()); + EXPECT_TRUE(ui_hmi_capability_so.keyExists("navigation")); + EXPECT_TRUE(ui_hmi_capability_so.keyExists("phoneCall")); + EXPECT_TRUE(ui_hmi_capability_so.keyExists("videoStreaming")); EXPECT_TRUE(hmi_capabilities_->phone_call_supported()); + EXPECT_TRUE(hmi_capabilities_->navigation_supported()); + EXPECT_TRUE(hmi_capabilities_->video_streaming_supported()); } TEST_F( HMICapabilitiesTest, LoadCapabilitiesFromFile_CheckVideoStreamingCapability_SuccessLoadAndConvert) { + const std::string content_to_save = + "{\"UI\": {\"hmiCapabilities\": {\"videoStreaming\":true}}}"; + + CreateFile(kHmiCapabilitiesCacheFile); + + const std::vector binary_data_to_save(content_to_save.begin(), + content_to_save.end()); + file_system::Write(kHmiCapabilitiesCacheFile, binary_data_to_save); hmi_capabilities_->Init(last_state_wrapper_); const auto vs_capability_so = *(hmi_capabilities_->video_streaming_capability()); @@ -836,7 +874,15 @@ TEST_F(HMICapabilitiesTest, const std::string hmi_capabilities_file = "hmi_capabilities_sc1.json"; ON_CALL(mock_application_manager_settings_, hmi_capabilities_file_name()) .WillByDefault(ReturnRef(hmi_capabilities_file)); + const std::string content_to_save = + "{\"UI\": {\"hmiCapabilities\": " + "{\"navigation\":false,\"phoneCall\":true,\"videoStreaming\":false}}}"; + + CreateFile(kHmiCapabilitiesCacheFile); + const std::vector binary_data_to_save(content_to_save.begin(), + content_to_save.end()); + file_system::Write(kHmiCapabilitiesCacheFile, binary_data_to_save); hmi_capabilities_->Init(last_state_wrapper_); // Check system capabilities; only phone capability is available @@ -857,6 +903,15 @@ TEST_F(HMICapabilitiesTest, const std::string hmi_capabilities_file = "hmi_capabilities_sc2.json"; ON_CALL(mock_application_manager_settings_, hmi_capabilities_file_name()) .WillByDefault(ReturnRef(hmi_capabilities_file)); + const std::string content_to_save = + "{\"UI\": {\"hmiCapabilities\": " + "{\"navigation\":true,\"phoneCall\":false,\"videoStreaming\":false}}}"; + + CreateFile(kHmiCapabilitiesCacheFile); + + const std::vector binary_data_to_save(content_to_save.begin(), + content_to_save.end()); + file_system::Write(kHmiCapabilitiesCacheFile, binary_data_to_save); hmi_capabilities_->Init(last_state_wrapper_); @@ -1219,7 +1274,7 @@ TEST_F(HMICapabilitiesTest, "\"EN-US\",\"languages\":[],\"displayCapabilities\" : " "{},\"audioPassThruCapabilities\":[],\"pcmStreamCapabilities\" : " "{},\"hmiZoneCapabilities\": \"\",\"softButtonCapabilities\" : " - "[],\"systemCapabilities\" : {}}}"; + "[],\"systemCapabilities\" : {},\"hmiCapabilities\" : {}}}"; const std::vector binary_data_to_save( predefined_ui_capabilities.begin(), predefined_ui_capabilities.end()); 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 f0da952d18..3a0bdc0741 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 @@ -114,6 +114,11 @@ class MockHMICapabilities : public ::application_manager::HMICapabilities { MOCK_METHOD1(set_hmi_zone_capabilities, void(const smart_objects::SmartObject& hmi_zone_capabilities)); + MOCK_CONST_METHOD0(ui_hmi_capabilities, + const smart_objects::SmartObjectSPtr()); + MOCK_METHOD1(set_ui_hmi_capabilities, + void(const smart_objects::SmartObject& ui_hmi_capabilities)); + MOCK_CONST_METHOD0(soft_button_capabilities, const smart_objects::SmartObjectSPtr()); MOCK_METHOD1( diff --git a/src/components/include/application_manager/hmi_capabilities.h b/src/components/include/application_manager/hmi_capabilities.h index 93cb09737d..16bc1b8a2c 100644 --- a/src/components/include/application_manager/hmi_capabilities.h +++ b/src/components/include/application_manager/hmi_capabilities.h @@ -252,6 +252,19 @@ class HMICapabilities { virtual void set_hmi_zone_capabilities( const smart_objects::SmartObject& hmi_zone_capabilities) = 0; + /** + * @brief Retrieves information about the HMI capabilities + * @return Currently supported UI HMI capabilities + */ + virtual const smart_objects::SmartObjectSPtr ui_hmi_capabilities() const = 0; + + /** + * @brief Sets supported HMI capabilities + * @param ui_hmi_capabilities supported HMI capabilities + */ + virtual void set_ui_hmi_capabilities( + const smart_objects::SmartObject& ui_hmi_capabilities) = 0; + /** * @brief Retrieves information about the SoftButton's capabilities * @return Currently supported SoftButton's capabilities -- cgit v1.2.1 From 94d6a89f471f8f6a707585465945c4ca77ae6e7e Mon Sep 17 00:00:00 2001 From: "Olha Vorobiova (GitHub)" <86727408+OlhaVorobiova@users.noreply.github.com> Date: Wed, 12 Jan 2022 00:27:25 +0200 Subject: Convert Common_SamplingRate and Common_BitsPerSample enums to uint (#3837) --- .../src/hmi_capabilities_impl.cc | 2 + .../include/media_manager/media_manager_impl.h | 2 - .../media_manager/src/media_manager_impl.cc | 81 ++++++++++++++++------ 3 files changed, 63 insertions(+), 22 deletions(-) diff --git a/src/components/application_manager/src/hmi_capabilities_impl.cc b/src/components/application_manager/src/hmi_capabilities_impl.cc index a1a85a7a44..6052382bb1 100644 --- a/src/components/application_manager/src/hmi_capabilities_impl.cc +++ b/src/components/application_manager/src/hmi_capabilities_impl.cc @@ -332,6 +332,7 @@ void HMICapabilitiesImpl::set_audio_pass_thru_capabilities( void HMICapabilitiesImpl::set_pcm_stream_capabilities( const smart_objects::SmartObject& pcm_stream_capabilities) { + SDL_LOG_AUTO_TRACE(); auto new_value = std::make_shared(pcm_stream_capabilities); sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); @@ -538,6 +539,7 @@ HMICapabilitiesImpl::audio_pass_thru_capabilities() const { const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::pcm_stream_capabilities() const { + SDL_LOG_AUTO_TRACE(); sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return pcm_stream_capabilities_; } 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 faa51feec9..2e4e46ed88 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 @@ -111,8 +111,6 @@ class MediaManagerImpl : public MediaManager, std::map streamer_; std::map streamer_listener_; - uint32_t bits_per_sample_; - uint32_t sampling_rate_; uint64_t stream_data_size_; std::chrono::time_point socket_audio_stream_start_time_; diff --git a/src/components/media_manager/src/media_manager_impl.cc b/src/components/media_manager/src/media_manager_impl.cc index 8a73101b47..c71012b1c9 100644 --- a/src/components/media_manager/src/media_manager_impl.cc +++ b/src/components/media_manager/src/media_manager_impl.cc @@ -66,8 +66,6 @@ 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(); @@ -165,23 +163,6 @@ 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::StartMicrophoneRecording( @@ -317,6 +298,11 @@ void MediaManagerImpl::OnMessageReceived( socket_audio_stream_start_time_) .count(); uint32_t ms_stream_remaining = ms_for_all_data - ms_since_stream_start; + SDL_LOG_DEBUG("stream_data_size_: " + << stream_data_size_ + << " ms_for_all_data: " << ms_for_all_data + << " ms_since_stream_start: " << ms_since_stream_start + << " ms_stream_remaining: " << ms_stream_remaining); app->WakeUpStreaming(service_type, ms_stream_remaining); } else { @@ -341,8 +327,63 @@ const MediaManagerSettings& MediaManagerImpl::settings() const { } uint32_t MediaManagerImpl::DataSizeToMilliseconds(uint64_t data_size) const { + uint32_t bits_per_sample = 16; + uint32_t sampling_rate = 16000; + + 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)) { + auto type = static_cast( + pcm_caps->getElement(application_manager::strings::bits_per_sample) + .asUInt()); + switch (type) { + case hmi_apis::Common_BitsPerSample::RATE_8_BIT: { + bits_per_sample = 8; + break; + } + case hmi_apis::Common_BitsPerSample::RATE_16_BIT: { + bits_per_sample = 16; + break; + } + default: + break; + } + } + + if (pcm_caps->keyExists(application_manager::strings::sampling_rate)) { + auto type = static_cast( + pcm_caps->getElement(application_manager::strings::sampling_rate) + .asUInt()); + switch (type) { + case hmi_apis::Common_SamplingRate::RATE_8KHZ: { + sampling_rate = 8000; + break; + } + case hmi_apis::Common_SamplingRate::RATE_16KHZ: { + sampling_rate = 16000; + break; + } + case hmi_apis::Common_SamplingRate::RATE_22KHZ: { + sampling_rate = 22000; + break; + } + case hmi_apis::Common_SamplingRate::RATE_44KHZ: { + sampling_rate = 44000; + break; + } + default: + break; + } + } + } + + SDL_LOG_DEBUG("Params of pcm_stream_capabilities: bits_per_sample: " + << bits_per_sample << " sampling_rate: " << sampling_rate); + constexpr uint16_t latency_compensation = 500; - return 1000 * data_size / (sampling_rate_ * bits_per_sample_ / 8) + + return 1000 * data_size / (sampling_rate * bits_per_sample / 8) + latency_compensation; } -- cgit v1.2.1 From 525abcc8e797e002bbf48444fe3bff931a89dc10 Mon Sep 17 00:00:00 2001 From: "Olha Vorobiova (GitHub)" <86727408+OlhaVorobiova@users.noreply.github.com> Date: Thu, 13 Jan 2022 16:51:44 +0200 Subject: SDL doesn't send up_to_date (#3834) * Correct UpdateStatusManager behavior after kOnValidUpdateReceived * Added an initialization of flags in external proprietary mode --- src/components/policy/policy_external/src/policy_manager_impl.cc | 2 ++ src/components/policy/policy_regular/src/status.cc | 1 + 2 files changed, 3 insertions(+) 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 75920be58c..b975b83712 100644 --- a/src/components/policy/policy_external/src/policy_manager_impl.cc +++ b/src/components/policy/policy_external/src/policy_manager_impl.cc @@ -215,6 +215,8 @@ PolicyManagerImpl::PolicyManagerImpl() , applications_pending_ptu_count_(0) , ignition_check(true) , retry_sequence_url_(0, 0, "") + , send_on_update_sent_out_(false) + , trigger_ptu_(false) , ptu_requested_(false) , is_ptu_in_progress_(false) {} diff --git a/src/components/policy/policy_regular/src/status.cc b/src/components/policy/policy_regular/src/status.cc index c870658622..f213c1f2a8 100644 --- a/src/components/policy/policy_regular/src/status.cc +++ b/src/components/policy/policy_regular/src/status.cc @@ -64,6 +64,7 @@ void policy::UpdateNeededStatus::ProcessEvent( manager->SetNextStatus(std::make_shared()); manager->SetPostponedStatus(std::make_shared()); break; + case kOnValidUpdateReceived: case kOnResetPolicyTableNoUpdate: manager->SetNextStatus(std::make_shared()); break; -- cgit v1.2.1 From 8f1ccb296f484f3aee1bfd56c83a963434a0fad9 Mon Sep 17 00:00:00 2001 From: RomanReznichenkoLuxoft <85177915+RomanReznichenkoLuxoft@users.noreply.github.com> Date: Thu, 13 Jan 2022 22:28:49 +0200 Subject: Cyclic UpdateDeviceList and UpdateAppList in case device is connected (#3835) * Added a check to make the script does not work when there is not device --- .../src/bluetooth/bluetooth_device_scanner.cc | 44 +++++++++++++++++----- .../transport_adapter/transport_adapter_impl.cc | 3 +- 2 files changed, 37 insertions(+), 10 deletions(-) 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 ce0c2900b7..11c6c0c79f 100644 --- a/src/components/transport_manager/src/bluetooth/bluetooth_device_scanner.cc +++ b/src/components/transport_manager/src/bluetooth/bluetooth_device_scanner.cc @@ -206,10 +206,19 @@ void BluetoothDeviceScanner::DoInquiry() { SDL_LOG_INFO("Check rfcomm channel on " << paired_devices_.size() << " paired devices."); - paired_devices_with_sdl_.clear(); CheckSDLServiceOnDevices( paired_devices_, device_handle, &paired_devices_with_sdl_); - UpdateTotalDeviceList(); + const bool new_connect = + paired_devices_with_sdl_.end() != + std::find_if(paired_devices_with_sdl_.begin(), + paired_devices_with_sdl_.end(), + [](DeviceSptr devicePtr) { + return devicePtr->connection_status() != + ConnectionStatus::CONNECTED; + }); + if (new_connect) { + UpdateTotalDeviceList(); + } controller_->FindNewApplicationsRequest(); @@ -249,13 +258,30 @@ void BluetoothDeviceScanner::CheckSDLServiceOnDevices( deviceName[name_len - 1] = '\0'; } - auto bluetooth_device = std::make_shared( - bd_address, deviceName, sdl_rfcomm_channels[i]); - if (bluetooth_device) { - SDL_LOG_INFO("Bluetooth device created successfully"); - discovered_devices->push_back(bluetooth_device); - } else { - SDL_LOG_WARN("Can't create bluetooth device " << deviceName); + auto it_device = + std::find_if(discovered_devices->begin(), + discovered_devices->end(), + [bd_address](DeviceSptr device) { + return device->unique_device_id() == + BluetoothDevice::GetUniqueDeviceId(bd_address); + }); + + const bool is_new_device = (it_device == discovered_devices->end()); + const bool is_new_rfcomm_channel = + !is_new_device && (*it_device)->GetApplicationList().size() != + sdl_rfcomm_channels[i].size(); + if (is_new_device || is_new_rfcomm_channel) { + if (!is_new_device) { + discovered_devices->erase(it_device); + } + auto bluetooth_device = std::make_shared( + bd_address, deviceName, sdl_rfcomm_channels[i]); + if (bluetooth_device) { + SDL_LOG_INFO("Bluetooth device created successfully"); + discovered_devices->push_back(bluetooth_device); + } else { + SDL_LOG_WARN("Can't create bluetooth device " << deviceName); + } } } SDL_LOG_TRACE("exit"); diff --git a/src/components/transport_manager/src/transport_adapter/transport_adapter_impl.cc b/src/components/transport_manager/src/transport_adapter/transport_adapter_impl.cc index 447aa6c8ff..c6412fe141 100644 --- a/src/components/transport_manager/src/transport_adapter/transport_adapter_impl.cc +++ b/src/components/transport_manager/src/transport_adapter/transport_adapter_impl.cc @@ -273,7 +273,8 @@ TransportAdapter::Error TransportAdapterImpl::ConnectDevice( retry_timer_pool_.push(std::make_pair(retry_timer, device_handle)); retry_timer->Start(get_settings().cloud_app_retry_timeout(), timer::kSingleShot); - } else if (OK == err) { + } else if (OK == err && + ConnectionStatus::CONNECTED != device->connection_status()) { ConnectionStatusUpdated(device, ConnectionStatus::CONNECTED); } SDL_LOG_TRACE("exit with error: " << err); -- cgit v1.2.1 From 880f4bb2e3ea048f070917077230c3bb832b999c Mon Sep 17 00:00:00 2001 From: "Yana Chernysheva (GitHub)" <59469418+ychernysheva@users.noreply.github.com> Date: Wed, 19 Jan 2022 16:58:28 +0200 Subject: Avoid processing streaming data packets after streaming stopping (#3816) * Avoid processing streaming data packets after streaming stopping In some situations streaming data packets may be received during streaming stopping. In this case processing of such packet will be performed right after completion of streaming stopping process due to streaming_stop_lock_. So in this case we need to skip processing of such packet, that's why new flags are added for both services, and also removed outdated comments and locks, which now are redundant due to streaming_stop_lock_. * Changed the text in the logs. The flag setting line above the Stop method has been moved * Move flag setting to the top of the method Co-authored-by: RomanReznichenkoLuxoft <85177915+RomanReznichenkoLuxoft@users.noreply.github.com> Co-authored-by: LitvinenkoIra --- .../include/application_manager/application_impl.h | 4 +- .../application_manager/src/application_impl.cc | 54 ++++++++++++---------- 2 files changed, 31 insertions(+), 27 deletions(-) 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 21e45b4515..49f44acacb 100644 --- a/src/components/application_manager/include/application_manager/application_impl.h +++ b/src/components/application_manager/include/application_manager/application_impl.h @@ -577,8 +577,8 @@ class ApplicationImpl : public virtual Application, bool audio_streaming_allowed_; bool video_streaming_suspended_; bool audio_streaming_suspended_; - sync_primitives::Lock video_streaming_suspended_lock_; - sync_primitives::Lock audio_streaming_suspended_lock_; + bool video_streaming_stopped_; + bool audio_streaming_stopped_; sync_primitives::Lock streaming_stop_lock_; bool is_app_allowed_; diff --git a/src/components/application_manager/src/application_impl.cc b/src/components/application_manager/src/application_impl.cc index 9b6e4457d0..e4a5304a1b 100644 --- a/src/components/application_manager/src/application_impl.cc +++ b/src/components/application_manager/src/application_impl.cc @@ -113,6 +113,8 @@ ApplicationImpl::ApplicationImpl( , audio_streaming_allowed_(false) , video_streaming_suspended_(true) , audio_streaming_suspended_(true) + , video_streaming_stopped_(false) + , audio_streaming_stopped_(false) , is_app_allowed_(true) , is_app_data_resumption_allowed_(false) , has_been_activated_(false) @@ -560,6 +562,7 @@ void ApplicationImpl::StartStreaming( if (ServiceType::kMobileNav == service_type) { SDL_LOG_TRACE("ServiceType = Video"); + video_streaming_stopped_ = false; if (!video_streaming_approved()) { SDL_LOG_TRACE("Video streaming not approved"); MessageHelper::SendNaviStartStream(app_id(), application_manager_); @@ -567,6 +570,7 @@ void ApplicationImpl::StartStreaming( } } else if (ServiceType::kAudio == service_type) { SDL_LOG_TRACE("ServiceType = Audio"); + audio_streaming_stopped_ = false; if (!audio_streaming_approved()) { SDL_LOG_TRACE("Audio streaming not approved"); MessageHelper::SendAudioStartStream(app_id(), application_manager_); @@ -580,7 +584,6 @@ void ApplicationImpl::StopStreamingForce( using namespace protocol_handler; SDL_LOG_AUTO_TRACE(); - // see the comment in StopStreaming() sync_primitives::AutoLock lock(streaming_stop_lock_); SuspendStreaming(service_type); @@ -597,10 +600,6 @@ void ApplicationImpl::StopStreaming( using namespace protocol_handler; SDL_LOG_AUTO_TRACE(); - // since WakeUpStreaming() is called from another thread, it is possible that - // the stream will be restarted after we call SuspendStreaming() and before - // we call StopXxxStreaming(). To avoid such timing issue, make sure that - // we run SuspendStreaming() and StopXxxStreaming() atomically. sync_primitives::AutoLock lock(streaming_stop_lock_); SuspendStreaming(service_type); @@ -615,6 +614,7 @@ void ApplicationImpl::StopStreaming( void ApplicationImpl::StopNaviStreaming() { SDL_LOG_AUTO_TRACE(); + video_streaming_stopped_ = true; video_stream_suspend_timer_.Stop(); MessageHelper::SendNaviStopStream(app_id(), application_manager_); set_video_streaming_approved(false); @@ -623,6 +623,7 @@ void ApplicationImpl::StopNaviStreaming() { void ApplicationImpl::StopAudioStreaming() { SDL_LOG_AUTO_TRACE(); + audio_streaming_stopped_ = true; audio_stream_suspend_timer_.Stop(); MessageHelper::SendAudioStopStream(app_id(), application_manager_); set_audio_streaming_approved(false); @@ -637,12 +638,10 @@ void ApplicationImpl::SuspendStreaming( if (ServiceType::kMobileNav == service_type) { video_stream_suspend_timer_.Stop(); 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_stream_suspend_timer_.Stop(); application_manager_.OnAppStreaming(app_id(), service_type, false); - sync_primitives::AutoLock lock(audio_streaming_suspended_lock_); audio_streaming_suspended_ = true; } application_manager_.ProcessOnDataStreamingNotification( @@ -654,32 +653,37 @@ void ApplicationImpl::WakeUpStreaming( using namespace protocol_handler; SDL_LOG_AUTO_TRACE(); - // See the comment in StopStreaming(). Also, please make sure that we acquire - // streaming_stop_lock_ then xxx_streaming_suspended_lock_ in this order! sync_primitives::AutoLock lock(streaming_stop_lock_); if (ServiceType::kMobileNav == service_type) { - { // 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, true); - application_manager_.ProcessOnDataStreamingNotification( - service_type, app_id(), true); - video_streaming_suspended_ = false; - } + if (video_streaming_stopped_) { + SDL_LOG_WARN( + "Video streaming is stopped, received data packet will be dropped"); + return; + } + if (video_streaming_suspended_) { + SDL_LOG_DEBUG("Video streaming is resuming after suspension"); + 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( 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, true); - application_manager_.ProcessOnDataStreamingNotification( - service_type, app_id(), true); - audio_streaming_suspended_ = false; - } + if (audio_streaming_stopped_) { + SDL_LOG_WARN( + "Audio streaming is stopped, received data packet will be dropped"); + return; + } + if (audio_streaming_suspended_) { + SDL_LOG_DEBUG("Audio streaming is resuming after suspension"); + 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( timer_len == 0 ? audio_stream_suspend_timeout_ : timer_len, -- cgit v1.2.1 From f6d2ff1cd90dd2dcb2b4fd4f5ca11224e13229ae Mon Sep 17 00:00:00 2001 From: "Yana Chernysheva (GitHub)" <59469418+ychernysheva@users.noreply.github.com> Date: Wed, 19 Jan 2022 18:21:43 +0200 Subject: Move app launcher stop before unregister app (#3825) * Move app launcher stop before unregister app The applauncher has to be stopped before appropriate application will be unregistered. Otherwise it could lead to core crash, when Launch controller will try to run already non existed application Co-authored-by: Andrii Kalinich Co-authored-by: OlhaVorobiova Co-authored-by: VladSemenyuk --- .../application_manager/app_launch/app_launch_ctrl.h | 6 ++++++ .../app_launch/app_launch_ctrl_impl.h | 2 ++ .../app_launch/device_apps_launcher.h | 2 ++ .../src/app_launch/app_launch_ctrl_impl.cc | 9 +++++++++ .../src/app_launch/device_apps_launcher.cc | 18 ++++++++++++++++++ .../src/application_manager_impl.cc | 5 +++++ 6 files changed, 42 insertions(+) diff --git a/src/components/application_manager/include/application_manager/app_launch/app_launch_ctrl.h b/src/components/application_manager/include/application_manager/app_launch/app_launch_ctrl.h index 2dd64a2941..ca1952197a 100644 --- a/src/components/application_manager/include/application_manager/app_launch/app_launch_ctrl.h +++ b/src/components/application_manager/include/application_manager/app_launch/app_launch_ctrl.h @@ -66,6 +66,12 @@ class AppLaunchCtrl { * @brief OnMasterReset clear database of saved applications */ virtual void OnMasterReset() = 0; + + /** + * @brief Stop - allows to stop app launcher. + */ + virtual void Stop() = 0; + virtual ~AppLaunchCtrl() {} }; diff --git a/src/components/application_manager/include/application_manager/app_launch/app_launch_ctrl_impl.h b/src/components/application_manager/include/application_manager/app_launch/app_launch_ctrl_impl.h index 986f4ad4ff..32cbc46245 100644 --- a/src/components/application_manager/include/application_manager/app_launch/app_launch_ctrl_impl.h +++ b/src/components/application_manager/include/application_manager/app_launch/app_launch_ctrl_impl.h @@ -69,6 +69,7 @@ class AppLaunchCtrlImpl : public AppLaunchCtrl { void OnAppRegistered(const application_manager::Application& app) OVERRIDE; void OnDeviceConnected(const std::string& device_mac) OVERRIDE; void OnMasterReset() OVERRIDE; + void Stop() OVERRIDE; private: const AppLaunchSettings& settings_; @@ -77,6 +78,7 @@ class AppLaunchCtrlImpl : public AppLaunchCtrl { AppsLauncher apps_launcher_; DeviceAppsLauncher device_apps_launcher_; + sync_primitives::Lock device_apps_launcher_lock_; DISALLOW_COPY_AND_ASSIGN(AppLaunchCtrlImpl); }; diff --git a/src/components/application_manager/include/application_manager/app_launch/device_apps_launcher.h b/src/components/application_manager/include/application_manager/app_launch/device_apps_launcher.h index f27e4569fc..2ffec0e065 100644 --- a/src/components/application_manager/include/application_manager/app_launch/device_apps_launcher.h +++ b/src/components/application_manager/include/application_manager/app_launch/device_apps_launcher.h @@ -35,6 +35,7 @@ class DeviceAppsLauncherImpl { }; bool StopLaunchingAppsOnDevice(const std::string& device_mac); + void StopLaunchingAppsOnAllDevices(); private: sync_primitives::Lock launchers_lock_; @@ -60,6 +61,7 @@ class DeviceAppsLauncher { const std::string& device_mac, const std::vector& applications_to_launch); bool StopLaunchingAppsOnDevice(const std::string& device_mac); + void StopLaunchingAppsOnAllDevices(); const AppLaunchSettings& settings() const; diff --git a/src/components/application_manager/src/app_launch/app_launch_ctrl_impl.cc b/src/components/application_manager/src/app_launch/app_launch_ctrl_impl.cc index 4dafe9a8e6..05231b66b1 100644 --- a/src/components/application_manager/src/app_launch/app_launch_ctrl_impl.cc +++ b/src/components/application_manager/src/app_launch/app_launch_ctrl_impl.cc @@ -83,6 +83,7 @@ bool HmiLevelSorter(const std::pair& lval, void AppLaunchCtrlImpl::OnDeviceConnected(const std::string& device_mac) { SDL_LOG_AUTO_TRACE(); + std::vector apps_on_device = app_launch_data_.GetApplicationDataByDevice(device_mac); std::vector > apps_hmi_levels; @@ -102,6 +103,7 @@ void AppLaunchCtrlImpl::OnDeviceConnected(const std::string& device_mac) { std::back_inserter(apps_on_device), GetAppFromHmiLevelPair); if (apps_on_device.size() > 0) { + sync_primitives::AutoLock lock(device_apps_launcher_lock_); device_apps_launcher_.LaunchAppsOnDevice(device_mac, apps_on_device); } else { SDL_LOG_DEBUG("No apps in saved for device " << device_mac); @@ -112,4 +114,11 @@ void AppLaunchCtrlImpl::OnMasterReset() { SDL_LOG_AUTO_TRACE(); app_launch_data_.Clear(); } + +void AppLaunchCtrlImpl::Stop() { + SDL_LOG_AUTO_TRACE(); + sync_primitives::AutoLock lock(device_apps_launcher_lock_); + device_apps_launcher_.StopLaunchingAppsOnAllDevices(); +} + } // namespace app_launch diff --git a/src/components/application_manager/src/app_launch/device_apps_launcher.cc b/src/components/application_manager/src/app_launch/device_apps_launcher.cc index 5f36e41efb..1bf2bbf46d 100644 --- a/src/components/application_manager/src/app_launch/device_apps_launcher.cc +++ b/src/components/application_manager/src/app_launch/device_apps_launcher.cc @@ -157,6 +157,20 @@ bool DeviceAppsLauncherImpl::StopLaunchingAppsOnDevice( return true; } +void DeviceAppsLauncherImpl::StopLaunchingAppsOnAllDevices() { + SDL_LOG_AUTO_TRACE(); + sync_primitives::AutoLock lock(launchers_lock_); + + std::for_each(works_launchers_.begin(), + works_launchers_.end(), + [this](LauncherPtr launcher) { + launcher->Clear(); + free_launchers_.push_back(launcher); + }); + + works_launchers_.clear(); +} + bool DeviceAppsLauncher::LaunchAppsOnDevice( const std::string& device_mac, const std::vector& applications_to_launch) { @@ -176,6 +190,10 @@ bool DeviceAppsLauncher::StopLaunchingAppsOnDevice( return impl_->StopLaunchingAppsOnDevice(device_mac); } +void DeviceAppsLauncher::StopLaunchingAppsOnAllDevices() { + impl_->StopLaunchingAppsOnAllDevices(); +} + const AppLaunchSettings& DeviceAppsLauncher::settings() const { return settings_; } diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc index e8e3912f9a..8f959460ca 100644 --- a/src/components/application_manager/src/application_manager_impl.cc +++ b/src/components/application_manager/src/application_manager_impl.cc @@ -2651,6 +2651,11 @@ bool ApplicationManagerImpl::Init( bool ApplicationManagerImpl::Stop() { SDL_LOG_AUTO_TRACE(); InitiateStopping(); + + if (app_launch_ctrl_) { + app_launch_ctrl_->Stop(); + } + application_list_update_timer_.Stop(); try { if (unregister_reason_ == -- cgit v1.2.1 From 71b4ce138fb0a3535693a70dcf847a3dd78a9f37 Mon Sep 17 00:00:00 2001 From: Jacob Keeler Date: Wed, 19 Jan 2022 12:51:50 -0500 Subject: Send lock screen dismissal info with DD_OFF notification (#3842) --- .../src/commands/hmi/on_driver_distraction_notification.cc | 3 +-- src/components/application_manager/src/application_manager_impl.cc | 4 +--- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_driver_distraction_notification.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_driver_distraction_notification.cc index 167176aa0f..2b41791d43 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_driver_distraction_notification.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_driver_distraction_notification.cc @@ -161,8 +161,7 @@ void OnDriverDistractionNotification::Run() { const auto lock_screen_dismissal = application_manager_.GetPolicyHandler().LockScreenDismissalEnabledState(); - if (lock_screen_dismissal && - hmi_apis::Common_DriverDistractionState::DD_ON == state) { + if (lock_screen_dismissal) { (*on_driver_distraction) [strings::msg_params] [mobile_notification::lock_screen_dismissal_enabled] = diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc index 8f959460ca..55a60abea5 100644 --- a/src/components/application_manager/src/application_manager_impl.cc +++ b/src/components/application_manager/src/application_manager_impl.cc @@ -4659,9 +4659,7 @@ void ApplicationManagerImpl::SendDriverDistractionState( const auto lock_screen_dismissal = policy_handler_->LockScreenDismissalEnabledState(); - if (lock_screen_dismissal && - hmi_apis::Common_DriverDistractionState::DD_ON == - driver_distraction_state()) { + if (lock_screen_dismissal) { bool dismissal_enabled = *lock_screen_dismissal; if (dismissal_enabled) { const auto language = EnumToString(application->ui_language()); -- cgit v1.2.1 From 6ca696110c7ad83ed390856ada84b223f98dbcd5 Mon Sep 17 00:00:00 2001 From: Jacob Keeler Date: Wed, 19 Jan 2022 16:25:45 -0500 Subject: Fix invalid iterator usage (#3843) --- .../vehicle_info_plugin/src/vehicle_info_pending_resumption_handler.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_pending_resumption_handler.cc b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_pending_resumption_handler.cc index faa7aa258e..34f5401bff 100644 --- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_pending_resumption_handler.cc +++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_pending_resumption_handler.cc @@ -223,8 +223,7 @@ void VehicleInfoPendingResumptionHandler::HandleOnEvent( custom_vehicle_data_manager_.CreateMobileMessageParams(converted_msg_params); response_message[strings::msg_params] = converted_msg_params; - if (converted_msg_params.enumerate().end() != - converted_msg_params.enumerate().find(strings::cluster_modes)) { + if (converted_msg_params.keyExists(strings::cluster_modes)) { response_message[strings::msg_params][strings::cluster_mode_status] = response_message[strings::msg_params][strings::cluster_modes]; response_message[strings::msg_params].erase(strings::cluster_modes); -- cgit v1.2.1 From c46340e7835e5381a7c309546e2d4a7a2f902130 Mon Sep 17 00:00:00 2001 From: "Yana Chernysheva (GitHub)" <59469418+ychernysheva@users.noreply.github.com> Date: Tue, 25 Jan 2022 16:41:52 +0200 Subject: Fix PerformInteractionChoiceSet request behavior (#3826) * Fix PerformInteractionChoiceSet request behavior * Update src/components/application_manager/src/application_data_impl.cc Co-authored-by: Collin Co-authored-by: Iryna Lytvynenko (GitHub) Co-authored-by: Collin --- .../include/application_manager/application.h | 19 +++++++ .../application_manager/application_data_impl.h | 7 +++ .../create_interaction_choice_set_request.cc | 13 +++++ .../delete_interaction_choice_set_request.cc | 1 + .../commands/mobile/perform_interaction_request.cc | 21 +++++++ .../mobile/create_interaction_choice_set_test.cc | 4 +- .../commands/mobile/perform_interaction_test.cc | 32 +++++++++++ .../src/application_data_impl.cc | 64 +++++++++++++++++++--- .../include/application_manager/mock_application.h | 2 + 9 files changed, 152 insertions(+), 11 deletions(-) diff --git a/src/components/application_manager/include/application_manager/application.h b/src/components/application_manager/include/application_manager/application.h index 86b26f24ef..33fa1ae914 100644 --- a/src/components/application_manager/include/application_manager/application.h +++ b/src/components/application_manager/include/application_manager/application.h @@ -520,6 +520,25 @@ class DynamicApplicationData { * @return TRUE if perform interaction active, otherwise FALSE */ virtual bool is_reset_global_properties_active() const = 0; + + /** + * @brief Set allowed mode for specified choice_set_id. + * @param choice_set_id Choice set id. + * @param is_allowed TRUE if the choice set has to be allowed to perform, + * otherwise FALSE. + * Allow mode means that the choice_set is not fully processed or not fully + * deleted (in both cases request is being processed on HMI side, and HMI + * hasn't sent response with result yet) + */ + virtual void set_choice_set_allow_mode(const uint32_t choice_set_id, + const bool is_allowed) = 0; + + /** + * @brief Check if choice set allowed. + * @param choice_set_id Choice set id. + * @return TRUE if the choice set is allowed to perform, otherwise FALSE. + */ + virtual bool is_choice_set_allowed(const uint32_t choice_set_id) const = 0; }; class Application : public virtual InitialApplicationData, diff --git a/src/components/application_manager/include/application_manager/application_data_impl.h b/src/components/application_manager/include/application_manager/application_data_impl.h index 086e71b48b..e349fd7d4c 100644 --- a/src/components/application_manager/include/application_manager/application_data_impl.h +++ b/src/components/application_manager/include/application_manager/application_data_impl.h @@ -315,6 +315,11 @@ class DynamicApplicationDataImpl : public virtual Application { */ inline bool is_reset_global_properties_active() const; + void set_choice_set_allow_mode(const uint32_t choice_set_id, + const bool is_allowed); + + bool is_choice_set_allowed(const uint32_t choice_set_id) const; + protected: smart_objects::SmartObject* help_prompt_; smart_objects::SmartObject* timeout_prompt_; @@ -346,6 +351,8 @@ class DynamicApplicationDataImpl : public virtual Application { uint32_t is_perform_interaction_active_; bool is_reset_global_properties_active_; int32_t perform_interaction_mode_; + mutable sync_primitives::Lock allowed_choice_sets_lock_; + std::set allowed_choice_sets_; DisplayCapabilitiesBuilder display_capabilities_builder_; private: diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/create_interaction_choice_set_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/create_interaction_choice_set_request.cc index 98e26e1aa9..70f462c05d 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/create_interaction_choice_set_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/create_interaction_choice_set_request.cc @@ -156,6 +156,11 @@ void CreateInteractionChoiceSetRequest::Run() { // we have VR commands SendVRAddCommandRequests(app); } else { + if (MessageHelper::ChoiceSetVRCommandsStatus::NONE == vr_status) { + // Because on_event will not be called for this choice, we set is allowed + // right after added. + app->set_choice_set_allow_mode(choice_set_id_, true); + } // we have none, just return with success SendResponse(true, Result::SUCCESS); } @@ -462,6 +467,14 @@ void CreateInteractionChoiceSetRequest::DeleteChoices() { void CreateInteractionChoiceSetRequest::OnAllHMIResponsesReceived() { SDL_LOG_AUTO_TRACE(); + ApplicationSharedPtr application = + application_manager_.application(connection_key()); + if (!error_from_hmi_) { + application->set_choice_set_allow_mode(choice_set_id_, true); + SDL_LOG_DEBUG("Choice set with id " << choice_set_id_ + << " is allowed to perform."); + } + if (!error_from_hmi_ && should_send_warnings_) { SendResponse(true, mobile_apis::Result::WARNINGS, kInvalidImageWarningInfo); } else if (!error_from_hmi_) { diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/delete_interaction_choice_set_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/delete_interaction_choice_set_request.cc index eac43bb22b..dccf2e9fdd 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/delete_interaction_choice_set_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/delete_interaction_choice_set_request.cc @@ -173,6 +173,7 @@ void DeleteInteractionChoiceSetRequest::SendVrDeleteCommand( return; } + app->set_choice_set_allow_mode(choice_set_id, false); smart_objects::SmartObject msg_params = smart_objects::SmartObject(smart_objects::SmartType_Map); msg_params[strings::app_id] = app->app_id(); 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 bf0f05ba32..7708df9363 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 @@ -173,6 +173,27 @@ void PerformInteractionRequest::Run() { return; } + auto choice_sets_are_disallowed_to_perform = + [](ApplicationSharedPtr app, + const smart_objects::SmartObject& choice_set_id_list) { + auto choice_set_id_array = choice_set_id_list.asArray(); + + return std::any_of( + choice_set_id_array->begin(), + choice_set_id_array->end(), + [app](smart_objects::SmartObject& choice_set_id) { + return !app->is_choice_set_allowed(choice_set_id.asInt()); + }); + }; + + if (choice_sets_are_disallowed_to_perform( + app, msg_params[strings::interaction_choice_set_id_list])) { + const std::string message = "One of choice sets is not available yet"; + SDL_LOG_WARN(message); + SendResponse(false, mobile_apis::Result::REJECTED, message.c_str()); + return; + } + if (msg_params.keyExists(strings::vr_help)) { if (mobile_apis::Result::INVALID_DATA == MessageHelper::VerifyImageVrHelpItems( diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/create_interaction_choice_set_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/create_interaction_choice_set_test.cc index 3f8ac0028b..951a206dff 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/create_interaction_choice_set_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/create_interaction_choice_set_test.cc @@ -836,8 +836,8 @@ TEST_F(CreateInteractionChoiceSetRequestTest, smart_objects::SmartObject choice_set_id(smart_objects::SmartType_Null); - EXPECT_CALL(app_mngr_, application(kConnectionKey)) - .WillOnce(Return(mock_app_)); + ON_CALL(app_mngr_, application(kConnectionKey)) + .WillByDefault(Return(mock_app_)); ON_CALL(mock_message_helper_, CheckChoiceSetVRCommands(_)) .WillByDefault(Return(am::MessageHelper::ChoiceSetVRCommandsStatus::ALL)); diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/perform_interaction_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/perform_interaction_test.cc index 196c83d144..ee2eb720e0 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/perform_interaction_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/perform_interaction_test.cc @@ -703,6 +703,38 @@ TEST_F( "UI warning message, VR error message"); } +TEST_F(PerformInteractionRequestTest, + ChoiceSetIsNotAllowed_UnsuccessWithREJECT) { + MessageSharedPtr msg_from_mobile = + CreateMessage(smart_objects::SmartType_Map); + const uint32_t kDissalowedChoiceSetId = 11u; + + (*msg_from_mobile)[strings::msg_params] + [strings::interaction_choice_set_id_list][0] = + kDissalowedChoiceSetId; + (*msg_from_mobile)[strings::msg_params][strings::interaction_choice_set_id] = + kDissalowedChoiceSetId; + smart_objects::SmartObject choice_set_id = + (*msg_from_mobile)[am::strings::msg_params] + [am::strings::interaction_choice_set_id]; + + ON_CALL(app_mngr_, application(_)).WillByDefault(Return(mock_app_)); + EXPECT_CALL(*mock_app_, FindChoiceSet(kDissalowedChoiceSetId)) + .WillOnce(Return(choice_set_id)); + EXPECT_CALL(*mock_app_, is_choice_set_allowed(kDissalowedChoiceSetId)) + .WillOnce(Return(false)); + EXPECT_CALL( + mock_rpc_service_, + ManageMobileCommand(MobileResultCodeIs(mobile_apis::Result::REJECTED), _)) + .WillOnce(Return(true)); + + auto command = + CreateCommand(msg_from_mobile); + + command->Init(); + command->Run(); +} + } // namespace perform_interaction_request } // namespace mobile_commands_test } // namespace commands_test diff --git a/src/components/application_manager/src/application_data_impl.cc b/src/components/application_manager/src/application_data_impl.cc index 57f7932246..7e5eaf43a0 100644 --- a/src/components/application_manager/src/application_data_impl.cc +++ b/src/components/application_manager/src/application_data_impl.cc @@ -926,20 +926,40 @@ void DynamicApplicationDataImpl::RemoveWindowInfo(const WindowID window_id) { void DynamicApplicationDataImpl::AddChoiceSet( uint32_t choice_set_id, const smart_objects::SmartObject& choice_set) { - sync_primitives::AutoLock lock(choice_set_map_lock_ptr_); - ChoiceSetMap::const_iterator it = choice_set_map_.find(choice_set_id); - if (choice_set_map_.end() == it) { - choice_set_map_[choice_set_id] = new smart_objects::SmartObject(choice_set); + bool is_choice_set_added = false; + { + sync_primitives::AutoLock lock(choice_set_map_lock_ptr_); + ChoiceSetMap::const_iterator it = choice_set_map_.find(choice_set_id); + if (choice_set_map_.end() == it) { + choice_set_map_[choice_set_id] = + new smart_objects::SmartObject(choice_set); + is_choice_set_added = true; + } + } + if (is_choice_set_added) { + set_choice_set_allow_mode(choice_set_id, true); } } void DynamicApplicationDataImpl::RemoveChoiceSet(uint32_t choice_set_id) { - sync_primitives::AutoLock lock(choice_set_map_lock_ptr_); - ChoiceSetMap::iterator it = choice_set_map_.find(choice_set_id); + { + sync_primitives::AutoLock choice_set_map_lock(choice_set_map_lock_ptr_); + ChoiceSetMap::iterator it = choice_set_map_.find(choice_set_id); - if (choice_set_map_.end() != it) { - delete it->second; - choice_set_map_.erase(choice_set_id); + if (choice_set_map_.end() != it) { + delete it->second; + choice_set_map_.erase(choice_set_id); + } + } + { + sync_primitives::AutoLock allowed_choice_sets_lock( + allowed_choice_sets_lock_); + auto choice_id_it = allowed_choice_sets_.find(choice_set_id); + if (allowed_choice_sets_.end() == choice_id_it) { + SDL_LOG_WARN("Choice set with id " << choice_set_id << " is not found"); + return; + } + allowed_choice_sets_.erase(choice_id_it); } } @@ -986,6 +1006,32 @@ void DynamicApplicationDataImpl::set_reset_global_properties_active( is_reset_global_properties_active_ = active; } +void DynamicApplicationDataImpl::set_choice_set_allow_mode( + const uint32_t choice_set_id, const bool is_allowed) { + SDL_LOG_DEBUG("Choice setID: " + << choice_set_id + << (is_allowed ? " is allowed" : " disallowed")); + sync_primitives::AutoLock lock(allowed_choice_sets_lock_); + if (is_allowed) { + allowed_choice_sets_.insert(choice_set_id); + } else { + allowed_choice_sets_.erase(choice_set_id); + } +} + +bool DynamicApplicationDataImpl::is_choice_set_allowed( + const uint32_t choice_set_id) const { + SDL_LOG_DEBUG("Choice setID: " << choice_set_id); + sync_primitives::AutoLock lock(allowed_choice_sets_lock_); + const auto it = allowed_choice_sets_.find(choice_set_id); + if (allowed_choice_sets_.end() == it) { + SDL_LOG_ERROR("Choice set with id " << choice_set_id + << " is not allowed to perform now"); + return false; + } + return true; +} + void DynamicApplicationDataImpl::set_perform_interaction_mode(int32_t mode) { perform_interaction_mode_ = mode; } 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 ac2a534929..93755ef8f4 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 @@ -361,6 +361,8 @@ class MockApplication : public ::application_manager::Application { mobile_apis::LayoutMode::eType()); MOCK_METHOD1(set_reset_global_properties_active, void(bool active)); MOCK_CONST_METHOD0(is_reset_global_properties_active, bool()); + MOCK_METHOD2(set_choice_set_allow_mode, void(std::uint32_t, bool)); + MOCK_CONST_METHOD1(is_choice_set_allowed, bool(std::uint32_t)); MOCK_CONST_METHOD0(app_id, uint32_t()); MOCK_CONST_METHOD0(mac_address, const std::string&()); MOCK_CONST_METHOD0(bundle_id, const std::string&()); -- cgit v1.2.1 From 52f7eecc58dec08074ade7cea335bf91f88efb92 Mon Sep 17 00:00:00 2001 From: "Olha Vorobiova (GitHub)" <86727408+OlhaVorobiova@users.noreply.github.com> Date: Tue, 25 Jan 2022 21:15:11 +0200 Subject: Resolve a deadlock (#3828) * Fixed deadlock * Delete useless members in EventDispatcher --- .../event_engine/event_dispatcher.h | 9 ---- .../event_engine/event_dispatcher_impl.h | 27 ---------- .../src/event_engine/event_dispatcher_impl.cc | 63 ++++++---------------- .../src/request_controller_impl.cc | 2 - .../src/request_timeout_handler_impl.cc | 3 ++ 5 files changed, 19 insertions(+), 85 deletions(-) diff --git a/src/components/application_manager/include/application_manager/event_engine/event_dispatcher.h b/src/components/application_manager/include/application_manager/event_engine/event_dispatcher.h index b232875f43..0656372f47 100644 --- a/src/components/application_manager/include/application_manager/event_engine/event_dispatcher.h +++ b/src/components/application_manager/include/application_manager/event_engine/event_dispatcher.h @@ -61,15 +61,6 @@ class EventDispatcher { int32_t hmi_correlation_id, EventObserver& observer) = 0; - /* - * @brief Unsubscribes the observer from specific event - * - * @param event_id The event ID to subscribe for - * @param hmi_correlation_id The event HMI correlation ID - */ - virtual void remove_observer(const Event::EventID& event_id, - const int32_t hmi_correlation_id) = 0; - /* * @brief Unsubscribes the observer from specific event * diff --git a/src/components/application_manager/include/application_manager/event_engine/event_dispatcher_impl.h b/src/components/application_manager/include/application_manager/event_engine/event_dispatcher_impl.h index ffe659a07c..b4cfead5fa 100644 --- a/src/components/application_manager/include/application_manager/event_engine/event_dispatcher_impl.h +++ b/src/components/application_manager/include/application_manager/event_engine/event_dispatcher_impl.h @@ -68,12 +68,6 @@ class EventDispatcherImpl : public EventDispatcher { EventObserverMap get_observers() const { return observers_event_; } - MobileEventObserverMap get_mobile_observers() const { - return mobile_observers_event_; - } - ObserverVector get_observers_list() const { - return observers_; - } #endif // BUILD_TESTS /* @@ -83,9 +77,6 @@ class EventDispatcherImpl : public EventDispatcher { */ void raise_event(const Event& event) OVERRIDE; - void remove_observer(const Event::EventID& event_id, - const int32_t hmi_correlation_id) OVERRIDE; - /* * @brief Subscribe the observer to event * @@ -149,32 +140,14 @@ class EventDispatcherImpl : public EventDispatcher { void remove_mobile_observer(EventObserver& observer) OVERRIDE; private: - /* - * @brief removes observer - * when occurs unsubscribe from event - * @param observer to be removed - */ - void remove_observer_from_vector(EventObserver& observer); - - /* - * @brief removes observer - * when occurs unsubscribe from event - * @param observer to be removed - */ - void remove_mobile_observer_from_vector(EventObserver& observer); - DISALLOW_COPY_AND_ASSIGN(EventDispatcherImpl); private: // Members section - sync_primitives::Lock state_lock_; - sync_primitives::Lock mobile_state_lock_; sync_primitives::RecursiveLock observer_lock_; sync_primitives::RecursiveLock mobile_observer_lock_; EventObserverMap observers_event_; MobileEventObserverMap mobile_observers_event_; - ObserverVector observers_; - ObserverVector mobile_observers_; }; } // namespace event_engine diff --git a/src/components/application_manager/src/event_engine/event_dispatcher_impl.cc b/src/components/application_manager/src/event_engine/event_dispatcher_impl.cc index 0d7dc9cfe0..441e3831f8 100644 --- a/src/components/application_manager/src/event_engine/event_dispatcher_impl.cc +++ b/src/components/application_manager/src/event_engine/event_dispatcher_impl.cc @@ -45,9 +45,9 @@ EventDispatcherImpl::~EventDispatcherImpl() {} void EventDispatcherImpl::raise_event(const Event& event) { ObserverVector observers; - AutoLock observer_lock(observer_lock_); + { - AutoLock state_lock(state_lock_); + AutoLock observer_lock(observer_lock_); // check if event is notification if (hmi_apis::messageType::notification == event.smart_object_type()) { @@ -65,7 +65,6 @@ void EventDispatcherImpl::raise_event(const Event& event) { while (!observers.empty()) { EventObserver* temp = *observers.begin(); observers.erase(observers.begin()); - AutoUnlock unlock_observer(observer_lock); if (temp->IncrementReferenceCount()) { temp->HandleOnEvent(event); @@ -77,7 +76,7 @@ void EventDispatcherImpl::raise_event(const Event& event) { void EventDispatcherImpl::add_observer(const Event::EventID& event_id, int32_t hmi_correlation_id, EventObserver& observer) { - AutoLock auto_lock(state_lock_); + AutoLock auto_lock(observer_lock_); observers_event_[event_id][hmi_correlation_id].push_back(&observer); } @@ -92,19 +91,9 @@ struct IdCheckFunctor { const unsigned long target_id; }; -void EventDispatcherImpl::remove_observer(const Event::EventID& event_id, - const int32_t hmi_correlation_id) { - AutoLock auto_lock(state_lock_); - auto& observers = observers_event_[event_id][hmi_correlation_id]; - for (auto observer : observers) { - remove_observer_from_vector(*observer); - } -} - void EventDispatcherImpl::remove_observer(const Event::EventID& event_id, EventObserver& observer) { - remove_observer_from_vector(observer); - AutoLock auto_lock(state_lock_); + AutoLock auto_lock(observer_lock_); ObserversMap::iterator it = observers_event_[event_id].begin(); for (; observers_event_[event_id].end() != it; ++it) { @@ -118,7 +107,8 @@ void EventDispatcherImpl::remove_observer(const Event::EventID& event_id, } void EventDispatcherImpl::remove_observer(EventObserver& observer) { - remove_observer_from_vector(observer); + AutoLock auto_lock(observer_lock_); + EventObserverMap::iterator event_map = observers_event_.begin(); for (; observers_event_.end() != event_map; ++event_map) { @@ -126,41 +116,32 @@ void EventDispatcherImpl::remove_observer(EventObserver& observer) { } } -void EventDispatcherImpl::remove_observer_from_vector(EventObserver& observer) { - AutoLock auto_lock(observer_lock_); - - observers_.erase( - std::remove_if( - observers_.begin(), observers_.end(), IdCheckFunctor(observer.id())), - observers_.end()); -} - // Mobile Events void EventDispatcherImpl::raise_mobile_event(const MobileEvent& event) { - AutoLock observer_lock(mobile_observer_lock_); + ObserverVector mobile_observers; + { - AutoLock state_lock(mobile_state_lock_); + AutoLock observer_lock(mobile_observer_lock_); // check if event is notification if (mobile_apis::messageType::notification == event.smart_object_type()) { const uint32_t notification_correlation_id = 0; - mobile_observers_ = + mobile_observers = mobile_observers_event_[event.id()][notification_correlation_id]; } if (mobile_apis::messageType::response == event.smart_object_type()) { - mobile_observers_ = + mobile_observers = mobile_observers_event_[event.id()] [event.smart_object_correlation_id()]; } } // Call observers - while (!mobile_observers_.empty()) { - EventObserver* temp = *mobile_observers_.begin(); - mobile_observers_.erase(mobile_observers_.begin()); - AutoUnlock unlock_observer(observer_lock); + while (!mobile_observers.empty()) { + EventObserver* temp = *mobile_observers.begin(); + mobile_observers.erase(mobile_observers.begin()); if (temp->IncrementReferenceCount()) { temp->HandleOnEvent(event); @@ -173,14 +154,13 @@ void EventDispatcherImpl::add_mobile_observer( const MobileEvent::MobileEventID& event_id, int32_t mobile_correlation_id, EventObserver& observer) { - AutoLock auto_lock(mobile_state_lock_); + AutoLock auto_lock(mobile_observer_lock_); mobile_observers_event_[event_id][mobile_correlation_id].push_back(&observer); } void EventDispatcherImpl::remove_mobile_observer( const MobileEvent::MobileEventID& event_id, EventObserver& observer) { - remove_mobile_observer_from_vector(observer); - AutoLock auto_lock(mobile_state_lock_); + AutoLock auto_lock(mobile_observer_lock_); ObserversMap::iterator it = mobile_observers_event_[event_id].begin(); for (; mobile_observers_event_[event_id].end() != it; ++it) { @@ -194,7 +174,6 @@ void EventDispatcherImpl::remove_mobile_observer( } void EventDispatcherImpl::remove_mobile_observer(EventObserver& observer) { - remove_mobile_observer_from_vector(observer); MobileEventObserverMap::iterator event_map = mobile_observers_event_.begin(); for (; mobile_observers_event_.end() != event_map; ++event_map) { @@ -202,15 +181,5 @@ void EventDispatcherImpl::remove_mobile_observer(EventObserver& observer) { } } -void EventDispatcherImpl::remove_mobile_observer_from_vector( - EventObserver& observer) { - AutoLock auto_lock(mobile_observer_lock_); - - mobile_observers_.erase( - std::remove_if( - observers_.begin(), observers_.end(), IdCheckFunctor(observer.id())), - observers_.end()); -} - } // namespace event_engine } // namespace application_manager diff --git a/src/components/application_manager/src/request_controller_impl.cc b/src/components/application_manager/src/request_controller_impl.cc index 76d4a70330..b73ebc0b74 100644 --- a/src/components/application_manager/src/request_controller_impl.cc +++ b/src/components/application_manager/src/request_controller_impl.cc @@ -335,8 +335,6 @@ void RequestControllerImpl::TerminateRequest(const uint32_t correlation_id, return; } if (force_terminate || request->request()->AllowedToTerminate()) { - event_dispatcher_.remove_observer( - static_cast(function_id), correlation_id); waiting_for_response_.RemoveRequest(request); if (RequestInfo::HMIRequest == request->request_type()) { request_timeout_handler_.RemoveRequest(request->requestId()); diff --git a/src/components/application_manager/src/request_timeout_handler_impl.cc b/src/components/application_manager/src/request_timeout_handler_impl.cc index 1ac72393a0..b8e0e67746 100644 --- a/src/components/application_manager/src/request_timeout_handler_impl.cc +++ b/src/components/application_manager/src/request_timeout_handler_impl.cc @@ -49,6 +49,7 @@ RequestTimeoutHandlerImpl::RequestTimeoutHandlerImpl( void RequestTimeoutHandlerImpl::AddRequest(const uint32_t hmi_correlation_id, const Request& request) { + sync_primitives::AutoLock lock(requests_lock_); requests_.insert(std::make_pair(hmi_correlation_id, request)); } @@ -101,6 +102,8 @@ void RequestTimeoutHandlerImpl::HandleOnEvent( } const auto hmi_corr_id = message[strings::msg_params][strings::request_id].asUInt(); + + sync_primitives::AutoLock lock(requests_lock_); auto it = requests_.find(hmi_corr_id); if (it != requests_.end()) { const auto& request = it->second; -- cgit v1.2.1 From 5e589104b1498ceffc1ef75e27320f4d7753d463 Mon Sep 17 00:00:00 2001 From: "Olha Vorobiova (GitHub)" <86727408+OlhaVorobiova@users.noreply.github.com> Date: Tue, 1 Feb 2022 16:28:49 +0200 Subject: Replase clusterModeStatus with clusterModes when this parameter is disallowed by policies (#3847) --- .../application_manager/src/commands/command_impl.cc | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/components/application_manager/src/commands/command_impl.cc b/src/components/application_manager/src/commands/command_impl.cc index 8eb7171274..34c2a6d6bc 100644 --- a/src/components/application_manager/src/commands/command_impl.cc +++ b/src/components/application_manager/src/commands/command_impl.cc @@ -47,12 +47,15 @@ struct InfoAppender { explicit InfoAppender(std::string& info) : info_(info) {} void operator()(const RPCParams::value_type& parameter) { + std::string param_name = parameter == strings::cluster_mode_status + ? strings::cluster_modes + : parameter; if (info_.empty()) { - info_ = "\'" + parameter + "\'"; + info_ = "\'" + param_name + "\'"; return; } - info_ = info_ + ", \'" + parameter + "\'"; + info_ = info_ + ", \'" + param_name + "\'"; } private: @@ -282,9 +285,11 @@ struct DisallowedParamsInserter { ? mobile_apis::VehicleDataType::VEHICLEDATA_OEM_CUSTOM_DATA : vehicle_data->second; + std::string param_name = + param == strings::cluster_mode_status ? strings::cluster_modes : param; (*disallowed_param)[strings::data_type] = vehicle_data_type; (*disallowed_param)[strings::result_code] = code_; - response_[strings::msg_params][param.c_str()] = *disallowed_param; + response_[strings::msg_params][param_name.c_str()] = *disallowed_param; return true; } -- cgit v1.2.1 From 0dac769e35f40bfc0de0d4676ecba0bcd74afca3 Mon Sep 17 00:00:00 2001 From: Shobhit Adlakha Date: Wed, 2 Feb 2022 12:15:02 -0500 Subject: [SDL 0334] Feature/Transform SetDisplayLayout to UI.Show (#3849) * Add changes to transform SetDisplayLayout into UI.Show * Remove deprecated RPC UI.SetDisplayLayout from the HMI API * Style fix * Add HMI capabilities to SetDisplayLayout response * Fix failed unit tests * Address review comments --- .../commands/hmi/ui_set_display_layout_request.h | 76 -------------------- .../commands/hmi/ui_set_display_layout_response.h | 78 --------------------- .../commands/hmi/ui_set_display_layout_request.cc | 63 ----------------- .../commands/hmi/ui_set_display_layout_response.cc | 68 ------------------ .../commands/mobile/set_display_layout_request.cc | 50 ++++++++------ .../sdl_rpc_plugin/src/hmi_command_factory.cc | 7 -- .../test/commands/hmi/dummy_hmi_commands_test.cc | 4 -- .../commands/hmi/simple_requests_to_hmi_test.cc | 2 - .../commands/hmi/simple_response_from_hmi_test.cc | 3 - .../commands/mobile/set_display_layout_test.cc | 80 +++++++++++++++++----- .../application_manager/src/hmi_interfaces_impl.cc | 1 - src/components/interfaces/HMI_API.xml | 31 --------- 12 files changed, 91 insertions(+), 372 deletions(-) delete mode 100644 src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/ui_set_display_layout_request.h delete mode 100644 src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/ui_set_display_layout_response.h delete mode 100644 src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_set_display_layout_request.cc delete mode 100644 src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_set_display_layout_response.cc diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/ui_set_display_layout_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/ui_set_display_layout_request.h deleted file mode 100644 index 446b77b997..0000000000 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/ui_set_display_layout_request.h +++ /dev/null @@ -1,76 +0,0 @@ -/* Copyright (c) 2018, 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_UI_SET_DISPLAY_LAYOUT_REQUEST_H_ -#define SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_HMI_UI_SET_DISPLAY_LAYOUT_REQUEST_H_ - -#include "application_manager/commands/request_to_hmi.h" - -namespace sdl_rpc_plugin { -namespace app_mngr = application_manager; - -namespace commands { - -/** - * @brief UiSetDisplayLayoutRequest command class - **/ -class UiSetDisplayLayoutRequest : public app_mngr::commands::RequestToHMI { - public: - /** - * @brief UiSetDisplayLayoutRequest class constructor - * - * @param message Incoming SmartObject message - **/ - UiSetDisplayLayoutRequest(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 UiSetDisplayLayoutRequest class destructor - **/ - virtual ~UiSetDisplayLayoutRequest(); - - /** - * @brief Execute command - **/ - virtual void Run(); - - private: - DISALLOW_COPY_AND_ASSIGN(UiSetDisplayLayoutRequest); -}; - -} // namespace commands - -} // namespace sdl_rpc_plugin - -#endif // SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_HMI_UI_SET_DISPLAY_LAYOUT_REQUEST_H_ diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/ui_set_display_layout_response.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/ui_set_display_layout_response.h deleted file mode 100644 index ade6aa1c13..0000000000 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/ui_set_display_layout_response.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (c) 2018, 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_UI_SET_DISPLAY_LAYOUT_RESPONSE_H_ -#define SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_HMI_UI_SET_DISPLAY_LAYOUT_RESPONSE_H_ - -#include "application_manager/commands/response_from_hmi.h" - -namespace sdl_rpc_plugin { -namespace app_mngr = application_manager; - -namespace commands { - -/** - * @brief UiSetDisplayLayoutResponse command class - **/ -class UiSetDisplayLayoutResponse : public app_mngr::commands::ResponseFromHMI { - public: - /** - * @brief UiSetDisplayLayoutResponse class constructor - * - * @param message Incoming SmartObject message - **/ - UiSetDisplayLayoutResponse( - 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 UiSetDisplayLayoutResponse class destructor - **/ - virtual ~UiSetDisplayLayoutResponse(); - - /** - * @brief Execute command - **/ - virtual void Run(); - - private: - DISALLOW_COPY_AND_ASSIGN(UiSetDisplayLayoutResponse); -}; - -} // namespace commands - -} // namespace sdl_rpc_plugin - -#endif // SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_HMI_UI_SET_DISPLAY_LAYOUT_RESPONSE_H_ diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_set_display_layout_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_set_display_layout_request.cc deleted file mode 100644 index df0f2a9f98..0000000000 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_set_display_layout_request.cc +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2018, 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/ui_set_display_layout_request.h" - -namespace sdl_rpc_plugin { -using namespace application_manager; - -namespace commands { - -SDL_CREATE_LOG_VARIABLE("Commands") - -UiSetDisplayLayoutRequest::UiSetDisplayLayoutRequest( - const application_manager::commands::MessageSharedPtr& message, - ApplicationManager& application_manager, - rpc_service::RPCService& rpc_service, - HMICapabilities& hmi_capabilities, - policy::PolicyHandlerInterface& policy_handle) - : RequestToHMI(message, - application_manager, - rpc_service, - hmi_capabilities, - policy_handle) {} - -UiSetDisplayLayoutRequest::~UiSetDisplayLayoutRequest() {} - -void UiSetDisplayLayoutRequest::Run() { - SDL_LOG_AUTO_TRACE(); - SendRequest(); -} - -} // namespace commands - -} // namespace sdl_rpc_plugin diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_set_display_layout_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_set_display_layout_response.cc deleted file mode 100644 index 35fe55ec4d..0000000000 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_set_display_layout_response.cc +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2018, 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/ui_set_display_layout_response.h" -#include "application_manager/event_engine/event.h" -#include "interfaces/HMI_API.h" - -namespace sdl_rpc_plugin { -using namespace application_manager; - -namespace commands { - -SDL_CREATE_LOG_VARIABLE("Commands") - -UiSetDisplayLayoutResponse::UiSetDisplayLayoutResponse( - const application_manager::commands::MessageSharedPtr& message, - ApplicationManager& application_manager, - rpc_service::RPCService& rpc_service, - HMICapabilities& hmi_capabilities, - policy::PolicyHandlerInterface& policy_handle) - : ResponseFromHMI(message, - application_manager, - rpc_service, - hmi_capabilities, - policy_handle) {} - -UiSetDisplayLayoutResponse::~UiSetDisplayLayoutResponse() {} - -void UiSetDisplayLayoutResponse::Run() { - SDL_LOG_AUTO_TRACE(); - - event_engine::Event event(hmi_apis::FunctionID::UI_SetDisplayLayout); - event.set_smart_object(*message_); - event.raise(application_manager_.event_dispatcher()); -} - -} // namespace commands - -} // namespace sdl_rpc_plugin diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_display_layout_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_display_layout_request.cc index ba0a20b459..98f2a2a247 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_display_layout_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_display_layout_request.cc @@ -53,7 +53,9 @@ SetDisplayLayoutRequest::SetDisplayLayoutRequest( application_manager, rpc_service, hmi_capabilities, - policy_handler) {} + policy_handler) { + subscribe_on_event(hmi_apis::FunctionID::UI_Show); +} SetDisplayLayoutRequest::~SetDisplayLayoutRequest() {} @@ -73,8 +75,14 @@ void SetDisplayLayoutRequest::Run() { std::string old_layout = app->display_layout(); std::string new_layout = ""; + smart_objects::SmartObject show_msg_params(smart_objects::SmartType_Map); + show_msg_params[hmi_request::show_strings] = + smart_objects::SmartObject(smart_objects::SmartType_Array); + if (msg_params.keyExists(strings::display_layout)) { new_layout = msg_params[strings::display_layout].asString(); + show_msg_params[strings::template_configuration][strings::template_layout] = + new_layout; } if (new_layout != old_layout && !new_layout.empty()) { @@ -109,18 +117,22 @@ void SetDisplayLayoutRequest::Run() { if (msg_params.keyExists(strings::day_color_scheme)) { SDL_LOG_DEBUG("Allow Day Color Scheme Change"); app->set_day_color_scheme(msg_params[strings::day_color_scheme]); + show_msg_params[strings::template_configuration] + [strings::day_color_scheme] = + msg_params[strings::day_color_scheme]; } if (msg_params.keyExists(strings::night_color_scheme)) { SDL_LOG_DEBUG("Allow Night Color Scheme Change"); app->set_night_color_scheme(msg_params[strings::night_color_scheme]); + show_msg_params[strings::template_configuration] + [strings::night_color_scheme] = + msg_params[strings::night_color_scheme]; } - (*message_)[strings::msg_params][strings::app_id] = app->app_id(); + show_msg_params[strings::app_id] = app->app_id(); StartAwaitForInterface(HmiInterfaces::HMI_INTERFACE_UI); - SendHMIRequest(hmi_apis::FunctionID::UI_SetDisplayLayout, - &((*message_)[strings::msg_params]), - true); + SendHMIRequest(hmi_apis::FunctionID::UI_Show, &show_msg_params, true); } void SetDisplayLayoutRequest::on_event(const event_engine::Event& event) { @@ -136,8 +148,8 @@ void SetDisplayLayoutRequest::on_event(const event_engine::Event& event) { const smart_objects::SmartObject& message = event.smart_object(); switch (event.id()) { - case hmi_apis::FunctionID::UI_SetDisplayLayout: { - SDL_LOG_INFO("Received UI_SetDisplayLayout event"); + case hmi_apis::FunctionID::UI_Show: { + SDL_LOG_INFO("Received UI_Show event (in set display layout)"); EndAwaitForInterface(HmiInterfaces::HMI_INTERFACE_UI); hmi_apis::Common_Result::eType result_code = static_cast( @@ -150,20 +162,16 @@ void SetDisplayLayoutRequest::on_event(const event_engine::Event& event) { if (response_success) { HMICapabilities& hmi_capabilities = hmi_capabilities_; - // In case templates_available is empty copy from hmi capabilities - if (msg_params.keyExists(hmi_response::display_capabilities)) { - if (0 == msg_params[hmi_response::display_capabilities] - [hmi_response::templates_available] - .length()) { - auto display_capabilities = hmi_capabilities.display_capabilities(); - if (display_capabilities) { - msg_params[hmi_response::display_capabilities] - [hmi_response::templates_available] = - display_capabilities->getElement( - hmi_response::templates_available); - } - } - } + // Add HMI capabilities to response + msg_params[hmi_response::display_capabilities] = + *hmi_capabilities.display_capabilities(); + msg_params[hmi_response::button_capabilities] = + *hmi_capabilities.button_capabilities(); + msg_params[hmi_response::soft_button_capabilities] = + *hmi_capabilities.soft_button_capabilities(); + msg_params[hmi_response::preset_bank_capabilities] = + *hmi_capabilities.preset_bank_capabilities(); + const Version& app_version = app->version(); if (app_version.max_supported_api_version >= APIVersion::kAPIV6) { // In case of successful response warn user that this RPC is 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 c66e0b6950..f60a475e3e 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 @@ -248,8 +248,6 @@ #include "sdl_rpc_plugin/commands/hmi/ui_cancel_interaction_response.h" #include "sdl_rpc_plugin/commands/hmi/ui_send_haptic_data_request.h" #include "sdl_rpc_plugin/commands/hmi/ui_send_haptic_data_response.h" -#include "sdl_rpc_plugin/commands/hmi/ui_set_display_layout_request.h" -#include "sdl_rpc_plugin/commands/hmi/ui_set_display_layout_response.h" #include "sdl_rpc_plugin/commands/hmi/ui_show_app_menu_request.h" #include "sdl_rpc_plugin/commands/hmi/ui_show_app_menu_response.h" @@ -834,11 +832,6 @@ CommandCreator& HMICommandFactory::get_creator_factory( case hmi_apis::FunctionID::BasicCommunication_OnResumeAudioSource: { return factory.GetCreator(); } - case hmi_apis::FunctionID::UI_SetDisplayLayout: { - return hmi_apis::messageType::request == message_type - ? factory.GetCreator() - : factory.GetCreator(); - } case hmi_apis::FunctionID::BasicCommunication_OnSDLClose: { return factory.GetCreator(); } diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/dummy_hmi_commands_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/dummy_hmi_commands_test.cc index 2a0eda2b10..9b7246b794 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/dummy_hmi_commands_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/dummy_hmi_commands_test.cc @@ -195,8 +195,6 @@ #include "hmi/ui_scrollable_message_response.h" #include "hmi/ui_set_app_icon_request.h" #include "hmi/ui_set_app_icon_response.h" -#include "hmi/ui_set_display_layout_request.h" -#include "hmi/ui_set_display_layout_response.h" #include "hmi/ui_set_global_properties_request.h" #include "hmi/ui_set_global_properties_response.h" #include "hmi/ui_set_media_clock_timer_request.h" @@ -466,8 +464,6 @@ typedef Types, CommandData, - CommandData, CommandData, CommandData(SmartType_Map); + SmartObject text_fields(SmartType_Array); + text_fields[0] = SmartObject(SmartType_Map); + text_fields[0][am::hmi_response::button_name] = am::strings::main_field_1; + text_fields[0][am::strings::character_set] = "UTF-8"; + text_fields[0]["rows"] = 1; + text_fields[0]["width"] = 500; + (*display_capabilities)[am::hmi_response::display_type] = "SDL_GENERIC"; + (*display_capabilities)[am::hmi_response::text_fields] = text_fields; + (*display_capabilities)[am::hmi_response::media_clock_formats] = + SmartObject(SmartType_Array); + (*display_capabilities)[am::hmi_response::graphic_supported] = true; + + // Button capabilities + SmartObjectSPtr button_capabilities = + std::make_shared(SmartType_Array); + SmartObject button_capability(SmartType_Map); + button_capability[strings::button_name] = "OK"; + button_capability["shortPressAvailable"] = true; + button_capability["longPressAvailable"] = true; + button_capability["upDownAvailable"] = true; + (*button_capabilities)[0] = button_capability; + + // Soft Button capabilities + SmartObjectSPtr soft_button_capabilities = + std::make_shared(SmartType_Array); + SmartObject soft_button_capability(SmartType_Map); + soft_button_capability[am::hmi_response::image_supported] = true; + soft_button_capability["longPressAvailable"] = true; + soft_button_capability["shortPressAvailable"] = true; + soft_button_capability["upDownAvailable"] = true; + soft_button_capability["imageSupported"] = false; + (*soft_button_capabilities) = soft_button_capability; + + // Preset Bank capabilities + SmartObjectSPtr preset_bank_capabilities = + std::make_shared(SmartType_Map); + (*preset_bank_capabilities)[am::hmi_response::on_screen_presets_available] = + false; + + EXPECT_CALL(mock_hmi_capabilities_, display_capabilities()) + .WillOnce(Return(display_capabilities)); + EXPECT_CALL(mock_hmi_capabilities_, button_capabilities()) + .WillOnce(Return(button_capabilities)); + EXPECT_CALL(mock_hmi_capabilities_, soft_button_capabilities()) + .WillOnce(Return(soft_button_capabilities)); + EXPECT_CALL(mock_hmi_capabilities_, preset_bank_capabilities()) + .WillOnce(Return(preset_bank_capabilities)); + } + typedef TypeIf, application_manager_test::MockHMICapabilities>::Result @@ -147,7 +202,7 @@ TEST_F(SetDisplayLayoutRequestTest, (*msg)[am::strings::msg_params][am::strings::info] = "UI is not supported by system"; - Event event(hmi_apis::FunctionID::UI_SetDisplayLayout); + Event event(hmi_apis::FunctionID::UI_Show); event.set_smart_object(*msg); ON_CALL(mock_hmi_interfaces_, @@ -195,9 +250,8 @@ TEST_F(SetDisplayLayoutRequestTest, Run_SUCCESS) { EXPECT_CALL(app_mngr_, GetNextHMICorrelationID()) .WillOnce(Return(kCorrelationKey)); - EXPECT_CALL( - mock_hmi_interfaces_, - GetInterfaceFromFunction(hmi_apis::FunctionID::UI_SetDisplayLayout)) + EXPECT_CALL(mock_hmi_interfaces_, + GetInterfaceFromFunction(hmi_apis::FunctionID::UI_Show)) .WillRepeatedly(Return(am::HmiInterfaces::HMI_INTERFACE_UI)); EXPECT_CALL(mock_hmi_interfaces_, GetInterfaceState(am::HmiInterfaces::HMI_INTERFACE_UI)) @@ -226,7 +280,7 @@ TEST_F(SetDisplayLayoutRequestTest, OnEvent_InvalidEventId_UNSUCCESS) { } TEST_F(SetDisplayLayoutRequestTest, OnEvent_AppVersion_v6_WARNING) { - am::event_engine::Event event(hmi_apis::FunctionID::UI_SetDisplayLayout); + am::event_engine::Event event(hmi_apis::FunctionID::UI_Show); MessageSharedPtr msg = CreateMessage(); (*msg)[am::strings::params][am::hmi_response::code] = @@ -235,12 +289,7 @@ TEST_F(SetDisplayLayoutRequestTest, OnEvent_AppVersion_v6_WARNING) { (*msg)[am::strings::params][am::strings::connection_key] = kConnectionKey; event.set_smart_object(*msg); - MessageSharedPtr dispaly_capabilities_msg = CreateMessage(); - (*dispaly_capabilities_msg)[am::hmi_response::templates_available] = - "templates_available"; - - EXPECT_CALL(mock_hmi_capabilities_, display_capabilities()) - .WillOnce(Return(dispaly_capabilities_msg)); + CreateResponseCapabilities(); EXPECT_CALL( mock_rpc_service_, ManageMobileCommand(MobileResultCodeIs(mobile_result::WARNINGS), @@ -260,7 +309,7 @@ TEST_F(SetDisplayLayoutRequestTest, OnEvent_AppVersion_v6_WARNING) { } TEST_F(SetDisplayLayoutRequestTest, OnEvent_AppVersion_v5_SUCCESS) { - am::event_engine::Event event(hmi_apis::FunctionID::UI_SetDisplayLayout); + am::event_engine::Event event(hmi_apis::FunctionID::UI_Show); MessageSharedPtr msg = CreateMessage(); (*msg)[am::strings::params][am::hmi_response::code] = @@ -269,12 +318,7 @@ TEST_F(SetDisplayLayoutRequestTest, OnEvent_AppVersion_v5_SUCCESS) { (*msg)[am::strings::params][am::strings::connection_key] = kConnectionKey; event.set_smart_object(*msg); - MessageSharedPtr dispaly_capabilities_msg = CreateMessage(); - (*dispaly_capabilities_msg)[am::hmi_response::templates_available] = - "templates_available"; - - EXPECT_CALL(mock_hmi_capabilities_, display_capabilities()) - .WillOnce(Return(dispaly_capabilities_msg)); + CreateResponseCapabilities(); EXPECT_CALL( mock_rpc_service_, ManageMobileCommand(MobileResultCodeIs(mobile_result::SUCCESS), diff --git a/src/components/application_manager/src/hmi_interfaces_impl.cc b/src/components/application_manager/src/hmi_interfaces_impl.cc index 205585959b..eb44ff4cd6 100644 --- a/src/components/application_manager/src/hmi_interfaces_impl.cc +++ b/src/components/application_manager/src/hmi_interfaces_impl.cc @@ -157,7 +157,6 @@ generate_function_to_interface_convert_map() { convert_map[UI_GetLanguage] = HmiInterfaces::HMI_INTERFACE_UI; convert_map[UI_OnDriverDistraction] = HmiInterfaces::HMI_INTERFACE_UI; convert_map[UI_SetAppIcon] = HmiInterfaces::HMI_INTERFACE_UI; - convert_map[UI_SetDisplayLayout] = HmiInterfaces::HMI_INTERFACE_UI; convert_map[UI_OnKeyboardInput] = HmiInterfaces::HMI_INTERFACE_UI; convert_map[UI_OnTouchEvent] = HmiInterfaces::HMI_INTERFACE_UI; convert_map[UI_Slider] = HmiInterfaces::HMI_INTERFACE_UI; diff --git a/src/components/interfaces/HMI_API.xml b/src/components/interfaces/HMI_API.xml index a5fa36a9a0..052f953547 100644 --- a/src/components/interfaces/HMI_API.xml +++ b/src/components/interfaces/HMI_API.xml @@ -5431,37 +5431,6 @@ - - This RPC is deprecated. Use Show RPC to change layout. - - - Predefined or dynamically created screen layout. - Currently only predefined screen layouts are defined. - - - - ID of application related to this RPC. - - - - - - - This RPC is deprecated. Use Show RPC to change layout. - - See DisplayCapabilities - - - See ButtonCapabilities - - - If returned, the platform supports on-screen SoftButtons; see SoftButtonCapabilities. - - - If returned, the platform supports custom on-screen Presets; see PresetBankCapabilities. - - - Array of lines of show text fields. See TextFieldStruct. If some field is not set, the corresponding text should stay unchanged. If field's text is empty "", the field must be cleared. -- cgit v1.2.1 From f6d319f917a4e20cc269b2d002bb6a23b974add4 Mon Sep 17 00:00:00 2001 From: RomanReznichenkoLuxoft <85177915+RomanReznichenkoLuxoft@users.noreply.github.com> Date: Thu, 3 Feb 2022 19:35:40 +0200 Subject: lock read and write operations (#3851) Co-authored-by: Yana Chernysheva --- .../include/transport_manager/websocket_server/websocket_session.h | 2 ++ .../transport_manager/src/websocket_server/websocket_session.cc | 2 ++ 2 files changed, 4 insertions(+) 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 009d2fe07c..afdacfc4ec 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 @@ -38,6 +38,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "protocol/raw_message.h" #include "transport_manager/transport_adapter/transport_adapter.h" +#include "utils/lock.h" #include "utils/logger.h" #ifdef ENABLE_SECURITY @@ -103,6 +104,7 @@ class WebSocketSession DataSendDoneCallback data_send_done_; DataSendFailedCallback data_send_failed_; OnIOErrorCallback on_io_error_; + mutable sync_primitives::Lock read_write_operations_lock_; }; } // namespace transport_adapter 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 020da580f9..c95cdd2c46 100644 --- a/src/components/transport_manager/src/websocket_server/websocket_session.cc +++ b/src/components/transport_manager/src/websocket_server/websocket_session.cc @@ -89,6 +89,7 @@ void WebSocketSession::AsyncAccept() { template void WebSocketSession::AsyncRead(boost::system::error_code ec) { SDL_LOG_AUTO_TRACE(); + sync_primitives::AutoLock lock(read_write_operations_lock_); if (ec) { auto str_err = "ErrorMessage: " + ec.message(); SDL_LOG_ERROR(str_err); @@ -106,6 +107,7 @@ void WebSocketSession::AsyncRead(boost::system::error_code ec) { template void WebSocketSession::WriteDown(Message message) { + sync_primitives::AutoLock lock(read_write_operations_lock_); boost::system::error_code ec; ws_.write(boost::asio::buffer(message->data(), message->data_size()), ec); -- cgit v1.2.1 From eebd1a9cfc6a25bb0a9618cd34ddf57751b14d53 Mon Sep 17 00:00:00 2001 From: Collin Date: Thu, 3 Feb 2022 17:26:26 -0500 Subject: remove unused param FileName from OnPutFile in HMI API (#3850) --- src/components/interfaces/HMI_API.xml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/components/interfaces/HMI_API.xml b/src/components/interfaces/HMI_API.xml index 052f953547..d046e77665 100644 --- a/src/components/interfaces/HMI_API.xml +++ b/src/components/interfaces/HMI_API.xml @@ -4914,10 +4914,6 @@ - - File reference name. - - File reference name. -- cgit v1.2.1 From 2f002290411cae9a414c4dfccc93bb777a9482d0 Mon Sep 17 00:00:00 2001 From: Jacob Keeler Date: Fri, 4 Feb 2022 10:13:10 -0500 Subject: Check that message code exists before accessing (#3852) An empty entry in the messages table would be created if the key being searched for didn't exist. This adds a check before accessing this data so that an entry isn't created accidentally --- src/components/policy/policy_external/src/cache_manager.cc | 9 +++++++-- src/components/policy/policy_regular/src/cache_manager.cc | 9 +++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/components/policy/policy_external/src/cache_manager.cc b/src/components/policy/policy_external/src/cache_manager.cc index 07f2df1991..d5e1e61966 100644 --- a/src/components/policy/policy_external/src/cache_manager.cc +++ b/src/components/policy/policy_external/src/cache_manager.cc @@ -1695,8 +1695,13 @@ std::vector CacheManager::GetUserFriendlyMsg( std::vector::const_iterator it_end = msg_codes.end(); sync_primitives::AutoLock auto_lock(cache_lock_); for (; it != it_end; ++it) { - policy_table::MessageLanguages msg_languages = - (*pt_->policy_table.consumer_friendly_messages->messages)[*it]; + auto messages = pt_->policy_table.consumer_friendly_messages->messages; + auto messages_it = messages->find(*it); + if (messages->end() == messages_it) { + SDL_LOG_ERROR("No entry found for message code: " << *it); + continue; + } + policy_table::MessageLanguages msg_languages = messages_it->second; // If message has no records with required language, fallback language // should be used instead. diff --git a/src/components/policy/policy_regular/src/cache_manager.cc b/src/components/policy/policy_regular/src/cache_manager.cc index cf4164d133..9cce86322a 100644 --- a/src/components/policy/policy_regular/src/cache_manager.cc +++ b/src/components/policy/policy_regular/src/cache_manager.cc @@ -987,8 +987,13 @@ std::vector CacheManager::GetUserFriendlyMsg( std::vector::const_iterator it_end = msg_codes.end(); sync_primitives::AutoLock auto_lock(cache_lock_); for (; it != it_end; ++it) { - policy_table::MessageLanguages msg_languages = - (*pt_->policy_table.consumer_friendly_messages->messages)[*it]; + auto messages = pt_->policy_table.consumer_friendly_messages->messages; + auto messages_it = messages->find(*it); + if (messages->end() == messages_it) { + SDL_LOG_ERROR("No entry found for message code: " << *it); + continue; + } + policy_table::MessageLanguages msg_languages = messages_it->second; policy_table::MessageString message_string; -- cgit v1.2.1 From e28694c01fcd4c45b084c343d16f05611fd1115a Mon Sep 17 00:00:00 2001 From: "Iryna Lytvynenko (GitHub)" Date: Fri, 11 Feb 2022 21:17:25 +0200 Subject: Fix perform interaction close pop up (#3844) * fix for rejected Perform Interaction * avoid close popup for VR_ONLY PI Co-authored-by: Yana Chernysheva (GitHub) <59469418+ychernysheva@users.noreply.github.com> fixup Co-authored-by: Vadym Luchko (gitHub) --- .../commands/mobile/perform_interaction_request.cc | 44 +++++++++++++--------- .../commands/mobile/perform_interaction_test.cc | 33 +++------------- 2 files changed, 32 insertions(+), 45 deletions(-) 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 7708df9363..a11f123337 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 @@ -246,6 +246,8 @@ void PerformInteractionRequest::Run() { // increment amount of active requests ++pi_requests_count_; + SDL_LOG_DEBUG("Send PerformInteraction requests"); + StartAwaitForInterface(HmiInterfaces::HMI_INTERFACE_VR); StartAwaitForInterface(HmiInterfaces::HMI_INTERFACE_UI); @@ -369,16 +371,10 @@ bool PerformInteractionRequest::ProcessVRResponse( SDL_LOG_DEBUG("Update timeout for UI"); application_manager_.UpdateRequestTimeout( - connection_key(), correlation_id(), default_timeout_); return false; } - if (IsInterfaceAwaited(HmiInterfaces::HMI_INTERFACE_UI) && - InteractionMode::MANUAL_ONLY != interaction_mode_) { - SendClosePopupRequestToHMI(); - } - const SmartObject& hmi_msg_params = message[strings::msg_params]; if (hmi_msg_params.keyExists(strings::choice_id)) { const int choice_id = hmi_msg_params[strings::choice_id].asInt(); @@ -392,6 +388,26 @@ bool PerformInteractionRequest::ProcessVRResponse( vr_choice_id_received_ = choice_id; } + const bool is_vr_result_successful = CommandImpl::IsHMIResultSuccess( + vr_result_code_, HmiInterfaces::HMI_INTERFACE_VR); + + if (IsInterfaceAwaited(HmiInterfaces::HMI_INTERFACE_UI) && + is_vr_result_successful) { + switch (interaction_mode_) { + case mobile_apis::InteractionMode::BOTH: + // Close UI popup only if choice ID was included in VR + if (vr_choice_id_received_ != INVALID_CHOICE_ID) { + SendClosePopupRequestToHMI(); + } + break; + case mobile_apis::InteractionMode::VR_ONLY: + SendClosePopupRequestToHMI(); + break; + default: + break; + } + } + if (mobile_apis::InteractionMode::BOTH == interaction_mode_ || mobile_apis::InteractionMode::MANUAL_ONLY == interaction_mode_) { SDL_LOG_DEBUG("Update timeout for UI"); @@ -399,17 +415,6 @@ bool PerformInteractionRequest::ProcessVRResponse( connection_key(), correlation_id(), default_timeout_); } - const bool is_vr_result_success = Compare( - vr_result_code_, Common_Result::SUCCESS, Common_Result::WARNINGS); - - if (is_vr_result_success && - InteractionMode::MANUAL_ONLY == interaction_mode_) { - SDL_LOG_DEBUG("VR response is successfull in MANUAL_ONLY mode " - << "Wait for UI response"); - // in case MANUAL_ONLY mode VR.PI SUCCESS just return - return false; - } - return false; } @@ -901,7 +906,10 @@ bool PerformInteractionRequest::IsWhiteSpaceExist() { void PerformInteractionRequest::TerminatePerformInteraction() { SDL_LOG_AUTO_TRACE(); - SendClosePopupRequestToHMI(); + if (IsInterfaceAwaited(HmiInterfaces::HMI_INTERFACE_UI)) { + SendClosePopupRequestToHMI(); + } + DisablePerformInteraction(); } diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/perform_interaction_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/perform_interaction_test.cc index ee2eb720e0..aa6d02b81c 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/perform_interaction_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/perform_interaction_test.cc @@ -467,9 +467,8 @@ TEST_F( command->StartAwaitForInterfaces(); - MessageSharedPtr response_msg_vr = - CreateHMIResponseMessage(hmi_apis::Common_Result::UNSUPPORTED_RESOURCE, - "VR is not supported by system"); + MessageSharedPtr response_msg_vr = CreateHMIResponseMessage( + hmi_apis::Common_Result::WRONG_LANGUAGE, "VR error message"); am::event_engine::Event event_vr(hmi_apis::FunctionID::VR_PerformInteraction); event_vr.set_smart_object(*response_msg_vr); @@ -484,23 +483,13 @@ TEST_F( ManageMobileCommand(_, am::commands::Command::CommandSource::SOURCE_SDL)) .WillOnce(DoAll(SaveArg<0>(&response_to_mobile), Return(true))); - MessageSharedPtr request_to_hmi; - EXPECT_CALL(mock_rpc_service_, - ManageHMICommand( - _, am::commands::Command::CommandSource::SOURCE_SDL_TO_HMI)) - .WillOnce(DoAll(SaveArg<0>(&request_to_hmi), Return(true))); - command->on_event(event_vr); command->on_event(event_ui); - HMIRequestExpectations(request_to_hmi, - hmi_apis::FunctionID::UI_ClosePopUp, - "UI.PerformInteraction"); - ResultCommandExpectations(response_to_mobile, true, - hmi_apis::Common_Result::UNSUPPORTED_RESOURCE, - "VR is not supported by system"); + hmi_apis::Common_Result::WRONG_LANGUAGE, + "VR error message"); } TEST_F( @@ -618,8 +607,8 @@ TEST_F( command->StartAwaitForInterfaces(); - MessageSharedPtr response_msg_vr = - CreateHMIResponseMessage(hmi_apis::Common_Result::SUCCESS, ""); + MessageSharedPtr response_msg_vr = CreateHMIResponseMessageWithChoiceID( + hmi_apis::Common_Result::SUCCESS, "", kVrChoiceID); am::event_engine::Event event_vr(hmi_apis::FunctionID::VR_PerformInteraction); event_vr.set_smart_object(*response_msg_vr); @@ -684,19 +673,9 @@ TEST_F( ManageMobileCommand(_, am::commands::Command::CommandSource::SOURCE_SDL)) .WillOnce(DoAll(SaveArg<0>(&response_to_mobile), Return(true))); - MessageSharedPtr request_to_hmi; - EXPECT_CALL(mock_rpc_service_, - ManageHMICommand( - _, am::commands::Command::CommandSource::SOURCE_SDL_TO_HMI)) - .WillOnce(DoAll(SaveArg<0>(&request_to_hmi), Return(true))); - command->on_event(event_vr); command->on_event(event_ui); - HMIRequestExpectations(request_to_hmi, - hmi_apis::FunctionID::UI_ClosePopUp, - "UI.PerformInteraction"); - ResultCommandExpectations(response_to_mobile, true, hmi_apis::Common_Result::UNSUPPORTED_RESOURCE, -- cgit v1.2.1 From 7a4a4e02b9edf2602596bf5608e05a2daf7dbfeb Mon Sep 17 00:00:00 2001 From: Collin Date: Fri, 11 Feb 2022 17:08:40 -0500 Subject: reject PTU system request when PTU not in progress (#3853) * reject PTU system request when PTU not in progress * track last_ptu_app_id_ in ext prop policy mode * fix style * Apply suggestions from code review Co-authored-by: Shobhit Adlakha * fix style Co-authored-by: Shobhit Adlakha --- .../application_manager/policies/policy_handler.h | 6 +++- .../commands/hmi/on_system_request_notification.cc | 3 ++ .../src/commands/mobile/system_request.cc | 10 +++++++ .../src/policies/policy_handler.cc | 34 +++++++++++++++++----- .../policies/policy_handler_interface.h | 4 +++ .../policies/mock_policy_handler_interface.h | 3 ++ 6 files changed, 51 insertions(+), 9 deletions(-) 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 662e255871..79b864e650 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 @@ -429,6 +429,8 @@ class PolicyHandler : public PolicyHandlerInterface, void CacheRetryInfo(const uint32_t app_id = 0, const std::string url = std::string(), const std::string snapshot_path = std::string()) OVERRIDE; +#else // EXTERNAL_PROPRIETARY_MODE + void UpdateLastPTUApp(const uint32_t app_id) OVERRIDE; #endif // EXTERNAL_PROPRIETARY_MODE uint32_t GetAppIdForSending() const OVERRIDE; @@ -721,6 +723,8 @@ class PolicyHandler : public PolicyHandlerInterface, void StopRetrySequence() OVERRIDE; + bool IsPTUSystemRequestAllowed(const uint32_t app_id) OVERRIDE; + /** * @brief OnDeviceSwitching Notifies policy manager on device switch event so * policy permissions should be processed accordingly @@ -932,10 +936,10 @@ class PolicyHandler : public PolicyHandlerInterface, std::shared_ptr atomic_policy_manager_; std::shared_ptr event_observer_; uint32_t last_activated_app_id_; + uint32_t last_ptu_app_id_; #ifndef EXTERNAL_PROPRIETARY_MODE // PTU retry information - uint32_t last_ptu_app_id_; std::string retry_update_url_; std::string policy_snapshot_path_; #endif // EXTERNAL_PROPRIETARY_MODE diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_system_request_notification.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_system_request_notification.cc index b75081e30f..f9900fd5c1 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_system_request_notification.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_system_request_notification.cc @@ -153,6 +153,9 @@ void OnSystemRequestNotification::Run() { if (helpers::Compare( request_type, RequestType::RT_PROPRIETARY, RequestType::RT_HTTP)) { policy_handler_.OnSystemRequestReceived(); +#ifdef EXTERNAL_PROPRIETARY_MODE + policy_handler_.UpdateLastPTUApp(app->app_id()); +#endif } SendNotificationToMobile(message_); } diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/system_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/system_request.cc index 97b2d2ff37..1ddb41704f 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/system_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/system_request.cc @@ -580,6 +580,16 @@ void SystemRequest::Run() { SDL_LOG_DEBUG("Binary data ok."); + if (mobile_apis::RequestType::PROPRIETARY == request_type || + mobile_apis::RequestType::HTTP == request_type) { + auto app_id = application->app_id(); + if (!policy_handler_.IsPTUSystemRequestAllowed(app_id)) { + SDL_LOG_DEBUG("Rejected PTU SystemRequest from app " << app_id); + SendResponse(false, mobile_apis::Result::REJECTED); + return; + } + } + if (mobile_apis::RequestType::ICON_URL == request_type) { application_manager_.SetIconFileFromSystemRequest(file_name); SendResponse(true, mobile_apis::Result::SUCCESS); diff --git a/src/components/application_manager/src/policies/policy_handler.cc b/src/components/application_manager/src/policies/policy_handler.cc index 500981a5a8..100a9fe271 100644 --- a/src/components/application_manager/src/policies/policy_handler.cc +++ b/src/components/application_manager/src/policies/policy_handler.cc @@ -300,14 +300,11 @@ PolicyHandler::PolicyHandler(const PolicySettings& settings, ApplicationManager& application_manager) : AsyncRunner("PolicyHandler async runner thread") , last_activated_app_id_(0) -#ifndef EXTERNAL_PROPRIETARY_MODE , last_ptu_app_id_(0) -#endif // EXTERNAL_PROPRIETARY_MODE , statistic_manager_impl_(std::make_shared(this)) , settings_(settings) , application_manager_(application_manager) - , last_registered_policy_app_id_(std::string()) { -} + , last_registered_policy_app_id_(std::string()) {} PolicyHandler::~PolicyHandler() {} @@ -423,13 +420,31 @@ void PolicyHandler::StopRetrySequence() { SDL_LOG_AUTO_TRACE(); const auto policy_manager = LoadPolicyManager(); POLICY_LIB_CHECK_VOID(policy_manager); -#ifndef EXTERNAL_PROPRIETARY_MODE // Clear cached PTU app last_ptu_app_id_ = 0; -#endif // EXTERNAL_PROPRIETARY_MODE policy_manager->StopRetrySequence(); } +bool PolicyHandler::IsPTUSystemRequestAllowed(const uint32_t app_id) { + SDL_LOG_AUTO_TRACE(); + const auto policy_manager = LoadPolicyManager(); + POLICY_LIB_CHECK_OR_RETURN(policy_manager, false); + + if (policy_manager->GetPolicyTableStatus() != "UPDATING") { + SDL_LOG_DEBUG("PTU received while not UPDATING"); + return false; + } + + if (app_id != last_ptu_app_id_) { + SDL_LOG_DEBUG( + "PTU received from unexpected application, request was sent to " + << last_ptu_app_id_); + return false; + } + + return true; +} + bool PolicyHandler::ResetPolicyTable() { SDL_LOG_TRACE("Reset policy table."); const auto policy_manager = LoadPolicyManager(); @@ -476,6 +491,11 @@ void PolicyHandler::CacheRetryInfo(const uint32_t app_id, retry_update_url_ = url; policy_snapshot_path_ = snapshot_path; } +#else // EXTERNAL_PROPRIETARY_MODE +void PolicyHandler::UpdateLastPTUApp(const uint32_t app_id) { + SDL_LOG_DEBUG("UpdateLastPTUApp to " << app_id); + last_ptu_app_id_ = app_id; +} #endif // EXTERNAL_PROPRIETARY_MODE uint32_t PolicyHandler::GetAppIdForSending() const { @@ -1286,10 +1306,8 @@ bool PolicyHandler::ReceiveMessageFromSDK(const std::string& file, policy_manager->CleanupUnpairedDevices(); SetDaysAfterEpoch(); policy_manager->OnPTUFinished(load_pt_result); -#ifndef EXTERNAL_PROPRIETARY_MODE // Clean up retry information last_ptu_app_id_ = 0; -#endif // EXTERNAL_PROPRIETARY_MODE uint32_t correlation_id = application_manager_.GetNextHMICorrelationID(); event_observer_->subscribe_on_event( 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 d79c059b34..0824e90984 100644 --- a/src/components/include/application_manager/policies/policy_handler_interface.h +++ b/src/components/include/application_manager/policies/policy_handler_interface.h @@ -406,6 +406,8 @@ class PolicyHandlerInterface : public VehicleDataItemProvider { const uint32_t app_id = 0, const std::string url = std::string(), const std::string snapshot_path = std::string()) = 0; +#else + virtual void UpdateLastPTUApp(const uint32_t app_id) = 0; #endif // EXTERNAL_PROPRIETARY_MODE /** @@ -426,6 +428,8 @@ class PolicyHandlerInterface : public VehicleDataItemProvider { virtual void OnPTInited() = 0; + virtual bool IsPTUSystemRequestAllowed(const uint32_t app_id) = 0; + /** * @brief Force stops retry sequence timer and resets retry sequence */ 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 ca5d25ed4c..78667dc6ff 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 @@ -200,6 +200,8 @@ class MockPolicyHandlerInterface : public policy::PolicyHandlerInterface { void(const uint32_t app_id, const std::string url, const std::string snapshot_path)); +#else + MOCK_METHOD1(UpdateLastPTUApp, void(const uint32_t app_id)); #endif MOCK_CONST_METHOD0(GetAppIdForSending, uint32_t()); MOCK_METHOD1( @@ -210,6 +212,7 @@ class MockPolicyHandlerInterface : public policy::PolicyHandlerInterface { MOCK_METHOD1(OnCertificateUpdated, void(const std::string& certificate_data)); MOCK_METHOD1(OnPTUFinished, void(const bool ptu_result)); MOCK_METHOD0(OnPTInited, void()); + MOCK_METHOD1(IsPTUSystemRequestAllowed, bool(const uint32_t app_id)); MOCK_METHOD0(StopRetrySequence, void()); MOCK_METHOD1(OnCertificateDecrypted, void(bool is_succeeded)); MOCK_METHOD0(CanUpdate, bool()); -- cgit v1.2.1 From b74c738101f282143094394454d20d12aa8e0d05 Mon Sep 17 00:00:00 2001 From: "Olha Vorobiova (GitHub)" <86727408+OlhaVorobiova@users.noreply.github.com> Date: Mon, 14 Feb 2022 19:37:15 +0200 Subject: Fix result code for PrepareAudioPassThru (#3854) * Fix result code for PrepareAudioPassThru * Fix result code for PrepareAudioPassThru in error structure --- .../mobile/perform_audio_pass_thru_request.cc | 41 +++++++++++----------- .../mobile/perform_audio_pass_thru_test.cc | 2 +- src/components/utils/include/utils/helpers.h | 9 +++++ 3 files changed, 31 insertions(+), 21 deletions(-) diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_audio_pass_thru_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_audio_pass_thru_request.cc index a690c0bc9b..dc46bd7f7c 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_audio_pass_thru_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_audio_pass_thru_request.cc @@ -175,6 +175,7 @@ void PerformAudioPassThruRequest::on_event(const event_engine::Event& event) { hmi_apis::Common_Result::WRONG_LANGUAGE, hmi_apis::Common_Result::RETRY, hmi_apis::Common_Result::SAVED, + hmi_apis::Common_Result::TRUNCATED_DATA, hmi_apis::Common_Result::UNSUPPORTED_RESOURCE); if (is_tts_speak_success_unsuported) { @@ -198,7 +199,7 @@ void PerformAudioPassThruRequest::on_event(const event_engine::Event& event) { return; } - const ResponseParams response_params = PrepareResponseParameters(); + ResponseParams response_params = PrepareResponseParameters(); SendResponse( response_params.success, @@ -220,7 +221,9 @@ PerformAudioPassThruRequest::PrepareResponseParameters() { response_params_.success = PrepareResultForMobileResponse(ui_perform_info, tts_perform_info); - if (ui_perform_info.is_ok && tts_perform_info.is_unsupported_resource && + + if ((ui_perform_info.result_code == hmi_apis::Common_Result::SUCCESS) && + ui_perform_info.is_ok && tts_perform_info.is_unsupported_resource && HmiInterfaces::STATE_AVAILABLE == tts_perform_info.interface_state) { response_params_.result_code = mobile_apis::Result::WARNINGS; response_params_.info = app_mngr::commands::MergeInfos( @@ -231,12 +234,13 @@ PerformAudioPassThruRequest::PrepareResponseParameters() { if (IsResultCodeUnsupported(ui_perform_info, tts_perform_info)) { response_params_.result_code = mobile_apis::Result::UNSUPPORTED_RESOURCE; - } else { - AudioPassThruResults results = PrepareAudioPassThruResultCodeForResponse( - ui_perform_info, tts_perform_info); - response_params_.success = results.second; - response_params_.result_code = results.first; } + + AudioPassThruResults results = PrepareAudioPassThruResultCodeForResponse( + ui_perform_info, tts_perform_info); + response_params_.success = results.second; + response_params_.result_code = results.first; + response_params_.info = app_mngr::commands::MergeInfos( ui_perform_info, ui_info_, tts_perform_info, tts_info_); @@ -407,23 +411,19 @@ PerformAudioPassThruRequest::PrepareAudioPassThruResultCodeForResponse( const hmi_apis::Common_Result::eType tts_result = tts_response.result_code; bool result = false; - if ((ui_result == hmi_apis::Common_Result::SUCCESS) && - (tts_result == hmi_apis::Common_Result::SUCCESS)) { - result = true; - } - - if ((ui_result == hmi_apis::Common_Result::SUCCESS) && - (tts_result == hmi_apis::Common_Result::INVALID_ENUM)) { + if ((application_manager::commands::IsHMIResultSuccess(ui_result) || + (ui_result == hmi_apis::Common_Result::UNSUPPORTED_RESOURCE)) && + (application_manager::commands::IsHMIResultSuccess(tts_result) || + (tts_result == hmi_apis::Common_Result::UNSUPPORTED_RESOURCE) || + (tts_result == hmi_apis::Common_Result::INVALID_ENUM))) { result = true; } if ((ui_result == hmi_apis::Common_Result::SUCCESS) && - (tts_result != hmi_apis::Common_Result::SUCCESS) && - (tts_result != hmi_apis::Common_Result::INVALID_ENUM)) { - common_result = hmi_apis::Common_Result::WARNINGS; - result = true; - } else if (ui_response.is_ok && - tts_result == hmi_apis::Common_Result::WARNINGS) { + (((tts_result != hmi_apis::Common_Result::SUCCESS) && + (tts_result != hmi_apis::Common_Result::INVALID_ENUM)) || + (ui_response.is_ok && + tts_result == hmi_apis::Common_Result::WARNINGS))) { common_result = hmi_apis::Common_Result::WARNINGS; result = true; } else if (ui_result == hmi_apis::Common_Result::INVALID_ENUM) { @@ -431,6 +431,7 @@ PerformAudioPassThruRequest::PrepareAudioPassThruResultCodeForResponse( } else { common_result = ui_result; } + result_code = MessageHelper::HMIToMobileResult(common_result); return std::make_pair(result_code, result); } diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/perform_audio_pass_thru_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/perform_audio_pass_thru_test.cc index b23e8eefeb..739041523b 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/perform_audio_pass_thru_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/perform_audio_pass_thru_test.cc @@ -261,7 +261,7 @@ TEST_F(PerformAudioPassThruRequestTest, EXPECT_EQ((*response_to_mobile)[am::strings::msg_params][am::strings::success] .asBool(), - false); + true); EXPECT_EQ( (*response_to_mobile)[am::strings::msg_params][am::strings::result_code] .asInt(), diff --git a/src/components/utils/include/utils/helpers.h b/src/components/utils/include/utils/helpers.h index 1ef336dadd..34b3583dae 100644 --- a/src/components/utils/include/utils/helpers.h +++ b/src/components/utils/include/utils/helpers.h @@ -126,6 +126,15 @@ bool Compare(T what, T to, T to1, T to2, T to3, T to4, T to5) { Compare(what, to4, to5)); } +template +bool Compare(T what, T to, T to1, T to2, T to3, T to4, T to5, T to6) { + return CmpStrategy( + Compare(what, to, to1, to2, to3), + Compare(what, to4, to5, to6)); +} + template bool in_range(const Container& container, const typename Container::value_type& value) { -- cgit v1.2.1 From e6a6a45ec0931bef428edf006f77b11ed99de178 Mon Sep 17 00:00:00 2001 From: Collin Date: Mon, 21 Feb 2022 13:01:24 -0500 Subject: Set Last PTU App ID when forwarding on system request in HTTP policy mode (#3863) * set last_ptu_app_id_ when forwarding on system request in HTTP policy mode * fixup! set last_ptu_app_id_ when forwarding on system request in HTTP policy mode --- .../include/application_manager/policies/policy_handler.h | 5 +++-- .../src/commands/hmi/on_system_request_notification.cc | 4 ++-- src/components/application_manager/src/policies/policy_handler.cc | 6 ++++-- .../include/application_manager/policies/policy_handler_interface.h | 5 +++-- .../application_manager/policies/mock_policy_handler_interface.h | 3 ++- 5 files changed, 14 insertions(+), 9 deletions(-) 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 79b864e650..655cf70336 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 @@ -429,9 +429,10 @@ class PolicyHandler : public PolicyHandlerInterface, void CacheRetryInfo(const uint32_t app_id = 0, const std::string url = std::string(), const std::string snapshot_path = std::string()) OVERRIDE; -#else // EXTERNAL_PROPRIETARY_MODE - void UpdateLastPTUApp(const uint32_t app_id) OVERRIDE; #endif // EXTERNAL_PROPRIETARY_MODE +#ifndef PROPRIETARY_MODE + void UpdateLastPTUApp(const uint32_t app_id) OVERRIDE; +#endif // PROPRIETARY_MODE uint32_t GetAppIdForSending() const OVERRIDE; diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_system_request_notification.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_system_request_notification.cc index f9900fd5c1..e19b0441ef 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_system_request_notification.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_system_request_notification.cc @@ -153,9 +153,9 @@ void OnSystemRequestNotification::Run() { if (helpers::Compare( request_type, RequestType::RT_PROPRIETARY, RequestType::RT_HTTP)) { policy_handler_.OnSystemRequestReceived(); -#ifdef EXTERNAL_PROPRIETARY_MODE +#ifndef PROPRIETARY_MODE policy_handler_.UpdateLastPTUApp(app->app_id()); -#endif +#endif // PROPRIETARY_MODE } SendNotificationToMobile(message_); } diff --git a/src/components/application_manager/src/policies/policy_handler.cc b/src/components/application_manager/src/policies/policy_handler.cc index 100a9fe271..20f61032a9 100644 --- a/src/components/application_manager/src/policies/policy_handler.cc +++ b/src/components/application_manager/src/policies/policy_handler.cc @@ -491,12 +491,14 @@ void PolicyHandler::CacheRetryInfo(const uint32_t app_id, retry_update_url_ = url; policy_snapshot_path_ = snapshot_path; } -#else // EXTERNAL_PROPRIETARY_MODE +#endif // EXTERNAL_PROPRIETARY_MODE + +#ifndef PROPRIETARY_MODE void PolicyHandler::UpdateLastPTUApp(const uint32_t app_id) { SDL_LOG_DEBUG("UpdateLastPTUApp to " << app_id); last_ptu_app_id_ = app_id; } -#endif // EXTERNAL_PROPRIETARY_MODE +#endif // PROPRIETARY_MODE uint32_t PolicyHandler::GetAppIdForSending() const { SDL_LOG_AUTO_TRACE(); 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 0824e90984..40a3fecfba 100644 --- a/src/components/include/application_manager/policies/policy_handler_interface.h +++ b/src/components/include/application_manager/policies/policy_handler_interface.h @@ -406,9 +406,10 @@ class PolicyHandlerInterface : public VehicleDataItemProvider { const uint32_t app_id = 0, const std::string url = std::string(), const std::string snapshot_path = std::string()) = 0; -#else - virtual void UpdateLastPTUApp(const uint32_t app_id) = 0; #endif // EXTERNAL_PROPRIETARY_MODE +#ifndef PROPRIETARY_MODE + virtual void UpdateLastPTUApp(const uint32_t app_id) = 0; +#endif // PROPRIETARY_MODE /** * @brief Retrieve potential application id to be used for snapshot sending 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 78667dc6ff..5f752e1a81 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 @@ -200,7 +200,8 @@ class MockPolicyHandlerInterface : public policy::PolicyHandlerInterface { void(const uint32_t app_id, const std::string url, const std::string snapshot_path)); -#else +#endif +#ifndef PROPRIETARY_MODE MOCK_METHOD1(UpdateLastPTUApp, void(const uint32_t app_id)); #endif MOCK_CONST_METHOD0(GetAppIdForSending, uint32_t()); -- cgit v1.2.1 From df9331868f564b160931f0e11cb3abfb01b55236 Mon Sep 17 00:00:00 2001 From: theresalech Date: Fri, 25 Feb 2022 09:24:26 -0500 Subject: Fix typos in HMI API (#3867) --- src/components/interfaces/HMI_API.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/interfaces/HMI_API.xml b/src/components/interfaces/HMI_API.xml index d046e77665..1d958d3138 100644 --- a/src/components/interfaces/HMI_API.xml +++ b/src/components/interfaces/HMI_API.xml @@ -1178,10 +1178,10 @@ No GPS at all - Longitude and lattitude + Longitude and latitude - Longitude and lattitude and altitude + Longitude and latitude and altitude -- cgit v1.2.1 From be6efb64176b8b6ffa30d37c01e8bb58862f947f Mon Sep 17 00:00:00 2001 From: JackLivio Date: Thu, 3 Mar 2022 16:28:46 -0500 Subject: Check if app id exists in cloud_app_id_map_ (#3870) * Check if app id exists in cloud_app_id_map_ * Update cloud_app_id_map_ if does not exist or endpoint changed * Fix style * Expand unit tests for connection handler --- .../src/connection_handler_impl.cc | 9 ++- .../test/connection_handler_impl_test.cc | 92 ++++++++++++++++++++++ 2 files changed, 99 insertions(+), 2 deletions(-) diff --git a/src/components/connection_handler/src/connection_handler_impl.cc b/src/components/connection_handler/src/connection_handler_impl.cc index c2c70ccae8..e00eaa33e0 100644 --- a/src/components/connection_handler/src/connection_handler_impl.cc +++ b/src/components/connection_handler/src/connection_handler_impl.cc @@ -1487,8 +1487,13 @@ void ConnectionHandlerImpl::AddCloudAppDevice( const transport_manager::transport_adapter::CloudAppProperties& cloud_properties) { cloud_app_id_map_lock_.Acquire(); - cloud_app_id_map_[policy_app_id] = - std::make_pair(cloud_properties.endpoint, 0); + auto it = cloud_app_id_map_.find(policy_app_id); + if (cloud_app_id_map_.end() == it || + cloud_properties.endpoint != it->second.first) { + // Init map entry if does not exist or if endpoint changed + cloud_app_id_map_[policy_app_id] = + std::make_pair(cloud_properties.endpoint, 0); + } cloud_app_id_map_lock_.Release(); transport_manager_.AddCloudDevice(cloud_properties); } 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 79b237253c..5c9f9a7bd3 100644 --- a/src/components/connection_handler/test/connection_handler_impl_test.cc +++ b/src/components/connection_handler/test/connection_handler_impl_test.cc @@ -2463,6 +2463,98 @@ TEST_F(ConnectionHandlerTest, CloseSession_LastSession_ConnectionOpened) { EXPECT_EQ(0u, connection->session_map().size()); EXPECT_EQ(1u, connection_list.size()); } + +TEST_F(ConnectionHandlerTest, AddCloudAppDevice_GetCloudAppID_Success) { + const transport_manager::transport_adapter::CloudAppProperties properties{ + "ws://192.168.1.100:9876", "", true, "iAmAAuthToken!", "WS", "CLOUD"}; + std::string policyID = "iAmAPolicyID-12345"; + EXPECT_CALL(mock_transport_manager_, AddCloudDevice(_)); + connection_handler_->AddCloudAppDevice(policyID, properties); + + const std::string result = connection_handler_->GetCloudAppID(0); + EXPECT_EQ(result, policyID); +} + +TEST_F(ConnectionHandlerTest, AddCloudAppDevice_OnConnectPending_Success) { + std::string endpoint = "ws://192.168.1.100:9876"; + const transport_manager::transport_adapter::CloudAppProperties properties{ + endpoint, "", true, "iAmAAuthToken!", "WS", "CLOUD"}; + std::string policyID = "iAmAPolicyID-12345"; + const transport_manager::DeviceInfo device_info(1, endpoint, endpoint, "WS"); + + connection_handler_->OnDeviceAdded(device_info); + + EXPECT_CALL(mock_transport_manager_, AddCloudDevice(_)); + connection_handler_->AddCloudAppDevice(policyID, properties); + + connection_handler_test::MockConnectionHandlerObserver + mock_connection_handler_observer; + connection_handler_->set_connection_handler_observer( + &mock_connection_handler_observer); + EXPECT_CALL(mock_connection_handler_observer, + CreatePendingApplication(1, device_info, _)); + connection_handler_->OnConnectionPending(device_info, 1); + + const std::string result = connection_handler_->GetCloudAppID(1); + EXPECT_EQ(result, policyID); +} + +TEST_F(ConnectionHandlerTest, AddCloudAppDevice_Repeated_Success) { + std::string endpoint = "ws://192.168.1.100:9876"; + const transport_manager::transport_adapter::CloudAppProperties properties{ + endpoint, "", true, "iAmAAuthToken!", "WS", "CLOUD"}; + std::string policyID = "iAmAPolicyID-12345"; + const transport_manager::DeviceInfo device_info(1, endpoint, endpoint, "WS"); + + connection_handler_->OnDeviceAdded(device_info); + + EXPECT_CALL(mock_transport_manager_, AddCloudDevice(_)).Times(2); + connection_handler_->AddCloudAppDevice(policyID, properties); + + connection_handler_test::MockConnectionHandlerObserver + mock_connection_handler_observer; + connection_handler_->set_connection_handler_observer( + &mock_connection_handler_observer); + EXPECT_CALL(mock_connection_handler_observer, + CreatePendingApplication(1, device_info, _)); + connection_handler_->OnConnectionPending(device_info, 1); + + // Call AddCloudAppDevice and verify policy id is still recoverable + connection_handler_->AddCloudAppDevice(policyID, properties); + const std::string result = connection_handler_->GetCloudAppID(1); + EXPECT_EQ(result, policyID); +} + +TEST_F(ConnectionHandlerTest, AddCloudAppDevice_NewEndpoint_Success) { + std::string endpoint = "ws://192.168.1.100:9876"; + const transport_manager::transport_adapter::CloudAppProperties properties{ + endpoint, "", true, "iAmAAuthToken!", "WS", "CLOUD"}; + std::string policyID = "iAmAPolicyID-12345"; + const transport_manager::DeviceInfo device_info(1, endpoint, endpoint, "WS"); + + connection_handler_->OnDeviceAdded(device_info); + + EXPECT_CALL(mock_transport_manager_, AddCloudDevice(_)).Times(2); + connection_handler_->AddCloudAppDevice(policyID, properties); + + connection_handler_test::MockConnectionHandlerObserver + mock_connection_handler_observer; + connection_handler_->set_connection_handler_observer( + &mock_connection_handler_observer); + EXPECT_CALL(mock_connection_handler_observer, + CreatePendingApplication(1, device_info, _)); + connection_handler_->OnConnectionPending(device_info, 1); + + // Call AddCloudAppDevice with new endpoint and verify connection id re-init + // to 0 + std::string endpoint2 = "ws://192.168.1.111:9888"; + const transport_manager::transport_adapter::CloudAppProperties properties2{ + endpoint2, "", true, "iAmAAuthToken2!", "WS", "CLOUD"}; + connection_handler_->AddCloudAppDevice(policyID, properties2); + const std::string result = connection_handler_->GetCloudAppID(0); + EXPECT_EQ(result, policyID); +} + } // namespace connection_handler_test } // namespace components } // namespace test -- cgit v1.2.1 From c55e2f28ff97fc031440e431da386ad5cd9e797f Mon Sep 17 00:00:00 2001 From: Jacob Keeler Date: Fri, 4 Mar 2022 13:31:18 -0500 Subject: Update coverity build process to account for different tool versions (#3873) --- .github/workflows/sdl_core_github_ci_coverity.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sdl_core_github_ci_coverity.yml b/.github/workflows/sdl_core_github_ci_coverity.yml index c3cbec5893..124691080a 100644 --- a/.github/workflows/sdl_core_github_ci_coverity.yml +++ b/.github/workflows/sdl_core_github_ci_coverity.yml @@ -51,7 +51,7 @@ jobs: - name: unzip run: tar zxvf coverity_tool.tgz - name: Build - run: make install-3rd_party && make install_python_dependencies && ./cov-analysis-linux64-2020.09/bin/cov-build --dir cov-int make -j `nproc` install + run: make install-3rd_party && make install_python_dependencies && ./cov-analysis-linux64-*/bin/cov-build --dir cov-int make -j `nproc` install - name: Set Library Path run: echo "LD_LIBRARY_PATH=$THIRD_PARTY_INSTALL_PREFIX/lib:." >> $GITHUB_ENV - name: Compress Coverity -- cgit v1.2.1 From 15ddebb432041fd541f43e02de17b35083c2f169 Mon Sep 17 00:00:00 2001 From: "Olha Vorobiova (GitHub)" <86727408+OlhaVorobiova@users.noreply.github.com> Date: Wed, 9 Mar 2022 21:56:35 +0200 Subject: Add missed locks (#3864) --- .../include/policy/policy_manager_impl.h | 5 ++++ .../policy_external/src/access_remote_impl.cc | 3 ++ .../policy/policy_external/src/cache_manager.cc | 33 ++++++++++++++++++++-- .../policy_external/src/policy_manager_impl.cc | 4 +++ .../policy_external/src/policy_table/types.cc | 1 - .../include/policy/policy_manager_impl.h | 5 ++++ .../policy/policy_regular/src/cache_manager.cc | 18 ++++++++++-- .../policy_regular/src/policy_manager_impl.cc | 3 ++ 8 files changed, 66 insertions(+), 6 deletions(-) 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 2be8183bfa..7822cc26f6 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 @@ -1265,6 +1265,11 @@ class PolicyManagerImpl : public PolicyManager { */ sync_primitives::Lock apps_registration_lock_; + /** + * @brief lock guard for protecting policy table snapshot + */ + sync_primitives::Lock policy_table_lock_; + /** * @brief lock guard for protecting application permissions access */ diff --git a/src/components/policy/policy_external/src/access_remote_impl.cc b/src/components/policy/policy_external/src/access_remote_impl.cc index 037f4551f1..4effb991c8 100644 --- a/src/components/policy/policy_external/src/access_remote_impl.cc +++ b/src/components/policy/policy_external/src/access_remote_impl.cc @@ -98,6 +98,7 @@ bool AccessRemoteImpl::CheckModuleType(const PTString& app_id, return false; } + sync_primitives::AutoLock auto_lock(cache_->cache_lock_); const policy_table::ApplicationParams& app = cache_->pt_->policy_table.app_policies_section.apps[app_id]; if (!app.moduleType.is_initialized()) { @@ -168,6 +169,7 @@ void AccessRemoteImpl::SetDefaultHmiTypes(const ApplicationOnDevice& who, const policy_table::AppHMITypes& AccessRemoteImpl::HmiTypes( const ApplicationOnDevice& who) { SDL_LOG_AUTO_TRACE(); + sync_primitives::AutoLock auto_lock(cache_->cache_lock_); if (cache_->IsDefaultPolicy(who.app_id)) { return hmi_types_[who]; } else { @@ -240,6 +242,7 @@ void AccessRemoteImpl::GetGroupsIds(const std::string& device_id, bool AccessRemoteImpl::GetModuleTypes(const std::string& application_id, std::vector* modules) { DCHECK(modules); + sync_primitives::AutoLock auto_lock(cache_->cache_lock_); policy_table::ApplicationPolicies& apps = cache_->pt_->policy_table.app_policies_section.apps; policy_table::ApplicationPolicies::iterator i = apps.find(application_id); diff --git a/src/components/policy/policy_external/src/cache_manager.cc b/src/components/policy/policy_external/src/cache_manager.cc index d5e1e61966..b6ea6e6e79 100644 --- a/src/components/policy/policy_external/src/cache_manager.cc +++ b/src/components/policy/policy_external/src/cache_manager.cc @@ -685,6 +685,7 @@ void CacheManager::ProcessUpdate( const std::string& app_id = initial_policy_iter->first; bool update_request_types = true; + sync_primitives::AutoLock auto_lock(cache_lock_); ApplicationParams& params = pt_->policy_table.app_policies_section.apps[app_id]; if (kPreDataConsentId == app_id) { @@ -1454,15 +1455,19 @@ CacheManager::GetRemovedVehicleDataItems() const { } Json::Value CacheManager::GetPolicyTableData() const { + SDL_LOG_AUTO_TRACE(); + sync_primitives::AutoLock auto_lock(cache_lock_); return pt_->policy_table.ToJsonValue(); } void CacheManager::GetEnabledCloudApps( std::vector& enabled_apps) const { + SDL_LOG_AUTO_TRACE(); #if !defined(CLOUD_APP_WEBSOCKET_TRANSPORT_SUPPORT) enabled_apps.clear(); return; #else + sync_primitives::AutoLock auto_lock(cache_lock_); const policy_table::ApplicationPolicies& policies = pt_->policy_table.app_policies_section.apps; for (policy_table::ApplicationPolicies::const_iterator it = policies.begin(); @@ -1478,6 +1483,8 @@ void CacheManager::GetEnabledCloudApps( bool CacheManager::GetAppProperties(const std::string& policy_app_id, AppProperties& out_app_properties) const { + SDL_LOG_AUTO_TRACE(); + sync_primitives::AutoLock auto_lock(cache_lock_); const policy_table::ApplicationPolicies& policies = pt_->policy_table.app_policies_section.apps; policy_table::ApplicationPolicies::const_iterator policy_iter = @@ -1509,10 +1516,12 @@ bool CacheManager::GetAppProperties(const std::string& policy_app_id, } std::vector CacheManager::GetEnabledLocalApps() const { + SDL_LOG_AUTO_TRACE(); #if !defined(WEBSOCKET_SERVER_TRANSPORT_SUPPORT) return std::vector(); #else std::vector enabled_apps; + sync_primitives::AutoLock auto_lock(cache_lock_); const policy_table::ApplicationPolicies& app_policies = pt_->policy_table.app_policies_section.apps; for (const auto& app_policies_item : app_policies) { @@ -1551,6 +1560,8 @@ void CacheManager::InitCloudApp(const std::string& policy_app_id) { void CacheManager::SetCloudAppEnabled(const std::string& policy_app_id, const bool enabled) { + SDL_LOG_AUTO_TRACE(); + sync_primitives::AutoLock auto_lock(cache_lock_); policy_table::ApplicationPolicies& policies = pt_->policy_table.app_policies_section.apps; policy_table::ApplicationPolicies::iterator policy_iter = @@ -1562,6 +1573,8 @@ void CacheManager::SetCloudAppEnabled(const std::string& policy_app_id, void CacheManager::SetAppAuthToken(const std::string& policy_app_id, const std::string& auth_token) { + SDL_LOG_AUTO_TRACE(); + sync_primitives::AutoLock auto_lock(cache_lock_); policy_table::ApplicationPolicies& policies = pt_->policy_table.app_policies_section.apps; policy_table::ApplicationPolicies::iterator policy_iter = @@ -1573,6 +1586,8 @@ void CacheManager::SetAppAuthToken(const std::string& policy_app_id, void CacheManager::SetAppCloudTransportType( const std::string& policy_app_id, const std::string& cloud_transport_type) { + SDL_LOG_AUTO_TRACE(); + sync_primitives::AutoLock auto_lock(cache_lock_); policy_table::ApplicationPolicies& policies = pt_->policy_table.app_policies_section.apps; policy_table::ApplicationPolicies::iterator policy_iter = @@ -1584,6 +1599,8 @@ void CacheManager::SetAppCloudTransportType( void CacheManager::SetAppEndpoint(const std::string& policy_app_id, const std::string& endpoint) { + SDL_LOG_AUTO_TRACE(); + sync_primitives::AutoLock auto_lock(cache_lock_); policy_table::ApplicationPolicies& policies = pt_->policy_table.app_policies_section.apps; policy_table::ApplicationPolicies::iterator policy_iter = @@ -1595,6 +1612,8 @@ void CacheManager::SetAppEndpoint(const std::string& policy_app_id, void CacheManager::SetAppNicknames(const std::string& policy_app_id, const StringArray& nicknames) { + SDL_LOG_AUTO_TRACE(); + sync_primitives::AutoLock auto_lock(cache_lock_); policy_table::ApplicationPolicies& policies = pt_->policy_table.app_policies_section.apps; policy_table::ApplicationPolicies::iterator policy_iter = @@ -1607,6 +1626,8 @@ void CacheManager::SetAppNicknames(const std::string& policy_app_id, void CacheManager::SetHybridAppPreference( const std::string& policy_app_id, const std::string& hybrid_app_preference) { + SDL_LOG_AUTO_TRACE(); + sync_primitives::AutoLock auto_lock(cache_lock_); policy_table::HybridAppPreference value; bool valid = EnumFromJsonString(hybrid_app_preference, &value); policy_table::ApplicationPolicies& policies = @@ -1622,6 +1643,7 @@ void CacheManager::GetAppServiceParameters( const std::string& policy_app_id, policy_table::AppServiceParameters* app_service_parameters) const { SDL_LOG_AUTO_TRACE(); + sync_primitives::AutoLock auto_lock(cache_lock_); const policy_table::ApplicationPolicies& policies = pt_->policy_table.app_policies_section.apps; policy_table::ApplicationPolicies::const_iterator policy_iter = @@ -1636,6 +1658,8 @@ void CacheManager::GetAppServiceParameters( bool CacheManager::UnknownRPCPassthroughAllowed( const std::string& policy_app_id) const { + SDL_LOG_AUTO_TRACE(); + sync_primitives::AutoLock auto_lock(cache_lock_); const policy_table::ApplicationPolicies& policies = pt_->policy_table.app_policies_section.apps; policy_table::ApplicationPolicies::const_iterator policy_iter = @@ -1747,6 +1771,7 @@ std::vector CacheManager::GetUserFriendlyMsg( void CacheManager::GetUpdateUrls(const uint32_t service_type, EndpointUrls& out_end_points) const { + SDL_LOG_AUTO_TRACE(); auto find_hexademical = [service_type](policy_table::ServiceEndpoints::value_type end_point) { uint32_t decimal; @@ -1754,6 +1779,7 @@ void CacheManager::GetUpdateUrls(const uint32_t service_type, return end_point.first.compare(0, 2, "0x") == 0 && decimal == service_type; }; + sync_primitives::AutoLock auto_lock(cache_lock_); auto& end_points = pt_->policy_table.module_config.endpoints; const auto end_point = std::find_if(end_points.begin(), end_points.end(), find_hexademical); @@ -1791,8 +1817,10 @@ void CacheManager::GetUpdateUrls(const std::string& service_type, } std::string CacheManager::GetIconUrl(const std::string& policy_app_id) const { + SDL_LOG_AUTO_TRACE(); CACHE_MANAGER_CHECK(std::string()); std::string url; + sync_primitives::AutoLock auto_lock(cache_lock_); const policy_table::ApplicationPolicies& policies = pt_->policy_table.app_policies_section.apps; policy_table::ApplicationPolicies::const_iterator policy_iter = @@ -2130,7 +2158,6 @@ std::shared_ptr CacheManager::GenerateSnapshot() { snapshot_ = std::make_shared(); sync_primitives::AutoLock auto_lock(cache_lock_); snapshot_->policy_table = pt_->policy_table; - if (pt_->policy_table.vehicle_data.is_initialized()) { snapshot_->policy_table.vehicle_data = rpc::Optional(); @@ -2138,7 +2165,6 @@ std::shared_ptr CacheManager::GenerateSnapshot() { snapshot_->policy_table.vehicle_data->schema_version = pt_->policy_table.vehicle_data->schema_version; } - snapshot_->SetPolicyTableType(policy_table::PT_SNAPSHOT); CheckSnapshotInitialization(); @@ -2284,6 +2310,7 @@ int CacheManager::CountUnconsentedGroups(const std::string& policy_app_id, void CacheManager::SetPreloadedPtFlag(const bool is_preloaded) { SDL_LOG_AUTO_TRACE(); + sync_primitives::AutoLock auto_lock(cache_lock_); *pt_->policy_table.module_config.preloaded_pt = is_preloaded; Backup(); } @@ -2680,7 +2707,7 @@ bool CacheManager::Init(const std::string& file_name, result &= snapshot->is_valid(); SDL_LOG_DEBUG("Check if snapshot valid: " << std::boolalpha << result); - + sync_primitives::AutoLock auto_lock(cache_lock_); if (!UnwrapAppPolicies(pt_->policy_table.app_policies_section.apps)) { SDL_LOG_ERROR("Cannot unwrap application policies"); } 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 b975b83712..60ab5a389e 100644 --- a/src/components/policy/policy_external/src/policy_manager_impl.cc +++ b/src/components/policy/policy_external/src/policy_manager_impl.cc @@ -486,7 +486,9 @@ PolicyManager::PtProcessingResult PolicyManagerImpl::LoadPT( } cache_->SaveUpdateRequired(false); + sync_primitives::AutoLock lock(apps_registration_lock_); + sync_primitives::AutoLock policy_lock(policy_table_lock_); // Get current DB data, since it could be updated during awaiting of PTU auto policy_table_snapshot = cache_->GenerateSnapshot(); @@ -704,6 +706,7 @@ void PolicyManagerImpl::GetUpdateUrls(const uint32_t service_type, void PolicyManagerImpl::RequestPTUpdate() { SDL_LOG_AUTO_TRACE(); + sync_primitives::AutoLock policy_lock(policy_table_lock_); std::shared_ptr policy_table_snapshot = cache_->GenerateSnapshot(); if (!policy_table_snapshot) { @@ -1772,6 +1775,7 @@ void PolicyManagerImpl::SendPermissionsToApp( Permissions notification_data; // Need to get rid of this call + sync_primitives::AutoLock policy_lock(policy_table_lock_); std::shared_ptr policy_table_snapshot = cache_->GenerateSnapshot(); 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 fffa6a7848..c382016169 100644 --- a/src/components/policy/policy_external/src/policy_table/types.cc +++ b/src/components/policy/policy_external/src/policy_table/types.cc @@ -2,7 +2,6 @@ #include #include - #include "rpc_base/rpc_base_json_inl.h" namespace rpc { 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 0d1a61ec89..16ab9417bb 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 @@ -1102,6 +1102,11 @@ class PolicyManagerImpl : public PolicyManager { */ sync_primitives::Lock apps_registration_lock_; + /** + * @brief lock guard for protecting policy table snapshot + */ + sync_primitives::Lock policy_table_lock_; + /** * @brief lock guard for protecting application permissions access */ diff --git a/src/components/policy/policy_regular/src/cache_manager.cc b/src/components/policy/policy_regular/src/cache_manager.cc index 9cce86322a..4d066e9c32 100644 --- a/src/components/policy/policy_regular/src/cache_manager.cc +++ b/src/components/policy/policy_regular/src/cache_manager.cc @@ -742,6 +742,7 @@ CacheManager::GetRemovedVehicleDataItems() const { } Json::Value CacheManager::GetPolicyTableData() const { + sync_primitives::AutoLock auto_lock(cache_lock_); return pt_->policy_table.ToJsonValue(); } @@ -751,6 +752,7 @@ void CacheManager::GetEnabledCloudApps( enabled_apps.clear(); return; #else + sync_primitives::AutoLock auto_lock(cache_lock_); const policy_table::ApplicationPolicies& policies = pt_->policy_table.app_policies_section.apps; for (policy_table::ApplicationPolicies::const_iterator it = policies.begin(); @@ -769,6 +771,7 @@ std::vector CacheManager::GetEnabledLocalApps() const { return std::vector(); #else std::vector enabled_apps; + sync_primitives::AutoLock auto_lock(cache_lock_); const policy_table::ApplicationPolicies& app_policies = pt_->policy_table.app_policies_section.apps; for (const auto& app_policies_item : app_policies) { @@ -788,6 +791,7 @@ std::vector CacheManager::GetEnabledLocalApps() const { bool CacheManager::GetAppProperties(const std::string& policy_app_id, AppProperties& out_app_properties) const { + sync_primitives::AutoLock auto_lock(cache_lock_); const policy_table::ApplicationPolicies& policies = pt_->policy_table.app_policies_section.apps; policy_table::ApplicationPolicies::const_iterator policy_iter = @@ -841,6 +845,7 @@ void CacheManager::InitCloudApp(const std::string& policy_app_id) { void CacheManager::SetCloudAppEnabled(const std::string& policy_app_id, const bool enabled) { + sync_primitives::AutoLock auto_lock(cache_lock_); policy_table::ApplicationPolicies& policies = pt_->policy_table.app_policies_section.apps; policy_table::ApplicationPolicies::iterator policy_iter = @@ -852,6 +857,7 @@ void CacheManager::SetCloudAppEnabled(const std::string& policy_app_id, void CacheManager::SetAppAuthToken(const std::string& policy_app_id, const std::string& auth_token) { + sync_primitives::AutoLock auto_lock(cache_lock_); policy_table::ApplicationPolicies& policies = pt_->policy_table.app_policies_section.apps; policy_table::ApplicationPolicies::iterator policy_iter = @@ -863,6 +869,7 @@ void CacheManager::SetAppAuthToken(const std::string& policy_app_id, void CacheManager::SetAppCloudTransportType( const std::string& policy_app_id, const std::string& cloud_transport_type) { + sync_primitives::AutoLock auto_lock(cache_lock_); policy_table::ApplicationPolicies& policies = pt_->policy_table.app_policies_section.apps; policy_table::ApplicationPolicies::iterator policy_iter = @@ -874,6 +881,7 @@ void CacheManager::SetAppCloudTransportType( void CacheManager::SetAppEndpoint(const std::string& policy_app_id, const std::string& endpoint) { + sync_primitives::AutoLock auto_lock(cache_lock_); policy_table::ApplicationPolicies& policies = pt_->policy_table.app_policies_section.apps; policy_table::ApplicationPolicies::iterator policy_iter = @@ -885,6 +893,7 @@ void CacheManager::SetAppEndpoint(const std::string& policy_app_id, void CacheManager::SetAppNicknames(const std::string& policy_app_id, const StringArray& nicknames) { + sync_primitives::AutoLock auto_lock(cache_lock_); policy_table::ApplicationPolicies& policies = pt_->policy_table.app_policies_section.apps; policy_table::ApplicationPolicies::iterator policy_iter = @@ -897,6 +906,7 @@ void CacheManager::SetAppNicknames(const std::string& policy_app_id, void CacheManager::SetHybridAppPreference( const std::string& policy_app_id, const std::string& hybrid_app_preference) { + sync_primitives::AutoLock auto_lock(cache_lock_); policy_table::HybridAppPreference value; bool valid = EnumFromJsonString(hybrid_app_preference, &value); policy_table::ApplicationPolicies& policies = @@ -912,6 +922,7 @@ void CacheManager::GetAppServiceParameters( const std::string& policy_app_id, policy_table::AppServiceParameters* app_service_parameters) const { SDL_LOG_AUTO_TRACE(); + sync_primitives::AutoLock auto_lock(cache_lock_); const policy_table::ApplicationPolicies& policies = pt_->policy_table.app_policies_section.apps; policy_table::ApplicationPolicies::const_iterator policy_iter = @@ -926,6 +937,7 @@ void CacheManager::GetAppServiceParameters( bool CacheManager::UnknownRPCPassthroughAllowed( const std::string& policy_app_id) const { + sync_primitives::AutoLock auto_lock(cache_lock_); const policy_table::ApplicationPolicies& policies = pt_->policy_table.app_policies_section.apps; policy_table::ApplicationPolicies::const_iterator policy_iter = @@ -1047,6 +1059,7 @@ void CacheManager::GetUpdateUrls(const uint32_t service_type, return end_point.first.compare(0, 2, "0x") == 0 && decimal == service_type; }; + sync_primitives::AutoLock auto_lock(cache_lock_); auto& end_points = pt_->policy_table.module_config.endpoints; const auto end_point = std::find_if(end_points.begin(), end_points.end(), find_hexademical); @@ -1086,6 +1099,7 @@ void CacheManager::GetUpdateUrls(const std::string& service_type, std::string CacheManager::GetIconUrl(const std::string& policy_app_id) const { CACHE_MANAGER_CHECK(std::string()); std::string url; + sync_primitives::AutoLock auto_lock(cache_lock_); const policy_table::ApplicationPolicies& policies = pt_->policy_table.app_policies_section.apps; policy_table::ApplicationPolicies::const_iterator policy_iter = @@ -1462,7 +1476,6 @@ bool CacheManager::GetFunctionalGroupings( sync_primitives::AutoLock auto_lock(cache_lock_); const policy_table::FunctionalGroupings& f_groupings = pt_->policy_table.functional_groupings; - groups.insert(f_groupings.begin(), f_groupings.end()); return true; } @@ -1478,6 +1491,7 @@ int CacheManager::CountUnconsentedGroups(const std::string& policy_app_id, void CacheManager::SetPreloadedPtFlag(const bool is_preloaded) { SDL_LOG_AUTO_TRACE(); + sync_primitives::AutoLock auto_lock(cache_lock_); *(pt_->policy_table.module_config.preloaded_pt) = is_preloaded; Backup(); } @@ -1841,7 +1855,7 @@ bool CacheManager::Init(const std::string& file_name, SDL_LOG_DEBUG("Validation report: " << rpc::PrettyFormat(report)); return result; } - + sync_primitives::AutoLock auto_lock(cache_lock_); if (!UnwrapAppPolicies(pt_->policy_table.app_policies_section.apps)) { SDL_LOG_ERROR("Cannot unwrap application policies"); } 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 3a41cfa08b..ccc3454708 100644 --- a/src/components/policy/policy_regular/src/policy_manager_impl.cc +++ b/src/components/policy/policy_regular/src/policy_manager_impl.cc @@ -337,6 +337,7 @@ PolicyManager::PtProcessingResult PolicyManagerImpl::LoadPT( cache_->SaveUpdateRequired(false); sync_primitives::AutoLock lock(apps_registration_lock_); + sync_primitives::AutoLock policy_lock(policy_table_lock_); // Get current DB data, since it could be updated during awaiting of PTU auto policy_table_snapshot = cache_->GenerateSnapshot(); @@ -516,6 +517,7 @@ void PolicyManagerImpl::SendPermissionsToApp( Permissions notification_data; // Need to get rid of this call + sync_primitives::AutoLock policy_lock(policy_table_lock_); auto policy_table_snapshot = cache_->GenerateSnapshot(); PrepareNotificationData( @@ -585,6 +587,7 @@ bool PolicyManagerImpl::RequestPTUpdate(const PTUIterationType iteration_type) { SDL_LOG_AUTO_TRACE(); BinaryMessage update; if (PTUIterationType::DefaultIteration == iteration_type) { + sync_primitives::AutoLock policy_lock(policy_table_lock_); std::shared_ptr policy_table_snapshot = cache_->GenerateSnapshot(); if (!policy_table_snapshot) { -- cgit v1.2.1 From 7a3b9bfb9a685d493f9ac4520d30e47296b11273 Mon Sep 17 00:00:00 2001 From: Shobhit Adlakha Date: Fri, 11 Mar 2022 14:08:54 -0500 Subject: Add additional case to openssl_to_internal_error for local issuer certificate (#3875) --- src/components/protocol_handler/src/handshake_handler.cc | 2 +- src/components/security_manager/src/ssl_context_impl.cc | 1 + src/components/security_manager/test/ssl_certificate_handshake_test.cc | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/protocol_handler/src/handshake_handler.cc b/src/components/protocol_handler/src/handshake_handler.cc index 87369c0793..6f86738ebe 100644 --- a/src/components/protocol_handler/src/handshake_handler.cc +++ b/src/components/protocol_handler/src/handshake_handler.cc @@ -154,7 +154,7 @@ bool HandshakeHandler::OnHandshakeDone( case security_manager::SSLContext::Handshake_Result_Fail: return ""; default: - return ""; + return "Unknown handshake result"; } }; diff --git a/src/components/security_manager/src/ssl_context_impl.cc b/src/components/security_manager/src/ssl_context_impl.cc index 1c8b009097..78e4d1d463 100644 --- a/src/components/security_manager/src/ssl_context_impl.cc +++ b/src/components/security_manager/src/ssl_context_impl.cc @@ -628,6 +628,7 @@ CryptoManagerImpl::SSLContextImpl::openssl_error_convert_to_internal( case X509_V_ERR_SUBJECT_ISSUER_MISMATCH: case X509_V_ERR_CERT_SIGNATURE_FAILURE: case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT: + case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY: case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: return Handshake_Result_CertNotSigned; default: diff --git a/src/components/security_manager/test/ssl_certificate_handshake_test.cc b/src/components/security_manager/test/ssl_certificate_handshake_test.cc index 9c21fba0bb..4d09e03883 100644 --- a/src/components/security_manager/test/ssl_certificate_handshake_test.cc +++ b/src/components/security_manager/test/ssl_certificate_handshake_test.cc @@ -450,7 +450,7 @@ TEST_P(SSLHandshakeTest, CAVerification_ClientSide_NoCACertificate) { << client_manager_->LastError(); GTEST_TRACE(HandshakeProcedure_ClientSideFail( - security_manager::SSLContext::Handshake_Result_Fail)); + security_manager::SSLContext::Handshake_Result_CertNotSigned)); ASSERT_TRUE(InitClientManagers(GetParam().client_protocol, client_certificate, -- cgit v1.2.1 From c95f2f91b7af6be5adc387cc1f2aba463109f061 Mon Sep 17 00:00:00 2001 From: Shobhit Adlakha Date: Fri, 11 Mar 2022 15:52:12 -0500 Subject: Fix/8.1.0 RC1 Coverity fixes (#3877) * Fix reported coverity issues * Add null check for message_ptr --- .../application_manager/src/application_manager_impl.cc | 11 ++++------- .../src/message_helper/message_helper.cc | 17 +---------------- .../application_manager/src/mobile_message_handler.cc | 10 +++++----- .../src/cloud/websocket_client_connection.cc | 4 ++++ 4 files changed, 14 insertions(+), 28 deletions(-) diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc index 55a60abea5..486af1de92 100644 --- a/src/components/application_manager/src/application_manager_impl.cc +++ b/src/components/application_manager/src/application_manager_impl.cc @@ -1959,7 +1959,10 @@ bool ApplicationManagerImpl::StartNaviService( const ApplicationSet apps = applications().GetData(); for (auto app : apps) { - if (!app || (!app->is_navi() && !app->mobile_projection_enabled())) { + if (!app) { + SDL_LOG_ERROR("NULL pointer for application"); + continue; + } else if (!app->is_navi() && !app->mobile_projection_enabled()) { SDL_LOG_DEBUG("Continue, Not Navi App Id: " << app->app_id()); continue; } @@ -3175,12 +3178,6 @@ void ApplicationManagerImpl::SendOnSDLClose() { (*msg)[strings::params][strings::protocol_version] = commands::CommandImpl::protocol_version_; - if (!msg) { - SDL_LOG_WARN("Null-pointer message received."); - NOTREACHED(); - return; - } - // SmartObject |message| has no way to declare priority for now std::shared_ptr message_to_send( new Message(protocol_handler::MessagePriority::kDefault)); 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 606bc4c3f0..0a9d8af9da 100644 --- a/src/components/application_manager/src/message_helper/message_helper.cc +++ b/src/components/application_manager/src/message_helper/message_helper.cc @@ -1059,10 +1059,6 @@ smart_objects::SmartObjectSPtr MessageHelper::CreateSetAppIcon( std::make_shared( smart_objects::SmartType_Map); - if (!set_icon) { - return NULL; - } - smart_objects::SmartObject& object = *set_icon; object[strings::sync_file_name][strings::value] = path_to_icon; // TODO(PV): need to store actual image type @@ -1419,9 +1415,7 @@ smart_objects::SmartObjectSPtr MessageHelper::CreateAppVrHelp( smart_objects::SmartObjectSPtr result = std::make_shared( smart_objects::SmartType_Map); - if (!result) { - return NULL; - } + smart_objects::SmartObject& vr_help = *result; const smart_objects::SmartObject* vr_help_title = app->vr_help_title(); if (vr_help_title) { @@ -2266,9 +2260,6 @@ void MessageHelper::SendGetUserFriendlyMessageResponse( smart_objects::SmartObjectSPtr message = std::make_shared( smart_objects::SmartType_Map); - if (!message) { - return; - } (*message)[strings::params][strings::function_id] = hmi_apis::FunctionID::SDL_GetUserFriendlyMessage; @@ -3050,9 +3041,6 @@ void MessageHelper::SendGetStatusUpdateResponse(const std::string& status, smart_objects::SmartObjectSPtr message = std::make_shared( smart_objects::SmartType_Map); - if (!message) { - return; - } (*message)[strings::params][strings::function_id] = hmi_apis::FunctionID::SDL_GetStatusUpdate; @@ -3090,9 +3078,6 @@ void MessageHelper::SendOnStatusUpdate(const std::string& status, smart_objects::SmartObjectSPtr message = std::make_shared( smart_objects::SmartType_Map); - if (!message) { - return; - } (*message)[strings::params][strings::function_id] = hmi_apis::FunctionID::SDL_OnStatusUpdate; diff --git a/src/components/application_manager/src/mobile_message_handler.cc b/src/components/application_manager/src/mobile_message_handler.cc index a9c0a362be..6cbe5ec25a 100644 --- a/src/components/application_manager/src/mobile_message_handler.cc +++ b/src/components/application_manager/src/mobile_message_handler.cc @@ -135,15 +135,15 @@ application_manager::Message* MobileMessageHandler::HandleIncomingMessageProtocolV1( const ::protocol_handler::RawMessagePtr message) { SDL_LOG_AUTO_TRACE(); - application_manager::Message* outgoing_message = - new application_manager::Message( - protocol_handler::MessagePriority::FromServiceType( - message->service_type())); + if (!message) { NOTREACHED(); - delete outgoing_message; return NULL; } + application_manager::Message* outgoing_message = + new application_manager::Message( + protocol_handler::MessagePriority::FromServiceType( + message->service_type())); outgoing_message->set_connection_key(message->connection_key()); outgoing_message->set_protocol_version( 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 a84723d2a1..e0fcbd983b 100644 --- a/src/components/transport_manager/src/cloud/websocket_client_connection.cc +++ b/src/components/transport_manager/src/cloud/websocket_client_connection.cc @@ -315,6 +315,10 @@ void WebsocketClientConnection::LoopThreadDelegate::DrainQueue() { while (!message_queue_.empty()) { Message message_ptr; message_queue_.pop(message_ptr); + if (!message_ptr) { + SDL_LOG_ERROR("Invalid message in message queue"); + continue; + } if (!shutdown_) { boost::system::error_code ec; if (handler_.cloud_properties.cloud_transport_type == "WS") { -- cgit v1.2.1 From cf9c3869d02b723d3aa74f6b0d25a6d3b810c061 Mon Sep 17 00:00:00 2001 From: JackLivio Date: Fri, 11 Mar 2022 16:11:17 -0500 Subject: Fix crash on shutdown during streaming (#3876) * Fix crash on shutdown during streaming * Fix iterative erase --- .../include/application_manager/request_controller_impl.h | 1 + src/components/application_manager/src/request_controller_impl.cc | 8 +++++--- src/components/application_manager/src/rpc_service_impl.cc | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/components/application_manager/include/application_manager/request_controller_impl.h b/src/components/application_manager/include/application_manager/request_controller_impl.h index 41d2419ba6..1813eab2dc 100644 --- a/src/components/application_manager/include/application_manager/request_controller_impl.h +++ b/src/components/application_manager/include/application_manager/request_controller_impl.h @@ -234,6 +234,7 @@ class RequestControllerImpl : public RequestController, threads::AsyncRunner { * @brief Set of HMI notifications with timeout. */ std::list notification_list_; + sync_primitives::Lock notification_list_lock_; /** * @brief Map keeping track of how many duplicate messages were sent for a diff --git a/src/components/application_manager/src/request_controller_impl.cc b/src/components/application_manager/src/request_controller_impl.cc index b73ebc0b74..79458566dc 100644 --- a/src/components/application_manager/src/request_controller_impl.cc +++ b/src/components/application_manager/src/request_controller_impl.cc @@ -236,16 +236,18 @@ void RequestControllerImpl::AddNotification(const RequestPtr ptr) { "Impossible to add notification due to Low Voltage is active"); return; } + AutoLock auto_lock(notification_list_lock_); notification_list_.push_back(ptr); } void RequestControllerImpl::RemoveNotification( const commands::Command* notification) { SDL_LOG_AUTO_TRACE(); - std::list::iterator it = notification_list_.begin(); + AutoLock auto_lock(notification_list_lock_); + auto it = notification_list_.begin(); for (; notification_list_.end() != it;) { if (it->get() == notification) { - notification_list_.erase(it++); + it = notification_list_.erase(it); SDL_LOG_DEBUG("Notification removed"); return; } else { @@ -372,7 +374,7 @@ void RequestControllerImpl::TerminateWaitingForExecutionAppRequests( while (mobile_request_list_.end() != request_it) { RequestPtr request = (*request_it); if ((request.use_count() != 0) && (request->connection_key() == app_id)) { - mobile_request_list_.erase(request_it++); + request_it = mobile_request_list_.erase(request_it); } else { ++request_it; } diff --git a/src/components/application_manager/src/rpc_service_impl.cc b/src/components/application_manager/src/rpc_service_impl.cc index 36dcb335c1..a5e55dcd0e 100644 --- a/src/components/application_manager/src/rpc_service_impl.cc +++ b/src/components/application_manager/src/rpc_service_impl.cc @@ -228,8 +228,8 @@ bool RPCServiceImpl::ManageMobileCommand( return true; } if (message_type == mobile_apis::messageType::notification) { - request_ctrl_.AddNotification(command); if (command->Init() && command->CheckPermissions()) { + request_ctrl_.AddNotification(command); command->Run(); if (command->CleanUp()) { request_ctrl_.RemoveNotification(command.get()); -- cgit v1.2.1 From 08b875d51fcb835ff1d157115f2f94d8927d8ddb Mon Sep 17 00:00:00 2001 From: Shobhit Adlakha Date: Mon, 14 Mar 2022 08:59:17 -0400 Subject: Remove empty check in SaveConsumerFriendlyMessages to clear messages when core receives PTU with no consumer messages(with key defined) (#3879) --- src/components/policy/policy_external/src/sql_pt_representation.cc | 4 +--- src/components/policy/policy_regular/src/sql_pt_representation.cc | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/components/policy/policy_external/src/sql_pt_representation.cc b/src/components/policy/policy_external/src/sql_pt_representation.cc index 1570675cf9..5bee09773d 100644 --- a/src/components/policy/policy_external/src/sql_pt_representation.cc +++ b/src/components/policy/policy_external/src/sql_pt_representation.cc @@ -1611,9 +1611,7 @@ bool SQLPTRepresentation::SaveConsumerFriendlyMessages( utils::dbms::SQLQuery query(db()); bool delete_query_exec_result = true; - if (!messages.messages->empty()) { - delete_query_exec_result = query.Exec(sql_pt::kDeleteMessageString); - } + delete_query_exec_result = query.Exec(sql_pt::kDeleteMessageString); if (!delete_query_exec_result) { SDL_LOG_WARN("Failed to delete messages from DB."); 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 0496896b60..f2254d7752 100644 --- a/src/components/policy/policy_regular/src/sql_pt_representation.cc +++ b/src/components/policy/policy_regular/src/sql_pt_representation.cc @@ -1575,9 +1575,7 @@ bool SQLPTRepresentation::SaveConsumerFriendlyMessages( utils::dbms::SQLQuery query(db()); bool delete_query_exec_result = true; - if (!messages.messages->empty()) { - delete_query_exec_result = query.Exec(sql_pt::kDeleteMessageString); - } + delete_query_exec_result = query.Exec(sql_pt::kDeleteMessageString); if (!delete_query_exec_result) { SDL_LOG_WARN("Failed to delete messages from DB."); -- cgit v1.2.1 From 25e47c7f34f90f5393958f998c1861efa966d702 Mon Sep 17 00:00:00 2001 From: Shobhit Adlakha Date: Tue, 15 Mar 2022 17:21:06 -0400 Subject: Fix/Clear endpoint_properties in policy DB if empty properties recieved in PTU (#3880) * Clear endpoint_properties from policy DB if empty endpoint_properties are recieved in a PTU * Add check to only overwrite endpoint_properties if parameter is defined and empty * Add is_initialized check for external proprietary --- .../policy/policy_external/include/policy/sql_pt_queries.h | 1 + src/components/policy/policy_external/src/sql_pt_queries.cc | 3 +++ .../policy/policy_external/src/sql_pt_representation.cc | 12 ++++++++++++ .../policy/policy_regular/include/policy/sql_pt_queries.h | 1 + src/components/policy/policy_regular/src/sql_pt_queries.cc | 3 +++ .../policy/policy_regular/src/sql_pt_representation.cc | 12 ++++++++++++ 6 files changed, 32 insertions(+) diff --git a/src/components/policy/policy_external/include/policy/sql_pt_queries.h b/src/components/policy/policy_external/include/policy/sql_pt_queries.h index aba08dcca1..18c4468703 100644 --- a/src/components/policy/policy_external/include/policy/sql_pt_queries.h +++ b/src/components/policy/policy_external/include/policy/sql_pt_queries.h @@ -99,6 +99,7 @@ extern const std::string kInsertDeviceData; extern const std::string kInsertAppLevel; extern const std::string kDeleteSecondsBetweenRetries; extern const std::string kDeleteEndpoint; +extern const std::string kDeleteEndpointProperties; extern const std::string kDeleteAppLevel; extern const std::string kDeleteMessageString; extern const std::string kDeleteFunctionalGroup; 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 91dd6fb713..8414c2feda 100644 --- a/src/components/policy/policy_external/src/sql_pt_queries.cc +++ b/src/components/policy/policy_external/src/sql_pt_queries.cc @@ -918,6 +918,9 @@ const std::string kDeleteSecondsBetweenRetries = const std::string kDeleteEndpoint = "DELETE FROM `endpoint`"; +const std::string kDeleteEndpointProperties = + "DELETE FROM `endpoint_properties`"; + const std::string kDeleteAppLevel = "DELETE FROM `app_level`"; const std::string kDeleteMessageString = "DELETE FROM `message`"; diff --git a/src/components/policy/policy_external/src/sql_pt_representation.cc b/src/components/policy/policy_external/src/sql_pt_representation.cc index 5bee09773d..0436e82bbb 100644 --- a/src/components/policy/policy_external/src/sql_pt_representation.cc +++ b/src/components/policy/policy_external/src/sql_pt_representation.cc @@ -1575,6 +1575,18 @@ bool SQLPTRepresentation::SaveServiceEndpoints( bool SQLPTRepresentation::SaveServiceEndpointProperties( const policy_table::ServiceEndpointProperties& endpoint_properties) { utils::dbms::SQLQuery query(db()); + + if (endpoint_properties.is_initialized() && endpoint_properties.empty()) { + bool delete_query_exec_result = + query.Exec(sql_pt::kDeleteEndpointProperties); + + if (!delete_query_exec_result) { + SDL_LOG_WARN("Failed to delete endpoint properties from DB."); + return false; + } + return true; + } + if (!query.Prepare(sql_pt::kInsertEndpointVersion)) { SDL_LOG_WARN( "Incorrect insert of endpoint property to endpoint_properties."); 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 fd7f879abf..492db56204 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 @@ -99,6 +99,7 @@ extern const std::string kInsertDeviceData; extern const std::string kInsertAppLevel; extern const std::string kDeleteSecondsBetweenRetries; extern const std::string kDeleteEndpoint; +extern const std::string kDeleteEndpointProperties; extern const std::string kDeleteAppLevel; extern const std::string kDeleteMessageString; extern const std::string kDeleteFunctionalGroup; 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 6e0bfd8c89..c86e934823 100644 --- a/src/components/policy/policy_regular/src/sql_pt_queries.cc +++ b/src/components/policy/policy_regular/src/sql_pt_queries.cc @@ -868,6 +868,9 @@ const std::string kDeleteSecondsBetweenRetries = const std::string kDeleteEndpoint = "DELETE FROM `endpoint`"; +const std::string kDeleteEndpointProperties = + "DELETE FROM `endpoint_properties`"; + const std::string kDeleteAppLevel = "DELETE FROM `app_level`"; const std::string kDeleteMessageString = "DELETE FROM `message`"; 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 f2254d7752..9dcde34588 100644 --- a/src/components/policy/policy_regular/src/sql_pt_representation.cc +++ b/src/components/policy/policy_regular/src/sql_pt_representation.cc @@ -1539,6 +1539,18 @@ bool SQLPTRepresentation::SaveServiceEndpoints( bool SQLPTRepresentation::SaveServiceEndpointProperties( const policy_table::ServiceEndpointProperties& endpoint_properties) { utils::dbms::SQLQuery query(db()); + + if (endpoint_properties.is_initialized() && endpoint_properties.empty()) { + bool delete_query_exec_result = + query.Exec(sql_pt::kDeleteEndpointProperties); + + if (!delete_query_exec_result) { + SDL_LOG_WARN("Failed to delete endpoint properties from DB."); + return false; + } + return true; + } + if (!query.Prepare(sql_pt::kInsertEndpointVersion)) { SDL_LOG_WARN( "Incorrect insert of endpoint property to endpoint_properties."); -- cgit v1.2.1 From 1c79adc004203d7819d938a9046970bd242a6eac Mon Sep 17 00:00:00 2001 From: JackLivio Date: Wed, 23 Mar 2022 17:03:25 -0400 Subject: Set secure wss cipher list (#3885) * Set secure wss cipher list * Update src/components/transport_manager/src/cloud/websocket_client_connection.cc Co-authored-by: Jacob Keeler Co-authored-by: Jacob Keeler --- .../transport_manager/src/cloud/websocket_client_connection.cc | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) 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 e0fcbd983b..6a28c6a7ff 100644 --- a/src/components/transport_manager/src/cloud/websocket_client_connection.cc +++ b/src/components/transport_manager/src/cloud/websocket_client_connection.cc @@ -50,7 +50,7 @@ WebsocketClientConnection::WebsocketClientConnection( , resolver_(ioc_) , ws_(ioc_) #ifdef ENABLE_SECURITY - , ctx_(ssl::context::sslv23_client) + , ctx_(ssl::context::tlsv12_client) , wss_(ioc_, ctx_) #endif // ENABLE_SECURITY , shutdown_(false) @@ -59,6 +59,14 @@ WebsocketClientConnection::WebsocketClientConnection( , device_uid_(device_uid) , app_handle_(app_handle) , io_pool_(1) { +#ifdef ENABLE_SECURITY + const char* wss_ciphers = + "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-" + "CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-" + "SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-" + "AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256"; + SSL_CTX_set_cipher_list(ctx_.native_handle(), wss_ciphers); +#endif } WebsocketClientConnection::~WebsocketClientConnection() { -- cgit v1.2.1 From b30f01258aeea4ec4c9cde22e942f091ade1cbfb Mon Sep 17 00:00:00 2001 From: RomanReznichenkoLuxoft <85177915+RomanReznichenkoLuxoft@users.noreply.github.com> Date: Tue, 29 Mar 2022 17:01:04 +0300 Subject: Add missed locks (#3890) Co-authored-by: OlhaVorobiova --- .../rpc_protection_manager_impl.h | 2 +- .../src/rpc_protection_manager_impl.cc | 18 ++++++++++-------- .../policy_regular/include/policy/cache_manager.h | 2 +- .../policy/policy_regular/src/access_remote_impl.cc | 4 +++- .../policy/policy_regular/src/cache_manager.cc | 21 +++++++++++---------- .../policy_regular/src/sql_pt_representation.cc | 1 + 6 files changed, 27 insertions(+), 21 deletions(-) diff --git a/src/components/application_manager/include/application_manager/rpc_protection_manager_impl.h b/src/components/application_manager/include/application_manager/rpc_protection_manager_impl.h index b971ace480..f5e96e4420 100644 --- a/src/components/application_manager/include/application_manager/rpc_protection_manager_impl.h +++ b/src/components/application_manager/include/application_manager/rpc_protection_manager_impl.h @@ -106,7 +106,7 @@ class RPCProtectionManagerImpl : public RPCProtectionManager { policy::PolicyHandlerInterface& policy_handler_; AppEncryptedRpcMap encrypted_rpcs_; - sync_primitives::Lock encrypted_rpcs_lock_; + mutable sync_primitives::RecursiveLock encrypted_rpcs_lock_; std::set encryption_needed_cache_; sync_primitives::Lock message_needed_encryption_lock_; diff --git a/src/components/application_manager/src/rpc_protection_manager_impl.cc b/src/components/application_manager/src/rpc_protection_manager_impl.cc index 64b732ddb2..62e296e786 100644 --- a/src/components/application_manager/src/rpc_protection_manager_impl.cc +++ b/src/components/application_manager/src/rpc_protection_manager_impl.cc @@ -89,7 +89,7 @@ bool RPCProtectionManagerImpl::CheckPolicyEncryptionFlag( bool RPCProtectionManagerImpl::IsEncryptionRequiredByPolicy( const std::string& policy_app_id, const std::string& function_name) const { SDL_LOG_AUTO_TRACE(); - + sync_primitives::AutoLock lock(encrypted_rpcs_lock_); auto it = encrypted_rpcs_.find(policy_app_id); if (encrypted_rpcs_.end() == it) { @@ -160,23 +160,25 @@ void RPCProtectionManagerImpl::OnPTUFinished(const bool ptu_result) { void RPCProtectionManagerImpl::SaveEncryptedRPC() { SDL_LOG_AUTO_TRACE(); - + sync_primitives::AutoLock lock(encrypted_rpcs_lock_); const auto policy_encryption_flag_getter = policy_handler_.PolicyEncryptionFlagGetter(); - const auto policy_policy_app_ids = - policy_encryption_flag_getter->GetApplicationPolicyIDs(); + if (policy_encryption_flag_getter) { + const auto policy_policy_app_ids = + policy_encryption_flag_getter->GetApplicationPolicyIDs(); - for (const auto& app : policy_policy_app_ids) { - SDL_LOG_DEBUG("Processing app name: " << app); + for (const auto& app : policy_policy_app_ids) { + SDL_LOG_DEBUG("Processing app name: " << app); - encrypted_rpcs_[app] = GetEncryptedRPCsForApp(app); + encrypted_rpcs_[app] = GetEncryptedRPCsForApp(app); + } } } void RPCProtectionManagerImpl::OnPTInited() { SDL_LOG_AUTO_TRACE(); - + sync_primitives::AutoLock lock(encrypted_rpcs_lock_); encrypted_rpcs_.clear(); SaveEncryptedRPC(); 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 473caef145..2f19da13b5 100644 --- a/src/components/policy/policy_regular/include/policy/cache_manager.h +++ b/src/components/policy/policy_regular/include/policy/cache_manager.h @@ -988,8 +988,8 @@ class CacheManager : public CacheManagerInterface { BackgroundBackuper* backuper_; const PolicySettings* settings_; -#ifdef BUILD_TESTS friend class AccessRemoteImpl; +#ifdef BUILD_TESTS FRIEND_TEST(AccessRemoteImplTest, CheckModuleType); FRIEND_TEST(AccessRemoteImplTest, EnableDisable); FRIEND_TEST(AccessRemoteImplTest, GetGroups); diff --git a/src/components/policy/policy_regular/src/access_remote_impl.cc b/src/components/policy/policy_regular/src/access_remote_impl.cc index 439fbcc8d2..04bf9479ef 100644 --- a/src/components/policy/policy_regular/src/access_remote_impl.cc +++ b/src/components/policy/policy_regular/src/access_remote_impl.cc @@ -97,7 +97,7 @@ bool AccessRemoteImpl::CheckModuleType(const PTString& app_id, if (!cache_->IsApplicationRepresented(app_id)) { return false; } - + sync_primitives::AutoLock auto_lock(cache_->cache_lock_); const policy_table::ApplicationParams& app = cache_->pt()->policy_table.app_policies_section.apps[app_id]; if (!app.moduleType.is_initialized()) { @@ -168,6 +168,7 @@ void AccessRemoteImpl::SetDefaultHmiTypes(const ApplicationOnDevice& who, const policy_table::AppHMITypes& AccessRemoteImpl::HmiTypes( const ApplicationOnDevice& who) { SDL_LOG_AUTO_TRACE(); + sync_primitives::AutoLock auto_lock(cache_->cache_lock_); if (cache_->IsDefaultPolicy(who.app_id)) { return hmi_types_[who]; } else { @@ -226,6 +227,7 @@ void AccessRemoteImpl::GetGroupsIds(const std::string& device_id, bool AccessRemoteImpl::GetModuleTypes(const std::string& application_id, std::vector* modules) { DCHECK(modules); + sync_primitives::AutoLock auto_lock(cache_->cache_lock_); policy_table::ApplicationPolicies& apps = cache_->pt()->policy_table.app_policies_section.apps; policy_table::ApplicationPolicies::iterator i = apps.find(application_id); diff --git a/src/components/policy/policy_regular/src/cache_manager.cc b/src/components/policy/policy_regular/src/cache_manager.cc index 4d066e9c32..f22cd9eec0 100644 --- a/src/components/policy/policy_regular/src/cache_manager.cc +++ b/src/components/policy/policy_regular/src/cache_manager.cc @@ -220,7 +220,6 @@ void CacheManager::GetAllAppGroups(const std::string& app_id, SDL_LOG_INFO("Devices doesn't have groups"); return; } - sync_primitives::AutoLock auto_lock(cache_lock_); policy_table::ApplicationPolicies::const_iterator app_params_iter = pt_->policy_table.app_policies_section.apps.find(app_id); @@ -439,7 +438,6 @@ bool CacheManager::GetDeviceGroupsFromPolicies( bool CacheManager::AddDevice(const std::string& device_id, const std::string& connection_type) { SDL_LOG_AUTO_TRACE(); - sync_primitives::AutoLock auto_lock(cache_lock_); CACHE_MANAGER_CHECK(false); policy_table::DeviceParams& params = @@ -465,7 +463,6 @@ bool CacheManager::SetDeviceData(const std::string& device_id, const uint32_t number_of_ports, const std::string& connection_type) { SDL_LOG_AUTO_TRACE(); - sync_primitives::AutoLock auto_lock(cache_lock_); CACHE_MANAGER_CHECK(false); Backup(); @@ -1313,9 +1310,9 @@ void CacheManager::PersistData() { if (pt_.use_count() != 0) { // Comma expression is used to hold the lock only during the constructor // call + policy_table::Table copy_pt( (sync_primitives::AutoLock(cache_lock_), *pt_)); - backup_->Save(copy_pt); backup_->SaveUpdateRequired(update_required); @@ -1586,7 +1583,7 @@ void CacheManager::Increment(usage_statistics::GlobalCounterId type) { void CacheManager::Increment(const std::string& app_id, usage_statistics::AppCounterId type) { CACHE_MANAGER_CHECK_VOID(); - sync_primitives::AutoLock lock(cache_lock_); + sync_primitives::AutoLock auto_lock(cache_lock_); switch (type) { case usage_statistics::USER_SELECTIONS: ++(*pt_->policy_table.usage_and_error_counts->app_level)[app_id] @@ -1635,7 +1632,7 @@ void CacheManager::Set(const std::string& app_id, usage_statistics::AppInfoId type, const std::string& value) { CACHE_MANAGER_CHECK_VOID(); - sync_primitives::AutoLock lock(cache_lock_); + sync_primitives::AutoLock auto_lock(cache_lock_); switch (type) { case usage_statistics::LANGUAGE_GUI: (*pt_->policy_table.usage_and_error_counts->app_level)[app_id] @@ -1656,7 +1653,7 @@ void CacheManager::Add(const std::string& app_id, usage_statistics::AppStopwatchId type, int seconds) { CACHE_MANAGER_CHECK_VOID(); - sync_primitives::AutoLock lock(cache_lock_); + sync_primitives::AutoLock auto_lock(cache_lock_); const int minutes = ConvertSecondsToMinute(seconds); switch (type) { case usage_statistics::SECONDS_HMI_FULL: @@ -1778,6 +1775,7 @@ bool CacheManager::IsPredataPolicy(const std::string& app_id) const { bool CacheManager::SetUnpairedDevice(const std::string& device_id, bool unpaired) { + SDL_LOG_AUTO_TRACE(); sync_primitives::AutoLock auto_lock(cache_lock_); const bool result = pt_->policy_table.device_data->end() != pt_->policy_table.device_data->find(device_id); @@ -1805,6 +1803,7 @@ bool CacheManager::SetVINValue(const std::string& value) { } bool CacheManager::IsApplicationRepresented(const std::string& app_id) const { + SDL_LOG_AUTO_TRACE(); CACHE_MANAGER_CHECK(false); if (kDeviceId == app_id) { return true; @@ -1876,7 +1875,7 @@ void CacheManager::FillDeviceSpecificData() {} bool CacheManager::LoadFromBackup() { SDL_LOG_AUTO_TRACE(); - sync_primitives::AutoLock lock(cache_lock_); + sync_primitives::AutoLock auto_lock(cache_lock_); pt_ = backup_->GenerateSnapshot(); update_required = backup_->UpdateRequired(); SDL_LOG_DEBUG("Update required flag from backup: " << std::boolalpha @@ -1930,7 +1929,7 @@ bool CacheManager::LoadFromFile(const std::string& file_name, } SDL_LOG_TRACE("Start create PT"); - sync_primitives::AutoLock locker(cache_lock_); + sync_primitives::AutoLock auto_lock(cache_lock_); table = policy_table::Table(&value); @@ -1957,6 +1956,7 @@ bool CacheManager::ResetPT(const std::string& file_name) { } bool CacheManager::AppExists(const std::string& app_id) const { + SDL_LOG_AUTO_TRACE(); CACHE_MANAGER_CHECK(false); sync_primitives::AutoLock auto_lock(cache_lock_); policy_table::ApplicationPolicies::iterator policy_iter = @@ -2072,6 +2072,7 @@ void CacheManager::GetAppRequestSubTypes( } std::string CacheManager::GetCertificate() const { + SDL_LOG_AUTO_TRACE(); CACHE_MANAGER_CHECK(std::string("")); sync_primitives::AutoLock auto_lock(cache_lock_); if (pt_->policy_table.module_config.certificate.is_initialized()) { @@ -2088,7 +2089,7 @@ bool CacheManager::MergePreloadPT(const std::string& file_name) { return false; } - sync_primitives::AutoLock lock(cache_lock_); + sync_primitives::AutoLock auto_lock(cache_lock_); policy_table::PolicyTable& current = pt_->policy_table; policy_table::PolicyTable& new_table = table.policy_table; const std::string date_current = *current.module_config.preloaded_date; 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 9dcde34588..f6ee8772fc 100644 --- a/src/components/policy/policy_regular/src/sql_pt_representation.cc +++ b/src/components/policy/policy_regular/src/sql_pt_representation.cc @@ -2676,6 +2676,7 @@ policy_table::VehicleDataItem SQLPTRepresentation::PopulateVDIFromQuery( bool SQLPTRepresentation::InsertVehicleDataItem( const policy_table::VehicleDataItem& vehicle_data_item) { + SDL_LOG_AUTO_TRACE(); utils::dbms::SQLQuery query(db()); if (!vehicle_data_item.is_initialized() || !vehicle_data_item.is_valid()) { -- cgit v1.2.1 From cbc9d3928fb3c4a8db6608e84bad67d2398a52e7 Mon Sep 17 00:00:00 2001 From: Shobhit Adlakha Date: Thu, 31 Mar 2022 07:57:23 -0400 Subject: Fix/WSS re-connection loop (#3891) * Remove shutdown call from failed ssl handshake and add call to teardown failed connection * Reset websocket stream on failed ssl handshake * Add function to reset websocket stream in case of failed handshakes --- .../cloud/websocket_client_connection.h | 7 +- .../src/cloud/websocket_client_connection.cc | 103 +++++++++++++-------- 2 files changed, 71 insertions(+), 39 deletions(-) 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 0465effa94..afc040f749 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 @@ -144,16 +144,19 @@ class WebsocketClientConnection void OnRead(boost::system::error_code ec, std::size_t bytes_transferred); private: + void ResetWebsocketStream(std::string cloud_transport_type); + TransportAdapterController* controller_; boost::asio::io_context ioc_; tcp::resolver resolver_; boost::beast::flat_buffer buffer_; std::string host_; std::string text_; - WS ws_; + std::shared_ptr ws_; #ifdef ENABLE_SECURITY + const char* wss_ciphers_; ssl::context ctx_; - WSS wss_; + std::shared_ptr wss_; #endif // ENABLE_SECURITY std::atomic_bool shutdown_; 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 6a28c6a7ff..c1274699f7 100644 --- a/src/components/transport_manager/src/cloud/websocket_client_connection.cc +++ b/src/components/transport_manager/src/cloud/websocket_client_connection.cc @@ -48,24 +48,25 @@ WebsocketClientConnection::WebsocketClientConnection( TransportAdapterController* controller) : controller_(controller) , resolver_(ioc_) - , ws_(ioc_) + , ws_(std::make_shared(ioc_)) #ifdef ENABLE_SECURITY , ctx_(ssl::context::tlsv12_client) - , wss_(ioc_, ctx_) + , wss_(std::make_shared(ioc_, ctx_)) #endif // ENABLE_SECURITY , shutdown_(false) , thread_delegate_(new LoopThreadDelegate(&message_queue_, this)) - , write_thread_(threads::CreateThread("WS Async Send", thread_delegate_)) + , write_thread_( + threads::CreateThread("Client WS Async Send", thread_delegate_)) , device_uid_(device_uid) , app_handle_(app_handle) , io_pool_(1) { #ifdef ENABLE_SECURITY - const char* wss_ciphers = + wss_ciphers_ = "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-" "CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-" "SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-" "AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256"; - SSL_CTX_set_cipher_list(ctx_.native_handle(), wss_ciphers); + SSL_CTX_set_cipher_list(ctx_.native_handle(), wss_ciphers_); #endif } @@ -83,7 +84,7 @@ void WebsocketClientConnection::AddCertificateAuthority( return; } - wss_.next_layer().set_verify_mode(ssl::verify_peer); + wss_->next_layer().set_verify_mode(ssl::verify_peer); } #endif // ENABLE_SECURITY @@ -116,12 +117,12 @@ TransportAdapter::Error WebsocketClientConnection::Start() { // Make Connection to host IP Address over TCP if (cloud_properties.cloud_transport_type == "WS") { - boost::asio::connect(ws_.next_layer(), results.begin(), results.end(), ec); + boost::asio::connect(ws_->next_layer(), results.begin(), results.end(), ec); } #ifdef ENABLE_SECURITY else if (cloud_properties.cloud_transport_type == "WSS") { boost::asio::connect( - wss_.next_layer().next_layer(), results.begin(), results.end(), ec); + wss_->next_layer().next_layer(), results.begin(), results.end(), ec); } #endif // ENABLE_SECURITY @@ -141,19 +142,19 @@ TransportAdapter::Error WebsocketClientConnection::Start() { SDL_LOG_ERROR("Failed to add certificate authority: " << cloud_properties.certificate); SDL_LOG_ERROR(str_err); - Shutdown(); + ResetWebsocketStream(cloud_properties.cloud_transport_type); return TransportAdapter::FAIL; } // Perform SSL Handshake - wss_.next_layer().handshake(ssl::stream_base::client, ec); + wss_->next_layer().handshake(ssl::stream_base::client, ec); if (ec) { std::string str_err = "ErrorMessage: " + ec.message(); SDL_LOG_ERROR("Could not complete SSL Handshake failed with host/port: " << host << ":" << port); SDL_LOG_ERROR(str_err); - Shutdown(); + ResetWebsocketStream(cloud_properties.cloud_transport_type); return TransportAdapter::FAIL; } } @@ -161,11 +162,11 @@ TransportAdapter::Error WebsocketClientConnection::Start() { // Perform websocket handshake if (cloud_properties.cloud_transport_type == "WS") { - ws_.handshake(host, cloud_device->GetTarget(), ec); + ws_->handshake(host, cloud_device->GetTarget(), ec); } #ifdef ENABLE_SECURITY else if (cloud_properties.cloud_transport_type == "WSS") { - wss_.handshake(host, cloud_device->GetTarget(), ec); + wss_->handshake(host, cloud_device->GetTarget(), ec); } #endif // ENABLE_SECURITY if (ec) { @@ -173,16 +174,17 @@ TransportAdapter::Error WebsocketClientConnection::Start() { SDL_LOG_ERROR("Could not complete handshake with host/port: " << host << ":" << port); SDL_LOG_ERROR(str_err); + ResetWebsocketStream(cloud_properties.cloud_transport_type); return TransportAdapter::FAIL; } // Set the binary message write option if (cloud_properties.cloud_transport_type == "WS") { - ws_.binary(true); + ws_->binary(true); } #ifdef ENABLE_SECURITY else if (cloud_properties.cloud_transport_type == "WSS") { - wss_.binary(true); + wss_->binary(true); } #endif // ENABLE_SECURITY write_thread_->Start(threads::ThreadOptions()); @@ -190,20 +192,20 @@ TransportAdapter::Error WebsocketClientConnection::Start() { // Start async read if (cloud_properties.cloud_transport_type == "WS") { - ws_.async_read(buffer_, - std::bind(&WebsocketClientConnection::OnRead, - this, - std::placeholders::_1, - std::placeholders::_2)); - } -#ifdef ENABLE_SECURITY - else if (cloud_properties.cloud_transport_type == "WSS") { - wss_.async_read(buffer_, + ws_->async_read(buffer_, std::bind(&WebsocketClientConnection::OnRead, this, std::placeholders::_1, std::placeholders::_2)); } +#ifdef ENABLE_SECURITY + else if (cloud_properties.cloud_transport_type == "WSS") { + wss_->async_read(buffer_, + std::bind(&WebsocketClientConnection::OnRead, + this, + std::placeholders::_1, + std::placeholders::_2)); + } #endif // ENABLE_SECURITY boost::asio::post(io_pool_, [&]() { ioc_.run(); }); @@ -225,20 +227,20 @@ void WebsocketClientConnection::Recv(boost::system::error_code ec) { return; } if (cloud_properties.cloud_transport_type == "WS") { - ws_.async_read(buffer_, - std::bind(&WebsocketClientConnection::OnRead, - this, - std::placeholders::_1, - std::placeholders::_2)); - } -#ifdef ENABLE_SECURITY - else if (cloud_properties.cloud_transport_type == "WSS") { - wss_.async_read(buffer_, + ws_->async_read(buffer_, std::bind(&WebsocketClientConnection::OnRead, this, std::placeholders::_1, std::placeholders::_2)); } +#ifdef ENABLE_SECURITY + else if (cloud_properties.cloud_transport_type == "WSS") { + wss_->async_read(buffer_, + std::bind(&WebsocketClientConnection::OnRead, + this, + std::placeholders::_1, + std::placeholders::_2)); + } #endif // ENABLE_SECURITY } @@ -248,7 +250,15 @@ void WebsocketClientConnection::OnRead(boost::system::error_code ec, if (ec) { std::string str_err = "ErrorMessage: " + ec.message(); SDL_LOG_ERROR(str_err); - boost::beast::get_lowest_layer(ws_).close(); + if (cloud_properties.cloud_transport_type == "WS") { + boost::beast::get_lowest_layer(*ws_).close(); + } +#ifdef ENABLE_SECURITY + else if (cloud_properties.cloud_transport_type == "WSS") { + boost::beast::get_lowest_layer(*wss_).close(); + } +#endif // ENABLE_SECURITY + ioc_.stop(); Shutdown(); return; @@ -287,7 +297,10 @@ void WebsocketClientConnection::Shutdown() { if (thread_delegate_) { thread_delegate_->SetShutdown(); - write_thread_->Stop(threads::Thread::kThreadSoftStop); + + if (write_thread_->IsRunning()) { + write_thread_->Stop(threads::Thread::kThreadSoftStop); + } delete thread_delegate_; thread_delegate_ = NULL; threads::DeleteThread(write_thread_); @@ -299,6 +312,22 @@ void WebsocketClientConnection::Shutdown() { controller_->DisconnectDone(device_uid_, app_handle_); } +void WebsocketClientConnection::ResetWebsocketStream( + std::string cloud_transport_type) { + if (cloud_transport_type == "WS") { + ws_.reset(); + ws_ = std::make_shared(ioc_); + } +#ifdef ENABLE_SECURITY + else if (cloud_transport_type == "WSS") { + ctx_ = ssl::context(ssl::context::tlsv12_client); + SSL_CTX_set_cipher_list(ctx_.native_handle(), wss_ciphers_); + wss_.reset(); + wss_ = std::make_shared(ioc_, ctx_); + } +#endif // ENABLE_SECURITY +} + WebsocketClientConnection::LoopThreadDelegate::LoopThreadDelegate( MessageQueue* message_queue, WebsocketClientConnection* handler) @@ -330,12 +359,12 @@ void WebsocketClientConnection::LoopThreadDelegate::DrainQueue() { if (!shutdown_) { boost::system::error_code ec; if (handler_.cloud_properties.cloud_transport_type == "WS") { - handler_.ws_.write( + handler_.ws_->write( boost::asio::buffer(message_ptr->data(), message_ptr->data_size())); } #ifdef ENABLE_SECURITY else if (handler_.cloud_properties.cloud_transport_type == "WSS") { - handler_.wss_.write( + handler_.wss_->write( boost::asio::buffer(message_ptr->data(), message_ptr->data_size())); } #endif // ENABLE_SECURITY -- cgit v1.2.1 From b380f4865aaa7c68cab72c67e32f29ae17c4cc1c Mon Sep 17 00:00:00 2001 From: JackLivio Date: Mon, 4 Apr 2022 12:57:55 -0400 Subject: Fix app activation during pending cloud connection (#3898) * Fix app activation during pending cloud connection * Apply suggestions from code review Co-authored-by: Jacob Keeler Co-authored-by: Jacob Keeler --- .../application_manager/application_manager_impl.h | 2 ++ .../src/commands/hmi/sdl_activate_app_request.cc | 10 ++++++++- .../commands/hmi/sdl_activate_app_request_test.cc | 24 ++++++++++++++++++++++ .../src/application_manager_impl.cc | 7 +++++++ .../application_manager/application_manager.h | 3 +++ .../application_manager/mock_application_manager.h | 3 +++ 6 files changed, 48 insertions(+), 1 deletion(-) 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 c59456a022..d72508bd63 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 @@ -187,6 +187,8 @@ class ApplicationManagerImpl uint32_t hmi_app_id) const OVERRIDE; ApplicationSharedPtr application_by_policy_id( const std::string& policy_app_id) const OVERRIDE; + ApplicationSharedPtr pending_application_by_hmi_app( + uint32_t hmi_app_id) const OVERRIDE; ApplicationSharedPtr pending_application_by_policy_id( const std::string& policy_app_id) const OVERRIDE; ApplicationSharedPtr reregister_application_by_policy_id( diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/sdl_activate_app_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/sdl_activate_app_request.cc index d79a397651..50152e0924 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/sdl_activate_app_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/sdl_activate_app_request.cc @@ -297,7 +297,13 @@ void SDLActivateAppRequest::on_event(const event_engine::Event& event) { if (event.id() != BasicCommunication_OnAppRegistered) { return; } - unsubscribe_from_event(BasicCommunication_OnAppRegistered); + + ApplicationSharedPtr pending_app = + application_manager_.pending_application_by_hmi_app(app_id()); + if (pending_app) { + SDL_LOG_ERROR("Application is still pending connection: " << app_id()); + return; + } // Have to use HMI app id from event, since HMI app id from original request // message will be changed after app, initially requested for launch via @@ -312,6 +318,8 @@ void SDLActivateAppRequest::on_event(const event_engine::Event& event) { return; } + unsubscribe_from_event(BasicCommunication_OnAppRegistered); + auto main_state = app->CurrentHmiState(mobile_apis::PredefinedWindows::DEFAULT_WINDOW); if (mobile_apis::HMILevel::INVALID_ENUM == main_state->hmi_level()) { diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/sdl_activate_app_request_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/sdl_activate_app_request_test.cc index 8057a2c518..162e421904 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/sdl_activate_app_request_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/sdl_activate_app_request_test.cc @@ -542,6 +542,28 @@ TEST_F(SDLActivateAppRequestTest, OnEvent_InvalidAppId_UNSUCCESS) { MockAppPtr invalid_mock_app; EXPECT_CALL(app_mngr_, application_by_hmi_app(_)) .WillOnce(Return(invalid_mock_app)); + EXPECT_CALL(app_mngr_, pending_application_by_hmi_app(_)) + .WillOnce(Return(ApplicationSharedPtr())); + + command->on_event(event); +} + +TEST_F(SDLActivateAppRequestTest, OnEvent_PendingApp_UNSUCCESS) { + MessageSharedPtr event_msg = CreateMessage(); + (*event_msg)[strings::msg_params][strings::application][strings::app_id] = + kAppID; + + std::shared_ptr command( + CreateCommand()); + + Event event(hmi_apis::FunctionID::BasicCommunication_OnAppRegistered); + event.set_smart_object(*event_msg); + + MockAppPtr mock_app(CreateMockApp()); + EXPECT_CALL(app_mngr_, pending_application_by_hmi_app(_)) + .WillOnce(Return(mock_app)); + EXPECT_CALL(app_mngr_, application_by_hmi_app(_)).Times(0); + EXPECT_CALL(mock_policy_handler_, OnActivateApp(_, _)).Times(0); command->on_event(event); } @@ -561,6 +583,8 @@ TEST_F(SDLActivateAppRequestTest, OnEvent_SUCCESS) { MockAppPtr mock_app(CreateMockApp()); EXPECT_CALL(app_mngr_, application_by_hmi_app(_)).WillOnce(Return(mock_app)); + EXPECT_CALL(app_mngr_, pending_application_by_hmi_app(_)) + .WillOnce(Return(ApplicationSharedPtr())); auto hmi_state = std::make_shared(mock_app, app_mngr_); hmi_state->set_hmi_level(mobile_apis::HMILevel::HMI_NONE); diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc index 486af1de92..acf174eb39 100644 --- a/src/components/application_manager/src/application_manager_impl.cc +++ b/src/components/application_manager/src/application_manager_impl.cc @@ -301,6 +301,13 @@ ApplicationSharedPtr ApplicationManagerImpl::application_by_policy_id( return FindApp(accessor, finder); } +ApplicationSharedPtr ApplicationManagerImpl::pending_application_by_hmi_app( + uint32_t hmi_app_id) const { + HmiAppIdPredicate finder(hmi_app_id); + DataAccessor accessor = pending_applications(); + return FindPendingApp(accessor, finder); +} + ApplicationSharedPtr ApplicationManagerImpl::pending_application_by_policy_id( const std::string& policy_app_id) const { PolicyAppIdPredicate finder(policy_app_id); diff --git a/src/components/include/application_manager/application_manager.h b/src/components/include/application_manager/application_manager.h index 5fd9be2a66..a0092b93df 100644 --- a/src/components/include/application_manager/application_manager.h +++ b/src/components/include/application_manager/application_manager.h @@ -216,6 +216,9 @@ class ApplicationManager { virtual ApplicationSharedPtr application_by_policy_id( const std::string& policy_app_id) const = 0; + virtual ApplicationSharedPtr pending_application_by_hmi_app( + uint32_t hmi_app_id) const = 0; + virtual ApplicationSharedPtr pending_application_by_policy_id( const std::string& policy_app_id) const = 0; 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 ef0f20ac65..dfc9cbab5a 100644 --- a/src/components/include/test/application_manager/mock_application_manager.h +++ b/src/components/include/test/application_manager/mock_application_manager.h @@ -113,6 +113,9 @@ class MockApplicationManager : public application_manager::ApplicationManager { MOCK_CONST_METHOD1(application_by_policy_id, application_manager::ApplicationSharedPtr( const std::string& policy_app_id)); + MOCK_CONST_METHOD1( + pending_application_by_hmi_app, + application_manager::ApplicationSharedPtr(uint32_t hmi_app_id)); MOCK_CONST_METHOD1(pending_application_by_policy_id, application_manager::ApplicationSharedPtr( const std::string& policy_app_id)); -- cgit v1.2.1 From 7edef2f006c58f3dbaa36f88d3922ac3b1fbc447 Mon Sep 17 00:00:00 2001 From: Jacob Keeler Date: Tue, 5 Apr 2022 09:29:23 -0400 Subject: Check if JSON value is a map before accessing members (#3896) --- src/components/security_manager/src/security_manager_impl.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/security_manager/src/security_manager_impl.cc b/src/components/security_manager/src/security_manager_impl.cc index 75cc104d95..59f6da22be 100644 --- a/src/components/security_manager/src/security_manager_impl.cc +++ b/src/components/security_manager/src/security_manager_impl.cc @@ -607,10 +607,11 @@ bool SecurityManagerImpl::ProcessInternalError( Json::Value root; utils::JsonReader reader; - if (!reader.parse(str, &root)) { + if (!reader.parse(str, &root) || !root.isObject()) { SDL_LOG_DEBUG("Json parsing fails."); return false; } + uint8_t id = root[kErrId].asInt(); SDL_LOG_DEBUG("Received InternalError id " << std::to_string(id) << ", text: " << root[kErrText].asString()); -- cgit v1.2.1 From 7cdb7e722f677717527af625b5874c6a7f32b53f Mon Sep 17 00:00:00 2001 From: JackLivio Date: Wed, 6 Apr 2022 09:26:39 -0400 Subject: Obtain appID if url is sent to prop policies (#3883) * Obtain appID if url is sent to prop policies * Add app_id to message string --- .../src/commands/hmi/on_system_request_notification.cc | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_system_request_notification.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_system_request_notification.cc index e19b0441ef..a81ebee5eb 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_system_request_notification.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_system_request_notification.cc @@ -83,11 +83,17 @@ void OnSystemRequestNotification::Run() { if (msg_params.keyExists(strings::url)) { // For backward-compatibility, the URL is cached for retries if provided // by HMI - policy_handler_.CacheRetryInfo(msg_params.keyExists(strings::app_id) - ? msg_params[strings::app_id].asUInt() - : 0, + uint32_t app_id; + if (msg_params.keyExists(strings::app_id)) { + app_id = msg_params[strings::app_id].asUInt(); + } else { + app_id = policy_handler_.ChoosePTUApplication( + policy::PTUIterationType::DefaultIteration); + } + policy_handler_.CacheRetryInfo(app_id, msg_params[strings::url].asString(), msg_params[strings::file_name].asString()); + msg_params[strings::app_id] = app_id; } else { // Clear cached retry info policy_handler_.CacheRetryInfo( -- cgit v1.2.1 From 6b423eb0a2b01600d399cad18f789a7dfbcc83af Mon Sep 17 00:00:00 2001 From: Jacob Keeler Date: Thu, 7 Apr 2022 11:46:22 -0400 Subject: Fix potential crashes by using shared pointers for app data (#3900) --- .../include/application_manager/application.h | 36 ++- .../application_manager/application_data_impl.h | 56 ++-- .../resumption/resumption_data.h | 2 +- .../src/commands/rc_command_request.cc | 2 +- .../test/commands/button_press_request_test.cc | 10 +- .../get_interior_vehicle_data_request_test.cc | 7 +- .../rc_get_interior_vehicle_data_consent_test.cc | 2 + .../set_interior_vehicle_data_request_test.cc | 2 + .../mobile/register_app_interface_request_test.cc | 4 + .../commands/mobile/set_global_properties_test.cc | 336 +++++++++++++-------- .../src/application_data_impl.cc | 198 +++--------- .../src/application_manager_impl.cc | 20 +- .../src/message_helper/message_helper.cc | 12 +- .../src/resumption/resumption_data.cc | 4 +- .../test/application_manager_impl_test.cc | 69 +++-- .../test/help_prompt_manager_test.cc | 76 +++-- .../include/application_manager/mock_application.h | 28 +- .../application_manager/resumption_data_test.h | 30 +- .../test/message_helper/message_helper_test.cc | 92 ++++-- .../test/resumption/resumption_data_test.cc | 63 ++-- 20 files changed, 530 insertions(+), 519 deletions(-) diff --git a/src/components/application_manager/include/application_manager/application.h b/src/components/application_manager/include/application_manager/application.h index 33fa1ae914..e018c28c54 100644 --- a/src/components/application_manager/include/application_manager/application.h +++ b/src/components/application_manager/include/application_manager/application.h @@ -113,14 +113,15 @@ class InitialApplicationData { public: virtual ~InitialApplicationData() {} - virtual const smart_objects::SmartObject* app_types() const = 0; - virtual const smart_objects::SmartObject* vr_synonyms() const = 0; + virtual const smart_objects::SmartObjectSPtr app_types() const = 0; + virtual const smart_objects::SmartObjectSPtr vr_synonyms() const = 0; virtual const std::string& mac_address() const = 0; virtual const std::string& bundle_id() const = 0; virtual void set_bundle_id(const std::string& bundle_id) = 0; virtual std::string policy_app_id() const = 0; - virtual const smart_objects::SmartObject* tts_name() const = 0; - virtual const smart_objects::SmartObject* ngn_media_screen_name() const = 0; + virtual const smart_objects::SmartObjectSPtr tts_name() const = 0; + virtual const smart_objects::SmartObjectSPtr ngn_media_screen_name() + const = 0; virtual const mobile_api::Language::eType& language() const = 0; virtual const mobile_api::Language::eType& ui_language() const = 0; virtual const utils::SemanticVersion& msg_version() const = 0; @@ -195,18 +196,18 @@ typedef std::vector MobileMessageQueue; class DynamicApplicationData { public: virtual ~DynamicApplicationData() {} - virtual const smart_objects::SmartObject* help_prompt() const = 0; - virtual const smart_objects::SmartObject* timeout_prompt() const = 0; - virtual const smart_objects::SmartObject* vr_help_title() const = 0; - virtual const smart_objects::SmartObject* vr_help() const = 0; + virtual const smart_objects::SmartObjectSPtr help_prompt() const = 0; + virtual const smart_objects::SmartObjectSPtr timeout_prompt() const = 0; + virtual const smart_objects::SmartObjectSPtr vr_help_title() const = 0; + virtual const smart_objects::SmartObjectSPtr vr_help() const = 0; virtual const mobile_api::TBTState::eType& tbt_state() const = 0; - virtual const smart_objects::SmartObject* show_command() const = 0; - virtual const smart_objects::SmartObject* tbt_show_command() const = 0; + virtual const smart_objects::SmartObjectSPtr show_command() const = 0; + virtual const smart_objects::SmartObjectSPtr tbt_show_command() const = 0; virtual DataAccessor SubscribedButtons() const = 0; - virtual const smart_objects::SmartObject* keyboard_props() const = 0; - virtual const smart_objects::SmartObject* menu_title() const = 0; - virtual const smart_objects::SmartObject* menu_icon() const = 0; - virtual const smart_objects::SmartObject* menu_layout() const = 0; + virtual const smart_objects::SmartObjectSPtr keyboard_props() const = 0; + virtual const smart_objects::SmartObjectSPtr menu_title() const = 0; + virtual const smart_objects::SmartObjectSPtr menu_icon() const = 0; + virtual const smart_objects::SmartObjectSPtr menu_layout() const = 0; virtual smart_objects::SmartObject day_color_scheme() const = 0; virtual smart_objects::SmartObject night_color_scheme() const = 0; virtual std::string display_layout() const = 0; @@ -558,8 +559,10 @@ class Application : public virtual InitialApplicationData, * @brief Returns message belonging to the application * that is currently executed (i.e. on HMI). * @return smart_objects::SmartObject * Active message + * @deprecated will always return NULL */ - virtual const smart_objects::SmartObject* active_message() const = 0; + DEPRECATED virtual const smart_objects::SmartObject* active_message() + const = 0; /** * @brief returns current hash value @@ -615,7 +618,8 @@ class Application : public virtual InitialApplicationData, */ virtual void set_app_data_resumption_allowance(const bool allowed) = 0; - virtual void CloseActiveMessage() = 0; + // Deprecated, has no effect + DEPRECATED virtual void CloseActiveMessage() = 0; virtual bool IsFullscreen() const = 0; virtual void ChangeSupportingAppHMIType() = 0; diff --git a/src/components/application_manager/include/application_manager/application_data_impl.h b/src/components/application_manager/include/application_manager/application_data_impl.h index e349fd7d4c..b24fb96a2d 100644 --- a/src/components/application_manager/include/application_manager/application_data_impl.h +++ b/src/components/application_manager/include/application_manager/application_data_impl.h @@ -50,11 +50,11 @@ class InitialApplicationDataImpl : public virtual Application { InitialApplicationDataImpl(); ~InitialApplicationDataImpl(); - const smart_objects::SmartObject* app_types() const; - const smart_objects::SmartObject* vr_synonyms() const; + const smart_objects::SmartObjectSPtr app_types() const; + const smart_objects::SmartObjectSPtr vr_synonyms() const; virtual std::string policy_app_id() const; - const smart_objects::SmartObject* tts_name() const; - const smart_objects::SmartObject* ngn_media_screen_name() const; + const smart_objects::SmartObjectSPtr tts_name() const; + const smart_objects::SmartObjectSPtr ngn_media_screen_name() const; const mobile_api::Language::eType& language() const; const mobile_api::Language::eType& ui_language() const; const utils::SemanticVersion& msg_version() const; @@ -73,11 +73,11 @@ class InitialApplicationDataImpl : public virtual Application { mobile_api::LayoutMode::eType perform_interaction_layout() const OVERRIDE; protected: - smart_objects::SmartObject* app_types_; - smart_objects::SmartObject* vr_synonyms_; + smart_objects::SmartObjectSPtr app_types_; + smart_objects::SmartObjectSPtr vr_synonyms_; std::string mobile_app_id_; - smart_objects::SmartObject* tts_name_; - smart_objects::SmartObject* ngn_media_screen_name_; + smart_objects::SmartObjectSPtr tts_name_; + smart_objects::SmartObjectSPtr ngn_media_screen_name_; mobile_api::Language::eType language_; mobile_api::Language::eType ui_language_; mobile_apis::LayoutMode::eType perform_interaction_layout_; @@ -92,17 +92,17 @@ class DynamicApplicationDataImpl : public virtual Application { typedef std::map AppWindowsTemplates; DynamicApplicationDataImpl(); ~DynamicApplicationDataImpl(); - const smart_objects::SmartObject* help_prompt() const; - const smart_objects::SmartObject* timeout_prompt() const; - const smart_objects::SmartObject* vr_help_title() const; - const smart_objects::SmartObject* vr_help() const; + const smart_objects::SmartObjectSPtr help_prompt() const; + const smart_objects::SmartObjectSPtr timeout_prompt() const; + const smart_objects::SmartObjectSPtr vr_help_title() const; + const smart_objects::SmartObjectSPtr vr_help() const; const mobile_api::TBTState::eType& tbt_state() const; - const smart_objects::SmartObject* show_command() const; - const smart_objects::SmartObject* tbt_show_command() const; - const smart_objects::SmartObject* keyboard_props() const; - const smart_objects::SmartObject* menu_title() const; - const smart_objects::SmartObject* menu_icon() const; - const smart_objects::SmartObject* menu_layout() const; + const smart_objects::SmartObjectSPtr show_command() const; + const smart_objects::SmartObjectSPtr tbt_show_command() const; + const smart_objects::SmartObjectSPtr keyboard_props() const; + const smart_objects::SmartObjectSPtr menu_title() const; + const smart_objects::SmartObjectSPtr menu_icon() const; + const smart_objects::SmartObjectSPtr menu_layout() const; smart_objects::SmartObject day_color_scheme() const OVERRIDE; smart_objects::SmartObject night_color_scheme() const OVERRIDE; @@ -321,17 +321,17 @@ class DynamicApplicationDataImpl : public virtual Application { bool is_choice_set_allowed(const uint32_t choice_set_id) const; protected: - smart_objects::SmartObject* help_prompt_; - smart_objects::SmartObject* timeout_prompt_; - smart_objects::SmartObject* vr_help_title_; - smart_objects::SmartObject* vr_help_; + smart_objects::SmartObjectSPtr help_prompt_; + smart_objects::SmartObjectSPtr timeout_prompt_; + smart_objects::SmartObjectSPtr vr_help_title_; + smart_objects::SmartObjectSPtr vr_help_; mobile_api::TBTState::eType tbt_state_; - smart_objects::SmartObject* show_command_; - smart_objects::SmartObject* keyboard_props_; - smart_objects::SmartObject* menu_title_; - smart_objects::SmartObject* menu_icon_; - smart_objects::SmartObject* menu_layout_; - smart_objects::SmartObject* tbt_show_command_; + smart_objects::SmartObjectSPtr show_command_; + smart_objects::SmartObjectSPtr keyboard_props_; + smart_objects::SmartObjectSPtr menu_title_; + smart_objects::SmartObjectSPtr menu_icon_; + smart_objects::SmartObjectSPtr menu_layout_; + smart_objects::SmartObjectSPtr tbt_show_command_; smart_objects::SmartObjectSPtr display_capabilities_; AppWindowsTemplates window_templates_; diff --git a/src/components/application_manager/include/application_manager/resumption/resumption_data.h b/src/components/application_manager/include/application_manager/resumption/resumption_data.h index 69fc5437de..ee9972b98c 100644 --- a/src/components/application_manager/include/application_manager/resumption/resumption_data.h +++ b/src/components/application_manager/include/application_manager/resumption/resumption_data.h @@ -269,7 +269,7 @@ class ResumptionData { * @return smartObject from pointer */ smart_objects::SmartObject PointerToSmartObj( - const smart_objects::SmartObject* ptr) const; + const smart_objects::SmartObjectSPtr ptr) const; /** * @brief creates smart object containing window info diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/rc_command_request.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/rc_command_request.cc index 376723b964..eef3b23d72 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/rc_command_request.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/rc_command_request.cc @@ -146,7 +146,7 @@ void RCCommandRequest::Run() { if (!policy_handler_.CheckHMIType( app->policy_app_id(), mobile_apis::AppHMIType::eType::REMOTE_CONTROL, - app->app_types())) { + app->app_types().get())) { SDL_LOG_WARN("Application has no remote control functions"); SendResponse(false, mobile_apis::Result::DISALLOWED, ""); return; diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/button_press_request_test.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/button_press_request_test.cc index f4ef39f488..17d4f05be7 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/button_press_request_test.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/button_press_request_test.cc @@ -97,10 +97,12 @@ class ButtonPressRequestTest ON_CALL(mock_hmi_capabilities_, rc_capability()) .WillByDefault(Return(rc_capabilities_)); ON_CALL(*mock_app_, policy_app_id()).WillByDefault(Return(kPolicyAppId)); - ON_CALL(mock_policy_handler_, - CheckHMIType(kPolicyAppId, - mobile_apis::AppHMIType::eType::REMOTE_CONTROL, - nullptr)) + ON_CALL(*mock_app_, app_types()) + .WillByDefault(Return(std::shared_ptr())); + ON_CALL( + mock_policy_handler_, + CheckHMIType( + kPolicyAppId, mobile_apis::AppHMIType::eType::REMOTE_CONTROL, _)) .WillByDefault(Return(true)); ON_CALL(mock_allocation_manager_, is_rc_enabled()) .WillByDefault(Return(true)); 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 5fa474c631..b4f9d177ea 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 @@ -104,6 +104,10 @@ class GetInteriorVehicleDataRequestTest smart_objects::SmartType::SmartType_Array)) { ON_CALL(*mock_app_, app_id()).WillByDefault(Return(kAppId)); ON_CALL(*mock_app2_, app_id()).WillByDefault(Return(kAppId2)); + ON_CALL(*mock_app_, app_types()) + .WillByDefault(Return(std::shared_ptr())); + ON_CALL(*mock_app2_, app_types()) + .WillByDefault(Return(std::shared_ptr())); ON_CALL(*mock_app_, is_remote_control_supported()) .WillByDefault(Return(true)); ON_CALL(*mock_app2_, is_remote_control_supported()) @@ -158,8 +162,7 @@ class GetInteriorVehicleDataRequestTest ON_CALL(mock_hmi_capabilities_, rc_capability()) .WillByDefault(Return(rc_capabilities_)); ON_CALL(mock_policy_handler_, - CheckHMIType( - _, mobile_apis::AppHMIType::eType::REMOTE_CONTROL, nullptr)) + CheckHMIType(_, mobile_apis::AppHMIType::eType::REMOTE_CONTROL, _)) .WillByDefault(Return(true)); ON_CALL(mock_policy_handler_, CheckModule(_, _)) .WillByDefault(Return(true)); diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/rc_get_interior_vehicle_data_consent_test.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/rc_get_interior_vehicle_data_consent_test.cc index 82d1b128f0..07ab202620 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/rc_get_interior_vehicle_data_consent_test.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/rc_get_interior_vehicle_data_consent_test.cc @@ -131,6 +131,8 @@ class RCGetInteriorVehicleDataConsentTest smart_objects::SmartObject control_caps((smart_objects::SmartType_Array)); (*rc_capabilities_)[strings::kradioControlCapabilities] = control_caps; ON_CALL(*mock_app_, app_id()).WillByDefault(Return(kAppId)); + ON_CALL(*mock_app_, app_types()) + .WillByDefault(Return(std::shared_ptr())); ON_CALL(app_mngr_, hmi_interfaces()) .WillByDefault(ReturnRef(mock_hmi_interfaces_)); ON_CALL( diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/set_interior_vehicle_data_request_test.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/set_interior_vehicle_data_request_test.cc index fe190a796f..3e6c271ed3 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/set_interior_vehicle_data_request_test.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/set_interior_vehicle_data_request_test.cc @@ -98,6 +98,8 @@ class SetInteriorVehicleDataRequestTest ON_CALL(mock_allocation_manager_, AcquireResource(_, _, _)) .WillByDefault(Return(AcquireResult::ALLOWED)); ON_CALL(*mock_app_, app_id()).WillByDefault(Return(kAppId)); + ON_CALL(*mock_app_, app_types()) + .WillByDefault(Return(std::shared_ptr())); ON_CALL(mock_policy_handler_, CheckHMIType(kPolicyAppId, mobile_apis::AppHMIType::eType::REMOTE_CONTROL, 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 0624c873fa..0e2fafe82b 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 @@ -168,6 +168,10 @@ class RegisterAppInterfaceRequestTest ON_CALL(*mock_app, is_cloud_app()).WillByDefault(Return(false)); ON_CALL(*mock_app, hybrid_app_preference()) .WillByDefault(ReturnRef(kHybridAppPreference)); + ON_CALL(*mock_app, vr_synonyms()) + .WillByDefault(Return(std::shared_ptr())); + ON_CALL(*mock_app, tts_name()) + .WillByDefault(Return(std::shared_ptr())); ON_CALL(*mock_app, policy_app_id()).WillByDefault(Return(kAppId1)); ON_CALL(*mock_app, msg_version()) .WillByDefault(ReturnRef(mock_semantic_version)); 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 4272005fba..de7548cc28 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 @@ -123,13 +123,14 @@ class SetGlobalPropertiesRequestTest } void VRArraySetupHelper(MessageSharedPtr msg, - SmartObject& vr_help_title, - SmartObject& vr_help_array) { - (*msg)[am::strings::msg_params][am::strings::vr_help_title] = vr_help_title; - vr_help_array[0] = SmartObject(smart_objects::SmartType_Map); - vr_help_array[0][am::strings::text] = kText; - vr_help_array[0][am::strings::position] = kPosition; - (*msg)[am::strings::msg_params][am::strings::vr_help] = vr_help_array; + smart_objects::SmartObjectSPtr vr_help_title, + smart_objects::SmartObjectSPtr vr_help_array) { + (*msg)[am::strings::msg_params][am::strings::vr_help_title] = + *vr_help_title; + (*vr_help_array)[0] = SmartObject(smart_objects::SmartType_Map); + (*vr_help_array)[0][am::strings::text] = kText; + (*vr_help_array)[0][am::strings::position] = kPosition; + (*msg)[am::strings::msg_params][am::strings::vr_help] = *vr_help_array; EXPECT_CALL(app_mngr_, application(kConnectionKey)) .WillOnce(Return(mock_app_)); } @@ -137,18 +138,20 @@ class SetGlobalPropertiesRequestTest void OnEventUISetupHelper( MessageSharedPtr msg, std::shared_ptr command) { - SmartObject vr_help_title("yes"); - SmartObject vr_help_array(smart_objects::SmartType_Array); + smart_objects::SmartObjectSPtr vr_help_title = + std::make_shared("yes"); + smart_objects::SmartObjectSPtr vr_help_array = + std::make_shared(smart_objects::SmartType_Array); VRArraySetupHelper(msg, vr_help_title, vr_help_array); EXPECT_CALL(mock_message_helper_, - VerifyImageVrHelpItems(vr_help_array, _, _)) + VerifyImageVrHelpItems(*vr_help_array, _, _)) .WillOnce((Return(mobile_apis::Result::SUCCESS))); EXPECT_CALL(app_mngr_, RemoveAppFromTTSGlobalPropertiesList(kConnectionKey)); - EXPECT_CALL(*mock_app_, set_vr_help_title(vr_help_title)); - EXPECT_CALL(*mock_app_, set_vr_help(vr_help_array)); - EXPECT_CALL(*mock_app_, vr_help_title()).WillOnce(Return(&vr_help_title)); - EXPECT_CALL(*mock_app_, vr_help()).WillOnce(Return(&vr_help_array)); + EXPECT_CALL(*mock_app_, set_vr_help_title(*vr_help_title)); + EXPECT_CALL(*mock_app_, set_vr_help(*vr_help_array)); + EXPECT_CALL(*mock_app_, vr_help_title()).WillOnce(Return(vr_help_title)); + EXPECT_CALL(*mock_app_, vr_help()).WillOnce(Return(vr_help_array)); EXPECT_CALL(*mock_app_, set_menu_title(_)).Times(0); EXPECT_CALL(*mock_app_, set_menu_icon(_)).Times(0); EXPECT_CALL(*mock_app_, set_keyboard_props(_)).Times(0); @@ -165,27 +168,29 @@ class SetGlobalPropertiesRequestTest void OnEventTTSSetupHelper( MessageSharedPtr msg, std::shared_ptr command) { - SmartObject help_prompt(smart_objects::SmartType_Array); - help_prompt[0][am::strings::text] = "Help_Prompt_One"; - (*msg)[am::strings::msg_params][am::strings::help_prompt] = help_prompt; - SmartObject timeout_prompt(smart_objects::SmartType_Array); - timeout_prompt[0][am::strings::text] = "Timeout_Prompt_One"; + smart_objects::SmartObjectSPtr help_prompt = + std::make_shared(smart_objects::SmartType_Array); + (*help_prompt)[0][am::strings::text] = "Help_Prompt_One"; + (*msg)[am::strings::msg_params][am::strings::help_prompt] = *help_prompt; + smart_objects::SmartObjectSPtr timeout_prompt = + std::make_shared(smart_objects::SmartType_Array); + (*timeout_prompt)[0][am::strings::text] = "Timeout_Prompt_One"; (*msg)[am::strings::msg_params][am::strings::timeout_prompt] = - timeout_prompt; + *timeout_prompt; EXPECT_CALL(app_mngr_, application(kConnectionKey)) .WillOnce(Return(mock_app_)); EXPECT_CALL(mock_message_helper_, VerifyImageVrHelpItems(_, _, _)).Times(0); - EXPECT_CALL(mock_message_helper_, VerifyTtsFiles(help_prompt, _, _)) + EXPECT_CALL(mock_message_helper_, VerifyTtsFiles(*help_prompt, _, _)) .WillOnce(Return(mobile_apis::Result::SUCCESS)); - EXPECT_CALL(mock_message_helper_, VerifyTtsFiles(timeout_prompt, _, _)) + EXPECT_CALL(mock_message_helper_, VerifyTtsFiles(*timeout_prompt, _, _)) .WillOnce(Return(mobile_apis::Result::SUCCESS)); EXPECT_CALL(app_mngr_, RemoveAppFromTTSGlobalPropertiesList(kConnectionKey)); - EXPECT_CALL(*mock_app_, set_help_prompt(help_prompt)); - EXPECT_CALL(*mock_app_, help_prompt()).WillOnce(Return(&help_prompt)); - EXPECT_CALL(*mock_app_, set_timeout_prompt(timeout_prompt)); - EXPECT_CALL(*mock_app_, timeout_prompt()).WillOnce(Return(&timeout_prompt)); + EXPECT_CALL(*mock_app_, set_help_prompt(*help_prompt)); + EXPECT_CALL(*mock_app_, help_prompt()).WillOnce(Return(help_prompt)); + EXPECT_CALL(*mock_app_, set_timeout_prompt(*timeout_prompt)); + EXPECT_CALL(*mock_app_, timeout_prompt()).WillOnce(Return(timeout_prompt)); EXPECT_CALL(*mock_app_, app_id()).WillOnce(Return(kAppId)); EXPECT_CALL(*mock_app_, help_prompt_manager()) @@ -437,12 +442,14 @@ TEST_F(SetGlobalPropertiesRequestTest, CreateCommand(msg_vr); EXPECT_CALL(app_mngr_, RemoveAppFromTTSGlobalPropertiesList(kConnectionKey)); - const smart_objects::SmartObject* vr_help_title = - &((*msg_vr)[am::strings::msg_params][am::strings::vr_help_title]); - const smart_objects::SmartObject* vr_help = - &((*msg_vr)[am::strings::msg_params][am::strings::vr_help]); - const smart_objects::SmartObject* vr_help_prompt = - &((*msg_vr)[am::strings::msg_params][am::strings::help_prompt]); + const smart_objects::SmartObjectSPtr vr_help_title = + std::make_shared( + (*msg_vr)[am::strings::msg_params][am::strings::vr_help_title]); + const smart_objects::SmartObjectSPtr vr_help = std::make_shared( + (*msg_vr)[am::strings::msg_params][am::strings::vr_help]); + const smart_objects::SmartObjectSPtr vr_help_prompt = + std::make_shared( + (*msg_vr)[am::strings::msg_params][am::strings::help_prompt]); ON_CALL(*mock_app_, vr_help_title()).WillByDefault(Return(vr_help_title)); ON_CALL(*mock_app_, vr_help()).WillByDefault(Return(vr_help)); ON_CALL(*mock_app_, help_prompt()).WillByDefault(Return(vr_help_prompt)); @@ -606,31 +613,37 @@ TEST_F(SetGlobalPropertiesRequestTest, Run_VRNoMenuAndKeyboard_SUCCESS) { TEST_F(SetGlobalPropertiesRequestTest, Run_VRWithMenuAndKeyboard_SUCCESS) { MessageSharedPtr msg = CreateMsgParams(); - SmartObject vr_help_title("yes"); - SmartObject vr_help_array(smart_objects::SmartType_Array); + smart_objects::SmartObjectSPtr vr_help_title = + std::make_shared("yes"); + smart_objects::SmartObjectSPtr vr_help_array = + std::make_shared(smart_objects::SmartType_Array); VRArraySetupHelper(msg, vr_help_title, vr_help_array); - (*msg)[am::strings::msg_params][am::strings::vr_help] = vr_help_array; + (*msg)[am::strings::msg_params][am::strings::vr_help] = *vr_help_array; SmartObject menu_title("Menu_Title"); (*msg)[am::strings::msg_params][am::hmi_request::menu_title] = menu_title; SmartObject menu_icon(smart_objects::SmartType_Map); menu_icon[am::strings::value] = "1"; (*msg)[am::strings::msg_params][am::hmi_request::menu_icon] = menu_icon; - SmartObject keyboard_properties(smart_objects::SmartType_Map); + smart_objects::SmartObjectSPtr keyboard_properties = + std::make_shared(smart_objects::SmartType_Map); (*msg)[am::strings::msg_params][am::hmi_request::keyboard_properties] = - keyboard_properties; + *keyboard_properties; EXPECT_CALL(mock_message_helper_, VerifyImage(menu_icon, _, _)) .WillOnce((Return(mobile_apis::Result::SUCCESS))); - EXPECT_CALL(mock_message_helper_, VerifyImageVrHelpItems(vr_help_array, _, _)) + EXPECT_CALL(mock_message_helper_, + VerifyImageVrHelpItems(*vr_help_array, _, _)) .WillOnce((Return(mobile_apis::Result::SUCCESS))); EXPECT_CALL(app_mngr_, RemoveAppFromTTSGlobalPropertiesList(kConnectionKey)); - EXPECT_CALL(*mock_app_, set_vr_help_title(vr_help_title)); - EXPECT_CALL(*mock_app_, set_vr_help(vr_help_array)); - EXPECT_CALL(*mock_app_, vr_help_title()).WillOnce(Return(&vr_help_title)); - EXPECT_CALL(*mock_app_, vr_help()).WillOnce(Return(&vr_help_array)); + EXPECT_CALL(*mock_app_, set_vr_help_title(*vr_help_title)); + EXPECT_CALL(*mock_app_, set_vr_help(*vr_help_array)); + EXPECT_CALL(*mock_app_, vr_help_title()).WillOnce(Return(vr_help_title)); + EXPECT_CALL(*mock_app_, vr_help()).WillOnce(Return(vr_help_array)); EXPECT_CALL(*mock_app_, set_menu_title(menu_title)); EXPECT_CALL(*mock_app_, set_menu_icon(menu_icon)); - EXPECT_CALL(*mock_app_, set_keyboard_props(keyboard_properties)); + EXPECT_CALL(*mock_app_, set_keyboard_props(*keyboard_properties)); + EXPECT_CALL(*mock_app_, keyboard_props()) + .WillOnce(Return(keyboard_properties)); EXPECT_CALL(*mock_app_, app_id()).WillOnce(Return(kAppId)); EXPECT_CALL( @@ -656,31 +669,37 @@ TEST_F(SetGlobalPropertiesRequestTest, Run_VRWithMenuAndKeyboard_SUCCESS) { TEST_F(SetGlobalPropertiesRequestTest, Run_VRWithMenuAndKeyboard_Menu_WARNINGS) { MessageSharedPtr msg = CreateMsgParams(); - SmartObject vr_help_title("yes"); - SmartObject vr_help_array(smart_objects::SmartType_Array); + smart_objects::SmartObjectSPtr vr_help_title = + std::make_shared("yes"); + smart_objects::SmartObjectSPtr vr_help_array = + std::make_shared(smart_objects::SmartType_Array); VRArraySetupHelper(msg, vr_help_title, vr_help_array); - (*msg)[am::strings::msg_params][am::strings::vr_help] = vr_help_array; + (*msg)[am::strings::msg_params][am::strings::vr_help] = *vr_help_array; SmartObject menu_title("Menu_Title"); (*msg)[am::strings::msg_params][am::hmi_request::menu_title] = menu_title; SmartObject menu_icon(smart_objects::SmartType_Map); menu_icon[am::strings::value] = "1"; (*msg)[am::strings::msg_params][am::hmi_request::menu_icon] = menu_icon; - SmartObject keyboard_properties(smart_objects::SmartType_Map); + smart_objects::SmartObjectSPtr keyboard_properties = + std::make_shared(smart_objects::SmartType_Map); (*msg)[am::strings::msg_params][am::hmi_request::keyboard_properties] = - keyboard_properties; + *keyboard_properties; EXPECT_CALL(mock_message_helper_, VerifyImage(menu_icon, _, _)) .WillOnce((Return(mobile_apis::Result::WARNINGS))); - EXPECT_CALL(mock_message_helper_, VerifyImageVrHelpItems(vr_help_array, _, _)) + EXPECT_CALL(mock_message_helper_, + VerifyImageVrHelpItems(*vr_help_array, _, _)) .WillOnce((Return(mobile_apis::Result::SUCCESS))); EXPECT_CALL(app_mngr_, RemoveAppFromTTSGlobalPropertiesList(kConnectionKey)); - EXPECT_CALL(*mock_app_, set_vr_help_title(vr_help_title)); - EXPECT_CALL(*mock_app_, set_vr_help(vr_help_array)); - EXPECT_CALL(*mock_app_, vr_help_title()).WillOnce(Return(&vr_help_title)); - EXPECT_CALL(*mock_app_, vr_help()).WillOnce(Return(&vr_help_array)); + EXPECT_CALL(*mock_app_, set_vr_help_title(*vr_help_title)); + EXPECT_CALL(*mock_app_, set_vr_help(*vr_help_array)); + EXPECT_CALL(*mock_app_, vr_help_title()).WillOnce(Return(vr_help_title)); + EXPECT_CALL(*mock_app_, vr_help()).WillOnce(Return(vr_help_array)); EXPECT_CALL(*mock_app_, set_menu_title(menu_title)); EXPECT_CALL(*mock_app_, set_menu_icon(menu_icon)); - EXPECT_CALL(*mock_app_, set_keyboard_props(keyboard_properties)); + EXPECT_CALL(*mock_app_, set_keyboard_props(*keyboard_properties)); + EXPECT_CALL(*mock_app_, keyboard_props()) + .WillOnce(Return(keyboard_properties)); EXPECT_CALL(*mock_app_, app_id()).WillOnce(Return(kAppId)); EXPECT_CALL(*mock_app_, help_prompt_manager()) .WillOnce(ReturnRef(*mock_help_prompt_manager_.get())); @@ -704,31 +723,37 @@ TEST_F(SetGlobalPropertiesRequestTest, TEST_F(SetGlobalPropertiesRequestTest, Run_VRWithMenuAndKeyboard_VR_WARNINGS) { MessageSharedPtr msg = CreateMsgParams(); - SmartObject vr_help_title("yes"); - SmartObject vr_help_array(smart_objects::SmartType_Array); + smart_objects::SmartObjectSPtr vr_help_title = + std::make_shared("yes"); + smart_objects::SmartObjectSPtr vr_help_array = + std::make_shared(smart_objects::SmartType_Array); VRArraySetupHelper(msg, vr_help_title, vr_help_array); - (*msg)[am::strings::msg_params][am::strings::vr_help] = vr_help_array; + (*msg)[am::strings::msg_params][am::strings::vr_help] = *vr_help_array; SmartObject menu_title("Menu_Title"); (*msg)[am::strings::msg_params][am::hmi_request::menu_title] = menu_title; SmartObject menu_icon(smart_objects::SmartType_Map); menu_icon[am::strings::value] = "1"; (*msg)[am::strings::msg_params][am::hmi_request::menu_icon] = menu_icon; - SmartObject keyboard_properties(smart_objects::SmartType_Map); + smart_objects::SmartObjectSPtr keyboard_properties = + std::make_shared(smart_objects::SmartType_Map); (*msg)[am::strings::msg_params][am::hmi_request::keyboard_properties] = - keyboard_properties; + *keyboard_properties; EXPECT_CALL(mock_message_helper_, VerifyImage(menu_icon, _, _)) .WillOnce((Return(mobile_apis::Result::SUCCESS))); - EXPECT_CALL(mock_message_helper_, VerifyImageVrHelpItems(vr_help_array, _, _)) + EXPECT_CALL(mock_message_helper_, + VerifyImageVrHelpItems(*vr_help_array, _, _)) .WillOnce((Return(mobile_apis::Result::WARNINGS))); EXPECT_CALL(app_mngr_, RemoveAppFromTTSGlobalPropertiesList(kConnectionKey)); - EXPECT_CALL(*mock_app_, set_vr_help_title(vr_help_title)); - EXPECT_CALL(*mock_app_, set_vr_help(vr_help_array)); - EXPECT_CALL(*mock_app_, vr_help_title()).WillOnce(Return(&vr_help_title)); - EXPECT_CALL(*mock_app_, vr_help()).WillOnce(Return(&vr_help_array)); + EXPECT_CALL(*mock_app_, set_vr_help_title(*vr_help_title)); + EXPECT_CALL(*mock_app_, set_vr_help(*vr_help_array)); + EXPECT_CALL(*mock_app_, vr_help_title()).WillOnce(Return(vr_help_title)); + EXPECT_CALL(*mock_app_, vr_help()).WillOnce(Return(vr_help_array)); EXPECT_CALL(*mock_app_, set_menu_title(menu_title)); EXPECT_CALL(*mock_app_, set_menu_icon(menu_icon)); - EXPECT_CALL(*mock_app_, set_keyboard_props(keyboard_properties)); + EXPECT_CALL(*mock_app_, set_keyboard_props(*keyboard_properties)); + EXPECT_CALL(*mock_app_, keyboard_props()) + .WillOnce(Return(keyboard_properties)); EXPECT_CALL(*mock_app_, app_id()).WillOnce(Return(kAppId)); EXPECT_CALL(*mock_app_, help_prompt_manager()) .WillOnce(ReturnRef(*mock_help_prompt_manager_.get())); @@ -772,25 +797,28 @@ TEST_F(SetGlobalPropertiesRequestTest, Run_VRBrokenMenuIcon_Canceled) { TEST_F(SetGlobalPropertiesRequestTest, Run_VRBrokenVRHelp_Canceled) { MessageSharedPtr msg = CreateMsgParams(); - SmartObject vr_help_title("yes"); + smart_objects::SmartObjectSPtr vr_help_title = + std::make_shared("yes"); SmartObject menu_icon(smart_objects::SmartType_Map); menu_icon[am::strings::value] = "1"; (*msg)[am::strings::msg_params][am::hmi_request::menu_icon] = menu_icon; - SmartObject vr_help_array(smart_objects::SmartType_Array); + smart_objects::SmartObjectSPtr vr_help_array = + std::make_shared(smart_objects::SmartType_Array); VRArraySetupHelper(msg, vr_help_title, vr_help_array); SmartObject menu_title("Menu_Title"); (*msg)[am::strings::msg_params][am::hmi_request::menu_title] = menu_title; EXPECT_CALL(mock_message_helper_, VerifyImage(menu_icon, _, _)) .WillOnce((Return(mobile_apis::Result::SUCCESS))); - EXPECT_CALL(mock_message_helper_, VerifyImageVrHelpItems(vr_help_array, _, _)) + EXPECT_CALL(mock_message_helper_, + VerifyImageVrHelpItems(*vr_help_array, _, _)) .WillOnce((Return(mobile_apis::Result::ABORTED))); EmptyExpectationsSetupHelper(); - EXPECT_CALL(*mock_app_, vr_help_title()).WillOnce(Return(&vr_help_title)); - EXPECT_CALL(*mock_app_, vr_help()).WillOnce(Return(&vr_help_array)); - EXPECT_CALL(*mock_app_, set_vr_help_title(vr_help_title)); - EXPECT_CALL(*mock_app_, set_vr_help(vr_help_array)); + EXPECT_CALL(*mock_app_, vr_help_title()).WillOnce(Return(vr_help_title)); + EXPECT_CALL(*mock_app_, vr_help()).WillOnce(Return(vr_help_array)); + EXPECT_CALL(*mock_app_, set_vr_help_title(*vr_help_title)); + EXPECT_CALL(*mock_app_, set_vr_help(*vr_help_array)); EXPECT_CALL(*mock_app_, set_menu_title(menu_title)); EXPECT_CALL(*mock_app_, set_menu_icon(menu_icon)); EXPECT_CALL(*mock_app_, app_id()).WillOnce(Return(kAppId)); @@ -809,16 +837,19 @@ TEST_F(SetGlobalPropertiesRequestTest, Run_VRIncorrectSyntax_Canceled) { MessageSharedPtr msg = CreateMsgParams(); (*msg)[am::strings::params][am::strings::connection_key] = kConnectionKey; (*msg)[am::strings::msg_params][am::strings::app_id] = kAppId; - SmartObject vr_help_title("wrong syntax string\\n"); + smart_objects::SmartObjectSPtr vr_help_title = + std::make_shared("wrong syntax string\\n"); SmartObject menu_icon(smart_objects::SmartType_Map); menu_icon[am::strings::value] = "1"; (*msg)[am::strings::msg_params][am::hmi_request::menu_icon] = menu_icon; - SmartObject vr_help_array(smart_objects::SmartType_Array); + smart_objects::SmartObjectSPtr vr_help_array = + std::make_shared(smart_objects::SmartType_Array); VRArraySetupHelper(msg, vr_help_title, vr_help_array); EXPECT_CALL(mock_message_helper_, VerifyImage(menu_icon, _, _)) .WillOnce((Return(mobile_apis::Result::SUCCESS))); - EXPECT_CALL(mock_message_helper_, VerifyImageVrHelpItems(vr_help_array, _, _)) + EXPECT_CALL(mock_message_helper_, + VerifyImageVrHelpItems(*vr_help_array, _, _)) .WillOnce((Return(mobile_apis::Result::SUCCESS))); EXPECT_CALL(app_mngr_, RemoveAppFromTTSGlobalPropertiesList(_)).Times(0); EmptyExpectationsSetupHelper(); @@ -869,15 +900,18 @@ TEST_F(SetGlobalPropertiesRequestTest, Run_VRMissingArray_Canceled) { TEST_F(SetGlobalPropertiesRequestTest, Run_VRWrongOrder_Canceled) { MessageSharedPtr msg = CreateMsgParams(); - SmartObject vr_help_title("yes"); - SmartObject vr_help_array(smart_objects::SmartType_Array); + smart_objects::SmartObjectSPtr vr_help_title = + std::make_shared("yes"); + smart_objects::SmartObjectSPtr vr_help_array = + std::make_shared(smart_objects::SmartType_Array); VRArraySetupHelper(msg, vr_help_title, vr_help_array); - vr_help_array[1] = SmartObject(smart_objects::SmartType_Map); - vr_help_array[1][am::strings::text] = "two"; - vr_help_array[1][am::strings::position] = 3u; - (*msg)[am::strings::msg_params][am::strings::vr_help] = vr_help_array; + (*vr_help_array)[1] = SmartObject(smart_objects::SmartType_Map); + (*vr_help_array)[1][am::strings::text] = "two"; + (*vr_help_array)[1][am::strings::position] = 3u; + (*msg)[am::strings::msg_params][am::strings::vr_help] = *vr_help_array; - EXPECT_CALL(mock_message_helper_, VerifyImageVrHelpItems(vr_help_array, _, _)) + EXPECT_CALL(mock_message_helper_, + VerifyImageVrHelpItems(*vr_help_array, _, _)) .WillOnce((Return(mobile_apis::Result::SUCCESS))); EXPECT_CALL(app_mngr_, RemoveAppFromTTSGlobalPropertiesList(kConnectionKey)); EmptyExpectationsSetupHelper(); @@ -890,9 +924,10 @@ TEST_F(SetGlobalPropertiesRequestTest, Run_VRWrongOrder_Canceled) { TEST_F(SetGlobalPropertiesRequestTest, Run_NoVR_SUCCESS) { MessageSharedPtr msg = CreateMsgParams(); - SmartObject keyboard_properties(smart_objects::SmartType_Map); + smart_objects::SmartObjectSPtr keyboard_properties = + std::make_shared(smart_objects::SmartType_Map); (*msg)[am::strings::msg_params][am::hmi_request::keyboard_properties] = - keyboard_properties; + *keyboard_properties; SmartObject menu_title("Menu_Title"); (*msg)[am::strings::msg_params][am::hmi_request::menu_title] = menu_title; @@ -902,7 +937,9 @@ TEST_F(SetGlobalPropertiesRequestTest, Run_NoVR_SUCCESS) { EXPECT_CALL(app_mngr_, RemoveAppFromTTSGlobalPropertiesList(kConnectionKey)); EXPECT_CALL(*mock_app_, set_menu_title(menu_title)); EXPECT_CALL(*mock_app_, set_menu_icon(_)).Times(0); - EXPECT_CALL(*mock_app_, set_keyboard_props(keyboard_properties)); + EXPECT_CALL(*mock_app_, set_keyboard_props(*keyboard_properties)); + EXPECT_CALL(*mock_app_, keyboard_props()) + .WillOnce(Return(keyboard_properties)); EXPECT_CALL(*mock_app_, app_id()).WillOnce(Return(kAppId)); EXPECT_CALL( @@ -921,15 +958,19 @@ TEST_F(SetGlobalPropertiesRequestTest, Run_NoVR_SUCCESS) { TEST_F(SetGlobalPropertiesRequestTest, Run_VRCouldNotGenerate_INVALID_DATA) { MessageSharedPtr msg = CreateMsgParams(); - SmartObject keyboard_properties(smart_objects::SmartType_Map); + smart_objects::SmartObjectSPtr keyboard_properties = + std::make_shared(smart_objects::SmartType_Map); (*msg)[am::strings::msg_params][am::hmi_request::keyboard_properties] = - keyboard_properties; + *keyboard_properties; SmartObject menu_title("Menu_Title"); (*msg)[am::strings::msg_params][am::hmi_request::menu_title] = menu_title; EXPECT_CALL(app_mngr_, application(kConnectionKey)) .WillOnce(Return(mock_app_)); EXPECT_CALL(app_mngr_, RemoveAppFromTTSGlobalPropertiesList(kConnectionKey)); + EXPECT_CALL(*mock_app_, set_keyboard_props(*keyboard_properties)); + EXPECT_CALL(*mock_app_, keyboard_props()) + .WillOnce(Return(std::shared_ptr())); EXPECT_CALL(*mock_app_, set_menu_title(menu_title)); std::shared_ptr command( @@ -951,6 +992,8 @@ TEST_F(SetGlobalPropertiesRequestTest, Run_NoVRNoDataNoDefault_Canceled) { EXPECT_CALL(*mock_app_, set_menu_title(_)).Times(0); EXPECT_CALL(*mock_app_, set_menu_icon(_)).Times(0); EXPECT_CALL(*mock_app_, set_keyboard_props(_)); + EXPECT_CALL(*mock_app_, keyboard_props()) + .WillOnce(Return(std::shared_ptr())); EXPECT_CALL(*mock_app_, app_id()); EXPECT_CALL( @@ -980,6 +1023,8 @@ TEST_F(SetGlobalPropertiesRequestTest, Run_NoVRNoDataDefaultCreated_SUCCESS) { EXPECT_CALL(*mock_app_, set_menu_title(_)).Times(0); EXPECT_CALL(*mock_app_, set_menu_icon(_)).Times(0); EXPECT_CALL(*mock_app_, set_keyboard_props(keyboard_properties)); + EXPECT_CALL(*mock_app_, keyboard_props()) + .WillOnce(Return(std::shared_ptr())); EXPECT_CALL(*mock_app_, app_id()).WillOnce(Return(kAppId)); EXPECT_CALL( mock_hmi_interfaces_, @@ -1014,6 +1059,8 @@ TEST_F(SetGlobalPropertiesRequestTest, Run_NoVRNoDataFromSynonyms_SUCCESS) { EXPECT_CALL(*mock_app_, set_menu_title(_)).Times(0); EXPECT_CALL(*mock_app_, set_menu_icon(_)).Times(0); EXPECT_CALL(*mock_app_, set_keyboard_props(keyboard_properties)); + EXPECT_CALL(*mock_app_, keyboard_props()) + .WillOnce(Return(std::shared_ptr())); EXPECT_CALL(*mock_app_, app_id()).WillOnce(Return(kAppId)); EXPECT_CALL( mock_hmi_interfaces_, @@ -1030,25 +1077,28 @@ TEST_F(SetGlobalPropertiesRequestTest, Run_NoVRNoDataFromSynonyms_SUCCESS) { TEST_F(SetGlobalPropertiesRequestTest, Run_TTSHelpAndTimeout_SUCCESS) { MessageSharedPtr msg = CreateMsgParams(); - SmartObject help_prompt(smart_objects::SmartType_Array); - help_prompt[0][am::strings::text] = "Help_Prompt_One"; - (*msg)[am::strings::msg_params][am::strings::help_prompt] = help_prompt; - SmartObject timeout_prompt(smart_objects::SmartType_Array); - timeout_prompt[0][am::strings::text] = "Timeout_Prompt_One"; - (*msg)[am::strings::msg_params][am::strings::timeout_prompt] = timeout_prompt; + smart_objects::SmartObjectSPtr help_prompt = + std::make_shared(smart_objects::SmartType_Array); + (*help_prompt)[0][am::strings::text] = "Help_Prompt_One"; + (*msg)[am::strings::msg_params][am::strings::help_prompt] = *help_prompt; + smart_objects::SmartObjectSPtr timeout_prompt = + std::make_shared(smart_objects::SmartType_Array); + (*timeout_prompt)[0][am::strings::text] = "Timeout_Prompt_One"; + (*msg)[am::strings::msg_params][am::strings::timeout_prompt] = + *timeout_prompt; EXPECT_CALL(app_mngr_, application(kConnectionKey)) .WillOnce(Return(mock_app_)); EXPECT_CALL(mock_message_helper_, VerifyImageVrHelpItems(_, _, _)).Times(0); - EXPECT_CALL(mock_message_helper_, VerifyTtsFiles(help_prompt, _, _)) + EXPECT_CALL(mock_message_helper_, VerifyTtsFiles(*help_prompt, _, _)) .WillOnce(Return(mobile_apis::Result::SUCCESS)); - EXPECT_CALL(mock_message_helper_, VerifyTtsFiles(timeout_prompt, _, _)) + EXPECT_CALL(mock_message_helper_, VerifyTtsFiles(*timeout_prompt, _, _)) .WillOnce(Return(mobile_apis::Result::SUCCESS)); EXPECT_CALL(app_mngr_, RemoveAppFromTTSGlobalPropertiesList(kConnectionKey)); - EXPECT_CALL(*mock_app_, set_help_prompt(help_prompt)); - EXPECT_CALL(*mock_app_, help_prompt()).WillOnce(Return(&help_prompt)); - EXPECT_CALL(*mock_app_, set_timeout_prompt(timeout_prompt)); - EXPECT_CALL(*mock_app_, timeout_prompt()).WillOnce(Return(&timeout_prompt)); + EXPECT_CALL(*mock_app_, set_help_prompt(*help_prompt)); + EXPECT_CALL(*mock_app_, help_prompt()).WillOnce(Return(help_prompt)); + EXPECT_CALL(*mock_app_, set_timeout_prompt(*timeout_prompt)); + EXPECT_CALL(*mock_app_, timeout_prompt()).WillOnce(Return(timeout_prompt)); EXPECT_CALL(*mock_app_, app_id()).WillOnce(Return(kAppId)); EXPECT_CALL( @@ -1072,18 +1122,19 @@ TEST_F(SetGlobalPropertiesRequestTest, Run_TTSHelpAndTimeout_SUCCESS) { TEST_F(SetGlobalPropertiesRequestTest, Run_TTSOnlyHelp_SUCCESS) { MessageSharedPtr msg = CreateMsgParams(); - SmartObject help_prompt(smart_objects::SmartType_Array); - help_prompt[0][am::strings::text] = "Help_Prompt_One"; - (*msg)[am::strings::msg_params][am::strings::help_prompt] = help_prompt; + smart_objects::SmartObjectSPtr help_prompt = + std::make_shared(smart_objects::SmartType_Array); + (*help_prompt)[0][am::strings::text] = "Help_Prompt_One"; + (*msg)[am::strings::msg_params][am::strings::help_prompt] = *help_prompt; EXPECT_CALL(app_mngr_, application(kConnectionKey)) .WillOnce(Return(mock_app_)); EXPECT_CALL(mock_message_helper_, VerifyImageVrHelpItems(_, _, _)).Times(0); - EXPECT_CALL(mock_message_helper_, VerifyTtsFiles(help_prompt, _, _)) + EXPECT_CALL(mock_message_helper_, VerifyTtsFiles(*help_prompt, _, _)) .WillOnce(Return(mobile_apis::Result::SUCCESS)); EXPECT_CALL(app_mngr_, RemoveAppFromTTSGlobalPropertiesList(kConnectionKey)); - EXPECT_CALL(*mock_app_, set_help_prompt(help_prompt)); - EXPECT_CALL(*mock_app_, help_prompt()).WillOnce(Return(&help_prompt)); + EXPECT_CALL(*mock_app_, set_help_prompt(*help_prompt)); + EXPECT_CALL(*mock_app_, help_prompt()).WillOnce(Return(help_prompt)); EXPECT_CALL(*mock_app_, set_timeout_prompt(_)).Times(0); EXPECT_CALL(*mock_app_, timeout_prompt()).Times(0); EXPECT_CALL(*mock_app_, app_id()).WillOnce(Return(kAppId)); @@ -1106,20 +1157,22 @@ TEST_F(SetGlobalPropertiesRequestTest, Run_TTSOnlyHelp_SUCCESS) { TEST_F(SetGlobalPropertiesRequestTest, Run_TTSOnlyTimeout_SUCCESS) { MessageSharedPtr msg = CreateMsgParams(); - SmartObject timeout_prompt(smart_objects::SmartType_Array); - timeout_prompt[0][am::strings::text] = "Timeout_Prompt_One"; - (*msg)[am::strings::msg_params][am::strings::timeout_prompt] = timeout_prompt; + smart_objects::SmartObjectSPtr timeout_prompt = + std::make_shared(smart_objects::SmartType_Array); + (*timeout_prompt)[0][am::strings::text] = "Timeout_Prompt_One"; + (*msg)[am::strings::msg_params][am::strings::timeout_prompt] = + *timeout_prompt; EXPECT_CALL(app_mngr_, application(kConnectionKey)) .WillOnce(Return(mock_app_)); EXPECT_CALL(mock_message_helper_, VerifyImageVrHelpItems(_, _, _)).Times(0); - EXPECT_CALL(mock_message_helper_, VerifyTtsFiles(timeout_prompt, _, _)) + EXPECT_CALL(mock_message_helper_, VerifyTtsFiles(*timeout_prompt, _, _)) .WillOnce(Return(mobile_apis::Result::SUCCESS)); EXPECT_CALL(app_mngr_, RemoveAppFromTTSGlobalPropertiesList(kConnectionKey)); EXPECT_CALL(*mock_app_, set_help_prompt(_)).Times(0); EXPECT_CALL(*mock_app_, help_prompt()).Times(0); - EXPECT_CALL(*mock_app_, set_timeout_prompt(timeout_prompt)); - EXPECT_CALL(*mock_app_, timeout_prompt()).WillOnce(Return(&timeout_prompt)); + EXPECT_CALL(*mock_app_, set_timeout_prompt(*timeout_prompt)); + EXPECT_CALL(*mock_app_, timeout_prompt()).WillOnce(Return(timeout_prompt)); EXPECT_CALL(*mock_app_, app_id()).WillOnce(Return(kAppId)); EXPECT_CALL( mock_hmi_interfaces_, @@ -1335,11 +1388,12 @@ TEST_F(SetGlobalPropertiesRequestTest, 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] = + auto saved_keyboard_props = + std::make_shared(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)); + .WillOnce(Return(saved_keyboard_props)); const int num_allowed_keys = 0; auto display_capabilities = GetCapabilitiesForConfigurableKeyboard( @@ -1371,6 +1425,9 @@ TEST_F(SetGlobalPropertiesRequestTest, std::shared_ptr command( CreateCommand(msg)); + EXPECT_CALL(*mock_app_, keyboard_props()) + .WillOnce(Return(std::shared_ptr())); + ExpectInvalidData(); command->Run(); @@ -1421,6 +1478,8 @@ TEST_F(SetGlobalPropertiesRequestTest, CreateCommand(msg)); EXPECT_CALL(*mock_app_, set_keyboard_props(keyboard_properties)); + EXPECT_CALL(*mock_app_, keyboard_props()) + .WillOnce(Return(std::shared_ptr())); command->Run(); } @@ -1433,11 +1492,12 @@ TEST_F( 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] = + auto saved_keyboard_props = + std::make_shared(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)); + .WillRepeatedly(Return(saved_keyboard_props)); const int num_allowed_keys = 3; auto display_capabilities = GetCapabilitiesForConfigurableKeyboard( @@ -1472,6 +1532,8 @@ TEST_F( .WillByDefault(Return(mock_app_)); ON_CALL(*mock_app_, display_capabilities()) .WillByDefault(Return(display_capabilities)); + ON_CALL(*mock_app_, keyboard_props()) + .WillByDefault(Return(std::shared_ptr())); std::shared_ptr command( CreateCommand(msg)); @@ -1494,6 +1556,8 @@ TEST_F(SetGlobalPropertiesRequestTest, CreateCommand(msg)); EXPECT_CALL(*mock_app_, set_keyboard_props(keyboard_properties)); + EXPECT_CALL(*mock_app_, keyboard_props()) + .WillOnce(Return(std::shared_ptr())); command->Run(); } @@ -1504,11 +1568,12 @@ TEST_F(SetGlobalPropertiesRequestTest, 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] = + auto saved_keyboard_props = + std::make_shared(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)); + .WillRepeatedly(Return(saved_keyboard_props)); std::shared_ptr command( CreateCommand(msg)); @@ -1534,6 +1599,8 @@ TEST_F(SetGlobalPropertiesRequestTest, CreateCommand(msg)); EXPECT_CALL(*mock_app_, set_keyboard_props(keyboard_properties)); + EXPECT_CALL(*mock_app_, keyboard_props()) + .WillOnce(Return(std::shared_ptr())); command->Run(); } @@ -1545,11 +1612,12 @@ TEST_F( 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] = + auto saved_keyboard_props = + std::make_shared(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)); + .WillRepeatedly(Return(saved_keyboard_props)); std::shared_ptr command( CreateCommand(msg)); @@ -1569,14 +1637,16 @@ TEST_F(SetGlobalPropertiesRequestTest, ON_CALL(app_mngr_, application(kConnectionKey)) .WillByDefault(Return(mock_app_)); - auto saved_keyboard_props = SmartObject(smart_objects::SmartType_Map); + auto saved_keyboard_props = + std::make_shared(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; + (*saved_keyboard_props)[am::hmi_request::auto_complete_list] = + autocomplete_list; EXPECT_CALL(*mock_app_, keyboard_props()) - .WillRepeatedly(Return(&saved_keyboard_props)); + .WillRepeatedly(Return(saved_keyboard_props)); std::shared_ptr command( CreateCommand(msg)); @@ -1607,10 +1677,11 @@ TEST_F( 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; + auto saved_keyboard_props = + std::make_shared(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)); + .WillRepeatedly(Return(saved_keyboard_props)); std::shared_ptr command( CreateCommand(msg)); @@ -1635,10 +1706,11 @@ TEST_F( 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; + auto saved_keyboard_props = + std::make_shared(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)); + .WillRepeatedly(Return(saved_keyboard_props)); std::shared_ptr command( CreateCommand(msg)); diff --git a/src/components/application_manager/src/application_data_impl.cc b/src/components/application_manager/src/application_data_impl.cc index 7e5eaf43a0..4d2ec30719 100644 --- a/src/components/application_manager/src/application_data_impl.cc +++ b/src/components/application_manager/src/application_data_impl.cc @@ -67,34 +67,14 @@ InitialApplicationDataImpl::InitialApplicationDataImpl() , language_(mobile_api::Language::INVALID_ENUM) , ui_language_(mobile_api::Language::INVALID_ENUM) {} -InitialApplicationDataImpl::~InitialApplicationDataImpl() { - if (app_types_) { - delete app_types_; - app_types_ = NULL; - } - - if (vr_synonyms_) { - delete vr_synonyms_; - vr_synonyms_ = NULL; - } +InitialApplicationDataImpl::~InitialApplicationDataImpl() {} - if (tts_name_) { - delete tts_name_; - tts_name_ = NULL; - } - - if (ngn_media_screen_name_) { - delete ngn_media_screen_name_; - ngn_media_screen_name_ = NULL; - } -} - -const smart_objects::SmartObject* InitialApplicationDataImpl::app_types() +const smart_objects::SmartObjectSPtr InitialApplicationDataImpl::app_types() const { return app_types_; } -const smart_objects::SmartObject* InitialApplicationDataImpl::vr_synonyms() +const smart_objects::SmartObjectSPtr InitialApplicationDataImpl::vr_synonyms() const { return vr_synonyms_; } @@ -103,11 +83,12 @@ std::string InitialApplicationDataImpl::policy_app_id() const { return mobile_app_id_; } -const smart_objects::SmartObject* InitialApplicationDataImpl::tts_name() const { +const smart_objects::SmartObjectSPtr InitialApplicationDataImpl::tts_name() + const { return tts_name_; } -const smart_objects::SmartObject* +const smart_objects::SmartObjectSPtr InitialApplicationDataImpl::ngn_media_screen_name() const { return ngn_media_screen_name_; } @@ -128,19 +109,12 @@ const utils::SemanticVersion& InitialApplicationDataImpl::msg_version() const { void InitialApplicationDataImpl::set_app_types( const smart_objects::SmartObject& app_types) { - if (app_types_) { - delete app_types_; - } - - app_types_ = new smart_objects::SmartObject(app_types); + app_types_.reset(new smart_objects::SmartObject(app_types)); } void InitialApplicationDataImpl::set_vr_synonyms( const smart_objects::SmartObject& vr_synonyms) { - if (vr_synonyms_) { - delete vr_synonyms_; - } - vr_synonyms_ = new smart_objects::SmartObject(vr_synonyms); + vr_synonyms_.reset(new smart_objects::SmartObject(vr_synonyms)); } void InitialApplicationDataImpl::set_mobile_app_id( @@ -150,20 +124,12 @@ void InitialApplicationDataImpl::set_mobile_app_id( void InitialApplicationDataImpl::set_tts_name( const smart_objects::SmartObject& tts_name) { - if (tts_name_) { - delete tts_name_; - } - - tts_name_ = new smart_objects::SmartObject(tts_name); + tts_name_.reset(new smart_objects::SmartObject(tts_name)); } void InitialApplicationDataImpl::set_ngn_media_screen_name( const smart_objects::SmartObject& ngn_name) { - if (ngn_media_screen_name_) { - delete ngn_media_screen_name_; - } - - ngn_media_screen_name_ = new smart_objects::SmartObject(ngn_name); + ngn_media_screen_name_.reset(new smart_objects::SmartObject(ngn_name)); } void InitialApplicationDataImpl::set_language( @@ -192,17 +158,7 @@ InitialApplicationDataImpl::perform_interaction_layout() const { } DynamicApplicationDataImpl::DynamicApplicationDataImpl() - : help_prompt_(nullptr) - , timeout_prompt_(nullptr) - , vr_help_title_(nullptr) - , vr_help_(nullptr) - , tbt_state_(mobile_api::TBTState::INVALID_ENUM) - , show_command_(nullptr) - , keyboard_props_(nullptr) - , menu_title_(nullptr) - , menu_icon_(nullptr) - , menu_layout_(nullptr) - , tbt_show_command_(nullptr) + : tbt_state_(mobile_api::TBTState::INVALID_ENUM) , commands_() , commands_lock_ptr_(std::make_shared()) , sub_menu_() @@ -222,51 +178,6 @@ DynamicApplicationDataImpl::DynamicApplicationDataImpl() , display_capabilities_builder_(*this) {} DynamicApplicationDataImpl::~DynamicApplicationDataImpl() { - if (help_prompt_) { - delete help_prompt_; - help_prompt_ = NULL; - } - - if (timeout_prompt_) { - delete timeout_prompt_; - timeout_prompt_ = NULL; - } - - if (vr_help_title_) { - delete vr_help_title_; - vr_help_title_ = NULL; - } - - if (vr_help_) { - delete vr_help_; - vr_help_ = NULL; - } - - if (show_command_) { - delete show_command_; - show_command_ = NULL; - } - - if (keyboard_props_) { - delete keyboard_props_; - keyboard_props_ = NULL; - } - - if (menu_title_) { - delete menu_title_; - menu_title_ = NULL; - } - - if (menu_icon_) { - delete menu_icon_; - menu_icon_ = NULL; - } - - if (tbt_show_command_) { - delete tbt_show_command_; - tbt_show_command_ = NULL; - } - for (CommandsMap::iterator command_it = commands_.begin(); commands_.end() != command_it; ++command_it) { @@ -301,22 +212,23 @@ DynamicApplicationDataImpl::~DynamicApplicationDataImpl() { window_params_map_.clear(); } -const smart_objects::SmartObject* DynamicApplicationDataImpl::help_prompt() +const smart_objects::SmartObjectSPtr DynamicApplicationDataImpl::help_prompt() const { return help_prompt_; } -const smart_objects::SmartObject* DynamicApplicationDataImpl::timeout_prompt() - const { +const smart_objects::SmartObjectSPtr +DynamicApplicationDataImpl::timeout_prompt() const { return timeout_prompt_; } -const smart_objects::SmartObject* DynamicApplicationDataImpl::vr_help_title() +const smart_objects::SmartObjectSPtr DynamicApplicationDataImpl::vr_help_title() const { return vr_help_title_; } -const smart_objects::SmartObject* DynamicApplicationDataImpl::vr_help() const { +const smart_objects::SmartObjectSPtr DynamicApplicationDataImpl::vr_help() + const { return vr_help_; } @@ -325,32 +237,32 @@ const mobile_api::TBTState::eType& DynamicApplicationDataImpl::tbt_state() return tbt_state_; } -const smart_objects::SmartObject* DynamicApplicationDataImpl::show_command() +const smart_objects::SmartObjectSPtr DynamicApplicationDataImpl::show_command() const { return show_command_; } -const smart_objects::SmartObject* DynamicApplicationDataImpl::tbt_show_command() - const { +const smart_objects::SmartObjectSPtr +DynamicApplicationDataImpl::tbt_show_command() const { return tbt_show_command_; } -const smart_objects::SmartObject* DynamicApplicationDataImpl::keyboard_props() - const { +const smart_objects::SmartObjectSPtr +DynamicApplicationDataImpl::keyboard_props() const { return keyboard_props_; } -const smart_objects::SmartObject* DynamicApplicationDataImpl::menu_title() +const smart_objects::SmartObjectSPtr DynamicApplicationDataImpl::menu_title() const { return menu_title_; } -const smart_objects::SmartObject* DynamicApplicationDataImpl::menu_icon() +const smart_objects::SmartObjectSPtr DynamicApplicationDataImpl::menu_icon() const { return menu_icon_; } -const smart_objects::SmartObject* DynamicApplicationDataImpl::menu_layout() +const smart_objects::SmartObjectSPtr DynamicApplicationDataImpl::menu_layout() const { return menu_layout_; } @@ -479,48 +391,30 @@ void DynamicApplicationDataImpl::load_global_properties( void DynamicApplicationDataImpl::set_help_prompt( const smart_objects::SmartObject& help_prompt) { - if (help_prompt_) { - delete help_prompt_; - } - help_prompt_ = new smart_objects::SmartObject(help_prompt); + help_prompt_.reset(new smart_objects::SmartObject(help_prompt)); } void DynamicApplicationDataImpl::set_timeout_prompt( const smart_objects::SmartObject& timeout_prompt) { - if (timeout_prompt_) { - delete timeout_prompt_; - } - timeout_prompt_ = new smart_objects::SmartObject(timeout_prompt); + timeout_prompt_.reset(new smart_objects::SmartObject(timeout_prompt)); } void DynamicApplicationDataImpl::set_vr_help_title( const smart_objects::SmartObject& vr_help_title) { - if (vr_help_title_) { - delete vr_help_title_; - } - vr_help_title_ = new smart_objects::SmartObject(vr_help_title); + vr_help_title_.reset(new smart_objects::SmartObject(vr_help_title)); } void DynamicApplicationDataImpl::reset_vr_help_title() { - if (vr_help_title_) { - delete vr_help_title_; - vr_help_title_ = NULL; - } + vr_help_title_.reset(); } void DynamicApplicationDataImpl::set_vr_help( const smart_objects::SmartObject& vr_help) { - if (vr_help_) { - delete vr_help_; - } - vr_help_ = new smart_objects::SmartObject(vr_help); + vr_help_.reset(new smart_objects::SmartObject(vr_help)); } void DynamicApplicationDataImpl::reset_vr_help() { - if (vr_help_) { - delete vr_help_; - } - vr_help_ = NULL; + vr_help_.reset(); } void DynamicApplicationDataImpl::set_tbt_state( @@ -530,50 +424,32 @@ void DynamicApplicationDataImpl::set_tbt_state( void DynamicApplicationDataImpl::set_show_command( const smart_objects::SmartObject& show_command) { - if (show_command_) { - delete show_command_; - } - show_command_ = new smart_objects::SmartObject(show_command); + show_command_.reset(new smart_objects::SmartObject(show_command)); } void DynamicApplicationDataImpl::set_tbt_show_command( const smart_objects::SmartObject& tbt_show) { - if (tbt_show_command_) { - delete tbt_show_command_; - } - tbt_show_command_ = new smart_objects::SmartObject(tbt_show); + tbt_show_command_.reset(new smart_objects::SmartObject(tbt_show)); } void DynamicApplicationDataImpl::set_keyboard_props( const smart_objects::SmartObject& keyboard_props) { - if (keyboard_props_) { - delete keyboard_props_; - } - keyboard_props_ = new smart_objects::SmartObject(keyboard_props); + keyboard_props_.reset(new smart_objects::SmartObject(keyboard_props)); } void DynamicApplicationDataImpl::set_menu_title( const smart_objects::SmartObject& menu_title) { - if (menu_title_) { - delete menu_title_; - } - menu_title_ = new smart_objects::SmartObject(menu_title); + menu_title_.reset(new smart_objects::SmartObject(menu_title)); } void DynamicApplicationDataImpl::set_menu_icon( const smart_objects::SmartObject& menu_icon) { - if (menu_icon_) { - delete menu_icon_; - } - menu_icon_ = new smart_objects::SmartObject(menu_icon); + menu_icon_.reset(new smart_objects::SmartObject(menu_icon)); } void DynamicApplicationDataImpl::set_menu_layout( const smart_objects::SmartObject& menu_layout) { - if (menu_layout_) { - delete menu_layout_; - } - menu_layout_ = new smart_objects::SmartObject(menu_layout); + menu_layout_.reset(new smart_objects::SmartObject(menu_layout)); } void DynamicApplicationDataImpl::set_day_color_scheme( diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc index acf174eb39..ec37e3b51f 100644 --- a/src/components/application_manager/src/application_manager_impl.cc +++ b/src/components/application_manager/src/application_manager_impl.cc @@ -1856,8 +1856,9 @@ bool ApplicationManagerImpl::CheckResumptionRequiredTransportAvailable( const std::string secondary_transport_type = GetTransportTypeProfileString(application->secondary_device()); - const smart_objects::SmartObject* app_types_array = application->app_types(); - if (app_types_array == NULL || app_types_array->length() == 0) { + const smart_objects::SmartObjectSPtr app_types_array = + application->app_types(); + if (!app_types_array || app_types_array->length() == 0) { // This app does not have any AppHMIType. In this case, check "EMPTY_APP" // entry std::map >::const_iterator it = @@ -4493,7 +4494,7 @@ void ApplicationManagerImpl::OnUpdateHMIAppType( std::vector hmi_types_from_policy; smart_objects::SmartObject transform_app_hmi_types( smart_objects::SmartType_Array); - bool flag_diffirence_app_hmi_type; + bool flag_difference_app_hmi_type; DataAccessor accessor(applications()); for (ApplicationSetIt it = accessor.GetData().begin(); it != accessor.GetData().end(); @@ -4516,19 +4517,18 @@ void ApplicationManagerImpl::OnUpdateHMIAppType( } ApplicationConstSharedPtr app = *it; - const smart_objects::SmartObject* save_application_hmi_type = + const smart_objects::SmartObjectSPtr save_application_hmi_type = app->app_types(); - if (save_application_hmi_type == NULL || - ((*save_application_hmi_type).length() != - transform_app_hmi_types.length())) { - flag_diffirence_app_hmi_type = true; + if (!save_application_hmi_type || (save_application_hmi_type->length() != + transform_app_hmi_types.length())) { + flag_difference_app_hmi_type = true; } else { - flag_diffirence_app_hmi_type = !(CompareAppHMIType( + flag_difference_app_hmi_type = !(CompareAppHMIType( transform_app_hmi_types, *save_application_hmi_type)); } - if (flag_diffirence_app_hmi_type) { + if (flag_difference_app_hmi_type) { ApplicationSharedPtr app = *it; app->set_app_types(transform_app_hmi_types); 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 0a9d8af9da..2e60bb2c66 100644 --- a/src/components/application_manager/src/message_helper/message_helper.cc +++ b/src/components/application_manager/src/message_helper/message_helper.cc @@ -801,8 +801,8 @@ void MessageHelper::SendResetPropertiesRequest(ApplicationSharedPtr application, { SmartObject msg_params = SmartObject(smart_objects::SmartType_Map); - msg_params[strings::help_prompt] = application->help_prompt(); - msg_params[strings::timeout_prompt] = application->timeout_prompt(); + msg_params[strings::help_prompt] = *(application->help_prompt()); + msg_params[strings::timeout_prompt] = *(application->timeout_prompt()); msg_params[strings::app_id] = application->app_id(); SmartObjectSPtr message = CreateMessageForHMI( @@ -1417,7 +1417,7 @@ smart_objects::SmartObjectSPtr MessageHelper::CreateAppVrHelp( smart_objects::SmartType_Map); smart_objects::SmartObject& vr_help = *result; - const smart_objects::SmartObject* vr_help_title = app->vr_help_title(); + const smart_objects::SmartObjectSPtr vr_help_title = app->vr_help_title(); if (vr_help_title) { vr_help[strings::vr_help_title] = vr_help_title->asString(); } @@ -1646,7 +1646,7 @@ void MessageHelper::SendUIChangeRegistrationRequestToHMI( CreateChangeRegistration(hmi_apis::FunctionID::UI_ChangeRegistration, app->ui_language(), app->app_id(), - app->app_types(), + app->app_types().get(), app_mngr); if (ui_command) { @@ -1823,8 +1823,8 @@ bool MessageHelper::CreateHMIApplicationStruct( return false; } - const smart_objects::SmartObject* app_types = app->app_types(); - const smart_objects::SmartObject* ngn_media_screen_name = + const smart_objects::SmartObjectSPtr app_types = app->app_types(); + const smart_objects::SmartObjectSPtr ngn_media_screen_name = app->ngn_media_screen_name(); const smart_objects::SmartObject day_color_scheme = app->day_color_scheme(); const smart_objects::SmartObject night_color_scheme = diff --git a/src/components/application_manager/src/resumption/resumption_data.cc b/src/components/application_manager/src/resumption/resumption_data.cc index c72231d334..50b95dba42 100644 --- a/src/components/application_manager/src/resumption/resumption_data.cc +++ b/src/components/application_manager/src/resumption/resumption_data.cc @@ -250,10 +250,10 @@ smart_objects::SmartObject ResumptionData::CreateWindowInfoSO( } smart_objects::SmartObject ResumptionData::PointerToSmartObj( - const smart_objects::SmartObject* ptr) const { + const smart_objects::SmartObjectSPtr ptr) const { SDL_LOG_AUTO_TRACE(); smart_objects::SmartObject temp; - if (ptr != NULL) { + if (ptr) { temp = *ptr; } return temp; diff --git a/src/components/application_manager/test/application_manager_impl_test.cc b/src/components/application_manager/test/application_manager_impl_test.cc index 48ba75275b..539bc39eb2 100644 --- a/src/components/application_manager/test/application_manager_impl_test.cc +++ b/src/components/application_manager/test/application_manager_impl_test.cc @@ -29,8 +29,11 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ +#include "application_manager/application_manager_impl.h" + #include #include + #include #include #include @@ -38,7 +41,6 @@ #include "application_manager/application.h" #include "application_manager/application_impl.h" -#include "application_manager/application_manager_impl.h" #include "application_manager/hmi_state.h" #include "application_manager/mock_app_service_manager.h" #include "application_manager/mock_application.h" @@ -51,6 +53,7 @@ #include "application_manager/resumption/resume_ctrl_impl.h" #include "application_manager/test/include/application_manager/mock_message_helper.h" #include "connection_handler/mock_connection_handler.h" +#include "encryption/hashing.h" #include "gtest/gtest.h" #include "hmi_message_handler/mock_hmi_message_handler.h" #include "media_manager/mock_media_manager.h" @@ -65,8 +68,6 @@ #include "utils/file_system.h" #include "utils/lock.h" -#include "encryption/hashing.h" - namespace test { namespace components { namespace application_manager_test { @@ -324,7 +325,7 @@ class ApplicationManagerImplTest : public ::testing::Test { } bool CheckResumptionRequiredTransportAvailableTest( - smart_objects::SmartObject* app_types_array, + smart_objects::SmartObjectSPtr app_types_array, connection_handler::DeviceHandle primary_device_handle, std::string primary_transport_device_string, connection_handler::DeviceHandle secondary_device_handle, @@ -1402,7 +1403,7 @@ static std::map > CreateTransportMap() { } bool ApplicationManagerImplTest::CheckResumptionRequiredTransportAvailableTest( - smart_objects::SmartObject* app_types_array, + smart_objects::SmartObjectSPtr app_types_array, connection_handler::DeviceHandle primary_device_handle, std::string primary_transport_device_string, connection_handler::DeviceHandle secondary_device_handle, @@ -1446,8 +1447,9 @@ TEST_F(ApplicationManagerImplTest, CheckResumptionRequiredTransportAvailableTest_PrimaryOnly_Success) { using namespace ns_smart_device_link::ns_smart_objects; - smart_objects::SmartObject app_types_array(SmartType_Array); - app_types_array[0] = mobile_apis::AppHMIType::eType::DEFAULT; + smart_objects::SmartObjectSPtr app_types_array = + std::make_shared(SmartType_Array); + (*app_types_array)[0] = mobile_apis::AppHMIType::eType::DEFAULT; const connection_handler::DeviceHandle primary_device_handle = 1; const connection_handler::DeviceHandle secondary_device_handle = 0; @@ -1462,7 +1464,7 @@ TEST_F(ApplicationManagerImplTest, // - We have SPP_BLUETOOTH for primary transport. // -> Conclusion: the app has required transport. bool result = CheckResumptionRequiredTransportAvailableTest( - &app_types_array, + app_types_array, primary_device_handle, primary_transport_device_string, secondary_device_handle, @@ -1474,8 +1476,9 @@ TEST_F(ApplicationManagerImplTest, CheckResumptionRequiredTransportAvailableTest_PrimaryOnly_NotListed) { using namespace ns_smart_device_link::ns_smart_objects; - smart_objects::SmartObject app_types_array(SmartType_Array); - app_types_array[0] = mobile_apis::AppHMIType::eType::SOCIAL; + smart_objects::SmartObjectSPtr app_types_array = + std::make_shared(SmartType_Array); + (*app_types_array)[0] = mobile_apis::AppHMIType::eType::SOCIAL; const connection_handler::DeviceHandle primary_device_handle = 1; const connection_handler::DeviceHandle secondary_device_handle = 0; @@ -1487,7 +1490,7 @@ TEST_F(ApplicationManagerImplTest, // - We do not have an entry in .ini file for SOCIAL apps. // -> In this case, resumption is always enabled for backward compatibility. bool result = CheckResumptionRequiredTransportAvailableTest( - &app_types_array, + app_types_array, primary_device_handle, primary_transport_device_string, secondary_device_handle, @@ -1499,8 +1502,9 @@ TEST_F(ApplicationManagerImplTest, CheckResumptionRequiredTransportAvailableTest_PrimaryOnly_Disabled) { using namespace ns_smart_device_link::ns_smart_objects; - smart_objects::SmartObject app_types_array(SmartType_Array); - app_types_array[0] = mobile_apis::AppHMIType::eType::TESTING; + smart_objects::SmartObjectSPtr app_types_array = + std::make_shared(SmartType_Array); + (*app_types_array)[0] = mobile_apis::AppHMIType::eType::TESTING; const connection_handler::DeviceHandle primary_device_handle = 1; const connection_handler::DeviceHandle secondary_device_handle = 0; @@ -1512,7 +1516,7 @@ TEST_F(ApplicationManagerImplTest, // - We do not have any transports allowed for TESTING apps. // -> In this case, resumption is always disabled. bool result = CheckResumptionRequiredTransportAvailableTest( - &app_types_array, + app_types_array, primary_device_handle, primary_transport_device_string, secondary_device_handle, @@ -1524,7 +1528,8 @@ TEST_F(ApplicationManagerImplTest, CheckResumptionRequiredTransportAvailableTest_PrimaryOnly_NoAppTypes) { using namespace ns_smart_device_link::ns_smart_objects; - smart_objects::SmartObject app_types_array(SmartType_Array); + smart_objects::SmartObjectSPtr app_types_array = + std::make_shared(SmartType_Array); // we don't specify any app type const connection_handler::DeviceHandle primary_device_handle = 1; @@ -1537,7 +1542,7 @@ TEST_F(ApplicationManagerImplTest, // - .ini file specifies TCP_WIFI for EMPTY_APP entry. // -> The app does not have required transport. bool result = CheckResumptionRequiredTransportAvailableTest( - &app_types_array, + app_types_array, primary_device_handle, primary_transport_device_string, secondary_device_handle, @@ -1571,8 +1576,9 @@ TEST_F(ApplicationManagerImplTest, CheckResumptionRequiredTransportAvailableTest_TwoTransports_Success) { using namespace ns_smart_device_link::ns_smart_objects; - smart_objects::SmartObject app_types_array(SmartType_Array); - app_types_array[0] = mobile_apis::AppHMIType::eType::MEDIA; + smart_objects::SmartObjectSPtr app_types_array = + std::make_shared(SmartType_Array); + (*app_types_array)[0] = mobile_apis::AppHMIType::eType::MEDIA; const connection_handler::DeviceHandle primary_device_handle = 1; const connection_handler::DeviceHandle secondary_device_handle = 2; @@ -1587,7 +1593,7 @@ TEST_F(ApplicationManagerImplTest, // - We have TCP_WIFI for secondary transport. // -> Conclusion: the app has required transport. bool result = CheckResumptionRequiredTransportAvailableTest( - &app_types_array, + app_types_array, primary_device_handle, primary_transport_device_string, secondary_device_handle, @@ -1599,8 +1605,9 @@ TEST_F(ApplicationManagerImplTest, CheckResumptionRequiredTransportAvailableTest_TwoTransports_Failure) { using namespace ns_smart_device_link::ns_smart_objects; - smart_objects::SmartObject app_types_array(SmartType_Array); - app_types_array[0] = mobile_apis::AppHMIType::eType::NAVIGATION; + smart_objects::SmartObjectSPtr app_types_array = + std::make_shared(SmartType_Array); + (*app_types_array)[0] = mobile_apis::AppHMIType::eType::NAVIGATION; const connection_handler::DeviceHandle primary_device_handle = 1; const connection_handler::DeviceHandle secondary_device_handle = 2; @@ -1615,7 +1622,7 @@ TEST_F(ApplicationManagerImplTest, // - We have IAP_USB for primary and TCP_WIFI for secondary transport. // -> Conclusion: the app does not have required transport. bool result = CheckResumptionRequiredTransportAvailableTest( - &app_types_array, + app_types_array, primary_device_handle, primary_transport_device_string, secondary_device_handle, @@ -1627,9 +1634,10 @@ TEST_F(ApplicationManagerImplTest, CheckResumptionRequiredTransportAvailableTest_MultipleAppTypes_Failure) { using namespace ns_smart_device_link::ns_smart_objects; - smart_objects::SmartObject app_types_array(SmartType_Array); - app_types_array[0] = mobile_apis::AppHMIType::eType::MEDIA; - app_types_array[1] = mobile_apis::AppHMIType::eType::NAVIGATION; + smart_objects::SmartObjectSPtr app_types_array = + std::make_shared(SmartType_Array); + (*app_types_array)[0] = mobile_apis::AppHMIType::eType::MEDIA; + (*app_types_array)[1] = mobile_apis::AppHMIType::eType::NAVIGATION; const connection_handler::DeviceHandle primary_device_handle = 1; const connection_handler::DeviceHandle secondary_device_handle = 2; @@ -1645,7 +1653,7 @@ TEST_F(ApplicationManagerImplTest, // - We have IAP_USB for primary and TCP_WIFI is secondary // -> Conclusion: the app does NOT have required transport. bool result = CheckResumptionRequiredTransportAvailableTest( - &app_types_array, + app_types_array, primary_device_handle, primary_transport_device_string, secondary_device_handle, @@ -1657,9 +1665,10 @@ TEST_F(ApplicationManagerImplTest, CheckResumptionRequiredTransportAvailableTest_MultipleAppTypes_Empty) { using namespace ns_smart_device_link::ns_smart_objects; - smart_objects::SmartObject app_types_array(SmartType_Array); - app_types_array[0] = mobile_apis::AppHMIType::eType::NAVIGATION; - app_types_array[1] = mobile_apis::AppHMIType::eType::SYSTEM; + smart_objects::SmartObjectSPtr app_types_array = + std::make_shared(SmartType_Array); + (*app_types_array)[0] = mobile_apis::AppHMIType::eType::NAVIGATION; + (*app_types_array)[1] = mobile_apis::AppHMIType::eType::SYSTEM; const connection_handler::DeviceHandle primary_device_handle = 1; const connection_handler::DeviceHandle secondary_device_handle = 2; @@ -1675,7 +1684,7 @@ TEST_F(ApplicationManagerImplTest, // - We have SPP_BLUETOOTH for primary and TCP_WIFI is secondary // -> Conclusion: the app does NOT have required transport. bool result = CheckResumptionRequiredTransportAvailableTest( - &app_types_array, + app_types_array, primary_device_handle, primary_transport_device_string, secondary_device_handle, diff --git a/src/components/application_manager/test/help_prompt_manager_test.cc b/src/components/application_manager/test/help_prompt_manager_test.cc index d9fb0b82d9..5cb4204cbf 100644 --- a/src/components/application_manager/test/help_prompt_manager_test.cc +++ b/src/components/application_manager/test/help_prompt_manager_test.cc @@ -121,8 +121,8 @@ class HelpPromptManagerTest : public ::testing::Test { void TearDown() OVERRIDE; MessageSharedPtr CreateMsgParams(); void VRArraySetupHelper(MessageSharedPtr msg, - SmartObject& vr_help_title, - SmartObject& vr_help_array); + smart_objects::SmartObjectSPtr vr_help_title, + smart_objects::SmartObjectSPtr vr_help_array); void CreateBasicParamsVRRequest(MessageSharedPtr msg); void CreateApplication(MockHelpPromptManager& mock_help_prompt_manager); HmiStatePtr CreateTestHmiState(); @@ -203,14 +203,15 @@ MessageSharedPtr HelpPromptManagerTest::CreateMsgParams() { return msg; } -void HelpPromptManagerTest::VRArraySetupHelper(MessageSharedPtr msg, - SmartObject& vr_help_title, - SmartObject& vr_help_array) { - (*msg)[am::strings::msg_params][am::strings::vr_help_title] = vr_help_title; - vr_help_array[0] = SmartObject(smart_objects::SmartType_Map); - vr_help_array[0][am::strings::text] = kText; - vr_help_array[0][am::strings::position] = kPosition; - (*msg)[am::strings::msg_params][am::strings::vr_help] = vr_help_array; +void HelpPromptManagerTest::VRArraySetupHelper( + MessageSharedPtr msg, + smart_objects::SmartObjectSPtr vr_help_title, + smart_objects::SmartObjectSPtr vr_help_array) { + (*msg)[am::strings::msg_params][am::strings::vr_help_title] = *vr_help_title; + (*vr_help_array)[0] = SmartObject(smart_objects::SmartType_Map); + (*vr_help_array)[0][am::strings::text] = kText; + (*vr_help_array)[0][am::strings::position] = kPosition; + (*msg)[am::strings::msg_params][am::strings::vr_help] = *vr_help_array; } void HelpPromptManagerTest::CreateBasicParamsVRRequest(MessageSharedPtr msg) { @@ -284,17 +285,20 @@ TEST_F(HelpPromptManagerTest, RemoveCommand_OnVrCommandDeleted) { TEST_F(HelpPromptManagerTest, Request_OnSetGlobalPropertiesReceived_TTS_SUCCESS) { MessageSharedPtr msg = CreateMsgParams(); - SmartObject help_prompt(smart_objects::SmartType_Array); - help_prompt[0][am::strings::text] = "Help_Prompt_One"; - (*msg)[am::strings::msg_params][am::strings::help_prompt] = help_prompt; - SmartObject timeout_prompt(smart_objects::SmartType_Array); - timeout_prompt[0][am::strings::text] = "Timeout_Prompt_One"; - (*msg)[am::strings::msg_params][am::strings::timeout_prompt] = timeout_prompt; + smart_objects::SmartObjectSPtr help_prompt = + std::make_shared(smart_objects::SmartType_Array); + (*help_prompt)[0][am::strings::text] = "Help_Prompt_One"; + (*msg)[am::strings::msg_params][am::strings::help_prompt] = *help_prompt; + smart_objects::SmartObjectSPtr timeout_prompt = + std::make_shared(smart_objects::SmartType_Array); + (*timeout_prompt)[0][am::strings::text] = "Timeout_Prompt_One"; + (*msg)[am::strings::msg_params][am::strings::timeout_prompt] = + *timeout_prompt; EXPECT_CALL(mock_message_helper_, VerifyImageVrHelpItems(_, _, _)).Times(0); - EXPECT_CALL(mock_message_helper_, VerifyTtsFiles(help_prompt, _, _)) + EXPECT_CALL(mock_message_helper_, VerifyTtsFiles(*help_prompt, _, _)) .WillOnce(Return(mobile_apis::Result::SUCCESS)); - EXPECT_CALL(mock_message_helper_, VerifyTtsFiles(timeout_prompt, _, _)) + EXPECT_CALL(mock_message_helper_, VerifyTtsFiles(*timeout_prompt, _, _)) .WillOnce(Return(mobile_apis::Result::SUCCESS)); EXPECT_CALL(app_mngr_, application(kConnectionKey)) @@ -302,10 +306,10 @@ TEST_F(HelpPromptManagerTest, EXPECT_CALL(app_mngr_, RemoveAppFromTTSGlobalPropertiesList(kConnectionKey)); EXPECT_CALL(*mock_app_, app_id()).WillOnce(Return(kAppId)); - EXPECT_CALL(*mock_app_, set_help_prompt(help_prompt)); - EXPECT_CALL(*mock_app_, help_prompt()).WillOnce(Return(&help_prompt)); - EXPECT_CALL(*mock_app_, set_timeout_prompt(timeout_prompt)); - EXPECT_CALL(*mock_app_, timeout_prompt()).WillOnce(Return(&timeout_prompt)); + EXPECT_CALL(*mock_app_, set_help_prompt(*help_prompt)); + EXPECT_CALL(*mock_app_, help_prompt()).WillOnce(Return(help_prompt)); + EXPECT_CALL(*mock_app_, set_timeout_prompt(*timeout_prompt)); + EXPECT_CALL(*mock_app_, timeout_prompt()).WillOnce(Return(timeout_prompt)); EXPECT_CALL( mock_hmi_interfaces_, GetInterfaceFromFunction(hmi_apis::FunctionID::TTS_SetGlobalProperties)) @@ -325,34 +329,40 @@ TEST_F(HelpPromptManagerTest, TEST_F(HelpPromptManagerTest, Request_OnSetGlobalPropertiesReceived_UI_SUCCESS) { MessageSharedPtr msg = CreateMsgParams(); - SmartObject vr_help_title("yes"); - SmartObject vr_help_array(smart_objects::SmartType_Array); + smart_objects::SmartObjectSPtr vr_help_title = + std::make_shared("yes"); + smart_objects::SmartObjectSPtr vr_help_array = + std::make_shared(smart_objects::SmartType_Array); VRArraySetupHelper(msg, vr_help_title, vr_help_array); - (*msg)[am::strings::msg_params][am::strings::vr_help] = vr_help_array; + (*msg)[am::strings::msg_params][am::strings::vr_help] = *vr_help_array; SmartObject menu_title("Menu_Title"); (*msg)[am::strings::msg_params][am::hmi_request::menu_title] = menu_title; SmartObject menu_icon(smart_objects::SmartType_Map); menu_icon[am::strings::value] = "1"; (*msg)[am::strings::msg_params][am::hmi_request::menu_icon] = menu_icon; - SmartObject keyboard_properties(smart_objects::SmartType_Map); + smart_objects::SmartObjectSPtr keyboard_properties = + std::make_shared(smart_objects::SmartType_Map); (*msg)[am::strings::msg_params][am::hmi_request::keyboard_properties] = - keyboard_properties; + *keyboard_properties; EXPECT_CALL(mock_message_helper_, VerifyImage(menu_icon, _, _)) .WillOnce((Return(mobile_apis::Result::SUCCESS))); - EXPECT_CALL(mock_message_helper_, VerifyImageVrHelpItems(vr_help_array, _, _)) + EXPECT_CALL(mock_message_helper_, + VerifyImageVrHelpItems(*vr_help_array, _, _)) .WillOnce((Return(mobile_apis::Result::SUCCESS))); EXPECT_CALL(app_mngr_, RemoveAppFromTTSGlobalPropertiesList(kConnectionKey)); EXPECT_CALL(app_mngr_, application(kConnectionKey)) .WillRepeatedly(Return(mock_app_)); - EXPECT_CALL(*mock_app_, set_vr_help_title(vr_help_title)); - EXPECT_CALL(*mock_app_, set_vr_help(vr_help_array)); - EXPECT_CALL(*mock_app_, vr_help_title()).WillOnce(Return(&vr_help_title)); - EXPECT_CALL(*mock_app_, vr_help()).WillOnce(Return(&vr_help_array)); + EXPECT_CALL(*mock_app_, set_vr_help_title(*vr_help_title)); + EXPECT_CALL(*mock_app_, set_vr_help(*vr_help_array)); + EXPECT_CALL(*mock_app_, vr_help_title()).WillOnce(Return(vr_help_title)); + EXPECT_CALL(*mock_app_, vr_help()).WillOnce(Return(vr_help_array)); EXPECT_CALL(*mock_app_, set_menu_title(menu_title)); EXPECT_CALL(*mock_app_, set_menu_icon(menu_icon)); - EXPECT_CALL(*mock_app_, set_keyboard_props(keyboard_properties)); + EXPECT_CALL(*mock_app_, set_keyboard_props(*keyboard_properties)); + EXPECT_CALL(*mock_app_, keyboard_props()) + .WillOnce(Return(keyboard_properties)); EXPECT_CALL(*mock_app_, app_id()).WillOnce(Return(kAppId)); EXPECT_CALL( mock_hmi_interfaces_, 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 93755ef8f4..e94ffa5961 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 @@ -217,12 +217,12 @@ class MockApplication : public ::application_manager::Application { MOCK_CONST_METHOD0(IsVideoApplication, bool()); MOCK_METHOD0(LoadPersistentFiles, void()); // InitialApplicationData methods - MOCK_CONST_METHOD0(app_types, const smart_objects::SmartObject*()); - MOCK_CONST_METHOD0(vr_synonyms, const smart_objects::SmartObject*()); + MOCK_CONST_METHOD0(app_types, const smart_objects::SmartObjectSPtr()); + MOCK_CONST_METHOD0(vr_synonyms, const smart_objects::SmartObjectSPtr()); MOCK_CONST_METHOD0(policy_app_id, std::string()); - MOCK_CONST_METHOD0(tts_name, const smart_objects::SmartObject*()); + MOCK_CONST_METHOD0(tts_name, const smart_objects::SmartObjectSPtr()); MOCK_CONST_METHOD0(ngn_media_screen_name, - const smart_objects::SmartObject*()); + const smart_objects::SmartObjectSPtr()); MOCK_CONST_METHOD0(language, const mobile_apis::Language::eType&()); MOCK_CONST_METHOD0(ui_language, const mobile_apis::Language::eType&()); MOCK_CONST_METHOD0(msg_version, const utils::SemanticVersion&()); @@ -240,20 +240,20 @@ class MockApplication : public ::application_manager::Application { void(const mobile_apis::Language::eType& ui_language)); MOCK_METHOD1(set_msg_version, void(const utils::SemanticVersion& version)); // DynamicApplicationData methods - MOCK_CONST_METHOD0(help_prompt, const smart_objects::SmartObject*()); - MOCK_CONST_METHOD0(timeout_prompt, const smart_objects::SmartObject*()); - MOCK_CONST_METHOD0(vr_help_title, const smart_objects::SmartObject*()); - MOCK_CONST_METHOD0(vr_help, const smart_objects::SmartObject*()); + MOCK_CONST_METHOD0(help_prompt, const smart_objects::SmartObjectSPtr()); + MOCK_CONST_METHOD0(timeout_prompt, const smart_objects::SmartObjectSPtr()); + MOCK_CONST_METHOD0(vr_help_title, const smart_objects::SmartObjectSPtr()); + MOCK_CONST_METHOD0(vr_help, const smart_objects::SmartObjectSPtr()); MOCK_CONST_METHOD0(tbt_state, const mobile_apis::TBTState::eType&()); - MOCK_CONST_METHOD0(show_command, const smart_objects::SmartObject*()); - MOCK_CONST_METHOD0(tbt_show_command, const smart_objects::SmartObject*()); + MOCK_CONST_METHOD0(show_command, const smart_objects::SmartObjectSPtr()); + MOCK_CONST_METHOD0(tbt_show_command, const smart_objects::SmartObjectSPtr()); MOCK_CONST_METHOD0( SubscribedButtons, DataAccessor< ::application_manager::ButtonSubscriptions>()); - MOCK_CONST_METHOD0(keyboard_props, const smart_objects::SmartObject*()); - MOCK_CONST_METHOD0(menu_title, const smart_objects::SmartObject*()); - MOCK_CONST_METHOD0(menu_icon, const smart_objects::SmartObject*()); - MOCK_CONST_METHOD0(menu_layout, const smart_objects::SmartObject*()); + MOCK_CONST_METHOD0(keyboard_props, const smart_objects::SmartObjectSPtr()); + MOCK_CONST_METHOD0(menu_title, const smart_objects::SmartObjectSPtr()); + MOCK_CONST_METHOD0(menu_icon, const smart_objects::SmartObjectSPtr()); + MOCK_CONST_METHOD0(menu_layout, const smart_objects::SmartObjectSPtr()); MOCK_CONST_METHOD0(day_color_scheme, smart_objects::SmartObject()); MOCK_CONST_METHOD0(night_color_scheme, smart_objects::SmartObject()); MOCK_CONST_METHOD0(display_layout, std::string()); diff --git a/src/components/application_manager/test/include/application_manager/resumption_data_test.h b/src/components/application_manager/test/include/application_manager/resumption_data_test.h index 0596b4e500..bea920e44e 100644 --- a/src/components/application_manager/test/include/application_manager/resumption_data_test.h +++ b/src/components/application_manager/test/include/application_manager/resumption_data_test.h @@ -63,15 +63,7 @@ using namespace mobile_apis; class ResumptionDataTest : public ::testing::Test { protected: ResumptionDataTest() - : help_prompt_(NULL) - , timeout_prompt_(NULL) - , vr_help_(NULL) - , vr_help_title_(NULL) - , vr_synonyms_(NULL) - , keyboard_props_(NULL) - , menu_title_(NULL) - , menu_icon_(NULL) - , kCountOfCommands_(5u) + : kCountOfCommands_(5u) , kCountOfChoice_(2u) , kCountOfChoiceSets_(4u) , kCountOfSubmenues_(3u) @@ -106,14 +98,15 @@ class ResumptionDataTest : public ::testing::Test { bool is_audio_; const connection_handler::DeviceHandle device_handle_ = 10; - sm::SmartObject* help_prompt_; - sm::SmartObject* timeout_prompt_; - sm::SmartObject* vr_help_; - sm::SmartObject* vr_help_title_; - sm::SmartObject* vr_synonyms_; - sm::SmartObject* keyboard_props_; - sm::SmartObject* menu_title_; - sm::SmartObject* menu_icon_; + sm::SmartObjectSPtr help_prompt_; + sm::SmartObjectSPtr timeout_prompt_; + sm::SmartObjectSPtr vr_help_; + sm::SmartObjectSPtr vr_help_title_; + sm::SmartObjectSPtr vr_synonyms_; + sm::SmartObjectSPtr keyboard_props_; + sm::SmartObjectSPtr menu_title_; + sm::SmartObjectSPtr menu_icon_; + sm::SmartObjectSPtr menu_layout_; void SetCommands(); void SetSubmenues(); @@ -121,7 +114,7 @@ class ResumptionDataTest : public ::testing::Test { void SetAppFiles(); void SetGlobalProporties(); void SetKeyboardProperties(); - void SetMenuTitleAndIcon(); + void SetMenuParams(); void SetHelpAndTimeoutPrompt(); void SetVRHelpTitle(); void SetSubscriptions(); @@ -137,6 +130,7 @@ class ResumptionDataTest : public ::testing::Test { void CheckKeyboardProperties(sm::SmartObject& res_list); void CheckMenuTitle(sm::SmartObject& res_list); void CheckMenuIcon(sm::SmartObject& res_list); + void CheckMenuLayout(sm::SmartObject& res_list); void CheckHelpPrompt(sm::SmartObject& res_list); void CheckTimeoutPrompt(sm::SmartObject& res_list); void CheckVRHelp( diff --git a/src/components/application_manager/test/message_helper/message_helper_test.cc b/src/components/application_manager/test/message_helper/message_helper_test.cc index 4b36647a11..2dd6b511d4 100644 --- a/src/components/application_manager/test/message_helper/message_helper_test.cc +++ b/src/components/application_manager/test/message_helper/message_helper_test.cc @@ -156,10 +156,32 @@ TEST(MessageHelperTestCreate, CreateSetAppIcon_SendPathImagetype_Equal) { TEST(MessageHelperTestCreate, CreateGlobalPropertiesRequestsToHMI_SmartObject_EmptyList) { MockApplicationSharedPtr appSharedMock = std::make_shared(); - EXPECT_CALL(*appSharedMock, vr_help_title()).Times(AtLeast(1)); - EXPECT_CALL(*appSharedMock, vr_help()).Times(AtLeast(1)); - EXPECT_CALL(*appSharedMock, help_prompt()).Times(AtLeast(1)); - EXPECT_CALL(*appSharedMock, timeout_prompt()).Times(AtLeast(1)); + smart_objects::SmartObjectSPtr emptyObject = + std::shared_ptr(); + EXPECT_CALL(*appSharedMock, vr_help_title()) + .Times(AtLeast(1)) + .WillOnce(Return(emptyObject)); + EXPECT_CALL(*appSharedMock, vr_help()) + .Times(AtLeast(1)) + .WillOnce(Return(emptyObject)); + EXPECT_CALL(*appSharedMock, help_prompt()) + .Times(AtLeast(1)) + .WillOnce(Return(emptyObject)); + EXPECT_CALL(*appSharedMock, timeout_prompt()) + .Times(AtLeast(1)) + .WillOnce(Return(emptyObject)); + EXPECT_CALL(*appSharedMock, menu_title()) + .Times(AtLeast(1)) + .WillOnce(Return(emptyObject)); + EXPECT_CALL(*appSharedMock, menu_icon()) + .Times(AtLeast(1)) + .WillOnce(Return(emptyObject)); + EXPECT_CALL(*appSharedMock, menu_layout()) + .Times(AtLeast(1)) + .WillOnce(Return(emptyObject)); + EXPECT_CALL(*appSharedMock, keyboard_props()) + .Times(AtLeast(1)) + .WillOnce(Return(emptyObject)); std::shared_ptr mock_help_prompt_manager = std::make_shared(); @@ -185,16 +207,23 @@ TEST(MessageHelperTestCreate, TEST(MessageHelperTestCreate, CreateGlobalPropertiesRequestsToHMI_SmartObject_NotEmpty) { MockApplicationSharedPtr appSharedMock = std::make_shared(); - smart_objects::SmartObjectSPtr objPtr = - std::make_shared(); - (*objPtr)[0][strings::vr_help_title] = "111"; - (*objPtr)[1][strings::vr_help] = "222"; - (*objPtr)[2][strings::keyboard_properties] = "333"; - (*objPtr)[3][strings::menu_title] = "444"; - (*objPtr)[4][strings::menu_icon] = "555"; - (*objPtr)[5][strings::help_prompt] = "666"; - (*objPtr)[6][strings::timeout_prompt] = "777"; + smart_objects::SmartObjectSPtr vrHelpTitle = + std::make_shared("111"); + smart_objects::SmartObjectSPtr vrHelp = + std::make_shared("222"); + smart_objects::SmartObjectSPtr keyboardProperties = + std::make_shared("333"); + smart_objects::SmartObjectSPtr menuTitle = + std::make_shared("444"); + smart_objects::SmartObjectSPtr menuIcon = + std::make_shared("555"); + smart_objects::SmartObjectSPtr helpPrompt = + std::make_shared("666"); + smart_objects::SmartObjectSPtr timeoutPrompt = + std::make_shared("777"); + smart_objects::SmartObjectSPtr menuLayout = + std::make_shared("888"); smart_objects::SmartObject user_loc = smart_objects::SmartObject(smart_objects::SmartType_Map); @@ -202,25 +231,28 @@ TEST(MessageHelperTestCreate, EXPECT_CALL(*appSharedMock, vr_help_title()) .Times(AtLeast(3)) - .WillRepeatedly(Return(&(*objPtr)[0])); + .WillRepeatedly(Return(vrHelpTitle)); EXPECT_CALL(*appSharedMock, vr_help()) .Times(AtLeast(2)) - .WillRepeatedly(Return(&(*objPtr)[1])); + .WillRepeatedly(Return(vrHelp)); EXPECT_CALL(*appSharedMock, help_prompt()) .Times(AtLeast(3)) - .WillRepeatedly(Return(&(*objPtr)[5])); + .WillRepeatedly(Return(helpPrompt)); EXPECT_CALL(*appSharedMock, timeout_prompt()) .Times(AtLeast(2)) - .WillRepeatedly(Return(&(*objPtr)[6])); + .WillRepeatedly(Return(timeoutPrompt)); EXPECT_CALL(*appSharedMock, keyboard_props()) .Times(AtLeast(2)) - .WillRepeatedly(Return(&(*objPtr)[2])); + .WillRepeatedly(Return(keyboardProperties)); EXPECT_CALL(*appSharedMock, menu_title()) .Times(AtLeast(2)) - .WillRepeatedly(Return(&(*objPtr)[3])); + .WillRepeatedly(Return(menuTitle)); EXPECT_CALL(*appSharedMock, menu_icon()) .Times(AtLeast(2)) - .WillRepeatedly(Return(&(*objPtr)[4])); + .WillRepeatedly(Return(menuIcon)); + EXPECT_CALL(*appSharedMock, menu_layout()) + .Times(AtLeast(2)) + .WillRepeatedly(Return(menuLayout)); EXPECT_CALL(*appSharedMock, app_id()).WillRepeatedly(Return(0)); EXPECT_CALL(*appSharedMock, get_user_location()) .WillRepeatedly(ReturnRef(user_loc)); @@ -242,14 +274,16 @@ TEST(MessageHelperTestCreate, smart_objects::SmartObject& first = *ptr[0]; smart_objects::SmartObject& second = *ptr[1]; - EXPECT_EQ((*objPtr)[0], first[strings::msg_params][strings::vr_help_title]); - EXPECT_EQ((*objPtr)[1], first[strings::msg_params][strings::vr_help]); - EXPECT_EQ((*objPtr)[2], + EXPECT_EQ(*vrHelpTitle, first[strings::msg_params][strings::vr_help_title]); + EXPECT_EQ(*vrHelp, first[strings::msg_params][strings::vr_help]); + EXPECT_EQ(*keyboardProperties, first[strings::msg_params][strings::keyboard_properties]); - EXPECT_EQ((*objPtr)[3], first[strings::msg_params][strings::menu_title]); - EXPECT_EQ((*objPtr)[4], first[strings::msg_params][strings::menu_icon]); - EXPECT_EQ((*objPtr)[5], second[strings::msg_params][strings::help_prompt]); - EXPECT_EQ((*objPtr)[6], second[strings::msg_params][strings::timeout_prompt]); + EXPECT_EQ(*menuTitle, first[strings::msg_params][strings::menu_title]); + EXPECT_EQ(*menuIcon, first[strings::msg_params][strings::menu_icon]); + EXPECT_EQ(*helpPrompt, second[strings::msg_params][strings::help_prompt]); + EXPECT_EQ(*timeoutPrompt, + second[strings::msg_params][strings::timeout_prompt]); + EXPECT_EQ(*menuLayout, first[strings::msg_params][strings::menu_layout]); } TEST(MessageHelperTestCreate, CreateShowRequestToHMI_SendSmartObject_Equal) { @@ -258,11 +292,9 @@ TEST(MessageHelperTestCreate, CreateShowRequestToHMI_SendSmartObject_Equal) { smart_objects::SmartObjectSPtr smartObjectPtr = std::make_shared(); - const smart_objects::SmartObject& object = *smartObjectPtr; - EXPECT_CALL(*appSharedMock, show_command()) .Times(AtLeast(2)) - .WillRepeatedly(Return(&object)); + .WillRepeatedly(Return(smartObjectPtr)); smart_objects::SmartObjectList ptr = MessageHelper::CreateShowRequestToHMI(appSharedMock, 0u); diff --git a/src/components/application_manager/test/resumption/resumption_data_test.cc b/src/components/application_manager/test/resumption/resumption_data_test.cc index a416cbbad5..cb5a4d9a56 100644 --- a/src/components/application_manager/test/resumption/resumption_data_test.cc +++ b/src/components/application_manager/test/resumption/resumption_data_test.cc @@ -30,19 +30,19 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include "application_manager/resumption_data_test.h" + #include #include -#include "gtest/gtest.h" #include "application_manager/application.h" #include "application_manager/message_helper.h" #include "application_manager/mock_resumption_data.h" #include "application_manager/usage_statistics.h" +#include "gtest/gtest.h" #include "utils/custom_string.h" #include "utils/data_accessor.h" -#include "application_manager/resumption_data_test.h" - namespace test { namespace components { namespace resumption_test { @@ -53,15 +53,6 @@ using ::testing::ReturnPointee; using ::testing::ReturnRef; ResumptionDataTest::~ResumptionDataTest() { - delete help_prompt_; - delete timeout_prompt_; - delete vr_help_; - delete vr_help_title_; - delete vr_synonyms_; - delete keyboard_props_; - delete menu_title_; - delete menu_icon_; - for (am::CommandsMap::iterator it = test_commands_map.begin(); test_commands_map.end() != it; ++it) { @@ -266,6 +257,7 @@ void ResumptionDataTest::CheckGlobalProporties(sm::SmartObject& res_list) { CheckKeyboardProperties(res_list[am::strings::keyboard_properties]); CheckMenuTitle(res_list[am::strings::menu_title]); CheckMenuIcon(res_list[am::strings::menu_icon]); + CheckMenuLayout(res_list[am::strings::menu_layout]); } void ResumptionDataTest::CheckKeyboardProperties(sm::SmartObject& res_list) { @@ -317,6 +309,12 @@ void ResumptionDataTest::CheckMenuIcon(sm::SmartObject& res_list) { static_cast(res_list[am::strings::image_type].asInt())); } +void ResumptionDataTest::CheckMenuLayout(sm::SmartObject& res_list) { + MenuLayout::eType value = static_cast( + (*menu_layout_)[am::strings::menu_layout].asInt()); + EXPECT_EQ(value, res_list[am::strings::menu_layout].asInt()); +} + void ResumptionDataTest::CheckHelpPrompt(sm::SmartObject& res_list) { for (uint i = 0; i < tts_chunks_count; ++i) { std::string promt = (*help_prompt_)[i][am::strings::help_prompt].asString(); @@ -420,17 +418,15 @@ void ResumptionDataTest::PrepareData() { ON_CALL(*app_mock, sub_menu_map()).WillByDefault(Return(sub_menu_m)); ON_CALL(*app_mock, choice_set_map()).WillByDefault(Return(choice_set_m)); - ON_CALL(*app_mock, help_prompt()).WillByDefault(ReturnPointee(&help_prompt_)); - ON_CALL(*app_mock, timeout_prompt()) - .WillByDefault(ReturnPointee(&timeout_prompt_)); - ON_CALL(*app_mock, vr_help()).WillByDefault(ReturnPointee(&vr_help_)); - ON_CALL(*app_mock, vr_help_title()) - .WillByDefault(ReturnPointee(&vr_help_title_)); + ON_CALL(*app_mock, help_prompt()).WillByDefault(Return(help_prompt_)); + ON_CALL(*app_mock, timeout_prompt()).WillByDefault(Return(timeout_prompt_)); + ON_CALL(*app_mock, vr_help()).WillByDefault(Return(vr_help_)); + ON_CALL(*app_mock, vr_help_title()).WillByDefault(Return(vr_help_title_)); - ON_CALL(*app_mock, keyboard_props()) - .WillByDefault(ReturnPointee(&keyboard_props_)); - ON_CALL(*app_mock, menu_title()).WillByDefault(ReturnPointee(&menu_title_)); - ON_CALL(*app_mock, menu_icon()).WillByDefault(ReturnPointee(&menu_icon_)); + ON_CALL(*app_mock, keyboard_props()).WillByDefault(Return(keyboard_props_)); + ON_CALL(*app_mock, menu_title()).WillByDefault(Return(menu_title_)); + ON_CALL(*app_mock, menu_icon()).WillByDefault(Return(menu_icon_)); + ON_CALL(*app_mock, menu_layout()).WillByDefault(Return(menu_layout_)); ON_CALL(*app_mock, SubscribedButtons()).WillByDefault(Return(btn_sub)); @@ -456,12 +452,12 @@ void ResumptionDataTest::SetDefaultWindowIds() { void ResumptionDataTest::SetGlobalProporties() { SetKeyboardProperties(); - SetMenuTitleAndIcon(); + SetMenuParams(); SetHelpAndTimeoutPrompt(); SetVRHelpTitle(); } -void ResumptionDataTest::SetMenuTitleAndIcon() { +void ResumptionDataTest::SetMenuParams() { custom_str::CustomString icon_name("test icon"); sm::SmartObject sm_icon; sm_icon[am::strings::value] = "test icon"; @@ -470,8 +466,13 @@ void ResumptionDataTest::SetMenuTitleAndIcon() { sm::SmartObject sm_title; sm_title = "test title"; - menu_title_ = new sm::SmartObject(sm_title); - menu_icon_ = new sm::SmartObject(sm_icon); + + sm::SmartObject sm_layout; + sm_layout = MenuLayout::LIST; + + menu_title_ = std::make_shared(sm_title); + menu_icon_ = std::make_shared(sm_icon); + menu_layout_ = std::make_shared(sm_layout); } void ResumptionDataTest::SetHelpAndTimeoutPrompt() { @@ -484,7 +485,7 @@ void ResumptionDataTest::SetHelpAndTimeoutPrompt() { help_prompt[i][am::strings::text] = "help prompt name" + std::string(numb); help_prompt[i][am::strings::type] = SpeechCapabilities::PRE_RECORDED; } - help_prompt_ = new sm::SmartObject(help_prompt); + help_prompt_ = std::make_shared(help_prompt); for (uint i = 0; i < tts_chunks_count; ++i) { char numb[12]; std::snprintf(numb, 12, "%d", i); @@ -492,7 +493,7 @@ void ResumptionDataTest::SetHelpAndTimeoutPrompt() { timeout_prompt[i][am::strings::type] = SpeechCapabilities::SC_TEXT; } - timeout_prompt_ = new sm::SmartObject(timeout_prompt); + timeout_prompt_ = std::make_shared(timeout_prompt); } void ResumptionDataTest::SetVRHelpTitle() { @@ -507,8 +508,8 @@ void ResumptionDataTest::SetVRHelpTitle() { vr_help[i][am::strings::position] = i; } - vr_help_ = new sm::SmartObject(vr_help); - vr_help_title_ = new sm::SmartObject(vr_help_title); + vr_help_ = std::make_shared(vr_help); + vr_help_title_ = std::make_shared(vr_help_title); } void ResumptionDataTest::SetCommands() { @@ -618,7 +619,7 @@ void ResumptionDataTest::SetKeyboardProperties() { keyboard[am::strings::auto_complete_text] = "complete"; keyboard[am::strings::limited_character_list][0] = "y"; keyboard[am::strings::limited_character_list][1] = "n"; - keyboard_props_ = new sm::SmartObject(keyboard); + keyboard_props_ = std::make_shared(keyboard); } void ResumptionDataTest::SetSubscriptions() { -- cgit v1.2.1