diff --git a/services/backup_sa/include/module_ipc/service.h b/services/backup_sa/include/module_ipc/service.h index 8bb77e1ad7bc90d84418f36f7841c4515fb328e1..5735f3f55352300997e8568b31a80f8ace0febd3 100644 --- a/services/backup_sa/include/module_ipc/service.h +++ b/services/backup_sa/include/module_ipc/service.h @@ -338,6 +338,7 @@ public: ErrCode SendIncrementalFileHandle(const std::string &bundleName, const std::string &fileName); void SetExtOnRelease(const BundleName &bundleName, bool isOnRelease); void RemoveExtOnRelease(const BundleName &bundleName); + void DoNoticeClientFinish(const std::string &bundleName, ErrCode errCode, bool isRestoreEnd); public: explicit Service(int32_t saID, bool runOnCreate = false) : SystemAbility(saID, runOnCreate) { diff --git a/services/backup_sa/src/module_ipc/sub_service.cpp b/services/backup_sa/src/module_ipc/sub_service.cpp index 7c83fd08f98e657d274e451d35012217fcf85103..d308767eec3500442e4c18e103a0f986fc7e9951 100644 --- a/services/backup_sa/src/module_ipc/sub_service.cpp +++ b/services/backup_sa/src/module_ipc/sub_service.cpp @@ -684,17 +684,17 @@ void Service::ExtConnectDied(const string &callName) /* Clear Session before notice client finish event */ HILOGE("Current bundle launch extension failed, bundleName:%{public}s", callName.c_str()); SendEndAppGalleryNotify(callName); + bool isRestoreEnd = session_->GetIsRestoreEnd(callName); ClearSessionAndSchedInfo(callName); - } - /* Notice Client Ext Ability Process Died */ - if (!session_->GetIsRestoreEnd(callName)) { - NoticeClientFinish(callName, BError(BError::Codes::EXT_ABILITY_DIED)); + /* Notice Client Ext Ability Process Died */ + DoNoticeClientFinish(callName, BError(BError::Codes::EXT_ABILITY_DIED), isRestoreEnd); } } catch (...) { HILOGE("Unexpected exception, bundleName: %{public}s", callName.c_str()); SendEndAppGalleryNotify(callName); + bool isRestoreEnd = session_->GetIsRestoreEnd(callName); ClearSessionAndSchedInfo(callName); - NoticeClientFinish(callName, BError(BError::Codes::EXT_ABILITY_DIED)); + DoNoticeClientFinish(callName, BError(BError::Codes::EXT_ABILITY_DIED), isRestoreEnd); } RemoveExtensionMutex(callName); } @@ -704,7 +704,9 @@ void Service::OnBackupExtensionDied(const string &&bundleName, bool isCleanCalle HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); if (isCleanCalled) { HILOGE("Backup <%{public}s> Extension Process second Died", bundleName.c_str()); + bool isRestoreEnd = session_->GetIsRestoreEnd(bundleName); ClearSessionAndSchedInfo(bundleName); + DoNoticeClientFinish(bundleName, BError(BError::Codes::EXT_ABILITY_DIED), isRestoreEnd); OnAllBundlesFinished(BError(BError::Codes::OK)); return; } @@ -1596,4 +1598,11 @@ ErrCode Service::GetCompatibilityInfo(const std::string &bundleName, const std:: session_->DecreaseSessionCnt(__PRETTY_FUNCTION__); return err; } + +void Service::DoNoticeClientFinish(const std::string &bundleName, ErrCode errCode, bool isRestoreEnd) +{ + if (!isRestoreEnd) { + NoticeClientFinish(bundleName, errCode); + } +} } \ No newline at end of file diff --git a/services/backup_sa/src/module_sched/sched_scheduler.cpp b/services/backup_sa/src/module_sched/sched_scheduler.cpp index ebdf00c284ae8e221fb35c7aee26ce25197da34e..70971f2912e9332a196fa343d59fe21189a0bf7e 100644 --- a/services/backup_sa/src/module_sched/sched_scheduler.cpp +++ b/services/backup_sa/src/module_sched/sched_scheduler.cpp @@ -239,7 +239,9 @@ void SchedScheduler::StartExecuteBundleTask(const std::string &bundleName, BCons } } else if (action == BConstants::ServiceSchedAction::CLEAN) { HILOGI("Current bundle %{public}s process is cleaning", bundleName.data()); + bool isRestoreEnd = sessionPtr_->GetIsRestoreEnd(bundleName); ErrCode res = reversePtr_->ClearResidualBundleData(bundleName); + reversePtr_->DoNoticeClientFinish(bundleName, BError(BError::Codes::EXT_ABILITY_DIED), isRestoreEnd); IServiceReverseType::Scenario scenario = sessionPtr_->GetScenario(); ExtDiedClearFailRadarReport(bundleName, scenario, res); } diff --git a/tests/mock/module_ipc/service_mock.cpp b/tests/mock/module_ipc/service_mock.cpp index 61afc65f2e60b8d344e35e51c1d4c14308967bd2..c07e583048a30feabc67ffe8c8e05800c48c249c 100644 --- a/tests/mock/module_ipc/service_mock.cpp +++ b/tests/mock/module_ipc/service_mock.cpp @@ -456,4 +456,6 @@ ErrCode Service::GetCompatibilityInfo(const std::string &bundleName, const std:: { return BError(BError::Codes::OK); } + +void Service::DoNoticeClientFinish(const std::string &bundleName, ErrCode errCode, bool isRestoreEnd) {} } // namespace OHOS::FileManagement::Backup diff --git a/tests/unittests/backup_sa/module_ipc/sched_scheduler_test.cpp b/tests/unittests/backup_sa/module_ipc/sched_scheduler_test.cpp index f5dc79c0d9b3afe83a5c8e77ec4a3632a8c85876..f30119c96b50c62fb441fd1bfba6f90e45e74803 100644 --- a/tests/unittests/backup_sa/module_ipc/sched_scheduler_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/sched_scheduler_test.cpp @@ -165,6 +165,8 @@ HWTEST_F(SchedSchedulerTest, SUB_Service_ExecutingQueueTasks_0100, testing::ext: schedPtr_->ExecutingQueueTasks(BUNDLE_NAME); sessionManagerPtr_->SetServiceSchedAction(BUNDLE_NAME, BConstants::ServiceSchedAction::RUNNING); schedPtr_->ExecutingQueueTasks(BUNDLE_NAME); + sessionManagerPtr_->SetServiceSchedAction(BUNDLE_NAME, BConstants::ServiceSchedAction::CLEAN); + schedPtr_->ExecutingQueueTasks(BUNDLE_NAME); } catch (...) { EXPECT_TRUE(false); GTEST_LOG_(INFO) << "SchedSchedulerTest-an exception occurred by ExecutingQueueTasks."; diff --git a/tests/unittests/backup_sa/module_ipc/sub_service_test.cpp b/tests/unittests/backup_sa/module_ipc/sub_service_test.cpp index da25a5f8e50f2a00c391e3bce3a43d02774ac7d4..cb6051d3f77de94608254f1efafa2079e9fedc96 100644 --- a/tests/unittests/backup_sa/module_ipc/sub_service_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/sub_service_test.cpp @@ -338,9 +338,11 @@ HWTEST_F(ServiceTest, SUB_Service_OnBackupExtensionDied_0000, TestSize.Level1) GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_OnBackupExtensionDied_0000"; try { service->isOccupyingSession_ = false; - EXPECT_CALL(*session, GetScenario()).WillOnce(Return(IServiceReverseType::Scenario::UNDEFINED)); + EXPECT_CALL(*session, GetScenario()).WillOnce(Return(IServiceReverseType::Scenario::UNDEFINED)) + .WillOnce(Return(IServiceReverseType::Scenario::UNDEFINED)); EXPECT_CALL(*cdConfig, DeleteClearBundleRecord(_)).WillOnce(Return(true)); - EXPECT_CALL(*session, IsOnAllBundlesFinished()).WillOnce(Return(false)); + EXPECT_CALL(*session, IsOnAllBundlesFinished()).WillOnce(Return(false)).WillOnce(Return(false)); + EXPECT_CALL(*session, GetIsRestoreEnd(_)).WillOnce(Return(true)); service->OnBackupExtensionDied("", true); EXPECT_TRUE(true); @@ -376,8 +378,8 @@ HWTEST_F(ServiceTest, SUB_Service_ExtConnectDied_0000, TestSize.Level1) try { string callName; service->isOccupyingSession_ = false; - EXPECT_CALL(*session, StopFwkTimer(_)).WillOnce(Return(true)); - EXPECT_CALL(*session, StopExtTimer(_)).WillOnce(Return(true)); + EXPECT_CALL(*session, StopFwkTimer(_)).WillRepeatedly(Return(true)); + EXPECT_CALL(*session, StopExtTimer(_)).WillRepeatedly(Return(true)); EXPECT_CALL(*session, GetExtConnection(_)).WillOnce(Return(nullptr)); EXPECT_CALL(*saUtils, IsSABundleName(_)).WillOnce(Return(true)); EXPECT_CALL(*session, GetScenario()).WillOnce(Return(IServiceReverseType::Scenario::UNDEFINED)) @@ -387,9 +389,7 @@ HWTEST_F(ServiceTest, SUB_Service_ExtConnectDied_0000, TestSize.Level1) service->ExtConnectDied(callName); EXPECT_TRUE(true); - EXPECT_CALL(*session, StopFwkTimer(_)).WillOnce(Return(true)); - EXPECT_CALL(*session, StopExtTimer(_)).WillOnce(Return(true)); - EXPECT_CALL(*session, GetExtConnection(_)).WillOnce(Return(connect)); + EXPECT_CALL(*session, GetExtConnection(_)).WillRepeatedly(Return(connect)); EXPECT_CALL(*connect, IsExtAbilityConnected()).WillOnce(Return(false)); EXPECT_CALL(*saUtils, IsSABundleName(_)).WillOnce(Return(true)); EXPECT_CALL(*session, GetScenario()).WillOnce(Return(IServiceReverseType::Scenario::UNDEFINED)) @@ -399,16 +399,22 @@ HWTEST_F(ServiceTest, SUB_Service_ExtConnectDied_0000, TestSize.Level1) service->ExtConnectDied(callName); EXPECT_TRUE(true); - EXPECT_CALL(*session, StopFwkTimer(_)).WillOnce(Return(true)); - EXPECT_CALL(*session, StopExtTimer(_)).WillOnce(Return(true)); - EXPECT_CALL(*session, GetExtConnection(_)).WillOnce(Return(connect)); EXPECT_CALL(*connect, IsExtAbilityConnected()).WillOnce(Return(true)); EXPECT_CALL(*connect, DisconnectBackupExtAbility()).WillOnce(Return(BError(BError::Codes::OK).GetCode())); EXPECT_CALL(*saUtils, IsSABundleName(_)).WillOnce(Return(true)); EXPECT_CALL(*session, GetScenario()).WillOnce(Return(IServiceReverseType::Scenario::UNDEFINED)) .WillOnce(Return(IServiceReverseType::Scenario::UNDEFINED)); - EXPECT_CALL(*cdConfig, DeleteClearBundleRecord(_)).WillOnce(Return(true)); - EXPECT_CALL(*session, IsOnAllBundlesFinished()).WillOnce(Return(false)); + EXPECT_CALL(*cdConfig, DeleteClearBundleRecord(_)).WillRepeatedly(Return(true)); + EXPECT_CALL(*session, IsOnAllBundlesFinished()).WillRepeatedly(Return(false)); + service->ExtConnectDied(callName); + EXPECT_TRUE(true); + + EXPECT_CALL(*connect, IsExtAbilityConnected()).WillRepeatedly(Return(false)); + EXPECT_CALL(*saUtils, IsSABundleName(_)).WillRepeatedly(Return(false)); + EXPECT_CALL(*session, GetClearDataFlag(_)).WillRepeatedly(Return(true)); + EXPECT_CALL(*session, GetScenario()).WillRepeatedly(Return(IServiceReverseType::Scenario::UNDEFINED)); + EXPECT_CALL(*session, UpdateDfxInfo(_, _)).WillRepeatedly(Return()); + EXPECT_CALL(*session, GetIsRestoreEnd(_)).WillOnce(Return(true)); service->ExtConnectDied(callName); EXPECT_TRUE(true); } catch (...) { @@ -2315,4 +2321,33 @@ HWTEST_F(ServiceTest, SUB_Service_GetCompatibilityInfo_0200, testing::ext::TestS GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by GetCompatibilityInfo."; } GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_GetCompatibilityInfo_0200"; +} + +/** + * @tc.number: SUB_Service_DoNoticeClientFinish_0000 + * @tc.name: SUB_Service_DoNoticeClientFinish_0000 + * @tc.desc: 测试 DoNoticeClientFinish 的正常/异常分支 + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: NA + */ +HWTEST_F(ServiceTest, SUB_Service_DoNoticeClientFinish_0000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ServiceTest-begin SUB_Service_DoNoticeClientFinish_0000"; + try { + std::string bundleName = "com.ohos.test"; + ErrCode err = BError(BError::Codes::SA_INVAL_ARG).GetCode(); + service->DoNoticeClientFinish(bundleName, err, true); + EXPECT_TRUE(true); + + EXPECT_CALL(*session, GetScenario()).WillOnce(Return(IServiceReverseType::Scenario::UNDEFINED)); + EXPECT_CALL(*session, IsOnAllBundlesFinished()).WillOnce(Return(false)); + service->DoNoticeClientFinish(bundleName, err, false); + EXPECT_TRUE(true); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by DoNoticeClientFinish."; + } + GTEST_LOG_(INFO) << "ServiceTest-end SUB_Service_DoNoticeClientFinish_0000"; } \ No newline at end of file