From c2558c1ccf3df62d96fc4e9892ccb769aac935d2 Mon Sep 17 00:00:00 2001 From: weishaoxiong Date: Tue, 2 Sep 2025 16:54:47 +0800 Subject: [PATCH] fix: Signed-off-by: weishaoxiong --- .../service/cloud/cloud_service_impl.cpp | 2 +- .../service/cloud/sync_manager.cpp | 11 +- .../service/cloud/sync_manager.h | 4 +- .../service/test/cloud_service_impl_test.cpp | 105 +++++++----------- 4 files changed, 44 insertions(+), 78 deletions(-) diff --git a/services/distributeddataservice/service/cloud/cloud_service_impl.cpp b/services/distributeddataservice/service/cloud/cloud_service_impl.cpp index 32334a08e..f1f963a31 100644 --- a/services/distributeddataservice/service/cloud/cloud_service_impl.cpp +++ b/services/distributeddataservice/service/cloud/cloud_service_impl.cpp @@ -808,7 +808,7 @@ int32_t CloudServiceImpl::OnReady(const std::string &device) Execute(GenTask(0, user, CloudSyncScene::NETWORK_RECOVERY, { WORK_CLOUD_INFO_UPDATE, WORK_SCHEMA_UPDATE, WORK_SUB })); } - syncManager_.OnNetworkConnected(); + syncManager_.OnNetworkConnected(users); return SUCCESS; } diff --git a/services/distributeddataservice/service/cloud/sync_manager.cpp b/services/distributeddataservice/service/cloud/sync_manager.cpp index ea2bc3db7..e552bcf1f 100644 --- a/services/distributeddataservice/service/cloud/sync_manager.cpp +++ b/services/distributeddataservice/service/cloud/sync_manager.cpp @@ -1095,9 +1095,9 @@ void SyncManager::OnNetworkDisconnected() networkRecoveryManager_.OnNetworkDisconnected(); } -void SyncManager::OnNetworkConnected() +void SyncManager::OnNetworkConnected(const std::vector &users) { - networkRecoveryManager_.OnNetworkConnected(); + networkRecoveryManager_.OnNetworkConnected(users); } void SyncManager::NetworkRecoveryManager::OnNetworkDisconnected() @@ -1108,7 +1108,7 @@ void SyncManager::NetworkRecoveryManager::OnNetworkDisconnected() currentEvent_->disconnectTime = std::chrono::system_clock::now(); } -void SyncManager::NetworkRecoveryManager::OnNetworkConnected() +void SyncManager::NetworkRecoveryManager::OnNetworkConnected(const std::vector &users) { std::unique_ptr event; { @@ -1123,11 +1123,6 @@ void SyncManager::NetworkRecoveryManager::OnNetworkConnected() auto duration = now - event->disconnectTime; auto hours = std::chrono::duration_cast(duration).count(); bool timeout = (hours > NETWORK_DISCONNECT_TIMEOUT_HOURS); - std::vector users; - if (!Account::GetInstance()->QueryForegroundUsers(users) || users.empty()) { - ZLOGE("no foreground user, skip sync."); - return; - } for (auto user : users) { const auto &syncApps = timeout ? GetAppList(user) : event->syncApps[user]; for (const auto &bundleName : syncApps) { diff --git a/services/distributeddataservice/service/cloud/sync_manager.h b/services/distributeddataservice/service/cloud/sync_manager.h index 1e152ca10..36445ec25 100644 --- a/services/distributeddataservice/service/cloud/sync_manager.h +++ b/services/distributeddataservice/service/cloud/sync_manager.h @@ -105,7 +105,7 @@ public: void CleanCompensateSync(int32_t userId); static std::string GetPath(const StoreMetaData &meta); void OnNetworkDisconnected(); - void OnNetworkConnected(); + void OnNetworkConnected(const std::vector &users); private: class NetworkRecoveryManager { @@ -114,7 +114,7 @@ private: { } void OnNetworkDisconnected(); - void OnNetworkConnected(); + void OnNetworkConnected(const std::vector &users); void RecordSyncApps(const int32_t user, const std::string &bundleName); private: diff --git a/services/distributeddataservice/service/test/cloud_service_impl_test.cpp b/services/distributeddataservice/service/test/cloud_service_impl_test.cpp index 6238c5271..c1b77b9cd 100644 --- a/services/distributeddataservice/service/test/cloud_service_impl_test.cpp +++ b/services/distributeddataservice/service/test/cloud_service_impl_test.cpp @@ -146,7 +146,6 @@ void CloudServiceImplTest::SetUpTestCase(void) size_t max = 12; size_t min = 5; auto executor = std::make_shared(max, min); - DeviceManagerAdapter::GetInstance().Init(executor); cloudServiceImpl_->OnBind( { "CloudServiceImplTest", static_cast(IPCSkeleton::GetSelfTokenID()), std::move(executor) }); Bootstrap::GetInstance().LoadCheckers(); @@ -996,11 +995,8 @@ HWTEST_F(CloudServiceImplTest, NetworkRecoveryTest001, TestSize.Level0) EXPECT_CALL(*accountDelegateMock, IsLoginAccount()).WillOnce(Return(true)); EXPECT_CALL(*accountDelegateMock, IsVerified(_)).WillRepeatedly(Return(true)); EXPECT_CALL(*accountDelegateMock, QueryUsers(_)).WillOnce(ReturnWithUserList({ MOCK_USER })); - // 2 means that the QueryForegroundUsers interface will be called twice - EXPECT_CALL(*accountDelegateMock, QueryForegroundUsers(_)) - .Times(2) - .WillRepeatedly(ReturnWithUserList({ MOCK_USER })); - EXPECT_CALL(*accountDelegateMock, GetUserByToken(_)).WillOnce(Return(MOCK_USER)); + EXPECT_CALL(*accountDelegateMock, QueryForegroundUsers(_)).WillOnce(ReturnWithUserList({ MOCK_USER })); + EXPECT_CALL(*accountDelegateMock, GetUserByToken(_)).WillRepeatedly(Return(MOCK_USER)); delegate_.isNetworkAvailable_ = false; CloudInfo::AppInfo appInfo; appInfo.bundleName = TEST_CLOUD_BUNDLE; @@ -1011,15 +1007,15 @@ HWTEST_F(CloudServiceImplTest, NetworkRecoveryTest001, TestSize.Level0) cloudInfo.apps = apps; cloudInfo.user = MOCK_USER; cloudInfo.enableCloud = true; + cloudInfo.id = TEST_CLOUD_APPID; MetaDataManager::GetInstance().SaveMeta(cloudInfo.GetKey(), cloudInfo, true); - auto &recoveryManager = cloudServiceImpl_->syncManager_.networkRecoveryManager_; cloudServiceImpl_->Offline(DeviceManagerAdapter::CLOUD_DEVICE_UUID); - ASSERT_NE(recoveryManager.currentEvent_, nullptr); SchemaMeta schemaMeta; schemaMeta.bundleName = TEST_CLOUD_BUNDLE; SchemaMeta::Database database; database.name = TEST_CLOUD_STORE; + database.alias = TEST_CLOUD_STORE; schemaMeta.databases.emplace_back(database); MetaDataManager::GetInstance().SaveMeta(CloudInfo::GetSchemaKey(cloudInfo.user, TEST_CLOUD_BUNDLE), schemaMeta, true); @@ -1027,13 +1023,17 @@ HWTEST_F(CloudServiceImplTest, NetworkRecoveryTest001, TestSize.Level0) option.syncMode = DistributedData::GeneralStore::CLOUD_BEGIN; auto async = [](const DistributedRdb::Details &details) {}; cloudServiceImpl_->CloudSync(TEST_CLOUD_BUNDLE, TEST_CLOUD_STORE, option, async); - EXPECT_CALL(*accountDelegateMock, GetUserByToken(_)).WillOnce(Return(MOCK_USER)); cloudServiceImpl_->CloudSync(TEST_CLOUD_BUNDLE, TEST_CLOUD_STORE, option, async); - sleep(1); - EXPECT_EQ(recoveryManager.currentEvent_->syncApps.size(), 1); + sleep(2); + MetaDataManager::GetInstance().DelMeta(CloudLastSyncInfo::GetKey(MOCK_USER, TEST_CLOUD_BUNDLE, TEST_CLOUD_STORE), + true); delegate_.isNetworkAvailable_ = true; cloudServiceImpl_->OnReady(DeviceManagerAdapter::CLOUD_DEVICE_UUID); - EXPECT_EQ(recoveryManager.currentEvent_, nullptr); + sleep(1); + auto [status, result] = + cloudServiceImpl_->QueryLastSyncInfo(TEST_CLOUD_APPID, TEST_CLOUD_BUNDLE, TEST_CLOUD_STORE); + EXPECT_EQ(status, CloudData::CloudService::SUCCESS); + EXPECT_TRUE(result.find(TEST_CLOUD_STORE) != result.end()); } /** @@ -1048,20 +1048,20 @@ HWTEST_F(CloudServiceImplTest, NetworkRecoveryTest002, TestSize.Level0) ASSERT_NE(cloudServiceImpl_, nullptr); EXPECT_CALL(*accountDelegateMock, IsVerified(_)).WillRepeatedly(Return(true)); EXPECT_CALL(*accountDelegateMock, IsLoginAccount()).WillOnce(Return(true)); - EXPECT_CALL(*accountDelegateMock, QueryUsers(_)).WillOnce(Invoke([&](std::vector &users) -> bool { - users = { MOCK_USER }; - return true; - })); - // 2 means that the QueryForegroundUsers interface will be called twice - EXPECT_CALL(*accountDelegateMock, QueryForegroundUsers(_)) - .Times(2) - .WillRepeatedly(ReturnWithUserList({ MOCK_USER })); - auto &recoveryManager = cloudServiceImpl_->syncManager_.networkRecoveryManager_; + EXPECT_CALL(*accountDelegateMock, QueryUsers(_)).WillOnce(ReturnWithUserList({ MOCK_USER })); + EXPECT_CALL(*accountDelegateMock, QueryForegroundUsers(_)).WillOnce(ReturnWithUserList({ MOCK_USER })); + EXPECT_CALL(*accountDelegateMock, GetUserByToken(_)).WillRepeatedly(Return(MOCK_USER)); + MetaDataManager::GetInstance().DelMeta(CloudLastSyncInfo::GetKey(MOCK_USER, TEST_CLOUD_BUNDLE, TEST_CLOUD_STORE), + true); cloudServiceImpl_->Offline(DeviceManagerAdapter::CLOUD_DEVICE_UUID); - ASSERT_NE(recoveryManager.currentEvent_, nullptr); + auto &recoveryManager = cloudServiceImpl_->syncManager_.networkRecoveryManager_; recoveryManager.currentEvent_->disconnectTime -= std::chrono::hours(DISCONNECT_TIME); cloudServiceImpl_->OnReady(DeviceManagerAdapter::CLOUD_DEVICE_UUID); - EXPECT_EQ(recoveryManager.currentEvent_, nullptr); + sleep(1); + auto [status, result] = + cloudServiceImpl_->QueryLastSyncInfo(TEST_CLOUD_APPID, TEST_CLOUD_BUNDLE, TEST_CLOUD_STORE); + EXPECT_EQ(status, CloudData::CloudService::SUCCESS); + EXPECT_TRUE(result.find(TEST_CLOUD_STORE) != result.end()); } /** @@ -1077,77 +1077,48 @@ HWTEST_F(CloudServiceImplTest, NetworkRecoveryTest003, TestSize.Level0) EXPECT_CALL(*accountDelegateMock, IsVerified(_)).WillRepeatedly(Return(true)); EXPECT_CALL(*accountDelegateMock, IsLoginAccount()).WillOnce(Return(true)); EXPECT_CALL(*accountDelegateMock, QueryForegroundUsers(_)).WillOnce(ReturnWithUserList({ MOCK_USER })); - auto &recoveryManager = cloudServiceImpl_->syncManager_.networkRecoveryManager_; + EXPECT_CALL(*accountDelegateMock, GetUserByToken(_)).WillRepeatedly(Return(MOCK_USER)); + delegate_.isNetworkAvailable_ = false; CloudData::CloudService::Option option; option.syncMode = DistributedData::GeneralStore::CLOUD_BEGIN; auto async = [](const DistributedRdb::Details &details) {}; - EXPECT_CALL(*accountDelegateMock, GetUserByToken(_)).WillOnce(Return(MOCK_USER)); cloudServiceImpl_->CloudSync(TEST_CLOUD_BUNDLE, TEST_CLOUD_STORE, option, async); sleep(1); + MetaDataManager::GetInstance().DelMeta(CloudLastSyncInfo::GetKey(MOCK_USER, TEST_CLOUD_BUNDLE, TEST_CLOUD_STORE), + true); cloudServiceImpl_->OnReady(DeviceManagerAdapter::CLOUD_DEVICE_UUID); - EXPECT_EQ(recoveryManager.currentEvent_, nullptr); + auto [status, result] = + cloudServiceImpl_->QueryLastSyncInfo(TEST_CLOUD_APPID, TEST_CLOUD_BUNDLE, TEST_CLOUD_STORE); + EXPECT_EQ(status, CloudData::CloudService::SUCCESS); + EXPECT_TRUE(result.empty()); } /** * @tc.name: NetworkRecoveryTest004 - * @tc.desc: The QueryForegroundUsers interface call fails when the network is restored - * @tc.type: FUNC - * @tc.require: - * @tc.author: - */ -HWTEST_F(CloudServiceImplTest, NetworkRecoveryTest004, TestSize.Level0) -{ - ASSERT_NE(cloudServiceImpl_, nullptr); - EXPECT_CALL(*accountDelegateMock, IsVerified(_)).WillRepeatedly(Return(true)); - EXPECT_CALL(*accountDelegateMock, QueryUsers(_)).WillOnce(ReturnWithUserList({ MOCK_USER })); - cloudServiceImpl_->Offline(DeviceManagerAdapter::CLOUD_DEVICE_UUID); - auto &recoveryManager = cloudServiceImpl_->syncManager_.networkRecoveryManager_; - ASSERT_NE(recoveryManager.currentEvent_, nullptr); - - EXPECT_CALL(*accountDelegateMock, IsLoginAccount()).WillOnce(Return(true)); - EXPECT_CALL(*accountDelegateMock, QueryForegroundUsers(_)) - .WillOnce(ReturnWithUserList({ MOCK_USER })) - .WillOnce(Return(false)); - cloudServiceImpl_->OnReady(DeviceManagerAdapter::CLOUD_DEVICE_UUID); - EXPECT_EQ(recoveryManager.currentEvent_, nullptr); - - EXPECT_CALL(*accountDelegateMock, QueryUsers(_)).WillOnce(ReturnWithUserList({ MOCK_USER })); - cloudServiceImpl_->Offline(DeviceManagerAdapter::CLOUD_DEVICE_UUID); - ASSERT_NE(recoveryManager.currentEvent_, nullptr); - EXPECT_CALL(*accountDelegateMock, IsLoginAccount()).WillOnce(Return(true)); - EXPECT_CALL(*accountDelegateMock, QueryForegroundUsers(_)) - .WillOnce(ReturnWithUserList({ MOCK_USER })) - .WillOnce(ReturnWithUserList({})); - cloudServiceImpl_->OnReady(DeviceManagerAdapter::CLOUD_DEVICE_UUID); - EXPECT_EQ(recoveryManager.currentEvent_, nullptr); -} - -/** - * @tc.name: NetworkRecoveryTest005 * @tc.desc: The test network connection interface call fails when the load cloudInfo failed * @tc.type: FUNC * @tc.require: * @tc.author: */ -HWTEST_F(CloudServiceImplTest, NetworkRecoveryTest005, TestSize.Level0) +HWTEST_F(CloudServiceImplTest, NetworkRecoveryTest004, TestSize.Level0) { ASSERT_NE(cloudServiceImpl_, nullptr); EXPECT_CALL(*accountDelegateMock, IsVerified(_)).WillRepeatedly(Return(true)); EXPECT_CALL(*accountDelegateMock, IsLoginAccount()).WillOnce(Return(true)); EXPECT_CALL(*accountDelegateMock, QueryUsers(_)).WillOnce(ReturnWithUserList({ MOCK_USER })); - // 2 means that the QueryForegroundUsers interface will be called twice - EXPECT_CALL(*accountDelegateMock, QueryForegroundUsers(_)) - .Times(2) - .WillRepeatedly(ReturnWithUserList({ MOCK_USER })); + EXPECT_CALL(*accountDelegateMock, QueryForegroundUsers(_)).WillOnce(ReturnWithUserList({ MOCK_USER })); + EXPECT_CALL(*accountDelegateMock, GetUserByToken(_)).WillRepeatedly(Return(MOCK_USER)); CloudInfo cloudInfo; cloudInfo.user = MOCK_USER; MetaDataManager::GetInstance().DelMeta(cloudInfo.GetKey(), true); auto &recoveryManager = cloudServiceImpl_->syncManager_.networkRecoveryManager_; cloudServiceImpl_->Offline(DeviceManagerAdapter::CLOUD_DEVICE_UUID); - ASSERT_NE(recoveryManager.currentEvent_, nullptr); recoveryManager.currentEvent_->disconnectTime -= std::chrono::hours(DISCONNECT_TIME); cloudServiceImpl_->OnReady(DeviceManagerAdapter::CLOUD_DEVICE_UUID); - EXPECT_EQ(recoveryManager.currentEvent_, nullptr); + auto [status, result] = + cloudServiceImpl_->QueryLastSyncInfo(TEST_CLOUD_APPID, TEST_CLOUD_BUNDLE, TEST_CLOUD_STORE); + EXPECT_EQ(status, CloudData::CloudService::ERROR); + EXPECT_TRUE(result.empty()); if (accountDelegateMock != nullptr) { delete accountDelegateMock; accountDelegateMock = nullptr; -- Gitee