diff --git a/interfaces/inner_api/appexecfwk_core/src/bundlemgr/bundle_mgr_host.cpp b/interfaces/inner_api/appexecfwk_core/src/bundlemgr/bundle_mgr_host.cpp index aeb97ffe362d46dc4da7ae54b81a09c8904e9c02..6b50d46a0a30c59e02a244b845dcdcb37e0aa316 100644 --- a/interfaces/inner_api/appexecfwk_core/src/bundlemgr/bundle_mgr_host.cpp +++ b/interfaces/inner_api/appexecfwk_core/src/bundlemgr/bundle_mgr_host.cpp @@ -1859,6 +1859,11 @@ ErrCode BundleMgrHost::HandleCleanBundleCacheFilesForSelf(MessageParcel &data, M return ERR_APPEXECFWK_PARCEL_ERROR; } sptr cleanCacheCallback = iface_cast(object); + if (cleanCacheCallback == nullptr) { + APP_LOGE("iface_cast cleanCacheCallback failed"); + return ERR_APPEXECFWK_PARCEL_ERROR; + } + ErrCode ret = CleanBundleCacheFilesForSelf(cleanCacheCallback); if (!reply.WriteInt32(ret)) { APP_LOGE("write failed"); diff --git a/interfaces/kits/js/bundle_manager/bundle_manager.cpp b/interfaces/kits/js/bundle_manager/bundle_manager.cpp index d590f91bde414a696f1ecce1cbd631d77fcf6520..24aa4dde1588710d1f6f9adc72ff7db9f68af2b4 100644 --- a/interfaces/kits/js/bundle_manager/bundle_manager.cpp +++ b/interfaces/kits/js/bundle_manager/bundle_manager.cpp @@ -2229,6 +2229,10 @@ void CleanBundleCacheFilesForSelfExec(napi_env env, void *data) } if (asyncCallbackInfo->cleanCacheCallback == nullptr) { asyncCallbackInfo->cleanCacheCallback = new (std::nothrow) CleanCacheCallback(); + if (asyncCallbackInfo->cleanCacheCallback == nullptr) { + APP_LOGE("error failed to allocate CleanCacheCallback"); + return; + } } asyncCallbackInfo->err = BundleManagerHelper::InnerCleanBundleCacheForSelfCallback( asyncCallbackInfo->cleanCacheCallback); diff --git a/interfaces/kits/js/bundle_manager/bundle_manager_helper.cpp b/interfaces/kits/js/bundle_manager/bundle_manager_helper.cpp index afc19378beea1ba5f1ee2418a9075fa970f3bffd..cefe5dbacd7c85be8ee1fae40cb7c7e4ace94011 100644 --- a/interfaces/kits/js/bundle_manager/bundle_manager_helper.cpp +++ b/interfaces/kits/js/bundle_manager/bundle_manager_helper.cpp @@ -473,7 +473,7 @@ ErrCode BundleManagerHelper::InnerCleanBundleCacheForSelfCallback( } ErrCode result = iBundleMgr->CleanBundleCacheFilesForSelf(cleanCacheCallback); if (result != ERR_OK) { - APP_LOGE("call error"); + APP_LOGE("CleanBundleCacheFilesForSelf ErrCode: %{public}d", result); } return CommonFunc::ConvertErrCode(result); } diff --git a/services/bundlemgr/test/unittest/bms_bundle_kit_service_test/BUILD.gn b/services/bundlemgr/test/unittest/bms_bundle_kit_service_test/BUILD.gn index 25a279328f8a1703384680e85a10b55611ecf34a..cf9aeeb6a2f464e7db0bd1b74e6504001b21c91f 100644 --- a/services/bundlemgr/test/unittest/bms_bundle_kit_service_test/BUILD.gn +++ b/services/bundlemgr/test/unittest/bms_bundle_kit_service_test/BUILD.gn @@ -1330,7 +1330,10 @@ ohos_unittest("BmsCleanAllBundleCacheTest") { } use_exceptions = true module_out_path = module_output_path - include_dirs = [ "mock/include" ] + include_dirs = [ + "mock/include", + "${kits_path}/js/bundle_manager", + ] sources = bundle_mgr_source sources += [ "mock/src/mock_ipc_skeleton.cpp" ] @@ -1375,7 +1378,10 @@ ohos_unittest("BmsCleanAllBundleCacheTest") { } deps = [ + "${base_path}:appexecfwk_base", "${core_path}:appexecfwk_core", + "${kits_path}/js/bundle_manager:bundle_manager_common", + "${kits_path}/js/common:bundle_napi_common", ] deps += bundle_install_deps @@ -1394,13 +1400,14 @@ ohos_unittest("BmsCleanAllBundleCacheTest") { "hitrace:hitrace_meter", "init:libbegetutil", "jsoncpp:jsoncpp", + "napi:ace_napi", "safwk:api_cache_manager", "safwk:system_ability_fwk", "samgr:samgr_proxy", "selinux_adapter:librestorecon", ] external_deps += bundle_install_external_deps - + public_external_deps = [ "libuv:uv" ] defines = [] if (current_cpu == "arm64") { defines += [ "USE_ARM64" ] diff --git a/services/bundlemgr/test/unittest/bms_bundle_kit_service_test/bms_clean_all_bundle_cache_test.cpp b/services/bundlemgr/test/unittest/bms_bundle_kit_service_test/bms_clean_all_bundle_cache_test.cpp index e76fca5a689be0257f8a4b022a4cc3f43ff18b0d..8e75e9594768e42e4eb6a4a0a0664c25ae6e001e 100644 --- a/services/bundlemgr/test/unittest/bms_bundle_kit_service_test/bms_clean_all_bundle_cache_test.cpp +++ b/services/bundlemgr/test/unittest/bms_bundle_kit_service_test/bms_clean_all_bundle_cache_test.cpp @@ -61,6 +61,7 @@ #include "display_power_mgr_client.h" #include "display_power_info.h" #include "battery_srv_client.h" +#include "bundle_manager_helper.h" using namespace testing::ext; using namespace OHOS; @@ -947,4 +948,99 @@ HWTEST_F(BmsCleanAllBundleCacheTest, CleanBundleCacheFilesAutomatic_0200, Functi ErrCode result = bundleMgrProxy->CleanBundleCacheFilesAutomatic(cacheSize); EXPECT_EQ(result, ERR_BUNDLE_MANAGER_INVALID_PARAMETER); } + +/** + * @tc.number: InnerCleanBundleCacheForSelfCallback_0100 + * @tc.name: test InnerCleanBundleCacheForSelfCallback with null callback + * @tc.desc: 1. system run normally + * 2. cleanCacheCallback is nullptr + * 3. return ERROR_BUNDLE_SERVICE_EXCEPTION + */ +HWTEST_F(BmsCleanAllBundleCacheTest, InnerCleanBundleCacheForSelfCallback_0100, Function | SmallTest | Level1) +{ + sptr cleanCacheCallback = nullptr; + ErrCode result = BundleManagerHelper::InnerCleanBundleCacheForSelfCallback(cleanCacheCallback); + EXPECT_EQ(result, ERROR_BUNDLE_SERVICE_EXCEPTION); +} + +/** + * @tc.number: InnerCleanBundleCacheForSelfCallback_0200 + * @tc.name: test InnerCleanBundleCacheForSelfCallback with valid callback + * @tc.desc: 1. system run normally + * 2. cleanCacheCallback is valid + * 3. test successful execution path + */ +HWTEST_F(BmsCleanAllBundleCacheTest, InnerCleanBundleCacheForSelfCallback_0200, Function | SmallTest | Level1) +{ + MockInstallBundle(BUNDLE_NAME_TEST, MODULE_NAME_TEST, ABILITY_NAME_TEST); + CreateFileDir(); + + sptr cleanCacheCallback = new (std::nothrow) CleanCacheCallback(); + EXPECT_NE(cleanCacheCallback, nullptr); + + ErrCode result = BundleManagerHelper::InnerCleanBundleCacheForSelfCallback(cleanCacheCallback); + EXPECT_NE(result, ERROR_BUNDLE_SERVICE_EXCEPTION); + + CleanFileDir(); + MockUninstallBundle(BUNDLE_NAME_TEST); +} + +/** + * @tc.number: InnerCleanBundleCacheForSelfCallback_0300 + * @tc.name: test InnerCleanBundleCacheForSelfCallback error handling + * @tc.desc: 1. system run normally + * 2. test error handling when bundle manager operations fail + * 3. verify error code conversion + */ +HWTEST_F(BmsCleanAllBundleCacheTest, InnerCleanBundleCacheForSelfCallback_0300, Function | SmallTest | Level1) +{ + sptr cleanCacheCallback = new (std::nothrow) CleanCacheCallback(); + EXPECT_NE(cleanCacheCallback, nullptr); + + ErrCode result = BundleManagerHelper::InnerCleanBundleCacheForSelfCallback(cleanCacheCallback); + EXPECT_NE(result, ERR_OK); + EXPECT_NE(result, ERROR_BUNDLE_SERVICE_EXCEPTION); +} + +/** + * @tc.number: HandleCleanBundleCacheFilesForSelf_0100 + * @tc.name: test with null remote object + * @tc.desc: 1. Prepare MessageParcel data without writing remote object + * 2. Call HandleCleanBundleCacheFilesForSelf + * 3. Expect ERR_APPEXECFWK_PARCEL_ERROR + */ +HWTEST_F(BmsCleanAllBundleCacheTest, HandleCleanBundleCacheFilesForSelf_0100, Function | SmallTest | Level1) +{ + MessageParcel data; + MessageParcel reply; + + BundleMgrHost host; + ErrCode result = host.HandleCleanBundleCacheFilesForSelf(data, reply); + + EXPECT_EQ(result, ERR_APPEXECFWK_PARCEL_ERROR); +} + +/** + * @tc.number: HandleCleanBundleCacheFilesForSelf_0200 + * @tc.name: test with invalid remote object type + * @tc.desc: 1. Write a non-ICleanCacheCallback remote object to MessageParcel data + * 2. Call HandleCleanBundleCacheFilesForSelf + * 3. Expect iface_cast to fail and return ERR_APPEXECFWK_PARCEL_ERROR + */ +HWTEST_F(BmsCleanAllBundleCacheTest, HandleCleanBundleCacheFilesForSelf_0200, Function | SmallTest | Level1) +{ + MessageParcel data; + MessageParcel reply; + + auto hostImpl = std::make_unique(); + sptr mockObject = hostImpl->AsObject(); + ASSERT_NE(mockObject, nullptr); + + data.WriteRemoteObject(mockObject); + + BundleMgrHost host; + ErrCode result = host.HandleCleanBundleCacheFilesForSelf(data, reply); + + EXPECT_EQ(result, ERR_APPEXECFWK_PARCEL_ERROR); } +} \ No newline at end of file