From ada2faa4dfadb42963837a6410de7b256f356955 Mon Sep 17 00:00:00 2001 From: lanhaoyu Date: Wed, 10 Sep 2025 17:51:35 +0800 Subject: [PATCH] fix_getAbilityResourceInfo_part2 Signed-off-by: lanhaoyu --- .../bundle/src/native_interface_bundle.cpp | 3 +- .../bundlemgr/include/bundle_mgr_host_impl.h | 2 +- .../bundlemgr/src/bundle_mgr_host_impl.cpp | 30 +++++++++ .../bms_bundle_default_app_test/BUILD.gn | 18 ++++++ .../bms_bundle_default_app_test.cpp | 53 ++++++++++++++++ .../bms_bundle_manager_test.cpp | 33 ++++++++++ .../bms_bundle_manager_test_three.cpp | 63 ++++++++++++++++++- .../bms_bundle_mgr_host_unit_test.cpp | 20 +++++- 8 files changed, 218 insertions(+), 4 deletions(-) diff --git a/interfaces/kits/native/bundle/src/native_interface_bundle.cpp b/interfaces/kits/native/bundle/src/native_interface_bundle.cpp index 8c5434ffdc..08cbc7d362 100644 --- a/interfaces/kits/native/bundle/src/native_interface_bundle.cpp +++ b/interfaces/kits/native/bundle/src/native_interface_bundle.cpp @@ -32,6 +32,7 @@ const size_t CHAR_MIN_LENGTH = 1; const size_t CHAR_MAX_LENGTH = 10240; const size_t MAX_ALLOWED_SIZE = 1024 * 1024; const size_t ARRAY_MAX_LENGTH = 1024; +const size_t ERR_APPEXECFWK_PERMISSION_DENIED = 8521226; } // Helper function to release char* memory @@ -556,7 +557,7 @@ BundleManager_ErrorCode OH_NativeBundle_GetAbilityResourceInfo( std::vector launcherAbilityResourceInfoArr; if (bundleMgrProxyNative.GetLauncherAbilityResourceInfoNative(fileTypeStr, launcherAbilityResourceInfoArr) == - BUNDLE_MANAGER_ERROR_CODE_PERMISSION_DENIED) { + ERR_APPEXECFWK_PERMISSION_DENIED) { APP_LOGE("failed to get launcher Ability Resource Info Arr because of permission denied"); return BUNDLE_MANAGER_ERROR_CODE_PERMISSION_DENIED; } diff --git a/services/bundlemgr/include/bundle_mgr_host_impl.h b/services/bundlemgr/include/bundle_mgr_host_impl.h index 71bd1446b2..bf143ebfa9 100644 --- a/services/bundlemgr/include/bundle_mgr_host_impl.h +++ b/services/bundlemgr/include/bundle_mgr_host_impl.h @@ -1258,7 +1258,7 @@ private: std::string &label); bool SendQueryBundleInfoEvent(QueryEventInfo &query, int64_t intervalTime, bool reportNow); bool GetCallingInfo(int32_t callingUid, std::string &callingBundleName, std::string &callingAppId); - + void RemoveSameAbilityResourceInfo(std::vector &launcherAbilityResourceInfos); bool GetSpecificResourceInfo(const std::string &bundleName, const std::string &moduleName, const std::string &abilityName, int32_t appIndex, const std::vector &launcherAbilityResourceInfos, diff --git a/services/bundlemgr/src/bundle_mgr_host_impl.cpp b/services/bundlemgr/src/bundle_mgr_host_impl.cpp index 38da1ca8de..0060e718aa 100644 --- a/services/bundlemgr/src/bundle_mgr_host_impl.cpp +++ b/services/bundlemgr/src/bundle_mgr_host_impl.cpp @@ -6232,6 +6232,35 @@ ErrCode BundleMgrHostImpl::ImplicitQueryAbilityInfosWithDefault(const std::strin return ERR_OK; } +void BundleMgrHostImpl::RemoveSameAbilityResourceInfo( + std::vector &launcherAbilityResourceInfos) +{ + if (launcherAbilityResourceInfos.size() <= 1) { + return; + } + // remove the same items + std::sort(launcherAbilityResourceInfos.begin(), launcherAbilityResourceInfos.end(), + [](const LauncherAbilityResourceInfo &infoA, const LauncherAbilityResourceInfo &infoB) { + if (infoA.bundleName != infoB.bundleName) { + return infoA.bundleName < infoB.bundleName; + } + if (infoA.moduleName != infoB.moduleName) { + return infoA.moduleName < infoB.moduleName; + } + if (infoA.abilityName != infoB.abilityName) { + return infoA.abilityName < infoB.abilityName; + } + return infoA.appIndex < infoB.appIndex; + }); + std::vector::iterator unque_it = std::unique( + launcherAbilityResourceInfos.begin(), launcherAbilityResourceInfos.end(), + [](const LauncherAbilityResourceInfo &infoA, const LauncherAbilityResourceInfo &infoB) { + return (infoA.bundleName == infoB.bundleName) && (infoA.moduleName == infoB.moduleName) + && (infoA.abilityName == infoB.abilityName) && (infoA.appIndex == infoB.appIndex); + }); + launcherAbilityResourceInfos.erase(unque_it, launcherAbilityResourceInfos.end()); +} + ErrCode BundleMgrHostImpl::GetAbilityResourceInfo(const std::string &fileType, std::vector &launcherAbilityResourceInfos) { @@ -6253,6 +6282,7 @@ ErrCode BundleMgrHostImpl::GetAbilityResourceInfo(const std::string &fileType, for (const std::string& normalizedType : normalizedTypeVector) { (void)ImplicitQueryAbilityInfosWithDefault(normalizedType, launcherAbilityResourceInfos); } + RemoveSameAbilityResourceInfo(launcherAbilityResourceInfos); APP_LOGI("GetAbilityResourceInfo end, size: %{public}zu", launcherAbilityResourceInfos.size()); return ERR_OK; } diff --git a/services/bundlemgr/test/unittest/bms_bundle_default_app_test/BUILD.gn b/services/bundlemgr/test/unittest/bms_bundle_default_app_test/BUILD.gn index 4c2c0be99f..2d6ff1eb34 100644 --- a/services/bundlemgr/test/unittest/bms_bundle_default_app_test/BUILD.gn +++ b/services/bundlemgr/test/unittest/bms_bundle_default_app_test/BUILD.gn @@ -192,6 +192,24 @@ ohos_unittest("BmsBundleDefaultAppTest") { ] defines += [ "BMS_DEVICE_INFO_MANAGER_ENABLE" ] } + + if (bundle_framework_bundle_resource) { + defines += [ "BUNDLE_FRAMEWORK_BUNDLE_RESOURCE" ] + external_deps += [ "ability_base:configuration" ] + if (bundle_framework_graphics) { + defines += [ "BUNDLE_FRAMEWORK_GRAPHICS" ] + external_deps += [ + "ace_engine:drawable_descriptor", + "image_framework:image_native", + ] + } + sources += bundle_resource + } + + if (global_i18n_enable) { + defines += [ "GLOBAL_I18_ENABLE" ] + external_deps += [ "i18n:intl_util" ] + } } ohos_unittest("BmsBundleDefaultAppMgrTest") { diff --git a/services/bundlemgr/test/unittest/bms_bundle_default_app_test/bms_bundle_default_app_test.cpp b/services/bundlemgr/test/unittest/bms_bundle_default_app_test/bms_bundle_default_app_test.cpp index 0375ed7aee..014f97d491 100644 --- a/services/bundlemgr/test/unittest/bms_bundle_default_app_test/bms_bundle_default_app_test.cpp +++ b/services/bundlemgr/test/unittest/bms_bundle_default_app_test/bms_bundle_default_app_test.cpp @@ -2462,4 +2462,57 @@ HWTEST_F(BmsBundleDefaultAppTest, ImplicitQueryAbilityInfosWithDefault_0100, Fun EXPECT_EQ(ret, ERR_OK); EXPECT_EQ(findDefaultApp, true); } + +/** + * @tc.number: ImplicitQueryAbilityInfosWithDefault_0200 + * @tc.name: test ImplicitQueryAbilityInfosWithDefault + * @tc.desc: 1. test ImplicitQueryAbilityInfosWithDefault success in HostImpl + */ +HWTEST_F(BmsBundleDefaultAppTest, ImplicitQueryAbilityInfosWithDefault_0200, Function | SmallTest | Level1) +{ + auto defaultAppProxy = GetDefaultAppProxy(); + EXPECT_NE(defaultAppProxy, nullptr); + ErrCode ret = SetDefaultApplicationWrap(defaultAppProxy, PDF_MIME_TYPE, ABILITY_PDF); + EXPECT_EQ(ret, ERR_OK); + + BundleInfo bundleInfo; + ret = defaultAppProxy->GetDefaultApplication(USER_ID, PDF_MIME_TYPE, bundleInfo); + EXPECT_EQ(ret, ERR_OK); + ASSERT_EQ(bundleInfo.abilityInfos.size(), 1); + EXPECT_EQ(bundleInfo.abilityInfos[0].name, ABILITY_PDF); + + ASSERT_NE(bundleMgrService_, nullptr); + auto dataMgr = bundleMgrService_->GetDataMgr(); + ASSERT_NE(dataMgr, nullptr); + int32_t flags = 0; + std::vector abilityInfos; + std::vector extensionInfos; + AbilityInfo defaultAbilityInfo; + bool findDefaultApp = false; + AAFwk::Want want; + want.SetType(PDF_MIME_TYPE); + want.SetAction(ACTION_VIEW_DATA); + bool result = DefaultAppMgr::GetInstance().GetDefaultApplication( + want, USER_ID, abilityInfos, extensionInfos, false); + EXPECT_EQ(result, true); + ASSERT_EQ(abilityInfos.size(), 1); + EXPECT_EQ(extensionInfos.size(), 0); + EXPECT_EQ(abilityInfos[0].name, ABILITY_PDF); + + abilityInfos = {}; + ret = dataMgr->ImplicitQueryAbilityInfosWithDefault( + want, flags, USER_ID, abilityInfos, defaultAbilityInfo, findDefaultApp); + EXPECT_EQ(ret, ERR_OK); + EXPECT_EQ(findDefaultApp, true); + ASSERT_NE(abilityInfos.size(), 0); + EXPECT_EQ(abilityInfos[0].name, ABILITY_PDF); + + auto hostImpl = std::make_unique(); + std::vector launcherAbilityResourceInfos; + setuid(20000001); + ret = hostImpl->ImplicitQueryAbilityInfosWithDefault(PDF_MIME_TYPE, launcherAbilityResourceInfos); + setuid(0); + EXPECT_EQ(ret, ERR_OK); + EXPECT_NE(launcherAbilityResourceInfos.size(), 0); +} } // OHOS \ No newline at end of file diff --git a/services/bundlemgr/test/unittest/bms_bundle_manager_test/bms_bundle_manager_test.cpp b/services/bundlemgr/test/unittest/bms_bundle_manager_test/bms_bundle_manager_test.cpp index f636297faf..6cb044d7dd 100644 --- a/services/bundlemgr/test/unittest/bms_bundle_manager_test/bms_bundle_manager_test.cpp +++ b/services/bundlemgr/test/unittest/bms_bundle_manager_test/bms_bundle_manager_test.cpp @@ -3201,4 +3201,37 @@ HWTEST_F(BmsBundleManagerTest, GetBundleInfosV9_0001, Function | MediumTest | Le EXPECT_EQ(ret2, ERR_OK); UnInstallBundle(BUNDLE_BACKUP_NAME); } + +/** + * @tc.number: ImplicitQueryAbilityInfosWithDefault_0001 + * @tc.name: test ImplicitQueryAbilityInfosWithDefault in HostImpl + * @tc.desc: 1.system run normally + * 2.want param is empty + */ +HWTEST_F(BmsBundleManagerTest, ImplicitQueryAbilityInfosWithDefault_0001, Function | SmallTest | Level1) +{ + auto hostImpl = std::make_unique(); + std::string fileType = "general.general"; + std::vector launcherAbilityResourceInfos; + ErrCode ret = hostImpl->ImplicitQueryAbilityInfosWithDefault(fileType, launcherAbilityResourceInfos); + EXPECT_EQ(ret, ERR_BUNDLE_MANAGER_ABILITY_INFO_NOT_FOUND); +} + +/** + * @tc.number: ImplicitQueryAbilityInfosWithDefault_0002 + * @tc.name: test ImplicitQueryAbilityInfosWithDefault in HostImpl + * @tc.desc: 1.dataMgr is null + */ +HWTEST_F(BmsBundleManagerTest, ImplicitQueryAbilityInfosWithDefault_0002, Function | SmallTest | Level0) +{ + auto hostImpl = std::make_unique(); + + ClearDataMgr(); + ScopeGuard stateGuard([&] { ResetDataMgr(); }); + std::string fileType = "text/html"; + std::vector launcherAbilityResourceInfos; + ErrCode ret = hostImpl->ImplicitQueryAbilityInfosWithDefault(fileType, launcherAbilityResourceInfos); + EXPECT_EQ(ret, ERR_APPEXECFWK_NULL_PTR); + EXPECT_EQ(launcherAbilityResourceInfos.size(), 0); +} } // OHOS \ No newline at end of file diff --git a/services/bundlemgr/test/unittest/bms_bundle_manager_test/bms_bundle_manager_test_three.cpp b/services/bundlemgr/test/unittest/bms_bundle_manager_test/bms_bundle_manager_test_three.cpp index 8582e445f5..f6697dd264 100644 --- a/services/bundlemgr/test/unittest/bms_bundle_manager_test/bms_bundle_manager_test_three.cpp +++ b/services/bundlemgr/test/unittest/bms_bundle_manager_test/bms_bundle_manager_test_three.cpp @@ -37,6 +37,7 @@ #include "installd/installd_service.h" #include "installd_client.h" #include "inner_bundle_info.h" +#include "launcher_ability_resource_info.h" #include "mime_type_mgr.h" #include "mock_status_receiver.h" #include "module_test_runner.h" @@ -2160,6 +2161,22 @@ HWTEST_F(BmsBundleManagerTest3, GetAbilityResourceInfo_0002, Function | MediumTe EXPECT_EQ(testRet, ERR_OK); } +/** + * @tc.number: GetAbilityResourceInfo_0003 + * @tc.name: test GetAbilityResourceInfo + * @tc.desc: 1.test GetAbilityResourceInfo + 2.text fileType + */ +HWTEST_F(BmsBundleManagerTest3, GetAbilityResourceInfo_0003, Function | MediumTest | Level1) +{ + auto hostImpl = std::make_unique(); + std::string fileType = ".?"; + std::vector launcherAbilityResourceInfos; + auto testRet = hostImpl->GetAbilityResourceInfo(fileType, launcherAbilityResourceInfos); + EXPECT_EQ(testRet, ERR_APPEXECFWK_INPUT_WRONG_TYPE_FILE); + EXPECT_TRUE(launcherAbilityResourceInfos.empty()); +} + /** * @tc.number: GetSpecificResourceInfo_0001 * @tc.name: test GetSpecificResourceInfo @@ -2199,7 +2216,7 @@ HWTEST_F(BmsBundleManagerTest3, GetSpecificResourceInfo_0001, Function | MediumT * @tc.name: test ImplicitQueryAbilityInfosWithDefault * @tc.desc: 1.system run normally * 2.want param is empty -*/ + */ HWTEST_F(BmsBundleManagerTest3, ImplicitQueryAbilityInfosWithDefault_0001, Function | SmallTest | Level1) { AAFwk::Want want; @@ -2212,4 +2229,48 @@ HWTEST_F(BmsBundleManagerTest3, ImplicitQueryAbilityInfosWithDefault_0001, Funct want, 0, USERID, abilityInfos, defaultAbilityInfo, findDefaultApp); EXPECT_EQ(testRet, ERR_BUNDLE_MANAGER_ABILITY_INFO_NOT_FOUND); } + +/** + * @tc.number: ImplicitQueryAbilityInfosWithDefault_0002 + * @tc.name: test ImplicitQueryAbilityInfosWithDefault in HostImpl + * @tc.desc: 1.system run normally + * 2.not defined BUNDLE_FRAMEWORK_BUNDLE_RESOURCE + */ +HWTEST_F(BmsBundleManagerTest3, ImplicitQueryAbilityInfosWithDefault_0002, Function | SmallTest | Level1) +{ + auto hostImpl = std::make_unique(); + std::string fileType = "text/html"; + std::vector launcherAbilityResourceInfos; + ErrCode ret = hostImpl->ImplicitQueryAbilityInfosWithDefault(fileType, launcherAbilityResourceInfos); + EXPECT_EQ(ret, ERR_OK); +} + +/** + * @tc.number: RemoveSameAbilityResourceInfo_0001 + * @tc.name: test RemoveSameAbilityResourceInfo in HostImpl + * @tc.desc: 1.system run normally + * 2.not defined BUNDLE_FRAMEWORK_BUNDLE_RESOURCE + */ +HWTEST_F(BmsBundleManagerTest3, RemoveSameAbilityResourceInfo_0001, Function | SmallTest | Level1) +{ + auto hostImpl = std::make_unique(); + std::vector launcherAbilityResourceInfos; + hostImpl->RemoveSameAbilityResourceInfo(launcherAbilityResourceInfos); + EXPECT_EQ(launcherAbilityResourceInfos.size(), 0); + LauncherAbilityResourceInfo launcherAbilityResourceInfo; + launcherAbilityResourceInfo.bundleName = "bundleName"; + launcherAbilityResourceInfo.moduleName = "moduleName"; + launcherAbilityResourceInfo.abilityName = "abilityName"; + launcherAbilityResourceInfo.appIndex = 0; + launcherAbilityResourceInfos.push_back(launcherAbilityResourceInfo); + launcherAbilityResourceInfos.push_back(launcherAbilityResourceInfo); + launcherAbilityResourceInfo.bundleName = "bundleName1"; + launcherAbilityResourceInfo.moduleName = "moduleName1"; + launcherAbilityResourceInfo.abilityName = "abilityName1"; + launcherAbilityResourceInfo.appIndex = 0; + launcherAbilityResourceInfos.push_back(launcherAbilityResourceInfo); + EXPECT_EQ(launcherAbilityResourceInfos.size(), 3); + hostImpl->RemoveSameAbilityResourceInfo(launcherAbilityResourceInfos); + EXPECT_EQ(launcherAbilityResourceInfos.size(), 2); +} } // OHOS \ No newline at end of file diff --git a/services/bundlemgr/test/unittest/bms_bundle_resource_test/bms_bundle_mgr_host_unit_test.cpp b/services/bundlemgr/test/unittest/bms_bundle_resource_test/bms_bundle_mgr_host_unit_test.cpp index e44fc29f76..589adff8b2 100644 --- a/services/bundlemgr/test/unittest/bms_bundle_resource_test/bms_bundle_mgr_host_unit_test.cpp +++ b/services/bundlemgr/test/unittest/bms_bundle_resource_test/bms_bundle_mgr_host_unit_test.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2024-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -3016,5 +3016,23 @@ HWTEST_F(BmsBundleMgrHostUnitTest, OnRemoteRequest_1650, Function | SmallTest | ErrCode res = bundleMgrHost.OnRemoteRequest(code, data, reply, option); EXPECT_EQ(res, ERR_OK); } + +/** + * @tc.number: OnRemoteRequest_1660 + * @tc.name: test the OnRemoteRequest + * @tc.desc: 1. system running normally + */ +HWTEST_F(BmsBundleMgrHostUnitTest, OnRemoteRequest_1660, Function | SmallTest | Level0) +{ + BundleMgrHost bundleMgrHost; + uint32_t code = static_cast(BundleMgrInterfaceCode::GET_ABILITY_RESOURCE_INFO); + MessageParcel data; + std::u16string descriptor = BundleMgrHost::GetDescriptor(); + data.WriteInterfaceToken(descriptor); + MessageParcel reply; + MessageOption option; + ErrCode res = bundleMgrHost.OnRemoteRequest(code, data, reply, option); + EXPECT_EQ(res, ERR_OK); +} } // namespace AppExecFwk } // namespace OHOS \ No newline at end of file -- Gitee