From fd59855d1b1877d7f12ac0baa73cd18ff2026cb7 Mon Sep 17 00:00:00 2001 From: MengYao Date: Fri, 13 Jun 2025 10:38:36 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E6=94=AF=E6=8C=81=E4=B8=8D=E5=90=8C?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E5=88=9B=E5=BB=BA=E5=90=8C=E5=90=8D=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: MengYao --- .../app/src/installer/installer_impl.cpp | 8 +- .../app/src/kvstore_data_service.cpp | 32 +- .../app/src/kvstore_meta_manager.cpp | 152 +++++-- .../app/src/kvstore_meta_manager.h | 9 +- .../route_head_handler_impl.cpp | 4 +- .../distributeddataservice/app/test/BUILD.gn | 71 ++++ .../unittest/kvstore_data_service_test.cpp | 1 + .../kvstore_meta_manager_update_key_test.cpp | 374 ++++++++++++++++++ .../test/unittest/session_manager_test.cpp | 21 +- .../include/metadata/device_meta_data.h | 1 - .../include/metadata/meta_data_manager.h | 6 + .../include/metadata/store_meta_data.h | 56 ++- .../include/metadata/version_meta_data.h | 4 +- .../framework/include/store/auto_cache.h | 13 +- .../framework/include/store/store_info.h | 1 + .../framework/include/utils/constant.h | 14 + .../framework/metadata/device_meta_data.cpp | 2 - .../framework/metadata/meta_data_manager.cpp | 63 ++- .../framework/metadata/store_meta_data.cpp | 131 +++++- .../framework/store/auto_cache.cpp | 64 ++- .../framework/test/BUILD.gn | 4 + .../framework/test/meta_data_test.cpp | 87 ++-- .../framework/test/store_test.cpp | 14 +- .../service/cloud/cloud_service_impl.cpp | 76 ++-- .../service/cloud/sync_manager.cpp | 45 ++- .../service/cloud/sync_manager.h | 1 + .../data_share/data_share_db_config.cpp | 20 +- .../load_config_data_info_strategy.cpp | 14 +- .../service/kvdb/kvdb_service_impl.cpp | 79 ++-- .../service/kvdb/kvdb_service_impl.h | 1 + .../object/src/object_asset_machine.cpp | 2 +- .../object/src/object_service_impl.cpp | 4 +- .../permission/src/permit_delegate.cpp | 6 +- .../service/rdb/rdb_general_store.cpp | 1 + .../service/rdb/rdb_service_impl.cpp | 284 ++++++++----- .../service/rdb/rdb_service_impl.h | 65 +-- .../service/test/BUILD.gn | 7 +- .../service/test/cloud_data_test.cpp | 24 +- .../service/test/cloud_service_impl_test.cpp | 88 ++++- .../service/test/kvdb_service_impl_test.cpp | 89 +++++ .../service/test/meta_data_test.cpp | 9 +- .../test/mock/meta_data_manager_mock.cpp | 5 + .../test/mock/meta_data_manager_mock.h | 2 + .../service/test/rdb_service_impl_test.cpp | 105 +++-- .../service/udmf/store/runtime_store.cpp | 4 +- 45 files changed, 1623 insertions(+), 440 deletions(-) create mode 100644 services/distributeddataservice/app/test/unittest/kvstore_meta_manager_update_key_test.cpp diff --git a/services/distributeddataservice/app/src/installer/installer_impl.cpp b/services/distributeddataservice/app/src/installer/installer_impl.cpp index 6977b3ab9..0e6901245 100644 --- a/services/distributeddataservice/app/src/installer/installer_impl.cpp +++ b/services/distributeddataservice/app/src/installer/installer_impl.cpp @@ -83,8 +83,9 @@ void InstallEventSubscriber::OnUninstall(const std::string &bundleName, int32_t } for (auto &meta : storeMetaData) { if (meta.instanceId == appIndex && !meta.appId.empty() && !meta.storeId.empty()) { - ZLOGI("uninstalled bundleName:%{public}s storeId:%{public}s, userId:%{public}d, appIndex:%{public}d", - bundleName.c_str(), Anonymous::Change(meta.storeId).c_str(), userId, appIndex); + ZLOGI("storeMetaData uninstalled bundleName:%{public}s storeId:%{public}s, userId:%{public}d, " + "appIndex:%{public}d", bundleName.c_str(), Anonymous::Change(meta.storeId).c_str(), userId, appIndex); + MetaDataManager::GetInstance().DelMeta(meta.GetKeyWithoutPath()); MetaDataManager::GetInstance().DelMeta(meta.GetKey()); MetaDataManager::GetInstance().DelMeta(meta.GetKey(), true); MetaDataManager::GetInstance().DelMeta(meta.GetKeyLocal(), true); @@ -96,7 +97,8 @@ void InstallEventSubscriber::OnUninstall(const std::string &bundleName, int32_t MetaDataManager::GetInstance().DelMeta(meta.GetDebugInfoKey(), true); MetaDataManager::GetInstance().DelMeta(meta.GetDfxInfoKey(), true); MetaDataManager::GetInstance().DelMeta(meta.GetCloneSecretKey(), true); - PermitDelegate::GetInstance().DelCache(meta.GetKey()); + MetaDataManager::GetInstance().DelMeta(StoreMetaMapping(meta).GetKey(), true); + PermitDelegate::GetInstance().DelCache(meta.GetKeyWithoutPath()); } } } diff --git a/services/distributeddataservice/app/src/kvstore_data_service.cpp b/services/distributeddataservice/app/src/kvstore_data_service.cpp index b598a653a..52f6f933a 100644 --- a/services/distributeddataservice/app/src/kvstore_data_service.cpp +++ b/services/distributeddataservice/app/src/kvstore_data_service.cpp @@ -52,6 +52,7 @@ #include "metadata/appid_meta_data.h" #include "metadata/meta_data_manager.h" #include "network/network_delegate.h" +#include "metadata/store_meta_data.h" #include "permission_validator.h" #include "permit_delegate.h" #include "process_communicator_impl.h" @@ -139,18 +140,18 @@ void KvStoreDataService::Initialize() DmAdapter::GetInstance().StartWatchDeviceChange(deviceInnerListener_.get(), { "innerListener" }); CommunicatorContext::GetInstance().RegSessionListener(deviceInnerListener_.get()); auto translateCall = [](const std::string &oriDevId, const DistributedDB::StoreInfo &info) { - StoreMetaData meta; + StoreMetaMapping storeMetaMapping; AppIDMetaData appIdMeta; MetaDataManager::GetInstance().LoadMeta(info.appId, appIdMeta, true); - meta.bundleName = appIdMeta.bundleName; - meta.storeId = info.storeId; - meta.user = info.userId; - meta.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; - MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), meta, true); + storeMetaMapping.bundleName = appIdMeta.bundleName; + storeMetaMapping.storeId = info.storeId; + storeMetaMapping.user = info.userId; + storeMetaMapping.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; + MetaDataManager::GetInstance().LoadMeta(storeMetaMapping.GetKey(), storeMetaMapping, true); std::string uuid; - if (OHOS::Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(meta.tokenId) == + if (OHOS::Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(storeMetaMapping.tokenId) == OHOS::Security::AccessToken::TOKEN_HAP) { - uuid = DmAdapter::GetInstance().CalcClientUuid(meta.appId, oriDevId); + uuid = DmAdapter::GetInstance().CalcClientUuid(storeMetaMapping.appId, oriDevId); } else { uuid = DmAdapter::GetInstance().CalcClientUuid(" ", oriDevId); } @@ -917,8 +918,9 @@ void KvStoreDataService::AccountEventChanged(const AccountEventInfo &eventInfo) if (meta.user != eventInfo.userId) { continue; } - ZLOGI("bundleName:%{public}s, user:%{public}s", meta.bundleName.c_str(), meta.user.c_str()); - MetaDataManager::GetInstance().DelMeta(meta.GetKey()); + ZLOGI("StoreMetaData bundleName:%{public}s, user:%{public}s", meta.bundleName.c_str(), + meta.user.c_str()); + MetaDataManager::GetInstance().DelMeta(meta.GetKeyWithoutPath()); MetaDataManager::GetInstance().DelMeta(meta.GetKey(), true); MetaDataManager::GetInstance().DelMeta(meta.GetKeyLocal(), true); MetaDataManager::GetInstance().DelMeta(meta.GetSecretKey(), true); @@ -929,7 +931,8 @@ void KvStoreDataService::AccountEventChanged(const AccountEventInfo &eventInfo) MetaDataManager::GetInstance().DelMeta(meta.GetDebugInfoKey(), true); MetaDataManager::GetInstance().DelMeta(meta.GetDfxInfoKey(), true); MetaDataManager::GetInstance().DelMeta(meta.GetCloneSecretKey(), true); - PermitDelegate::GetInstance().DelCache(meta.GetKey()); + MetaDataManager::GetInstance().DelMeta(StoreMetaMapping(meta).GetKey(), true); + PermitDelegate::GetInstance().DelCache(meta.GetKeyWithoutPath()); } g_kvStoreAccountEventStatus = 0; break; @@ -1117,8 +1120,8 @@ int32_t KvStoreDataService::ClearAppStorage(const std::string &bundleName, int32 for (auto &meta : metaData) { if (meta.instanceId == appIndex && !meta.appId.empty() && !meta.storeId.empty()) { - ZLOGI("data cleared bundleName:%{public}s, stordId:%{public}s, appIndex:%{public}d", bundleName.c_str(), - Anonymous::Change(meta.storeId).c_str(), appIndex); + ZLOGI("StoreMetaData data cleared bundleName:%{public}s, stordId:%{public}s, appIndex:%{public}d", + bundleName.c_str(), Anonymous::Change(meta.storeId).c_str(), appIndex); MetaDataManager::GetInstance().DelMeta(meta.GetKey()); MetaDataManager::GetInstance().DelMeta(meta.GetKey(), true); MetaDataManager::GetInstance().DelMeta(meta.GetKeyLocal(), true); @@ -1129,7 +1132,8 @@ int32_t KvStoreDataService::ClearAppStorage(const std::string &bundleName, int32 MetaDataManager::GetInstance().DelMeta(meta.GetDebugInfoKey(), true); MetaDataManager::GetInstance().DelMeta(meta.GetDfxInfoKey(), true); MetaDataManager::GetInstance().DelMeta(meta.GetAutoLaunchKey(), true); - PermitDelegate::GetInstance().DelCache(meta.GetKey()); + MetaDataManager::GetInstance().DelMeta(StoreMetaMapping(meta).GetKey(), true); + PermitDelegate::GetInstance().DelCache(meta.GetKeyWithoutPath()); } } return SUCCESS; diff --git a/services/distributeddataservice/app/src/kvstore_meta_manager.cpp b/services/distributeddataservice/app/src/kvstore_meta_manager.cpp index 9c8013f8b..c2477b585 100644 --- a/services/distributeddataservice/app/src/kvstore_meta_manager.cpp +++ b/services/distributeddataservice/app/src/kvstore_meta_manager.cpp @@ -143,11 +143,42 @@ void KvStoreMetaManager::InitMetaData() return; } + StoreMetaData data = InitStoreMetaData(); + StoreMetaDataLocal localData; + localData.isAutoSync = false; + localData.isBackup = false; + localData.isEncrypt = false; + localData.dataDir = metaDBDirectory_; + localData.schema = ""; + localData.isPublic = true; + if (!(MetaDataManager::GetInstance().SaveMeta(data.GetKeyWithoutPath(), data) && + MetaDataManager::GetInstance().SaveMeta(data.GetKey(), data, true) && + MetaDataManager::GetInstance().SaveMeta(data.GetKeyLocal(), localData, true))) { + ZLOGE("save meta fail"); + } + std::string localUuid; + DeviceMetaData deviceMeta; + if (MetaDataManager::GetInstance().LoadMeta(deviceMeta.GetKey(), deviceMeta, true)) { + localUuid = deviceMeta.newUuid; + } else { + localUuid = DmAdapter::GetInstance().GetLocalDevice().uuid; + } + if (localUuid.empty()) { + ZLOGE("get uuid failed"); + return; + } + UpdateMetaData(localUuid); CheckMetaDeviceId(); + SetCloudSyncer(); + ZLOGI("end."); +} + +StoreMetaData KvStoreMetaManager::InitStoreMetaData() +{ + StoreMetaData data; auto uid = getuid(); auto tokenId = IPCSkeleton::GetCallingTokenID(); auto userId = AccountDelegate::GetInstance()->GetUserByToken(tokenId); - StoreMetaData data; data.appId = label_; data.appType = "default"; data.bundleName = label_; @@ -168,46 +199,89 @@ void KvStoreMetaManager::InitMetaData() data.securityLevel = SecurityLevel::S1; data.area = EL1; data.tokenId = tokenId; - StoreMetaDataLocal localData; - localData.isAutoSync = false; - localData.isBackup = false; - localData.isEncrypt = false; - localData.dataDir = metaDBDirectory_; - localData.schema = ""; - localData.isPublic = true; - if (!(MetaDataManager::GetInstance().SaveMeta(data.GetKey(), data) && - MetaDataManager::GetInstance().SaveMeta(data.GetKey(), data, true) && - MetaDataManager::GetInstance().SaveMeta(data.GetKeyLocal(), localData, true))) { - ZLOGE("save meta fail"); - } - UpdateMetaData(); - SetCloudSyncer(); - ZLOGI("end."); + return data; } -void KvStoreMetaManager::UpdateMetaData() +void KvStoreMetaManager::UpdateMetaData(const std::string &uuid) { VersionMetaData versionMeta; - if (!MetaDataManager::GetInstance().LoadMeta(versionMeta.GetKey(), versionMeta, true) - || versionMeta.version < META_VERSION) { + bool isExist = MetaDataManager::GetInstance().LoadMeta(versionMeta.GetKey(), versionMeta, true); + if (isExist && versionMeta.version == VersionMetaData::CURRENT_VERSION) { + return; + } + bool syncMetaUpdateNeeded = !isExist || versionMeta.version < VersionMetaData::UPDATE_SYNC_META_VERSION; + bool storeMetaUpgradeNeeded = !isExist || versionMeta.version < VersionMetaData::UPDATE_STORE_META_KEY_VERSION; + if (syncMetaUpdateNeeded) { std::vector metaDataList; - std::string prefix = StoreMetaData::GetPrefix({ DmAdapter::GetInstance().GetLocalDevice().uuid }); + std::string prefix = StoreMetaData::GetPrefix({ uuid }); MetaDataManager::GetInstance().LoadMeta(prefix, metaDataList); - for (auto metaData : metaDataList) { + std::vector keys; + for (const auto &metaData : metaDataList) { MetaDataManager::GetInstance().SaveMeta(metaData.GetKey(), metaData, true); if (CheckerManager::GetInstance().IsDistrust(Converter::ConvertToStoreInfo(metaData)) || - (metaData.storeType >= StoreMetaData::StoreType::STORE_RELATIONAL_BEGIN - && metaData.storeType <= StoreMetaData::StoreType::STORE_RELATIONAL_END)) { - MetaDataManager::GetInstance().DelMeta(metaData.GetKey()); + (metaData.storeType >= StoreMetaData::StoreType::STORE_RELATIONAL_BEGIN && + metaData.storeType <= StoreMetaData::StoreType::STORE_RELATIONAL_END)) { + keys.push_back(metaData.GetKey()); } } + MetaDataManager::GetInstance().DelMeta(keys); + versionMeta.version = VersionMetaData::UPDATE_SYNC_META_VERSION; + MetaDataManager::GetInstance().SaveMeta(versionMeta.GetKey(), versionMeta, true); } - if (versionMeta.version != VersionMetaData::CURRENT_VERSION) { - versionMeta.version = VersionMetaData::CURRENT_VERSION; + if (storeMetaUpgradeNeeded && UpgradeStoreMeta(uuid)) { + versionMeta.version = VersionMetaData::UPDATE_STORE_META_KEY_VERSION; MetaDataManager::GetInstance().SaveMeta(versionMeta.GetKey(), versionMeta, true); } } +// The metadata database is upgraded. The suffix is added to the path. +bool KvStoreMetaManager::UpgradeStoreMeta(const std::string &uuid) +{ + std::vector metaDataList; + std::string prefix = StoreMetaData::GetPrefix({ uuid }); + if (!MetaDataManager::GetInstance().LoadMeta(prefix, metaDataList, true)) { + ZLOGE("load meta failed"); + return false; + } + size_t batchSize = 100; // The batch quantity is 100. + return Constant::BatchProcess(metaDataList, batchSize, [](const auto &begin, const auto &end) { + std::vector entries; + std::vector deleteKeys; + auto size = static_cast(std::distance(begin, end)); + entries.reserve(size * 3); // Expand the entries size by 3 times. + deleteKeys.reserve(size * 4); // Expand the deleteKeys size by 4 times. + auto it = begin; + do { + auto &meta = *it; + StoreMetaDataLocal localMeta; + bool isExist = MetaDataManager::GetInstance().LoadMeta(meta.GetKeyLocalWithoutPath(), localMeta, true); + if (isExist) { + deleteKeys.push_back(meta.GetKeyLocalWithoutPath()); + entries.push_back({ meta.GetKeyLocal(), Serializable::Marshall(localMeta) }); + } + SecretKeyMetaData secretKeyMetaData; + isExist = MetaDataManager::GetInstance().LoadMeta(meta.GetSecretKeyWithoutPath(), secretKeyMetaData, true); + if (isExist) { + deleteKeys.push_back(meta.GetSecretKeyWithoutPath()); + entries.push_back({ meta.GetSecretKey(), Serializable::Marshall(secretKeyMetaData) }); + } + deleteKeys.push_back(meta.GetKeyWithoutPath()); + deleteKeys.push_back(meta.GetDebugInfoKeyWithoutPath()); + deleteKeys.push_back(meta.GetDfxInfoKeyWithoutPath()); + StoreMetaMapping storeMetaMapping(meta); + auto key = storeMetaMapping.GetKey(); + entries.push_back({ std::move(key), Serializable::Marshall(storeMetaMapping) }); + entries.push_back({ meta.GetKey(), Serializable::Marshall(meta) }); + } while (++it != end); + + if (MetaDataManager::GetInstance().SaveMeta(entries, true)) { + MetaDataManager::GetInstance().DelMeta(deleteKeys, true); + return true; + } + return false; + }); +} + void KvStoreMetaManager::InitMetaParameter() { ZLOGI("start."); @@ -580,11 +654,10 @@ void KvStoreMetaManager::CheckMetaDeviceId() if (deviceMeta.newUuid != localUuid) { UpdateStoreMetaData(localUuid, deviceMeta.newUuid); UpdateMetaDatas(localUuid, deviceMeta.newUuid); - deviceMeta.oldUuid = deviceMeta.newUuid; + ZLOGI("meta changed! cur uuid:%{public}s, old uuid:%{public}s", Anonymous::Change(localUuid).c_str(), + Anonymous::Change(deviceMeta.newUuid).c_str()); deviceMeta.newUuid = localUuid; MetaDataManager::GetInstance().SaveMeta(deviceMeta.GetKey(), deviceMeta, true); - ZLOGI("meta changed! curruuid:%{public}s, olduuid:%{public}s", Anonymous::Change(deviceMeta.newUuid).c_str(), - Anonymous::Change(deviceMeta.oldUuid).c_str()); } } @@ -600,10 +673,10 @@ void KvStoreMetaManager::UpdateStoreMetaData(const std::string &newUuid, const s MetaDataManager::GetInstance().DelMeta(oldMeta.GetKey(), true); StoreMetaData syncStoreMeta; - if (MetaDataManager::GetInstance().LoadMeta(oldMeta.GetKey(), syncStoreMeta)) { + if (MetaDataManager::GetInstance().LoadMeta(oldMeta.GetKeyWithoutPath(), syncStoreMeta)) { syncStoreMeta.deviceId = newUuid; - MetaDataManager::GetInstance().SaveMeta(storeMeta.GetKey(), syncStoreMeta); - MetaDataManager::GetInstance().DelMeta(oldMeta.GetKey()); + MetaDataManager::GetInstance().SaveMeta(storeMeta.GetKeyWithoutPath(), syncStoreMeta); + MetaDataManager::GetInstance().DelMeta(oldMeta.GetKeyWithoutPath()); } StrategyMeta strategyMeta; @@ -634,6 +707,21 @@ void KvStoreMetaManager::UpdateStoreMetaData(const std::string &newUuid, const s MetaDataManager::GetInstance().DelMeta(storeMeta.GetSecretKey(), true); MetaDataManager::GetInstance().DelMeta(storeMeta.GetCloneSecretKey(), true); } + MetaDataManager::GetInstance().DelMeta(oldMeta.GetDebugInfoKey(), true); + MetaDataManager::GetInstance().DelMeta(oldMeta.GetDfxInfoKey(), true); + } + UpdateStoreMetaMapping(newUuid, oldUuid); +} + +void KvStoreMetaManager::UpdateStoreMetaMapping(const std::string &newUuid, const std::string &oldUuid) +{ + std::vector storeMetaMappings; + MetaDataManager::GetInstance().LoadMeta(StoreMetaMapping::GetPrefix({ oldUuid }), storeMetaMappings, true); + for (auto &meta : storeMetaMappings) { + auto oldKey = meta.GetKey(); + meta.deviceId = newUuid; + MetaDataManager::GetInstance().SaveMeta(meta.GetKey(), meta, true); + MetaDataManager::GetInstance().DelMeta(oldKey); } } diff --git a/services/distributeddataservice/app/src/kvstore_meta_manager.h b/services/distributeddataservice/app/src/kvstore_meta_manager.h index f7b28e1cd..df3abc661 100644 --- a/services/distributeddataservice/app/src/kvstore_meta_manager.h +++ b/services/distributeddataservice/app/src/kvstore_meta_manager.h @@ -75,7 +75,9 @@ private: void InitMetaData(); - void UpdateMetaData(); + DistributedData::StoreMetaData InitStoreMetaData(); + + void UpdateMetaData(const std::string &uuid); void SubscribeMetaKvStore(); @@ -100,8 +102,12 @@ private: void UpdateStoreMetaData(const std::string &newUuid, const std::string &oldUuid); + void UpdateStoreMetaMapping(const std::string &newUuid, const std::string &oldUuid); + void UpdateMetaDatas(const std::string &newUuid, const std::string &oldUuid); + static bool UpgradeStoreMeta(const std::string &uuid); + static ExecutorPool::Task GetBackupTask( TaskQueue queue, std::shared_ptr executors, const NbDelegate store); @@ -137,7 +143,6 @@ private: std::mutex mutex_; std::shared_ptr executors_; TaskId delaySyncTaskId_ = ExecutorPool::INVALID_TASK_ID; - static constexpr int32_t META_VERSION = 4; static constexpr int32_t MAX_TASK_COUNT = 1; }; } // namespace DistributedKv diff --git a/services/distributeddataservice/app/src/session_manager/route_head_handler_impl.cpp b/services/distributeddataservice/app/src/session_manager/route_head_handler_impl.cpp index 01c16a239..2806b2754 100644 --- a/services/distributeddataservice/app/src/session_manager/route_head_handler_impl.cpp +++ b/services/distributeddataservice/app/src/session_manager/route_head_handler_impl.cpp @@ -69,7 +69,7 @@ void RouteHeadHandlerImpl::Init() metaData.user = DEFAULT_USERID; metaData.bundleName = appId_; metaData.storeId = storeId_; - if (MetaDataManager::GetInstance().LoadMeta(metaData.GetKey(), metaData)) { + if (MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData)) { userId_ = DEFAULT_USERID; } } @@ -343,7 +343,7 @@ bool RouteHeadHandlerImpl::ParseHeadDataUser(const uint8_t *data, uint32_t total metaData.user = DEFAULT_USERID; metaData.bundleName = session_.appId; metaData.storeId = std::move(storeId); - if (!MetaDataManager::GetInstance().LoadMeta(metaData.GetKey(), metaData)) { + if (!MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData)) { int foregroundUserId = 0; AccountDelegate::GetInstance()->QueryForegroundUserId(foregroundUserId); UserInfo userInfo = { .receiveUser = std::to_string(foregroundUserId) }; diff --git a/services/distributeddataservice/app/test/BUILD.gn b/services/distributeddataservice/app/test/BUILD.gn index f942a19e1..d5b6eaa36 100644 --- a/services/distributeddataservice/app/test/BUILD.gn +++ b/services/distributeddataservice/app/test/BUILD.gn @@ -138,6 +138,76 @@ ohos_unittest("KvStoreDataServiceTest") { part_name = "datamgr_service" } +ohos_unittest("KvStoreMetaManagerUpdateKeyTest") { + module_out_path = module_output_path + sources = [ + "${data_service_path}/app/src/checker/bundle_checker.cpp", + "${data_service_path}/app/src/checker/system_checker.cpp", + "${data_service_path}/app/src/clone/clone_backup_info.cpp", + "${data_service_path}/app/src/clone/secret_key_backup_data.cpp", + "${data_service_path}/app/src/db_info_handle_impl.cpp", + "${data_service_path}/app/src/feature_stub_impl.cpp", + "${data_service_path}/app/src/installer/installer.cpp", + "${data_service_path}/app/src/installer/installer_impl.cpp", + "${data_service_path}/app/src/kvstore_account_observer.cpp", + "${data_service_path}/app/src/kvstore_data_service.cpp", + "${data_service_path}/app/src/kvstore_data_service_stub.cpp", + "${data_service_path}/app/src/kvstore_device_listener.cpp", + "${data_service_path}/app/src/kvstore_meta_manager.cpp", + "${data_service_path}/app/src/kvstore_screen_observer.cpp", + "${data_service_path}/app/src/security/security.cpp", + "${data_service_path}/app/src/security/sensitive.cpp", + "${data_service_path}/app/src/session_manager/route_head_handler_impl.cpp", + "${data_service_path}/app/src/session_manager/session_manager.cpp", + "${data_service_path}/app/src/session_manager/upgrade_manager.cpp", + "${data_service_path}/app/src/task_manager.cpp", + "${data_service_path}/app/test/unittest/kvstore_meta_manager_update_key_test.cpp", + "${data_service_path}/service/common/xcollie.cpp", + ] + + configs = [ ":module_private_config" ] + + external_deps = [ + "ability_base:want", + "access_token:libaccesstoken_sdk", + "bundle_framework:appexecfwk_core", + "c_utils:utils", + "common_event_service:cesfwk_innerkits", + "dataclassification:data_transit_mgr", + "device_auth:deviceauth_sdk", + "device_manager:devicemanagersdk", + "file_api:securitylabel", + "googletest:gtest_main", + "hicollie:libhicollie", + "hilog:libhilog", + "hisysevent:libhisysevent", + "hitrace:hitrace_meter", + "hitrace:libhitracechain", + "kv_store:distributeddata_inner", + "kv_store:distributeddata_mgr", + "kv_store:distributeddb", + "kv_store:kvdb_inner_lite", + "memmgr:memmgrclient", + "safwk:system_ability_fwk", + "samgr:samgr_proxy", + ] + + if (datamgr_service_power) { + external_deps += [ + "battery_manager:batterysrv_client", + "power_manager:powermgr_client", + ] + } + cflags = [ + "-fno-access-control", # Ignore Private Member Access Control + ] + deps = [ + "${data_service_path}/framework:distributeddatasvcfwk", + "${data_service_path}/service:distributeddatasvc", + ] + part_name = "datamgr_service" +} + ohos_unittest("SessionManagerTest") { module_out_path = module_output_path @@ -485,6 +555,7 @@ group("unittest") { ":FeatureStubImplTest", ":KvStoreDataServiceClearTest", ":KvStoreDataServiceTest", + ":KvStoreMetaManagerUpdateKeyTest", ":SessionManagerTest", ":UpgradeManagerTest", ":RouteHeadHandlerImplTest", diff --git a/services/distributeddataservice/app/test/unittest/kvstore_data_service_test.cpp b/services/distributeddataservice/app/test/unittest/kvstore_data_service_test.cpp index 8e761fdcb..007605438 100644 --- a/services/distributeddataservice/app/test/unittest/kvstore_data_service_test.cpp +++ b/services/distributeddataservice/app/test/unittest/kvstore_data_service_test.cpp @@ -993,6 +993,7 @@ HWTEST_F(KvStoreDataServiceTest, OnExtensionBackup008, TestSize.Level0) { testMeta.deviceId = DeviceManagerAdapter::GetInstance().GetLocalDevice().uuid; testMeta.isEncrypt = true; + testMeta.dataDir = "TEST_DIR"; std::vector sKey{2, 249, 221, 119, 177, 216, 217, 134, 185, 139, 114, 38, 140, 64, 165, 35, 77, 169, 0, 226, 226, 166, 37, 73, 181, 229, 42, 88, 108, 111, diff --git a/services/distributeddataservice/app/test/unittest/kvstore_meta_manager_update_key_test.cpp b/services/distributeddataservice/app/test/unittest/kvstore_meta_manager_update_key_test.cpp new file mode 100644 index 000000000..3d67106ca --- /dev/null +++ b/services/distributeddataservice/app/test/unittest/kvstore_meta_manager_update_key_test.cpp @@ -0,0 +1,374 @@ +/* +* Copyright (c) 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 +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +#define LOG_TAG "KvstoreMetaManagerUpdateKeyTest" + +#include "metadata/meta_data_manager.h" + +#include "bootstrap.h" +#include "device_manager_adapter.h" +#include "kvstore_meta_manager.h" +#include "log_print.h" +#include "metadata/device_meta_data.h" +#include "metadata/secret_key_meta_data.h" +#include "metadata/store_meta_data.h" +#include "metadata/store_meta_data_local.h" +#include "metadata/version_meta_data.h" +#include "executor_pool.h" +#include "semaphore_ex.h" +#include "store_types.h" +#include "gtest/gtest.h" +namespace { +using namespace testing::ext; +using namespace OHOS::DistributedData; +using KvStoreMetaManager = OHOS::DistributedKv::KvStoreMetaManager; +using DmAdapter = OHOS::DistributedData::DeviceManagerAdapter; +class KvstoreMetaManagerUpdateKeyTest : public testing::Test { +public: + static void SetUpTestCase() + { + auto executors = std::make_shared(1, 0); + Bootstrap::GetInstance().LoadComponents(); + Bootstrap::GetInstance().LoadDirectory(); + DeviceManagerAdapter::GetInstance().Init(executors); + KvStoreMetaManager::GetInstance().BindExecutor(executors); + KvStoreMetaManager::GetInstance().InitMetaParameter(); + } + static void TearDownTestCase() + { + } + void SetUp() + { + } + void TearDown() + { + } +}; + +/** +* @tc.name: keyUpdataTestWithUuid +* @tc.desc: key updata test +* @tc.type: FUNC +* @tc.require: +* @tc.author: cjx +*/ +HWTEST_F(KvstoreMetaManagerUpdateKeyTest, KeyUpdataTest001, TestSize.Level1) +{ + auto store = KvStoreMetaManager::GetInstance().GetMetaKvStore(); + DeviceMetaData deviceMetaData; + deviceMetaData.newUuid = "KeyUpdataTest001_oldUuid"; + EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(deviceMetaData.GetKey(), deviceMetaData, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(deviceMetaData.GetKey(), deviceMetaData, true)); + + StoreMetaData metaData; + metaData.deviceId = "KeyUpdataTest001_oldUuid"; + metaData.user = "KeyUpdataTest001_user"; + metaData.bundleName = "KeyUpdataTest001_bundleName"; + metaData.storeId = "KeyUpdataTest001_storeId"; + metaData.dataDir = "KeyUpdataTest001_dataDir"; + EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData.GetKeyWithoutPath(), metaData, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData.GetKeyWithoutPath(), metaData)); + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData)); + StoreMetaDataLocal metaDataLocal; + EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData.GetKeyLocalWithoutPath(), metaDataLocal, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyLocalWithoutPath(), metaDataLocal, true)); + SecretKeyMetaData secretKeymetaData; + EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData.GetSecretKeyWithoutPath(), secretKeymetaData, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetSecretKeyWithoutPath(), secretKeymetaData, true)); + + VersionMetaData versionMeta; + versionMeta.version = VersionMetaData::UPDATE_SYNC_META_VERSION; + MetaDataManager::GetInstance().SaveMeta(versionMeta.GetKey(), versionMeta, true); + + KvStoreMetaManager::GetInstance().InitMetaData(); + metaData.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; + + EXPECT_FALSE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKey(), metaData, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData)); + + EXPECT_FALSE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyLocalWithoutPath(), metaDataLocal, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyLocal(), metaDataLocal, true)); + + EXPECT_FALSE(MetaDataManager::GetInstance().LoadMeta(metaData.GetSecretKeyWithoutPath(), secretKeymetaData, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetSecretKey(), secretKeymetaData, true)); + + StoreMetaMapping storeMetaMapping(metaData); + EXPECT_TRUE(MetaDataManager::GetInstance().DelMeta(storeMetaMapping.GetKey(), true)); + EXPECT_TRUE(MetaDataManager::GetInstance().DelMeta(metaData.GetKey(), true)); + EXPECT_TRUE(MetaDataManager::GetInstance().DelMeta(metaData.GetKeyWithoutPath())); + EXPECT_TRUE(MetaDataManager::GetInstance().DelMeta(metaData.GetKeyLocal(), true)); + EXPECT_TRUE(MetaDataManager::GetInstance().DelMeta(metaData.GetSecretKey(), true)); +} + +/** +* @tc.name: KeyUpdataTest +* @tc.desc: key updata test +* @tc.type: FUNC +* @tc.require: +* @tc.author: cjx +*/ +HWTEST_F(KvstoreMetaManagerUpdateKeyTest, KeyUpdataTest002, TestSize.Level1) +{ + auto store = KvStoreMetaManager::GetInstance().GetMetaKvStore(); + StoreMetaData metaData; + metaData.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; + metaData.user = "KeyUpdataTest002_user"; + metaData.bundleName = "KeyUpdataTest002_bundleName"; + metaData.storeId = "KeyUpdataTest002_storeId"; + metaData.dataDir = "KeyUpdataTest002_dataDir"; + EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData.GetKeyWithoutPath(), metaData, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData.GetKeyWithoutPath(), metaData)); + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData)); + StoreMetaDataLocal metaDataLocal; + EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData.GetKeyLocalWithoutPath(), metaDataLocal, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyLocalWithoutPath(), metaDataLocal, true)); + SecretKeyMetaData secretKeymetaData; + EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData.GetSecretKeyWithoutPath(), secretKeymetaData, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetSecretKeyWithoutPath(), secretKeymetaData, true)); + + VersionMetaData versionMeta; + versionMeta.version = VersionMetaData::UPDATE_SYNC_META_VERSION; + MetaDataManager::GetInstance().SaveMeta(versionMeta.GetKey(), versionMeta, true); + KvStoreMetaManager::GetInstance().InitMetaData(); + + EXPECT_FALSE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKey(), metaData, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData)); + + EXPECT_FALSE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyLocalWithoutPath(), metaDataLocal, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyLocal(), metaDataLocal, true)); + + EXPECT_FALSE(MetaDataManager::GetInstance().LoadMeta(metaData.GetSecretKeyWithoutPath(), secretKeymetaData, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetSecretKey(), secretKeymetaData, true)); + + StoreMetaMapping storeMetaMapping(metaData); + EXPECT_TRUE(MetaDataManager::GetInstance().DelMeta(storeMetaMapping.GetKey(), true)); + EXPECT_TRUE(MetaDataManager::GetInstance().DelMeta(metaData.GetKey(), true)); + EXPECT_TRUE(MetaDataManager::GetInstance().DelMeta(metaData.GetKeyWithoutPath())); + EXPECT_TRUE(MetaDataManager::GetInstance().DelMeta(metaData.GetKeyLocal(), true)); + EXPECT_TRUE(MetaDataManager::GetInstance().DelMeta(metaData.GetSecretKey(), true)); +} + +/** +* @tc.name: KeyUpdataTest +* @tc.desc: key updata test +* @tc.type: FUNC +* @tc.require: +* @tc.author: cjx +*/ +HWTEST_F(KvstoreMetaManagerUpdateKeyTest, KeyUpdataTest003, TestSize.Level1) +{ + auto store = KvStoreMetaManager::GetInstance().GetMetaKvStore(); + StoreMetaData metaData; + metaData.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; + metaData.user = "KeyUpdataTest003_user"; + metaData.bundleName = "KeyUpdataTest003_bundleName"; + metaData.storeId = "KeyUpdataTest003_storeId"; + metaData.dataDir = "KeyUpdataTest003_dataDir"; + EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData.GetKeyWithoutPath(), metaData, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData.GetKeyWithoutPath(), metaData)); + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData)); + + KvStoreMetaManager::GetInstance().InitMetaData(); + + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData, true)); + EXPECT_FALSE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKey(), metaData, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData)); + + EXPECT_TRUE(MetaDataManager::GetInstance().DelMeta(metaData.GetKeyWithoutPath(), true)); + EXPECT_TRUE(MetaDataManager::GetInstance().DelMeta(metaData.GetKey(), true)); + EXPECT_TRUE(MetaDataManager::GetInstance().DelMeta(metaData.GetKeyWithoutPath())); +} + +/** +* @tc.name: KeyUpdataTest +* @tc.desc: key updata test +* @tc.type: FUNC +* @tc.require: +* @tc.author: my +*/ +HWTEST_F(KvstoreMetaManagerUpdateKeyTest, KeyUpdataTest004, TestSize.Level1) +{ + auto store = KvStoreMetaManager::GetInstance().GetMetaKvStore(); + StoreMetaData metaData; + metaData.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; + metaData.user = "KeyUpdataTest004_user"; + metaData.bundleName = "KeyUpdataTest004_bundleName"; + metaData.storeId = "KeyUpdataTest004_storeId"; + metaData.dataDir = "KeyUpdataTest004_dataDir"; + EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData.GetKeyWithoutPath(), metaData, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData.GetKeyWithoutPath(), metaData)); + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData)); + + VersionMetaData versionMeta; + MetaDataManager::GetInstance().DelMeta(versionMeta.GetKey(), true); + + KvStoreMetaManager::GetInstance().InitMetaData(); + + EXPECT_FALSE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKey(), metaData, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData)); + + EXPECT_TRUE(MetaDataManager::GetInstance().DelMeta(metaData.GetKeyWithoutPath(), true)); + EXPECT_TRUE(MetaDataManager::GetInstance().DelMeta(metaData.GetKey(), true)); + EXPECT_TRUE(MetaDataManager::GetInstance().DelMeta(metaData.GetKeyWithoutPath())); +} + +/** +* @tc.name: KeyUpdataTest +* @tc.desc: key updata test +* @tc.type: FUNC +* @tc.require: +* @tc.author: my +*/ +HWTEST_F(KvstoreMetaManagerUpdateKeyTest, KeyUpdataTest005, TestSize.Level1) +{ + auto store = KvStoreMetaManager::GetInstance().GetMetaKvStore(); + StoreMetaData metaData; + metaData.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; + metaData.user = "KeyUpdataTest005_user"; + metaData.bundleName = "KeyUpdataTest005_bundleName"; + metaData.storeId = "KeyUpdataTest005_storeId"; + metaData.dataDir = "KeyUpdataTest005_dataDir"; + EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData.GetKeyWithoutPath(), metaData, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData.GetKeyWithoutPath(), metaData)); + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData)); + + VersionMetaData versionMeta; + versionMeta.version = 3; // Set version to 3. + MetaDataManager::GetInstance().SaveMeta(versionMeta.GetKey(), versionMeta, true); + KvStoreMetaManager::GetInstance().InitMetaData(); + + EXPECT_FALSE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKey(), metaData, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData)); + + EXPECT_TRUE(MetaDataManager::GetInstance().DelMeta(metaData.GetKeyWithoutPath(), true)); + EXPECT_TRUE(MetaDataManager::GetInstance().DelMeta(metaData.GetKey(), true)); + EXPECT_TRUE(MetaDataManager::GetInstance().DelMeta(metaData.GetKeyWithoutPath())); +} + +/** +* @tc.name: KeyUpdataTest +* @tc.desc: key updata test +* @tc.type: FUNC +* @tc.require: +* @tc.author: my +*/ +HWTEST_F(KvstoreMetaManagerUpdateKeyTest, KeyUpdataTest006, TestSize.Level1) +{ + auto store = KvStoreMetaManager::GetInstance().GetMetaKvStore(); + StoreMetaData metaData; + + VersionMetaData versionMeta; + versionMeta.version = VersionMetaData::UPDATE_SYNC_META_VERSION; + MetaDataManager::GetInstance().SaveMeta(versionMeta.GetKey(), versionMeta, true); + KvStoreMetaManager::GetInstance().InitMetaData(); + + EXPECT_FALSE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData, true)); +} + +/** +* @tc.name: KeyUpdataTest +* @tc.desc: key updata test +* @tc.type: FUNC +* @tc.require: +* @tc.author: my +*/ +HWTEST_F(KvstoreMetaManagerUpdateKeyTest, KeyUpdataTest007, TestSize.Level1) +{ + auto store = KvStoreMetaManager::GetInstance().GetMetaKvStore(); + + StoreMetaData metaData; + metaData.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; + metaData.user = "KeyUpdataTest007_user"; + metaData.bundleName = "KeyUpdataTest007_bundleName"; + metaData.storeId = "KeyUpdataTest007_storeId"; + metaData.dataDir = "KeyUpdataTest007_dataDir"; + StoreMetaDataLocal metaDataLocal; + EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData.GetKeyLocalWithoutPath(), metaDataLocal, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyLocalWithoutPath(), metaDataLocal, true)); + + VersionMetaData versionMeta; + versionMeta.version = VersionMetaData::UPDATE_SYNC_META_VERSION; + MetaDataManager::GetInstance().SaveMeta(versionMeta.GetKey(), versionMeta, true); + KvStoreMetaManager::GetInstance().InitMetaData(); + + EXPECT_FALSE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyLocalWithoutPath(), metaDataLocal, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyLocal(), metaDataLocal, true)); + + StoreMetaMapping storeMetaMapping(metaData); + EXPECT_TRUE(MetaDataManager::GetInstance().DelMeta(storeMetaMapping.GetKey(), true)); + EXPECT_TRUE(MetaDataManager::GetInstance().DelMeta(metaData.GetKeyLocal(), true)); +} + +/** +* @tc.name: keyUpdataTestWithUuid +* @tc.desc: key updata test +* @tc.type: FUNC +* @tc.require: +* @tc.author: cjx +*/ +HWTEST_F(KvstoreMetaManagerUpdateKeyTest, KeyUpdataTest008, TestSize.Level1) +{ + auto store = KvStoreMetaManager::GetInstance().GetMetaKvStore(); + + StoreMetaData metaData; + metaData.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; + metaData.user = "KeyUpdataTest008_user"; + metaData.bundleName = "KeyUpdataTest008_bundleName"; + metaData.storeId = "KeyUpdataTest008_storeId"; + metaData.dataDir = "KeyUpdataTest008_dataDir"; + EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData.GetKeyWithoutPath(), metaData, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData.GetKeyWithoutPath(), metaData)); + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData)); + StoreMetaDataLocal metaDataLocal; + EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData.GetKeyLocalWithoutPath(), metaDataLocal, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyLocalWithoutPath(), metaDataLocal, true)); + SecretKeyMetaData secretKeymetaData; + EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData.GetSecretKeyWithoutPath(), secretKeymetaData, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetSecretKeyWithoutPath(), secretKeymetaData, true)); + + VersionMetaData versionMeta; + versionMeta.version = VersionMetaData::CURRENT_VERSION; + MetaDataManager::GetInstance().SaveMeta(versionMeta.GetKey(), versionMeta, true); + + KvStoreMetaManager::GetInstance().InitMetaData(); + metaData.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; + + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData, true)); + EXPECT_FALSE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKey(), metaData, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData)); + + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyLocalWithoutPath(), metaDataLocal, true)); + EXPECT_FALSE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyLocal(), metaDataLocal, true)); + + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetSecretKeyWithoutPath(), secretKeymetaData, true)); + EXPECT_FALSE(MetaDataManager::GetInstance().LoadMeta(metaData.GetSecretKey(), secretKeymetaData, true)); + + StoreMetaMapping storeMetaMapping(metaData); + EXPECT_TRUE(MetaDataManager::GetInstance().DelMeta(storeMetaMapping.GetKey(), true)); + EXPECT_TRUE(MetaDataManager::GetInstance().DelMeta(metaData.GetKey(), true)); + EXPECT_TRUE(MetaDataManager::GetInstance().DelMeta(metaData.GetKeyWithoutPath())); + EXPECT_TRUE(MetaDataManager::GetInstance().DelMeta(metaData.GetKeyLocal(), true)); + EXPECT_TRUE(MetaDataManager::GetInstance().DelMeta(metaData.GetSecretKey(), true)); +} +} // namespace \ No newline at end of file diff --git a/services/distributeddataservice/app/test/unittest/session_manager_test.cpp b/services/distributeddataservice/app/test/unittest/session_manager_test.cpp index b336e74fe..d45a2819b 100644 --- a/services/distributeddataservice/app/test/unittest/session_manager_test.cpp +++ b/services/distributeddataservice/app/test/unittest/session_manager_test.cpp @@ -108,6 +108,15 @@ public: } static void SetUpTestCase() { + deviceManagerAdapterMock = std::make_shared(); + BDeviceManagerAdapter::deviceManagerAdapter = deviceManagerAdapterMock; + metaDataManagerMock = std::make_shared(); + BMetaDataManager::metaDataManager = metaDataManagerMock; + metaDataMock = std::make_shared>(); + BMetaData::metaDataManager = metaDataMock; + userDelegateMock = std::make_shared(); + BUserDelegate::userDelegate = userDelegateMock; + auto executors = std::make_shared(12, 5); Bootstrap::GetInstance().LoadComponents(); Bootstrap::GetInstance().LoadDirectory(); @@ -143,16 +152,8 @@ public: metaData.tokenId = AccessTokenKit::GetHapTokenID(PEER_USER_ID2, "ohos.test.demo", 0); metaData.uid = METADATA_UID; metaData.storeType = 1; - MetaDataManager::GetInstance().SaveMeta(metaData.GetKey(), metaData); + MetaDataManager::GetInstance().SaveMeta(metaData.GetKeyWithoutPath(), metaData); GrantPermissionNative(); - deviceManagerAdapterMock = std::make_shared(); - BDeviceManagerAdapter::deviceManagerAdapter = deviceManagerAdapterMock; - metaDataManagerMock = std::make_shared(); - BMetaDataManager::metaDataManager = metaDataManagerMock; - metaDataMock = std::make_shared>(); - BMetaData::metaDataManager = metaDataMock; - userDelegateMock = std::make_shared(); - BUserDelegate::userDelegate = userDelegateMock; } static void TearDownTestCase() { @@ -169,7 +170,7 @@ public: metaData.tokenId = AccessTokenKit::GetHapTokenID(PEER_USER_ID2, "ohos.test.demo", 0); metaData.uid = METADATA_UID; metaData.storeType = 1; - MetaDataManager::GetInstance().DelMeta(metaData.GetKey()); + MetaDataManager::GetInstance().DelMeta(metaData.GetKeyWithoutPath()); deviceManagerAdapterMock = nullptr; BDeviceManagerAdapter::deviceManagerAdapter = nullptr; metaDataManagerMock = nullptr; diff --git a/services/distributeddataservice/framework/include/metadata/device_meta_data.h b/services/distributeddataservice/framework/include/metadata/device_meta_data.h index 7df8c5564..a5dd8e61e 100644 --- a/services/distributeddataservice/framework/include/metadata/device_meta_data.h +++ b/services/distributeddataservice/framework/include/metadata/device_meta_data.h @@ -28,7 +28,6 @@ public: API_EXPORT std::string GetKey() const; std::string newUuid = ""; - std::string oldUuid = ""; }; } // namespace OHOS::DistributedData #endif // OHOS_DISTRIBUTED_DATA_SERVICES_FRAMEWORK_METADATA_DEVICE_META_DATA_H \ No newline at end of file diff --git a/services/distributeddataservice/framework/include/metadata/meta_data_manager.h b/services/distributeddataservice/framework/include/metadata/meta_data_manager.h index 08a2465c4..3a01dbdc1 100644 --- a/services/distributeddataservice/framework/include/metadata/meta_data_manager.h +++ b/services/distributeddataservice/framework/include/metadata/meta_data_manager.h @@ -51,11 +51,16 @@ public: using Backup = std::function &)>; using Bytes = std::vector; using OnComplete = std::function &)>; + struct Entry { + std::string key; + std::string value; + }; API_EXPORT static MetaDataManager &GetInstance(); API_EXPORT void Initialize(std::shared_ptr metaStore, const Backup &backup, const std::string &storeId); API_EXPORT void SetSyncer(const Syncer &syncer); API_EXPORT void SetCloudSyncer(const CloudSyncer &cloudSyncer); API_EXPORT bool SaveMeta(const std::string &key, const Serializable &value, bool isLocal = false); + API_EXPORT bool SaveMeta(const std::vector &values, bool isLocal = false); API_EXPORT bool LoadMeta(const std::string &key, Serializable &value, bool isLocal = false); template API_EXPORT bool LoadMeta(const std::string &prefix, std::vector &values, bool isLocal = false) @@ -75,6 +80,7 @@ public: } API_EXPORT bool DelMeta(const std::string &key, bool isLocal = false); + API_EXPORT bool DelMeta(const std::vector &keys, bool isLocal = false); API_EXPORT bool Subscribe(std::shared_ptr filter, Observer observer); API_EXPORT bool Subscribe(std::string prefix, Observer observer, bool isLocal = false); API_EXPORT bool Unsubscribe(std::string filter); diff --git a/services/distributeddataservice/framework/include/metadata/store_meta_data.h b/services/distributeddataservice/framework/include/metadata/store_meta_data.h index 40e6ca1ae..240a55e60 100644 --- a/services/distributeddataservice/framework/include/metadata/store_meta_data.h +++ b/services/distributeddataservice/framework/include/metadata/store_meta_data.h @@ -21,7 +21,8 @@ #include "store/store_info.h" namespace OHOS::DistributedData { -struct API_EXPORT StoreMetaData final : public Serializable { +struct StoreMetaMapping; +struct API_EXPORT StoreMetaData : public Serializable { // record meta version for compatible, should update when modify store meta data structure. static constexpr uint32_t CURRENT_VERSION = 0x03000006; // UID -> uid, deviceAccountId -> userId, userId -> user @@ -77,24 +78,53 @@ struct API_EXPORT StoreMetaData final : public Serializable { API_EXPORT StoreMetaData(); API_EXPORT StoreMetaData(const std::string &userId, const std::string &appId, const std::string &storeId); API_EXPORT explicit StoreMetaData(const StoreInfo &storeInfo); - API_EXPORT ~StoreMetaData(); + API_EXPORT virtual ~StoreMetaData(); API_EXPORT bool operator==(const StoreMetaData &metaData) const; API_EXPORT bool operator!=(const StoreMetaData &metaData) const; API_EXPORT bool Marshal(json &node) const override; API_EXPORT bool Unmarshal(const json &node) override; - API_EXPORT std::string GetKey() const; - API_EXPORT std::string GetKeyLocal() const; - API_EXPORT std::string GetSecretKey() const; - API_EXPORT std::string GetStrategyKey() const; - API_EXPORT std::string GetBackupSecretKey() const; - API_EXPORT std::string GetAutoLaunchKey() const; - API_EXPORT std::string GetDebugInfoKey() const; - API_EXPORT std::string GetDfxInfoKey() const; - API_EXPORT std::string GetStoreAlias() const; - API_EXPORT StoreInfo GetStoreInfo() const; + API_EXPORT virtual std::string GetKeyWithoutPath() const; + API_EXPORT virtual std::string GetKey() const; + API_EXPORT virtual std::string GetKeyLocalWithoutPath() const; + API_EXPORT virtual std::string GetKeyLocal() const; + API_EXPORT virtual std::string GetSecretKeyWithoutPath() const; + API_EXPORT virtual std::string GetSecretKey() const; + API_EXPORT virtual std::string GetStrategyKey() const; + API_EXPORT virtual std::string GetBackupSecretKey() const; + API_EXPORT virtual std::string GetAutoLaunchKey() const; + API_EXPORT virtual std::string GetDebugInfoKey() const; + API_EXPORT virtual std::string GetDebugInfoKeyWithoutPath() const; + API_EXPORT virtual std::string GetDfxInfoKey() const; + API_EXPORT virtual std::string GetDfxInfoKeyWithoutPath() const; + API_EXPORT virtual std::string GetStoreAlias() const; + API_EXPORT virtual StoreInfo GetStoreInfo() const; + API_EXPORT virtual std::string GetCloneSecretKey() const; API_EXPORT static std::string GetKey(const std::initializer_list &fields); API_EXPORT static std::string GetPrefix(const std::initializer_list &fields); - API_EXPORT std::string GetCloneSecretKey() const; +}; + +struct API_EXPORT StoreMetaMapping final : public StoreMetaData { + static constexpr const char *KEY_PREFIX = "StoreMetaMapping"; + std::string cloudPath; + std::string devicePath; + std::string searchPath; + + API_EXPORT StoreMetaMapping(); + API_EXPORT StoreMetaMapping(const StoreMetaData &storeMeta); + API_EXPORT explicit StoreMetaMapping(const StoreInfo &storeInfo); + API_EXPORT ~StoreMetaMapping(); + API_EXPORT bool Marshal(json &node) const override; + API_EXPORT bool Unmarshal(const json &node) override; + API_EXPORT std::string GetKey() const override; + API_EXPORT std::string GetCloudStoreMetaKey() const; + API_EXPORT std::string GetDeviceStoreMetaKey() const; + API_EXPORT std::string GetSearchStoreMetaKey() const; + API_EXPORT static std::string GetPrefix(const std::initializer_list &fields); + API_EXPORT StoreMetaMapping& operator=(const StoreMetaData &meta); + +private: + static std::string GetKey(const std::initializer_list &fields); + std::string GetStoreMetaKeyWithPath(const std::string &path) const; }; } // namespace OHOS::DistributedData #endif // OHOS_DISTRIBUTED_DATA_SERVICES_FRAMEWORK_METADATA_STORE_META_DATA_H \ No newline at end of file diff --git a/services/distributeddataservice/framework/include/metadata/version_meta_data.h b/services/distributeddataservice/framework/include/metadata/version_meta_data.h index c83522c67..0f44814e1 100755 --- a/services/distributeddataservice/framework/include/metadata/version_meta_data.h +++ b/services/distributeddataservice/framework/include/metadata/version_meta_data.h @@ -20,7 +20,9 @@ namespace OHOS::DistributedData { class API_EXPORT VersionMetaData final : public Serializable { public: - static constexpr int32_t CURRENT_VERSION = 4; + static constexpr int32_t CURRENT_VERSION = 5; + static constexpr int32_t UPDATE_STORE_META_KEY_VERSION = 5; + static constexpr int32_t UPDATE_SYNC_META_VERSION = 4; static constexpr int32_t INVALID_VERSION = -1; int32_t version = INVALID_VERSION; diff --git a/services/distributeddataservice/framework/include/store/auto_cache.h b/services/distributeddataservice/framework/include/store/auto_cache.h index 1549d0f1f..3a1572945 100644 --- a/services/distributeddataservice/framework/include/store/auto_cache.h +++ b/services/distributeddataservice/framework/include/store/auto_cache.h @@ -52,24 +52,21 @@ public: API_EXPORT std::pair GetDBStore(const StoreMetaData &meta, const Watchers &watchers); - API_EXPORT Stores GetStoresIfPresent(uint32_t tokenId, const std::string &storeName = "", - const std::string &userId = ""); + API_EXPORT Stores GetStoresIfPresent(uint32_t tokenId, const std::string &path = ""); - API_EXPORT void CloseStore(uint32_t tokenId, const std::string &storeId = "", const std::string &userId = ""); + API_EXPORT void CloseStore(uint32_t tokenId, const std::string &path = ""); API_EXPORT void CloseStore(const Filter &filter); - API_EXPORT void SetObserver(uint32_t tokenId, const std::string &storeId, const Watchers &watchers, - const std::string &userId = ""); + API_EXPORT void SetObserver(uint32_t tokenId, const Watchers &watchers, const std::string &path); - API_EXPORT void Enable(uint32_t tokenId, const std::string &storeId = "", const std::string &userId = ""); + API_EXPORT void Enable(uint32_t tokenId, const std::string &path = ""); - API_EXPORT void Disable(uint32_t tokenId, const std::string &storeId, const std::string &userId = ""); + API_EXPORT void Disable(uint32_t tokenId, const std::string &path = ""); private: AutoCache(); ~AutoCache(); - std::string GenerateKey(const std::string &userId, const std::string &storeId) const; void GarbageCollect(bool isForce); void StartTimer(); struct Delegate : public GeneralWatcher { diff --git a/services/distributeddataservice/framework/include/store/store_info.h b/services/distributeddataservice/framework/include/store/store_info.h index 8c5d02b2b..3543cca5d 100644 --- a/services/distributeddataservice/framework/include/store/store_info.h +++ b/services/distributeddataservice/framework/include/store/store_info.h @@ -27,6 +27,7 @@ struct StoreInfo { int32_t user = 0; std::string deviceId; uint64_t syncId = 0; + std::string path; }; } // namespace OHOS::DistributedData #endif // OHOS_DISTRIBUTED_DATA_SERVICES_FRAMEWORK_STORE_STORE_INFO_H diff --git a/services/distributeddataservice/framework/include/utils/constant.h b/services/distributeddataservice/framework/include/utils/constant.h index bfeaee6b3..48aaf1547 100644 --- a/services/distributeddataservice/framework/include/utils/constant.h +++ b/services/distributeddataservice/framework/include/utils/constant.h @@ -44,6 +44,20 @@ public: API_EXPORT static std::vector Split(const std::string &str, const std::string &delim); + template + API_EXPORT static bool BatchProcess(const std::vector &value, size_t batchSize, Action action) + { + auto it = value.begin(); + while (it != value.end()) { + auto end = it + std::min(batchSize, static_cast(std::distance(it, value.end()))); + if (!action(it, end)) { + return false; + } + it = end; + } + return true; + } + template inline static constexpr bool is_pod = (std::is_standard_layout_v && std::is_trivial_v); diff --git a/services/distributeddataservice/framework/metadata/device_meta_data.cpp b/services/distributeddataservice/framework/metadata/device_meta_data.cpp index c16c6400f..c3aa1e3fe 100644 --- a/services/distributeddataservice/framework/metadata/device_meta_data.cpp +++ b/services/distributeddataservice/framework/metadata/device_meta_data.cpp @@ -20,14 +20,12 @@ static constexpr const char *KEY_PREFIX = "DeviceMeta"; bool DeviceMetaData::Marshal(json &node) const { SetValue(node[GET_NAME(newUuid)], newUuid); - SetValue(node[GET_NAME(oldUuid)], oldUuid); return true; } bool DeviceMetaData::Unmarshal(const json &node) { GetValue(node, GET_NAME(newUuid), newUuid); - GetValue(node, GET_NAME(oldUuid), oldUuid); return true; } diff --git a/services/distributeddataservice/framework/metadata/meta_data_manager.cpp b/services/distributeddataservice/framework/metadata/meta_data_manager.cpp index e7ade4b82..ff46e2720 100644 --- a/services/distributeddataservice/framework/metadata/meta_data_manager.cpp +++ b/services/distributeddataservice/framework/metadata/meta_data_manager.cpp @@ -216,6 +216,38 @@ bool MetaDataManager::SaveMeta(const std::string &key, const Serializable &value return status == DistributedDB::DBStatus::OK; } +bool MetaDataManager::SaveMeta(const std::vector &values, bool isLocal) +{ + if (!inited_) { + return false; + } + if (values.empty()) { + return true; + } + std::vector entries; + entries.reserve(values.size()); + for (const auto &[key, value] : values) { + entries.push_back({ { key.begin(), key.end() }, { value.begin(), value.end() } }); + } + auto status = isLocal ? metaStore_->PutLocalBatch(entries) : metaStore_->PutBatch(entries); + if (status == DistributedDB::DBStatus::INVALID_PASSWD_OR_CORRUPTED_DB) { + ZLOGE("db corrupted! status:%{public}d isLocal:%{public}d, size:%{public}zu", status, isLocal, values.size()); + CorruptReporter::CreateCorruptedFlag(DirectoryManager::GetInstance().GetMetaStorePath(), storeId_); + StopSA(); + return false; + } + if (status == DistributedDB::DBStatus::OK && backup_) { + backup_(metaStore_); + } + if (!isLocal && cloudSyncer_) { + cloudSyncer_(); + } + if (status != DistributedDB::DBStatus::OK) { + ZLOGE("failed! status:%{public}d isLocal:%{public}d, size:%{public}zu", status, isLocal, values.size()); + } + return status == DistributedDB::DBStatus::OK; +} + bool MetaDataManager::LoadMeta(const std::string &key, Serializable &value, bool isLocal) { if (!inited_) { @@ -271,7 +303,6 @@ bool MetaDataManager::DelMeta(const std::string &key, bool isLocal) return false; } - DistributedDB::Value data; auto status = isLocal ? metaStore_->DeleteLocal({ key.begin(), key.end() }) : metaStore_->Delete({ key.begin(), key.end() }); if (status == DistributedDB::DBStatus::INVALID_PASSWD_OR_CORRUPTED_DB) { @@ -290,6 +321,36 @@ bool MetaDataManager::DelMeta(const std::string &key, bool isLocal) return ((status == DistributedDB::DBStatus::OK) || (status == DistributedDB::DBStatus::NOT_FOUND)); } +bool MetaDataManager::DelMeta(const std::vector &keys, bool isLocal) +{ + if (!inited_) { + return false; + } + if (keys.empty()) { + return true; + } + std::vector dbKeys; + dbKeys.reserve(keys.size()); + for (auto &key : keys) { + dbKeys.emplace_back(key.begin(), key.end()); + } + auto status = isLocal ? metaStore_->DeleteLocalBatch(dbKeys) : metaStore_->DeleteBatch(dbKeys); + if (status == DistributedDB::DBStatus::INVALID_PASSWD_OR_CORRUPTED_DB) { + ZLOGE("db corrupted! status:%{public}d isLocal:%{public}d, key size:%{public}zu", status, isLocal, + dbKeys.size()); + CorruptReporter::CreateCorruptedFlag(DirectoryManager::GetInstance().GetMetaStorePath(), storeId_); + StopSA(); + return false; + } + if (status == DistributedDB::DBStatus::OK && backup_) { + backup_(metaStore_); + } + if (!isLocal && cloudSyncer_) { + cloudSyncer_(); + } + return ((status == DistributedDB::DBStatus::OK) || (status == DistributedDB::DBStatus::NOT_FOUND)); +} + bool MetaDataManager::Sync(const std::vector &devices, OnComplete complete, bool wait) { if (!inited_ || devices.empty()) { diff --git a/services/distributeddataservice/framework/metadata/store_meta_data.cpp b/services/distributeddataservice/framework/metadata/store_meta_data.cpp index 61d678580..41ecb84f6 100644 --- a/services/distributeddataservice/framework/metadata/store_meta_data.cpp +++ b/services/distributeddataservice/framework/metadata/store_meta_data.cpp @@ -22,6 +22,7 @@ #include "metadata/strategy_meta_data.h" #include "utils/anonymous.h" #include "utils/constant.h" +#include "utils/crypto.h" namespace OHOS { namespace DistributedData { constexpr uint32_t StoreMetaData::CURRENT_VERSION; @@ -127,8 +128,8 @@ StoreMetaData::StoreMetaData(const std::string &userId, const std::string &appId } StoreMetaData::StoreMetaData(const StoreInfo &storeInfo) - : instanceId(storeInfo.instanceId), bundleName(storeInfo.bundleName), storeId(storeInfo.storeName), - user(std::to_string(storeInfo.user)) + : instanceId(storeInfo.instanceId), bundleName(storeInfo.bundleName), dataDir(storeInfo.path), + storeId(storeInfo.storeName), user(std::to_string(storeInfo.user)) { } @@ -160,25 +161,26 @@ bool StoreMetaData::operator!=(const StoreMetaData &metaData) const std::string StoreMetaData::GetKey() const { if (instanceId == 0) { - return GetKey({ deviceId, user, "default", bundleName, storeId }); + return GetKey({ deviceId, user, "default", bundleName, storeId, dataDir }); } - return GetKey({ deviceId, user, "default", bundleName, storeId, std::to_string(instanceId) }); + return GetKey({ deviceId, user, "default", bundleName, storeId, std::to_string(instanceId), dataDir }); } std::string StoreMetaData::GetKeyLocal() const { if (instanceId == 0) { - return StoreMetaDataLocal::GetKey({ deviceId, user, "default", bundleName, storeId }); + return StoreMetaDataLocal::GetKey({ deviceId, user, "default", bundleName, storeId, dataDir }); } - return StoreMetaDataLocal::GetKey({ deviceId, user, "default", bundleName, storeId, std::to_string(instanceId) }); + return StoreMetaDataLocal::GetKey( + { deviceId, user, "default", bundleName, storeId, std::to_string(instanceId), dataDir }); } std::string StoreMetaData::GetSecretKey() const { if (version < UUID_CHANGED_TAG) { - return SecretKeyMetaData::GetKey({ user, "default", bundleName, storeId }); + return SecretKeyMetaData::GetKey({ user, "default", bundleName, storeId, dataDir }); } - return SecretKeyMetaData::GetKey({ user, "default", bundleName, storeId, std::to_string(instanceId) }); + return SecretKeyMetaData::GetKey({ user, "default", bundleName, storeId, std::to_string(instanceId), dataDir }); } std::string StoreMetaData::GetBackupSecretKey() const @@ -195,11 +197,23 @@ std::string StoreMetaData::GetAutoLaunchKey() const } std::string StoreMetaData::GetDebugInfoKey() const +{ + return StoreDebugInfo::GetPrefix( + { deviceId, user, "default", bundleName, storeId, std::to_string(instanceId), dataDir }); +} + +std::string StoreMetaData::GetDebugInfoKeyWithoutPath() const { return StoreDebugInfo::GetPrefix({ deviceId, user, "default", bundleName, storeId, std::to_string(instanceId) }); } std::string StoreMetaData::GetDfxInfoKey() const +{ + return StoreDfxInfo::GetPrefix( + { deviceId, user, "default", bundleName, storeId, std::to_string(instanceId), dataDir }); +} + +std::string StoreMetaData::GetDfxInfoKeyWithoutPath() const { return StoreDfxInfo::GetPrefix({ deviceId, user, "default", bundleName, storeId, std::to_string(instanceId) }); } @@ -245,5 +259,106 @@ std::string StoreMetaData::GetCloneSecretKey() const { return SecretKeyMetaData::GetCloneKey({ user, "default", bundleName, storeId, std::to_string(instanceId) }); } + +std::string StoreMetaData::GetKeyWithoutPath() const +{ + if (instanceId == 0) { + return GetKey({ deviceId, user, "default", bundleName, storeId }); + } + return GetKey({ deviceId, user, "default", bundleName, storeId, std::to_string(instanceId) }); +} + +std::string StoreMetaData::GetKeyLocalWithoutPath() const +{ + if (instanceId == 0) { + return StoreMetaDataLocal::GetKey({ deviceId, user, "default", bundleName, storeId }); + } + return StoreMetaDataLocal::GetKey({ deviceId, user, "default", bundleName, storeId, std::to_string(instanceId) }); +} + +std::string StoreMetaData::GetSecretKeyWithoutPath() const +{ + if (version < UUID_CHANGED_TAG) { + return SecretKeyMetaData::GetKey({ user, "default", bundleName, storeId }); + } + return SecretKeyMetaData::GetKey({ user, "default", bundleName, storeId, std::to_string(instanceId) }); +} + +StoreMetaMapping::StoreMetaMapping() {} +StoreMetaMapping::StoreMetaMapping(const StoreMetaData &storeMeta) : StoreMetaData(storeMeta) {} +StoreMetaMapping::~StoreMetaMapping() {} + +bool StoreMetaMapping::Marshal(json &node) const +{ + StoreMetaData::Marshal(node); + SetValue(node[GET_NAME(cloudPath)], cloudPath); + SetValue(node[GET_NAME(devicePath)], devicePath); + SetValue(node[GET_NAME(searchPath)], searchPath); + return true; +} +bool StoreMetaMapping::Unmarshal(const Serializable::json &node) +{ + StoreMetaData::Unmarshal(node); + GetValue(node, GET_NAME(cloudPath), cloudPath); + GetValue(node, GET_NAME(devicePath), devicePath); + GetValue(node, GET_NAME(searchPath), searchPath); + return true; +} + +std::string StoreMetaMapping::GetKey() const +{ + if (instanceId == 0) { + return GetKey({ deviceId, user, "default", bundleName, storeId }); + } + return GetKey({ deviceId, user, "default", bundleName, storeId, std::to_string(instanceId) }); +} + +std::string StoreMetaMapping::GetCloudStoreMetaKey() const +{ + return GetStoreMetaKeyWithPath(cloudPath); +} + +std::string StoreMetaMapping::GetDeviceStoreMetaKey() const +{ + return GetStoreMetaKeyWithPath(devicePath); +} + +std::string StoreMetaMapping::GetSearchStoreMetaKey() const +{ + return GetStoreMetaKeyWithPath(searchPath); +} + +std::string StoreMetaMapping::GetPrefix(const std::initializer_list &fields) +{ + return GetKey(fields).append(Constant::KEY_SEPARATOR); +} + +StoreMetaMapping& StoreMetaMapping::operator=(const StoreMetaData &meta) +{ + if (this == &meta) { + return *this; + } + this->StoreMetaData::operator=(meta); + return *this; +} + +std::string StoreMetaMapping::GetStoreMetaKeyWithPath(const std::string &path) const +{ + if (instanceId == 0) { + return StoreMetaData::GetKey({ deviceId, user, "default", bundleName, storeId, path }); + } + return StoreMetaData::GetKey({ deviceId, user, "default", bundleName, storeId, std::to_string(instanceId), path }); +} + +std::string StoreMetaMapping::GetKey(const std::initializer_list &fields) +{ + std::string prefix = KEY_PREFIX; + for (const auto &field : fields) { + prefix.append(Constant::KEY_SEPARATOR).append(field); + } + return prefix; +} +StoreMetaMapping::StoreMetaMapping(const StoreInfo &storeInfo) : StoreMetaData(storeInfo) {} + } // namespace DistributedData } // namespace OHOS \ No newline at end of file diff --git a/services/distributeddataservice/framework/store/auto_cache.cpp b/services/distributeddataservice/framework/store/auto_cache.cpp index b6343164e..9e1cbef74 100644 --- a/services/distributeddataservice/framework/store/auto_cache.cpp +++ b/services/distributeddataservice/framework/store/auto_cache.cpp @@ -25,7 +25,6 @@ #include "utils/anonymous.h" namespace OHOS::DistributedData { using Account = AccountDelegate; -static constexpr const char *KEY_SEPARATOR = "###"; AutoCache &AutoCache::GetInstance() { static AutoCache cache; @@ -61,24 +60,16 @@ AutoCache::~AutoCache() } } -std::string AutoCache::GenerateKey(const std::string &userId, const std::string &storeId) const -{ - std::string key = ""; - if (userId.empty() || storeId.empty()) { - return key; - } - return key.append(userId).append(KEY_SEPARATOR).append(storeId); -} - std::pair AutoCache::GetDBStore(const StoreMetaData &meta, const Watchers &watchers) { Store store; - auto storeKey = GenerateKey(meta.user, meta.storeId); + auto storeKey = meta.dataDir; if (meta.storeType >= MAX_CREATOR_NUM || meta.storeType < 0 || !creators_[meta.storeType] || disables_.ContainIf(meta.tokenId, [&storeKey](const std::set &stores) -> bool { return stores.count(storeKey) != 0; })) { - ZLOGW("storeType is invalid or store is disabled,user:%{public}s,bundleName:%{public}s,storeName:%{public}s", - meta.user.c_str(), meta.bundleName.c_str(), meta.GetStoreAlias().c_str()); + ZLOGW("storeType %{public}d is invalid or store is disabled, user:%{public}s, bundleName:%{public}s, " + "storeName:%{public}s", meta.storeType, meta.user.c_str(), meta.bundleName.c_str(), + meta.GetStoreAlias().c_str()); return { E_ERROR, store }; } if (meta.area == GeneralStore::EL4 && ScreenManager::GetInstance()->IsLocked()) { @@ -126,19 +117,17 @@ AutoCache::Store AutoCache::GetStore(const StoreMetaData &meta, const Watchers & return GetDBStore(meta, watchers).second; } -AutoCache::Stores AutoCache::GetStoresIfPresent(uint32_t tokenId, const std::string &storeName, - const std::string &userId) +AutoCache::Stores AutoCache::GetStoresIfPresent(uint32_t tokenId, const std::string &path) { Stores stores; - auto storeKey = GenerateKey(userId, storeName); stores_.ComputeIfPresent( - tokenId, [&stores, &storeKey](auto &, std::map &delegates) -> bool { - if (storeKey.empty()) { + tokenId, [&stores, &path](auto &, std::map &delegates) -> bool { + if (path.empty()) { for (auto &[_, delegate] : delegates) { stores.push_back(delegate); } } else { - auto it = delegates.find(storeKey); + auto it = delegates.find(path); if (it != delegates.end()) { stores.push_back(it->second); } @@ -170,18 +159,17 @@ void AutoCache::StartTimer() ZLOGD("start timer,taskId: %{public}" PRIu64, taskId_); } -void AutoCache::CloseStore(uint32_t tokenId, const std::string &storeId, const std::string &userId) +void AutoCache::CloseStore(uint32_t tokenId, const std::string &path) { - ZLOGD("close store start, store:%{public}s, token:%{public}u", Anonymous::Change(storeId).c_str(), tokenId); + ZLOGD("close store start, token:%{public}u", tokenId); std::set storeIds; std::list closeStores; bool isScreenLocked = ScreenManager::GetInstance()->IsLocked(); - auto storeKey = GenerateKey(userId, storeId); stores_.ComputeIfPresent(tokenId, - [this, &storeKey, isScreenLocked, &storeIds, &closeStores](auto &, auto &delegates) { + [this, &path, isScreenLocked, &storeIds, &closeStores](auto &, auto &delegates) { auto it = delegates.begin(); while (it != delegates.end()) { - if ((it->first == storeKey || storeKey.empty()) && + if ((it->first == path || path.empty()) && (!isScreenLocked || it->second.GetArea() != GeneralStore::EL4) && disableStores_.count(it->second.GetDataDir()) == 0) { disableStores_.insert(it->second.GetDataDir()); @@ -241,14 +229,12 @@ void AutoCache::CloseStore(const AutoCache::Filter &filter) }); } -void AutoCache::SetObserver(uint32_t tokenId, const std::string &storeId, const AutoCache::Watchers &watchers, - const std::string &userId) +void AutoCache::SetObserver(uint32_t tokenId, const AutoCache::Watchers &watchers, const std::string &path) { - auto storeKey = GenerateKey(userId, storeId); - stores_.ComputeIfPresent(tokenId, [&storeKey, &watchers](auto &key, auto &stores) { + stores_.ComputeIfPresent(tokenId, [&path, &watchers](auto &key, auto &stores) { ZLOGD("tokenId:0x%{public}x storeId:%{public}s observers:%{public}zu", key, - Anonymous::Change(storeKey).c_str(), watchers.size()); - auto it = stores.find(storeKey); + Anonymous::Change(path).c_str(), watchers.size()); + auto it = stores.find(path); if (it != stores.end()) { it->second.SetObservers(watchers); } @@ -274,23 +260,21 @@ void AutoCache::GarbageCollect(bool isForce) }); } -void AutoCache::Enable(uint32_t tokenId, const std::string &storeId, const std::string &userId) +void AutoCache::Enable(uint32_t tokenId, const std::string &path) { - auto storeKey = GenerateKey(userId, storeId); - disables_.ComputeIfPresent(tokenId, [&storeKey](auto key, std::set &stores) { - stores.erase(storeKey); - return !(stores.empty() || storeKey.empty()); + disables_.ComputeIfPresent(tokenId, [&path](auto key, std::set &stores) { + stores.erase(path); + return !(stores.empty() || path.empty()); }); } -void AutoCache::Disable(uint32_t tokenId, const std::string &storeId, const std::string &userId) +void AutoCache::Disable(uint32_t tokenId, const std::string &path) { - auto storeKey = GenerateKey(userId, storeId); - disables_.Compute(tokenId, [&storeKey](auto key, std::set &stores) { - stores.insert(storeKey); + disables_.Compute(tokenId, [&path](auto key, std::set &stores) { + stores.insert(path); return !stores.empty(); }); - CloseStore(tokenId, storeId, userId); + CloseStore(tokenId, path); } AutoCache::Delegate::Delegate(GeneralStore *delegate, const Watchers &watchers, int32_t user, const StoreMetaData &meta) diff --git a/services/distributeddataservice/framework/test/BUILD.gn b/services/distributeddataservice/framework/test/BUILD.gn index 002eaef72..7864242c9 100644 --- a/services/distributeddataservice/framework/test/BUILD.gn +++ b/services/distributeddataservice/framework/test/BUILD.gn @@ -273,6 +273,8 @@ ohos_unittest("MetaDataManagerTest") { "ipc:ipc_core", "cJSON:cjson", "kv_store:datamgr_common", + "kv_store:distributeddb", + "kv_store:distributeddata_inner", ] deps = [ @@ -290,6 +292,8 @@ ohos_unittest("StoreMetaDataLocalTest") { external_deps = [ "cJSON:cjson", "kv_store:datamgr_common", + "kv_store:distributeddb", + "kv_store:distributeddata_inner", ] } diff --git a/services/distributeddataservice/framework/test/meta_data_test.cpp b/services/distributeddataservice/framework/test/meta_data_test.cpp index 4ae6ed71e..1c740a152 100644 --- a/services/distributeddataservice/framework/test/meta_data_test.cpp +++ b/services/distributeddataservice/framework/test/meta_data_test.cpp @@ -225,12 +225,13 @@ HWTEST_F(ServiceMetaDataTest, SecretKeyMetaData002, TestSize.Level1) HWTEST_F(ServiceMetaDataTest, StoreMetaData001, TestSize.Level1) { StoreMetaData storeMetaData("100", "appid", "test_store"); + storeMetaData.dataDir = "testDir"; StoreMetaData storeMeta; std::string key = storeMetaData.GetKey(); - EXPECT_EQ(key, "KvStoreMetaData######100###default######test_store"); + EXPECT_EQ(key, "KvStoreMetaData######100###default######test_store###testDir"); std::string keylocal = storeMetaData.GetKeyLocal(); - EXPECT_EQ(keylocal, "KvStoreMetaDataLocal######100###default######test_store"); + EXPECT_EQ(keylocal, "KvStoreMetaDataLocal######100###default######test_store###testDir"); std::initializer_list fields = { "100", "appid", "test_store" }; std::string keyfields = storeMetaData.GetKey(fields); EXPECT_EQ(keyfields, "KvStoreMetaData###100###appid###test_store"); @@ -246,15 +247,16 @@ HWTEST_F(ServiceMetaDataTest, StoreMetaData001, TestSize.Level1) result = MetaDataManager::GetInstance().DelMeta(key, true); EXPECT_TRUE(result); - result = MetaDataManager::GetInstance().SaveMeta(key, storeMetaData); + std::string syncKey = storeMetaData.GetKeyWithoutPath(); + result = MetaDataManager::GetInstance().SaveMeta(syncKey, storeMetaData); EXPECT_TRUE(result); - result = MetaDataManager::GetInstance().LoadMeta(key, storeMeta); + result = MetaDataManager::GetInstance().LoadMeta(syncKey, storeMeta); EXPECT_TRUE(result); EXPECT_EQ(storeMetaData.GetKey(), storeMeta.GetKey()); EXPECT_EQ(storeMetaData.GetKeyLocal(), storeMeta.GetKeyLocal()); EXPECT_EQ(storeMetaData.GetKey(fields), storeMeta.GetKey(fields)); - result = MetaDataManager::GetInstance().DelMeta(key); + result = MetaDataManager::GetInstance().DelMeta(syncKey); EXPECT_TRUE(result); } @@ -268,10 +270,11 @@ HWTEST_F(ServiceMetaDataTest, StoreMetaData001, TestSize.Level1) HWTEST_F(ServiceMetaDataTest, StoreMetaData002, TestSize.Level1) { StoreMetaData storeMetaData("100", "appid", "test_store"); + storeMetaData.dataDir = "testDir"; StoreMetaData storeMeta; std::string secretkey = storeMetaData.GetSecretKey(); - EXPECT_EQ(secretkey, "SecretKey###100###default######test_store###0###SINGLE_KEY"); + EXPECT_EQ(secretkey, "SecretKey###100###default######test_store###0###testDir###SINGLE_KEY"); std::string backupsecretkey = storeMetaData.GetBackupSecretKey(); EXPECT_EQ(backupsecretkey, "BackupSecretKey###100###default######test_store###0###"); @@ -351,12 +354,13 @@ HWTEST_F(ServiceMetaDataTest, StoreMetaData004, TestSize.Level1) StoreMetaData storeMetaData("100", "appid", "test_store"); storeMetaData.version = TEST_CURRENT_VERSION; storeMetaData.instanceId = 1; + storeMetaData.dataDir = "testDir"; StoreMetaData storeMeta; std::string key = storeMetaData.GetKey(); - EXPECT_EQ(key, "KvStoreMetaData######100###default######test_store###1"); + EXPECT_EQ(key, "KvStoreMetaData######100###default######test_store###1###testDir"); std::string keylocal = storeMetaData.GetKeyLocal(); - EXPECT_EQ(keylocal, "KvStoreMetaDataLocal######100###default######test_store###1"); + EXPECT_EQ(keylocal, "KvStoreMetaDataLocal######100###default######test_store###1###testDir"); auto result = MetaDataManager::GetInstance().SaveMeta(key, storeMetaData, true); EXPECT_TRUE(result); @@ -368,14 +372,15 @@ HWTEST_F(ServiceMetaDataTest, StoreMetaData004, TestSize.Level1) result = MetaDataManager::GetInstance().DelMeta(key, true); EXPECT_TRUE(result); - result = MetaDataManager::GetInstance().SaveMeta(key, storeMetaData); + std::string syncKey = storeMetaData.GetKeyWithoutPath(); + result = MetaDataManager::GetInstance().SaveMeta(syncKey, storeMetaData); EXPECT_TRUE(result); - result = MetaDataManager::GetInstance().LoadMeta(key, storeMeta); + result = MetaDataManager::GetInstance().LoadMeta(syncKey, storeMeta); EXPECT_TRUE(result); EXPECT_EQ(storeMetaData.GetKey(), storeMeta.GetKey()); EXPECT_EQ(storeMetaData.GetKeyLocal(), storeMeta.GetKeyLocal()); - result = MetaDataManager::GetInstance().DelMeta(key); + result = MetaDataManager::GetInstance().DelMeta(syncKey); EXPECT_TRUE(result); } @@ -391,10 +396,11 @@ HWTEST_F(ServiceMetaDataTest, StoreMetaData005, TestSize.Level1) StoreMetaData storeMetaData("100", "appid", "test_store"); storeMetaData.version = TEST_CURRENT_VERSION; storeMetaData.instanceId = 1; + storeMetaData.dataDir = "testDir"; StoreMetaData storeMeta; std::string secretkey = storeMetaData.GetSecretKey(); - EXPECT_EQ(secretkey, "SecretKey###100###default######test_store###SINGLE_KEY"); + EXPECT_EQ(secretkey, "SecretKey###100###default######test_store###testDir###SINGLE_KEY"); std::string backupsecretkey = storeMetaData.GetBackupSecretKey(); EXPECT_EQ(backupsecretkey, "BackupSecretKey###100###default######test_store###"); std::string strategykey = storeMetaData.GetStrategyKey(); @@ -535,6 +541,44 @@ HWTEST_F(ServiceMetaDataTest, StoreMetaData007, TestSize.Level1) EXPECT_FALSE(storemetaData1 != storemetaData2); } +/** + * @tc.name: StoreMetaData + * @tc.desc: + * @tc.type: FUNC + * @tc.require: + * @tc.author: MY + */ +HWTEST_F(ServiceMetaDataTest, StoreMetaData008, TestSize.Level1) +{ + StoreMetaData storeMetaData("100", "appid", "test_store"); + storeMetaData.instanceId = 1; + storeMetaData.dataDir = "008_dataDir"; + storeMetaData.deviceId = "008_uuid"; + storeMetaData.bundleName = "008_bundleName"; + + std::string key = "KvStoreMetaDataLocal###008_uuid###100###default###008_bundleName###test_store###1"; + EXPECT_EQ(storeMetaData.GetKeyLocalWithoutPath(), key); +} + +/** + * @tc.name: StoreMetaData + * @tc.desc: + * @tc.type: FUNC + * @tc.require: + * @tc.author: MY + */ +HWTEST_F(ServiceMetaDataTest, StoreMetaData009, TestSize.Level1) +{ + StoreMetaData storeMetaData("100", "appid", "test_store"); + storeMetaData.instanceId = 1; + storeMetaData.dataDir = "009_dataDir"; + storeMetaData.deviceId = "009_uuid"; + storeMetaData.bundleName = "009_bundleName"; + + std::string key = "StoreDfxInfo###009_uuid###100###default###009_bundleName###test_store###1"; + EXPECT_EQ(storeMetaData.GetDfxInfoKeyWithoutPath(), key); +} + /** * @tc.name: GetStoreInfo * @tc.desc: test StoreMetaData GetStoreInfo function @@ -652,6 +696,7 @@ HWTEST_F(ServiceMetaDataTest, StrategyMeta002, TestSize.Level1) HWTEST_F(ServiceMetaDataTest, MetaData, TestSize.Level1) { StoreMetaData storeMetaData("100", "appid", "test_store"); + storeMetaData.dataDir = "testDir1"; SecretKeyMetaData secretKeyMetaData; MetaData metaData; MetaData metaDataLoad; @@ -814,18 +859,14 @@ HWTEST_F(ServiceMetaDataTest, DeviceMetaData, TestSize.Level1) { DeviceMetaData metaData; std::string newUuid = "newuuid"; - std::string oldUuid = "olduuid"; metaData.newUuid = newUuid; - metaData.oldUuid = oldUuid; Serializable::json node1; metaData.Marshal(node1); EXPECT_EQ(node1["newUuid"], newUuid); - EXPECT_EQ(node1["oldUuid"], oldUuid); DeviceMetaData newMetaData; newMetaData.Unmarshal(node1); EXPECT_EQ(newMetaData.newUuid, newUuid); - EXPECT_EQ(newMetaData.oldUuid, oldUuid); } /** @@ -843,6 +884,7 @@ HWTEST_F(ServiceMetaDataTest, InitTestMeta, TestSize.Level1) oldMeta.bundleName = "test_appid_001"; oldMeta.storeId = "test_storeid_001"; oldMeta.isEncrypt = true; + oldMeta.dataDir = "testDir2"; bool isSuccess = MetaDataManager::GetInstance().SaveMeta(oldMeta.GetKey(), oldMeta, true); EXPECT_TRUE(isSuccess); StoreMetaDataLocal metaDataLocal; @@ -860,7 +902,7 @@ HWTEST_F(ServiceMetaDataTest, InitTestMeta, TestSize.Level1) isSuccess = MetaDataManager::GetInstance().SaveMeta(MatrixMetaData::GetPrefix({"mockOldUuid"}), matrixMeta0, true); EXPECT_TRUE(isSuccess); - isSuccess = MetaDataManager::GetInstance().SaveMeta(oldMeta.GetKey(), oldMeta); + isSuccess = MetaDataManager::GetInstance().SaveMeta(oldMeta.GetKeyWithoutPath(), oldMeta); EXPECT_TRUE(isSuccess); MatrixMetaData matrixMeta; isSuccess = MetaDataManager::GetInstance().SaveMeta(MatrixMetaData::GetPrefix({"mockOldUuid"}), matrixMeta); @@ -893,11 +935,12 @@ HWTEST_F(ServiceMetaDataTest, UpdateStoreMetaData, TestSize.Level1) newMeta.user = "200"; newMeta.bundleName = "test_appid_001"; newMeta.storeId = "test_storeid_001"; + newMeta.dataDir = "testDir2"; KvStoreMetaManager::GetInstance().UpdateStoreMetaData(mockNewUuid, mockOldUuid); bool isSuccess = MetaDataManager::GetInstance().LoadMeta(newMeta.GetKey(), newMeta, true); EXPECT_TRUE(isSuccess); EXPECT_TRUE(newMeta.isNeedUpdateDeviceId); - isSuccess = MetaDataManager::GetInstance().LoadMeta(newMeta.GetKey(), newMeta); + isSuccess = MetaDataManager::GetInstance().LoadMeta(newMeta.GetKeyWithoutPath(), newMeta); EXPECT_TRUE(isSuccess); AutoLaunchMetaData autoLaunchMetaData; isSuccess = MetaDataManager::GetInstance().LoadMeta(AutoLaunchMetaData::GetPrefix({ newMeta.deviceId, newMeta.user, @@ -919,11 +962,6 @@ HWTEST_F(ServiceMetaDataTest, UpdateMetaDatas, TestSize.Level1) { std::string mockNewUuid = "mockNewUuid"; std::string mockOldUuid = "mockOldUuid"; - StoreMetaData newMeta; - newMeta.deviceId = "mockNewUuid"; - newMeta.user = "200"; - newMeta.bundleName = "test_appid_001"; - newMeta.storeId = "test_storeid_001"; KvStoreMetaManager::GetInstance().UpdateMetaDatas(mockNewUuid, mockOldUuid); MatrixMetaData matrixMeta; bool isSuccess = MetaDataManager::GetInstance().LoadMeta(MatrixMetaData::GetPrefix({ "mockNewUuid" }), @@ -958,6 +996,7 @@ HWTEST_F(ServiceMetaDataTest, DelTestMeta, TestSize.Level1) newMeta.user = "200"; newMeta.bundleName = "test_appid_001"; newMeta.storeId = "test_storeid_001"; + newMeta.dataDir = "testDir2"; bool isSuccess = MetaDataManager::GetInstance().DelMeta(newMeta.GetKey(), true); EXPECT_TRUE(isSuccess); isSuccess = MetaDataManager::GetInstance().DelMeta(newMeta.GetKeyLocal(), true); @@ -970,7 +1009,7 @@ HWTEST_F(ServiceMetaDataTest, DelTestMeta, TestSize.Level1) isSuccess = MetaDataManager::GetInstance().DelMeta(MatrixMetaData::GetPrefix({ "mockNewUuid" }), true); EXPECT_TRUE(isSuccess); - isSuccess = MetaDataManager::GetInstance().DelMeta(newMeta.GetKey()); + isSuccess = MetaDataManager::GetInstance().DelMeta(newMeta.GetKeyWithoutPath()); EXPECT_TRUE(isSuccess); isSuccess = MetaDataManager::GetInstance().DelMeta(MatrixMetaData::GetPrefix({"mockNewUuid"})); EXPECT_TRUE(isSuccess); diff --git a/services/distributeddataservice/framework/test/store_test.cpp b/services/distributeddataservice/framework/test/store_test.cpp index 24e8f5218..304b19bd2 100644 --- a/services/distributeddataservice/framework/test/store_test.cpp +++ b/services/distributeddataservice/framework/test/store_test.cpp @@ -30,8 +30,6 @@ using namespace testing::ext; using namespace OHOS::DistributedData; namespace OHOS::Test { -static constexpr const char *TEST_CLOUD_STORE = "test_cloud_store"; - class GeneralValueTest : public testing::Test { public: static void SetUpTestCase(void){}; @@ -278,10 +276,8 @@ HWTEST_F(AutoCacheTest, CloseStore001, TestSize.Level2) mock_->isLocked_ = true; StoreMetaData meta; meta.area = GeneralStore::EL1; - meta.dataDir = "abc"; + meta.dataDir = ""; uint32_t tokenId = 123; - std::string storeId = TEST_CLOUD_STORE; - std::string userId = ""; AutoCache autoCache; autoCache.stores_.Compute(tokenId, [this, &meta, &watchers, &store](auto &, std::map &stores) -> bool { @@ -290,7 +286,7 @@ HWTEST_F(AutoCacheTest, CloseStore001, TestSize.Level2) std::forward_as_tuple(store, watchers, 0, meta)); return !stores.empty(); }); - autoCache.CloseStore(tokenId, storeId, userId); + autoCache.CloseStore(tokenId, meta.dataDir); EXPECT_TRUE(autoCache.stores_.Empty()); } @@ -309,10 +305,8 @@ HWTEST_F(AutoCacheTest, CloseStore002, TestSize.Level2) mock_->isLocked_ = true; StoreMetaData meta; meta.area = GeneralStore::EL4; - meta.dataDir = "abc"; + meta.dataDir = ""; uint32_t tokenId = 123; - std::string storeId = TEST_CLOUD_STORE; - std::string userId = ""; AutoCache autoCache; autoCache.stores_.Compute(tokenId, [this, &meta, &watchers, &store](auto &, std::map &stores) -> bool { @@ -321,7 +315,7 @@ HWTEST_F(AutoCacheTest, CloseStore002, TestSize.Level2) std::forward_as_tuple(store, watchers, 0, meta)); return !stores.empty(); }); - autoCache.CloseStore(tokenId, storeId, userId); + autoCache.CloseStore(tokenId, meta.dataDir); EXPECT_FALSE(autoCache.stores_.Empty()); } } // namespace OHOS::Test \ No newline at end of file diff --git a/services/distributeddataservice/service/cloud/cloud_service_impl.cpp b/services/distributeddataservice/service/cloud/cloud_service_impl.cpp index f566532a7..4feebf0a3 100644 --- a/services/distributeddataservice/service/cloud/cloud_service_impl.cpp +++ b/services/distributeddataservice/service/cloud/cloud_service_impl.cpp @@ -23,6 +23,7 @@ #include "accesstoken_kit.h" #include "account/account_delegate.h" #include "checker/checker_manager.h" +#include "cloud/change_event.h" #include "cloud/cloud_last_sync_info.h" #include "cloud/cloud_mark.h" #include "cloud/cloud_server.h" @@ -40,6 +41,7 @@ #include "ipc_skeleton.h" #include "log_print.h" #include "metadata/meta_data_manager.h" +#include "metadata/store_meta_data.h" #include "network/network_delegate.h" #include "rdb_types.h" #include "relational_store_manager.h" @@ -48,6 +50,7 @@ #include "sync_manager.h" #include "sync_strategies/network_sync_strategy.h" #include "utils/anonymous.h" +#include "utils/constant.h" #include "values_bucket.h" #include "xcollie.h" @@ -274,6 +277,7 @@ void CloudServiceImpl::DoClean(int32_t user, const SchemaMeta &schemaMeta, int32 storeInfo.bundleName = meta.bundleName; storeInfo.user = atoi(meta.user.c_str()); storeInfo.storeName = meta.storeId; + storeInfo.path = meta.dataDir; if (action != GeneralStore::CLEAN_WATER) { EventCenter::GetInstance().PostEvent(std::make_unique(CloudEvent::CLEAN_DATA, storeInfo)); } @@ -291,20 +295,24 @@ void CloudServiceImpl::DoClean(int32_t user, const SchemaMeta &schemaMeta, int32 bool CloudServiceImpl::GetStoreMetaData(StoreMetaData &meta) { - if (!MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), meta, true)) { - if (meta.user == "0") { - ZLOGE("failed, no store meta bundleName:%{public}s, storeId:%{public}s, user = %{public}s", - meta.bundleName.c_str(), meta.GetStoreAlias().c_str(), meta.user.c_str()); - return false; - } - meta.user = "0"; - StoreMetaDataLocal localMeta; - if (!MetaDataManager::GetInstance().LoadMeta(meta.GetKeyLocal(), localMeta, true) || - !localMeta.isPublic || !MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), meta, true)) { - ZLOGE("meta empty, not public store. bundleName:%{public}s, storeId:%{public}s, user = %{public}s", - meta.bundleName.c_str(), meta.GetStoreAlias().c_str(), meta.user.c_str()); - return false; - } + StoreMetaMapping metaMapping(meta); + meta.dataDir = SyncManager::GetPath(meta); + if (!meta.dataDir.empty() && MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), meta, true)) { + return true; + } + meta.user = "0"; // check if it is a public store + meta.dataDir = SyncManager::GetPath(meta); + + if (meta.dataDir.empty() || !MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), meta, true)) { + ZLOGE("failed, no store meta. bundleName:%{public}s, storeId:%{public}s", meta.bundleName.c_str(), + meta.GetStoreAlias().c_str()); + return false; + } + StoreMetaDataLocal localMetaData; + if (!MetaDataManager::GetInstance().LoadMeta(meta.GetKeyLocal(), localMetaData, true) || !localMetaData.isPublic) { + ZLOGE("failed, no store LocalMeta. bundleName:%{public}s, storeId:%{public}s", meta.bundleName.c_str(), + meta.GetStoreAlias().c_str()); + return false; } return true; } @@ -490,21 +498,25 @@ std::map CloudServiceImpl::ExecuteStatistics(const { std::map result; for (auto &database : schemaMeta.databases) { - if (storeId.empty() || database.alias == storeId) { - StoreMetaData meta; - meta.bundleName = schemaMeta.bundleName; - meta.storeId = database.name; - meta.user = std::to_string(cloudInfo.user); - meta.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; - auto it = cloudInfo.apps.find(schemaMeta.bundleName); - if (it == cloudInfo.apps.end()) { - ZLOGE("bundleName:%{public}s is not exist", schemaMeta.bundleName.c_str()); - break; - } - meta.instanceId = it->second.instanceId; - MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), meta, true); - result.insert_or_assign(database.alias, QueryStatistics(meta, database)); + if (!storeId.empty() && database.alias != storeId) { + continue; + } + auto it = cloudInfo.apps.find(schemaMeta.bundleName); + if (it == cloudInfo.apps.end()) { + ZLOGE("bundleName:%{public}s is not exist", schemaMeta.bundleName.c_str()); + break; } + StoreMetaMapping meta; + meta.bundleName = schemaMeta.bundleName; + meta.storeId = database.name; + meta.user = std::to_string(cloudInfo.user); + meta.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; + meta.instanceId = it->second.instanceId; + MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), meta, true); + if (!meta.cloudPath.empty() && meta.cloudPath != meta.dataDir) { + MetaDataManager::GetInstance().LoadMeta(meta.GetCloudStoreMetaKey(), meta, true); + } + result.insert_or_assign(database.alias, QueryStatistics(meta, database)); } return result; } @@ -1205,9 +1217,15 @@ void CloudServiceImpl::DoSync(const Event &event) std::pair> CloudServiceImpl::PreShare( const StoreInfo &storeInfo, GenQuery &query) { - StoreMetaData meta(storeInfo); + StoreMetaMapping meta(storeInfo); meta.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; if (!MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), meta, true)) { + ZLOGE("failed, no store mapping bundleName:%{public}s, storeId:%{public}s", meta.bundleName.c_str(), + meta.GetStoreAlias().c_str()); + return { GeneralError::E_ERROR, nullptr }; + } + if (!meta.cloudPath.empty() && meta.dataDir != meta.cloudPath && + !MetaDataManager::GetInstance().LoadMeta(meta.GetCloudStoreMetaKey(), meta, true)) { ZLOGE("failed, no store meta bundleName:%{public}s, storeId:%{public}s", meta.bundleName.c_str(), meta.GetStoreAlias().c_str()); return { GeneralError::E_ERROR, nullptr }; diff --git a/services/distributeddataservice/service/cloud/sync_manager.cpp b/services/distributeddataservice/service/cloud/sync_manager.cpp index ca1bc5813..db4e6099c 100644 --- a/services/distributeddataservice/service/cloud/sync_manager.cpp +++ b/services/distributeddataservice/service/cloud/sync_manager.cpp @@ -176,13 +176,19 @@ std::function SyncManager::GetLockChangeHandler() return; } - StoreMetaData meta(storeInfo); + StoreMetaMapping meta(storeInfo); meta.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; if (!MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), meta, true)) { - ZLOGE("not found meta. bundleName: %{public}s, storeName: %{public}s, user: %{public}d.", + ZLOGE("no store mapping. bundleName: %{public}s, storeName: %{public}s, user: %{public}d.", storeInfo.bundleName.c_str(), Anonymous::Change(storeInfo.storeName).c_str(), storeInfo.user); return; } + if (!meta.cloudPath.empty() && meta.dataDir != meta.cloudPath && + !MetaDataManager::GetInstance().LoadMeta(meta.GetCloudStoreMetaKey(), meta, true)) { + ZLOGE("failed, no store meta. bundleName:%{public}s, storeId:%{public}s", meta.bundleName.c_str(), + meta.GetStoreAlias().c_str()); + return; + } auto [status, store] = GetStore(meta, storeInfo.user); if (store == nullptr) { ZLOGE("failed to get store. bundleName: %{public}s, storeName: %{public}s, user: %{public}d.", @@ -957,19 +963,36 @@ void SyncManager::BatchReport(int32_t userId, const TraceIds &traceIds, SyncStag } } +std::string SyncManager::GetPath(const StoreMetaData &meta) +{ + if (!meta.dataDir.empty()) { + return meta.dataDir; + } + StoreMetaMapping mapping(meta); + MetaDataManager::GetInstance().LoadMeta(mapping.GetKey(), mapping, true); + return mapping.cloudPath.empty() ? mapping.dataDir : mapping.cloudPath; +} + std::pair SyncManager::GetMetaData(const StoreInfo &storeInfo) { StoreMetaData meta(storeInfo); meta.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; - if (!MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), meta, true)) { - meta.user = "0"; // check if it is a public store. - StoreMetaDataLocal localMetaData; - if (!MetaDataManager::GetInstance().LoadMeta(meta.GetKeyLocal(), localMetaData, true) || - !localMetaData.isPublic || !MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), meta, true)) { - ZLOGE("failed, no store meta. bundleName:%{public}s, storeId:%{public}s", meta.bundleName.c_str(), - meta.GetStoreAlias().c_str()); - return { false, meta }; - } + meta.dataDir = GetPath(meta); + if (!meta.dataDir.empty() && MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), meta, true)) { + return { true, meta }; + } + meta.user = "0"; // check if it is a public store. + meta.dataDir = GetPath(meta); + if (meta.dataDir.empty() || !MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), meta, true)) { + ZLOGE("failed, no store meta. bundleName:%{public}s, storeId:%{public}s", meta.bundleName.c_str(), + meta.GetStoreAlias().c_str()); + return { false, meta }; + } + StoreMetaDataLocal localMetaData; + if (!MetaDataManager::GetInstance().LoadMeta(meta.GetKeyLocal(), localMetaData, true) || !localMetaData.isPublic) { + ZLOGE("failed, no store LocalMeta. bundleName:%{public}s, storeId:%{public}s", meta.bundleName.c_str(), + meta.GetStoreAlias().c_str()); + return { false, meta }; } return { true, meta }; } diff --git a/services/distributeddataservice/service/cloud/sync_manager.h b/services/distributeddataservice/service/cloud/sync_manager.h index 9e4e13cea..ad1d9bb30 100644 --- a/services/distributeddataservice/service/cloud/sync_manager.h +++ b/services/distributeddataservice/service/cloud/sync_manager.h @@ -103,6 +103,7 @@ public: const std::vector &queryKeys); void OnScreenUnlocked(int32_t user); void CleanCompensateSync(int32_t userId); + static std::string GetPath(const StoreMetaData &meta); private: using Event = DistributedData::Event; diff --git a/services/distributeddataservice/service/data_share/data_share_db_config.cpp b/services/distributeddataservice/service/data_share/data_share_db_config.cpp index 544f887ff..fb72f0c29 100644 --- a/services/distributeddataservice/service/data_share/data_share_db_config.cpp +++ b/services/distributeddataservice/service/data_share/data_share_db_config.cpp @@ -25,6 +25,7 @@ #include "extension_connect_adaptor.h" #include "log_print.h" #include "metadata/meta_data_manager.h" +#include "metadata/store_meta_data.h" #include "uri_utils.h" #include "utils/anonymous.h" #include "ipc_skeleton.h" @@ -34,17 +35,18 @@ std::pair DataShareDbConfig::QueryMetaData const std::string &bundleName, const std::string &storeName, int32_t userId, int32_t appIndex) { TimeoutReport timeoutReport({bundleName, "", storeName, __FUNCTION__, 0}); - DistributedData::StoreMetaData meta; - meta.deviceId = DistributedData::DeviceManagerAdapter::GetInstance().GetLocalDevice().uuid; - meta.user = std::to_string(userId); - meta.bundleName = bundleName; - meta.storeId = storeName; - meta.instanceId = appIndex; - DistributedData::StoreMetaData metaData; - bool isCreated = DistributedData::MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), metaData, true); + DistributedData::StoreMetaMapping storeMetaMapping; + storeMetaMapping.deviceId = DistributedData::DeviceManagerAdapter::GetInstance().GetLocalDevice().uuid; + storeMetaMapping.user = std::to_string(userId); + storeMetaMapping.bundleName = bundleName; + storeMetaMapping.storeId = storeName; + storeMetaMapping.instanceId = appIndex; + bool isCreated = + DistributedData::MetaDataManager::GetInstance().LoadMeta(storeMetaMapping.GetKey(), storeMetaMapping, true); + auto callingPid = IPCSkeleton::GetCallingPid(); timeoutReport.Report(std::to_string(userId), callingPid, appIndex); - return std::make_pair(isCreated, metaData); + return std::make_pair(isCreated, storeMetaMapping); } std::pair DataShareDbConfig::GetMetaData(const DbConfig &dbConfig) diff --git a/services/distributeddataservice/service/data_share/strategies/general/load_config_data_info_strategy.cpp b/services/distributeddataservice/service/data_share/strategies/general/load_config_data_info_strategy.cpp index 095a04bdb..978a67165 100644 --- a/services/distributeddataservice/service/data_share/strategies/general/load_config_data_info_strategy.cpp +++ b/services/distributeddataservice/service/data_share/strategies/general/load_config_data_info_strategy.cpp @@ -33,12 +33,14 @@ LoadConfigDataInfoStrategy::LoadConfigDataInfoStrategy() static bool QueryMetaData(const std::string &bundleName, const std::string &storeName, DistributedData::StoreMetaData &metaData, const int32_t userId, const int32_t appIndex) { - DistributedData::StoreMetaData meta; - meta.deviceId = DistributedData::DeviceManagerAdapter::GetInstance().GetLocalDevice().uuid; - meta.user = std::to_string(userId); - meta.bundleName = bundleName; - meta.storeId = storeName; - bool isCreated = DistributedData::MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), metaData, true); + DistributedData::StoreMetaMapping storeMetaMapping; + storeMetaMapping.deviceId = DistributedData::DeviceManagerAdapter::GetInstance().GetLocalDevice().uuid; + storeMetaMapping.user = std::to_string(userId); + storeMetaMapping.bundleName = bundleName; + storeMetaMapping.storeId = storeName; + bool isCreated = DistributedData::MetaDataManager::GetInstance().LoadMeta( + storeMetaMapping.GetKey(), storeMetaMapping, true); + metaData = storeMetaMapping; if (!isCreated) { ZLOGE("DB not exist"); return false; diff --git a/services/distributeddataservice/service/kvdb/kvdb_service_impl.cpp b/services/distributeddataservice/service/kvdb/kvdb_service_impl.cpp index dca251452..d72ce1b21 100644 --- a/services/distributeddataservice/service/kvdb/kvdb_service_impl.cpp +++ b/services/distributeddataservice/service/kvdb/kvdb_service_impl.cpp @@ -40,6 +40,7 @@ #include "matrix_event.h" #include "metadata/appid_meta_data.h" #include "metadata/capability_meta_data.h" +#include "metadata/store_meta_data.h" #include "metadata/switches_meta_data.h" #include "permit_delegate.h" #include "query_helper.h" @@ -101,7 +102,7 @@ void KVDBServiceImpl::Init() auto process = [this](const Event &event) { const auto &evt = static_cast(event); const auto &storeInfo = evt.GetStoreInfo(); - StoreMetaData meta(storeInfo); + StoreMetaMapping meta(storeInfo); meta.deviceId = DMAdapter::GetInstance().GetLocalDevice().uuid; if (!MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), meta, true)) { if (meta.user == "0") { @@ -180,7 +181,7 @@ Status KVDBServiceImpl::GetStoreIds(const AppId &appId, int32_t subUser, std::ve Status KVDBServiceImpl::Delete(const AppId &appId, const StoreId &storeId, int32_t subUser) { - StoreMetaData metaData = GetStoreMetaData(appId, storeId, subUser); + StoreMetaData metaData = LoadStoreMetaData(appId, storeId, subUser); if (metaData.instanceId < 0) { return ILLEGAL_STATE; } @@ -193,7 +194,9 @@ Status KVDBServiceImpl::Delete(const AppId &appId, const StoreId &storeId, int32 syncAgent.delayTimes_.erase(storeId); return true; }); - MetaDataManager::GetInstance().DelMeta(metaData.GetKey()); + StoreMetaMapping storeMetaMapping(metaData); + MetaDataManager::GetInstance().DelMeta(storeMetaMapping.GetKey(), true); + MetaDataManager::GetInstance().DelMeta(metaData.GetKeyWithoutPath()); MetaDataManager::GetInstance().DelMeta(metaData.GetKey(), true); MetaDataManager::GetInstance().DelMeta(metaData.GetKeyLocal(), true); MetaDataManager::GetInstance().DelMeta(metaData.GetSecretKey(), true); @@ -202,8 +205,8 @@ Status KVDBServiceImpl::Delete(const AppId &appId, const StoreId &storeId, int32 MetaDataManager::GetInstance().DelMeta(metaData.GetAutoLaunchKey(), true); MetaDataManager::GetInstance().DelMeta(metaData.GetDebugInfoKey(), true); MetaDataManager::GetInstance().DelMeta(metaData.GetCloneSecretKey(), true); - PermitDelegate::GetInstance().DelCache(metaData.GetKey()); - AutoCache::GetInstance().CloseStore(metaData.tokenId, storeId, metaData.user); + PermitDelegate::GetInstance().DelCache(metaData.GetKeyWithoutPath()); + AutoCache::GetInstance().CloseStore(metaData.tokenId, metaData.dataDir); ZLOGD("appId:%{public}s storeId:%{public}s instanceId:%{public}d", appId.appId.c_str(), Anonymous::Change(storeId.storeId).c_str(), metaData.instanceId); return SUCCESS; @@ -211,11 +214,11 @@ Status KVDBServiceImpl::Delete(const AppId &appId, const StoreId &storeId, int32 Status KVDBServiceImpl::Close(const AppId &appId, const StoreId &storeId, int32_t subUser) { - StoreMetaData metaData = GetStoreMetaData(appId, storeId, subUser); + StoreMetaData metaData = LoadStoreMetaData(appId, storeId, subUser); if (metaData.instanceId < 0) { return ILLEGAL_STATE; } - AutoCache::GetInstance().CloseStore(metaData.tokenId, storeId, metaData.user); + AutoCache::GetInstance().CloseStore(metaData.tokenId, metaData.dataDir); ZLOGD("appId:%{public}s storeId:%{public}s instanceId:%{public}d", appId.appId.c_str(), Anonymous::Change(storeId.storeId).c_str(), metaData.instanceId); return SUCCESS; @@ -223,7 +226,7 @@ Status KVDBServiceImpl::Close(const AppId &appId, const StoreId &storeId, int32_ Status KVDBServiceImpl::CloudSync(const AppId &appId, const StoreId &storeId, const SyncInfo &syncInfo) { - StoreMetaData metaData = GetStoreMetaData(appId, storeId); + StoreMetaMapping metaData = GetStoreMetaData(appId, storeId); if (!MetaDataManager::GetInstance().LoadMeta(metaData.GetKey(), metaData, true)) { ZLOGE("invalid, appId:%{public}s storeId:%{public}s", appId.appId.c_str(), Anonymous::Change(storeId.storeId).c_str()); @@ -244,7 +247,7 @@ void KVDBServiceImpl::OnAsyncComplete(uint32_t tokenId, uint64_t seqNum, Progres Status KVDBServiceImpl::Sync(const AppId &appId, const StoreId &storeId, int32_t subUser, SyncInfo &syncInfo) { StoreMetaData metaData = GetStoreMetaData(appId, storeId, subUser); - MetaDataManager::GetInstance().LoadMeta(metaData.GetKey(), metaData); + MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData); auto delay = GetSyncDelayTime(syncInfo.delay, storeId, metaData.user); if (metaData.isAutoSync && syncInfo.seqId == std::numeric_limits::max()) { DeviceMatrix::GetInstance().OnChanged(metaData); @@ -269,7 +272,7 @@ Status KVDBServiceImpl::Sync(const AppId &appId, const StoreId &storeId, int32_t Status KVDBServiceImpl::NotifyDataChange(const AppId &appId, const StoreId &storeId, uint64_t delay) { StoreMetaData meta = GetStoreMetaData(appId, storeId); - if (!MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), meta)) { + if (!MetaDataManager::GetInstance().LoadMeta(meta.GetKeyWithoutPath(), meta)) { ZLOGE("invalid, appId:%{public}s storeId:%{public}s", appId.appId.c_str(), Anonymous::Change(storeId.storeId).c_str()); return Status::INVALID_ARGUMENT; @@ -527,7 +530,7 @@ Status KVDBServiceImpl::AddSubscribeInfo(const AppId &appId, const StoreId &stor const SyncInfo &syncInfo) { StoreMetaData metaData = GetStoreMetaData(appId, storeId, subUser); - MetaDataManager::GetInstance().LoadMeta(metaData.GetKey(), metaData); + MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData); auto delay = GetSyncDelayTime(syncInfo.delay, storeId, metaData.user); return KvStoreSyncManager::GetInstance()->AddSyncOperation(uintptr_t(metaData.tokenId), delay, std::bind(&KVDBServiceImpl::DoSyncInOrder, this, metaData, syncInfo, std::placeholders::_1, ACTION_SUBSCRIBE), @@ -538,7 +541,7 @@ Status KVDBServiceImpl::RmvSubscribeInfo(const AppId &appId, const StoreId &stor const SyncInfo &syncInfo) { StoreMetaData metaData = GetStoreMetaData(appId, storeId, subUser); - MetaDataManager::GetInstance().LoadMeta(metaData.GetKey(), metaData); + MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData); auto delay = GetSyncDelayTime(syncInfo.delay, storeId, metaData.user); return KvStoreSyncManager::GetInstance()->AddSyncOperation(uintptr_t(metaData.tokenId), delay, std::bind( @@ -552,7 +555,7 @@ Status KVDBServiceImpl::Subscribe(const AppId &appId, const StoreId &storeId, in if (observer == nullptr) { return INVALID_ARGUMENT; } - StoreMetaData metaData = GetStoreMetaData(appId, storeId, subUser); + StoreMetaData metaData = LoadStoreMetaData(appId, storeId, subUser); ZLOGI("appId:%{public}s storeId:%{public}s tokenId:0x%{public}x", appId.appId.c_str(), Anonymous::Change(storeId.storeId).c_str(), metaData.tokenId); bool isCreate = false; @@ -568,8 +571,8 @@ Status KVDBServiceImpl::Subscribe(const AppId &appId, const StoreId &storeId, in return true; }); if (isCreate) { - AutoCache::GetInstance().SetObserver(metaData.tokenId, storeId, - GetWatchers(metaData.tokenId, storeId, metaData.user), metaData.user); + AutoCache::GetInstance().SetObserver(metaData.tokenId, + GetWatchers(metaData.tokenId, storeId, metaData.user), metaData.dataDir); } return SUCCESS; } @@ -577,7 +580,7 @@ Status KVDBServiceImpl::Subscribe(const AppId &appId, const StoreId &storeId, in Status KVDBServiceImpl::Unsubscribe(const AppId &appId, const StoreId &storeId, int32_t subUser, sptr observer) { - StoreMetaData metaData = GetStoreMetaData(appId, storeId, subUser); + StoreMetaData metaData = LoadStoreMetaData(appId, storeId, subUser); ZLOGI("appId:%{public}s storeId:%{public}s tokenId:0x%{public}x", appId.appId.c_str(), Anonymous::Change(storeId.storeId).c_str(), metaData.tokenId); bool destroyed = false; @@ -600,8 +603,8 @@ Status KVDBServiceImpl::Unsubscribe(const AppId &appId, const StoreId &storeId, return true; }); if (destroyed) { - AutoCache::GetInstance().SetObserver(metaData.tokenId, storeId, - GetWatchers(metaData.tokenId, storeId, metaData.user), metaData.user); + AutoCache::GetInstance().SetObserver(metaData.tokenId, + GetWatchers(metaData.tokenId, storeId, metaData.user), metaData.dataDir); } return SUCCESS; } @@ -645,6 +648,9 @@ Status KVDBServiceImpl::GetBackupPassword(const AppId &appId, const StoreId &sto Status KVDBServiceImpl::SetConfig(const AppId &appId, const StoreId &storeId, const StoreConfig &storeConfig) { StoreMetaData meta = GetStoreMetaData(appId, storeId); + StoreMetaMapping storeMetaMapping(meta); + MetaDataManager::GetInstance().LoadMeta(storeMetaMapping.GetKey(), storeMetaMapping, true); + meta.dataDir = storeMetaMapping.dataDir; auto isCreated = MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), meta, true); if (!isCreated) { return SUCCESS; @@ -654,15 +660,19 @@ Status KVDBServiceImpl::SetConfig(const AppId &appId, const StoreId &storeId, co if (!MetaDataManager::GetInstance().SaveMeta(meta.GetKey(), meta, true)) { return Status::ERROR; } + storeMetaMapping = meta; + if (!MetaDataManager::GetInstance().SaveMeta(storeMetaMapping.GetKey(), storeMetaMapping, true)) { + return Status::ERROR; + } StoreMetaData syncMeta; - if (MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), syncMeta)) { + if (MetaDataManager::GetInstance().LoadMeta(meta.GetKeyWithoutPath(), syncMeta)) { syncMeta.enableCloud = storeConfig.cloudConfig.enableCloud; syncMeta.cloudAutoSync = storeConfig.cloudConfig.autoSync; - if (!MetaDataManager::GetInstance().SaveMeta(syncMeta.GetKey(), syncMeta)) { + if (!MetaDataManager::GetInstance().SaveMeta(syncMeta.GetKeyWithoutPath(), syncMeta)) { return Status::ERROR; } } - auto stores = AutoCache::GetInstance().GetStoresIfPresent(meta.tokenId, storeId, meta.user); + auto stores = AutoCache::GetInstance().GetStoresIfPresent(meta.tokenId, meta.dataDir); for (auto store : stores) { store->SetConfig({ storeConfig.cloudConfig.enableCloud }); } @@ -678,8 +688,8 @@ Status KVDBServiceImpl::BeforeCreate(const AppId &appId, const StoreId &storeId, StoreMetaData meta = GetStoreMetaData(appId, storeId, options.subUser); AddOptions(options, meta); - StoreMetaData old; - auto isCreated = MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), old, true); + StoreMetaMapping old(meta); + auto isCreated = MetaDataManager::GetInstance().LoadMeta(old.GetKey(), old, true); if (!isCreated) { return SUCCESS; } @@ -729,8 +739,8 @@ Status KVDBServiceImpl::AfterCreate( StoreMetaData metaData = GetStoreMetaData(appId, storeId, options.subUser); AddOptions(options, metaData); - StoreMetaData oldMeta; - auto isCreated = MetaDataManager::GetInstance().LoadMeta(metaData.GetKey(), oldMeta, true); + StoreMetaMapping oldMeta(metaData); + auto isCreated = MetaDataManager::GetInstance().LoadMeta(oldMeta.GetKey(), oldMeta, true); Status status = SUCCESS; if (isCreated && oldMeta != metaData) { auto dbStatus = Upgrade::GetInstance().UpdateStore(oldMeta, metaData, password); @@ -746,9 +756,11 @@ Status KVDBServiceImpl::AfterCreate( if (!isCreated || oldMeta != metaData) { if (!CheckerManager::GetInstance().IsDistrust(Converter::ConvertToStoreInfo(metaData))) { - MetaDataManager::GetInstance().SaveMeta(metaData.GetKey(), metaData); + MetaDataManager::GetInstance().SaveMeta(metaData.GetKeyWithoutPath(), metaData); } MetaDataManager::GetInstance().SaveMeta(metaData.GetKey(), metaData, true); + oldMeta = metaData; + MetaDataManager::GetInstance().SaveMeta(oldMeta.GetKey(), oldMeta, true); } AppIDMetaData appIdMeta; appIdMeta.bundleName = metaData.bundleName; @@ -918,6 +930,14 @@ void KVDBServiceImpl::SaveLocalMetaData(const Options &options, const StoreMetaD MetaDataManager::GetInstance().SaveMeta(metaData.GetKeyLocal(), localMetaData, true); } +StoreMetaData KVDBServiceImpl::LoadStoreMetaData(const AppId &appId, const StoreId &storeId, int32_t subUser) +{ + StoreMetaData metaData = GetStoreMetaData(appId, storeId, subUser); + StoreMetaMapping storeMetaMapping(metaData); + MetaDataManager::GetInstance().LoadMeta(storeMetaMapping.GetKey(), storeMetaMapping, true); + return storeMetaMapping; +} + StoreMetaData KVDBServiceImpl::GetStoreMetaData(const AppId &appId, const StoreId &storeId, int32_t subUser) { StoreMetaData metaData; @@ -1004,6 +1024,7 @@ Status KVDBServiceImpl::DoCloudSync(const StoreMetaData &meta, const SyncInfo &s storeInfo.user = atoi(meta.user.c_str()); storeInfo.tokenId = meta.tokenId; storeInfo.storeName = meta.storeId; + storeInfo.path = meta.dataDir; GenAsync syncCallback = [tokenId = storeInfo.tokenId, seqId = syncInfo.seqId, this](const GenDetails &details) { OnAsyncComplete(tokenId, seqId, HandleGenDetails(details)); }; @@ -1082,7 +1103,7 @@ bool KVDBServiceImpl::IsNeedMetaSync(const StoreMetaData &meta, const std::vecto if ((!MetaDataManager::GetInstance().LoadMeta(std::string(capKey.begin(), capKey.end()), capMeta) && !(devInfo.osType != OH_OS_TYPE && devInfo.deviceType == static_cast(DistributedHardware::DmDeviceType::DEVICE_TYPE_CAR))) || - !MetaDataManager::GetInstance().LoadMeta(metaData.GetKey(), metaData)) { + !MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData)) { isAfterMeta = true; break; } @@ -1107,7 +1128,7 @@ StoreMetaData KVDBServiceImpl::GetDistributedDataMeta(const std::string &deviceI meta.bundleName = Bootstrap::GetInstance().GetProcessLabel(); meta.storeId = Bootstrap::GetInstance().GetMetaDBName(); meta.user = DEFAULT_USER_ID; - if (!MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), meta)) { + if (!MetaDataManager::GetInstance().LoadMeta(meta.GetKeyWithoutPath(), meta)) { ZLOGE("Load meta fail, device: %{public}s", Anonymous::Change(deviceId).c_str()); } return meta; @@ -1489,7 +1510,7 @@ Status KVDBServiceImpl::RemoveDeviceData(const AppId &appId, const StoreId &stor const std::string &device) { StoreMetaData metaData = GetStoreMetaData(appId, storeId, subUser); - MetaDataManager::GetInstance().LoadMeta(metaData.GetKey(), metaData); + MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData); auto watcher = GetWatchers(metaData.tokenId, metaData.storeId, metaData.user); auto store = AutoCache::GetInstance().GetStore(metaData, watcher); if (store == nullptr) { diff --git a/services/distributeddataservice/service/kvdb/kvdb_service_impl.h b/services/distributeddataservice/service/kvdb/kvdb_service_impl.h index 4604f8b56..ed9b29933 100644 --- a/services/distributeddataservice/service/kvdb/kvdb_service_impl.h +++ b/services/distributeddataservice/service/kvdb/kvdb_service_impl.h @@ -123,6 +123,7 @@ private: void Init(); void AddOptions(const Options &options, StoreMetaData &metaData); StoreMetaData GetStoreMetaData(const AppId &appId, const StoreId &storeId, int32_t subUser = 0); + StoreMetaData LoadStoreMetaData(const AppId &appId, const StoreId &storeId, int32_t subUser = 0); StoreMetaData GetDistributedDataMeta(const std::string &deviceId); StrategyMeta GetStrategyMeta(const AppId &appId, const StoreId &storeId, int32_t subUser = 0); int32_t GetInstIndex(uint32_t tokenId, const AppId &appId); diff --git a/services/distributeddataservice/service/object/src/object_asset_machine.cpp b/services/distributeddataservice/service/object/src/object_asset_machine.cpp index 4bb56de3d..2401303a4 100644 --- a/services/distributeddataservice/service/object/src/object_asset_machine.cpp +++ b/services/distributeddataservice/service/object/src/object_asset_machine.cpp @@ -296,7 +296,7 @@ static AutoCache::Store GetStore(const ChangedAssetInfo& changedAsset) meta.user = std::to_string(changedAsset.storeInfo.user); meta.instanceId = changedAsset.storeInfo.instanceId; meta.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; - if (!MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), meta)) { + if (!MetaDataManager::GetInstance().LoadMeta(meta.GetKeyWithoutPath(), meta)) { ZLOGE("meta empty, bundleName:%{public}s, storeId:%{public}s", meta.bundleName.c_str(), meta.GetStoreAlias().c_str()); return nullptr; diff --git a/services/distributeddataservice/service/object/src/object_service_impl.cpp b/services/distributeddataservice/service/object/src/object_service_impl.cpp index 5df3363c7..9927bcd5e 100644 --- a/services/distributeddataservice/service/object/src/object_service_impl.cpp +++ b/services/distributeddataservice/service/object/src/object_service_impl.cpp @@ -170,7 +170,7 @@ int32_t ObjectServiceImpl::SaveMetaData(StoreMetaData &saveMeta, const std::stri saveMeta.storeType = ObjectDistributedType::OBJECT_SINGLE_VERSION; saveMeta.dataType = DistributedKv::DataType::TYPE_DYNAMICAL; saveMeta.dataDir = DistributedData::DirectoryManager::GetInstance().GetStorePath(saveMeta); - bool isSaved = DistributedData::MetaDataManager::GetInstance().SaveMeta(saveMeta.GetKey(), saveMeta) && + bool isSaved = DistributedData::MetaDataManager::GetInstance().SaveMeta(saveMeta.GetKeyWithoutPath(), saveMeta) && DistributedData::MetaDataManager::GetInstance().SaveMeta(saveMeta.GetKey(), saveMeta, true); if (!isSaved) { ZLOGE("SaveMeta failed"); @@ -352,7 +352,7 @@ ObjectServiceImpl::ObjectServiceImpl() meta.bundleName = eventInfo.bundleName; meta.user = std::to_string(eventInfo.user); meta.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; - if (!MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), meta)) { + if (!MetaDataManager::GetInstance().LoadMeta(meta.GetKeyWithoutPath(), meta)) { ZLOGE("meta empty, bundleName:%{public}s, storeId:%{public}s", meta.bundleName.c_str(), meta.GetStoreAlias().c_str()); return; diff --git a/services/distributeddataservice/service/permission/src/permit_delegate.cpp b/services/distributeddataservice/service/permission/src/permit_delegate.cpp index d3d020871..dd5b3c2cd 100644 --- a/services/distributeddataservice/service/permission/src/permit_delegate.cpp +++ b/services/distributeddataservice/service/permission/src/permit_delegate.cpp @@ -102,13 +102,13 @@ bool PermitDelegate::VerifyPermission(const CheckParam ¶m, uint8_t flag) } return !value.empty(); }); - auto key = data.GetKey(); + auto key = data.GetKeyWithoutPath(); if (!metaDataBucket_.Get(key, data)) { if (!MetaDataManager::GetInstance().LoadMeta(key, data)) { - ZLOGE("load meta failed."); + ZLOGE("load meta failed, %{public}s", Anonymous::Change(data.storeId).c_str()); return false; } - metaDataBucket_.Set(data.GetKey(), data); + metaDataBucket_.Set(data.GetKeyWithoutPath(), data); } if (data.appType.compare("default") == 0) { ZLOGD("default, sync permission success."); diff --git a/services/distributeddataservice/service/rdb/rdb_general_store.cpp b/services/distributeddataservice/service/rdb/rdb_general_store.cpp index ba0299bdd..f239b0cfd 100644 --- a/services/distributeddataservice/service/rdb/rdb_general_store.cpp +++ b/services/distributeddataservice/service/rdb/rdb_general_store.cpp @@ -142,6 +142,7 @@ void RdbGeneralStore::InitStoreInfo(const StoreMetaData &meta) storeInfo_.instanceId = meta.instanceId; storeInfo_.user = std::atoi(meta.user.c_str()); storeInfo_.deviceId = DeviceManagerAdapter::GetInstance().GetLocalDevice().uuid; + storeInfo_.path = meta.dataDir; } RelationalStoreDelegate::Option GetOption(const StoreMetaData &meta) diff --git a/services/distributeddataservice/service/rdb/rdb_service_impl.cpp b/services/distributeddataservice/service/rdb/rdb_service_impl.cpp index 5ac01b1e6..86b9a306b 100644 --- a/services/distributeddataservice/service/rdb/rdb_service_impl.cpp +++ b/services/distributeddataservice/service/rdb/rdb_service_impl.cpp @@ -18,6 +18,7 @@ #include "abs_rdb_predicates.h" #include "accesstoken_kit.h" #include "account/account_delegate.h" +#include "bootstrap.h" #include "changeevent/remote_change_event.h" #include "checker/checker_manager.h" #include "cloud/change_event.h" @@ -40,11 +41,13 @@ #include "metadata/store_debug_info.h" #include "metadata/store_meta_data.h" #include "metadata/store_meta_data_local.h" +#include "permit_delegate.h" #include "rdb_general_store.h" +#include "rdb_hiview_adapter.h" #include "rdb_notifier_proxy.h" #include "rdb_query.h" -#include "rdb_schema_config.h" #include "rdb_result_set_impl.h" +#include "rdb_schema_config.h" #include "rdb_watcher.h" #include "store/general_store.h" #include "tokenid_kit.h" @@ -53,9 +56,7 @@ #include "utils/constant.h" #include "utils/converter.h" #include "xcollie.h" -#include "permit_delegate.h" -#include "bootstrap.h" -#include "rdb_hiview_adapter.h" +using OHOS::DistributedData::AccountDelegate; using OHOS::DistributedData::Anonymous; using OHOS::DistributedData::CheckerManager; using OHOS::DistributedData::MetaDataManager; @@ -106,49 +107,7 @@ RdbServiceImpl::RdbServiceImpl() [this](const std::string& identifier, DistributedDB::AutoLaunchParam ¶m) { return ResolveAutoLaunch(identifier, param); }); - auto process = [this](const Event &event) { - auto &evt = static_cast(event); - auto &storeInfo = evt.GetStoreInfo(); - StoreMetaData meta(storeInfo); - meta.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; - if (!MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), meta, true)) { - ZLOGE("meta empty, bundleName:%{public}s, storeId:%{public}s", meta.bundleName.c_str(), - meta.GetStoreAlias().c_str()); - return; - } - if (meta.storeType < StoreMetaData::STORE_RELATIONAL_BEGIN || - meta.storeType > StoreMetaData::STORE_RELATIONAL_END) { - return; - } - auto watchers = GetWatchers(meta.tokenId, meta.storeId); - auto store = AutoCache::GetInstance().GetStore(meta, watchers); - if (store == nullptr) { - ZLOGE("store null, storeId:%{public}s", meta.GetStoreAlias().c_str()); - return; - } - store->RegisterDetailProgressObserver(GetCallbacks(meta.tokenId, storeInfo.storeName)); - }; - EventCenter::GetInstance().Subscribe(CloudEvent::CLOUD_SYNC, process); - EventCenter::GetInstance().Subscribe(CloudEvent::CLEAN_DATA, process); - - EventCenter::GetInstance().Subscribe(CloudEvent::MAKE_QUERY, [](const Event& event) { - auto& evt = static_cast(event); - auto callback = evt.GetCallback(); - if (!callback) { - return; - } - auto predicate = evt.GetPredicates(); - auto rdbQuery = std::make_shared(); - rdbQuery->MakeQuery(*predicate); - rdbQuery->SetColumns(evt.GetColumns()); - callback(rdbQuery); - }); - auto compensateSyncProcess = [this] (const Event &event) { - auto &evt = static_cast(event); - DoCompensateSync(evt); - }; - EventCenter::GetInstance().Subscribe(BindEvent::COMPENSATE_SYNC, compensateSyncProcess); - EventCenter::GetInstance().Subscribe(BindEvent::RECOVER_SYNC, compensateSyncProcess); + RegisterEvent(); } int32_t RdbServiceImpl::ResolveAutoLaunch(const std::string &identifier, DistributedDB::AutoLaunchParam ¶m) @@ -326,13 +285,13 @@ std::shared_ptr RdbServiceImpl::GetStore(const Rd void RdbServiceImpl::UpdateMeta(const StoreMetaData &meta, const StoreMetaData &localMeta, AutoCache::Store store) { StoreMetaData syncMeta; - bool isCreatedSync = MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), syncMeta); + bool isCreatedSync = MetaDataManager::GetInstance().LoadMeta(meta.GetKeyWithoutPath(), syncMeta); if (!isCreatedSync || localMeta != syncMeta) { ZLOGI("save sync meta. bundle:%{public}s store:%{public}s type:%{public}d->%{public}d " "encrypt:%{public}d->%{public}d , area:%{public}d->%{public}d", meta.bundleName.c_str(), meta.GetStoreAlias().c_str(), syncMeta.storeType, meta.storeType, syncMeta.isEncrypt, meta.isEncrypt, syncMeta.area, meta.area); - MetaDataManager::GetInstance().SaveMeta(meta.GetKey(), localMeta); + MetaDataManager::GetInstance().SaveMeta(meta.GetKeyWithoutPath(), localMeta); } Database dataBase; if (RdbSchemaConfig::GetDistributedSchema(localMeta, dataBase) && !dataBase.name.empty() && @@ -363,14 +322,16 @@ int32_t RdbServiceImpl::SetDistributedTables(const RdbSyncerParam ¶m, const Anonymous::Change(param.storeName_).c_str()); return RDB_ERROR; } - auto store = GetStore(param); + auto store = GetStore(meta); if (store == nullptr) { - ZLOGE("bundleName:%{public}s, storeName:%{public}s. GetStore failed", param.bundleName_.c_str(), - Anonymous::Change(param.storeName_).c_str()); + ZLOGE("bundle:%{public}s, %{public}s.", param.bundleName_.c_str(), Anonymous::Change(param.storeName_).c_str()); return RDB_ERROR; } + StoreMetaMapping metaMapping(localMeta); + MetaDataManager::GetInstance().LoadMeta(metaMapping.GetKey(), metaMapping, true); if (type == DistributedTableType::DISTRIBUTED_DEVICE) { UpdateMeta(meta, localMeta, store); + metaMapping.devicePath = meta.dataDir; } else if (type == DistributedTableType::DISTRIBUTED_CLOUD) { if (localMeta.asyncDownloadAsset != param.asyncDownloadAsset_ || localMeta.enableCloud != param.enableCloud_) { ZLOGI("update meta, bundleName:%{public}s, storeName:%{public}s, asyncDownloadAsset? [%{public}d -> " @@ -381,7 +342,10 @@ int32_t RdbServiceImpl::SetDistributedTables(const RdbSyncerParam ¶m, const localMeta.enableCloud = param.enableCloud_; MetaDataManager::GetInstance().SaveMeta(localMeta.GetKey(), localMeta, true); } + metaMapping.cloudPath = meta.dataDir; } + metaMapping = localMeta; + MetaDataManager::GetInstance().SaveMeta(metaMapping.GetKey(), metaMapping, true); std::vector relationships; for (const auto &reference : references) { DistributedData::Reference relationship = { reference.sourceTable, reference.targetTable, reference.refFields }; @@ -466,15 +430,16 @@ std::pair> RdbServiceImpl::R Anonymous::Change(param.storeName_).c_str()); return { RDB_ERROR, nullptr }; } - auto store = GetStore(param); + StoreMetaData meta = GetStoreMetaData(param); + auto store = GetStore(meta); if (store == nullptr) { ZLOGE("bundleName:%{public}s, storeName:%{public}s. GetStore failed", param.bundleName_.c_str(), Anonymous::Change(param.storeName_).c_str()); return { RDB_ERROR, nullptr }; } - StoreMetaData meta = GetStoreMetaData(param); - std::vector devices = {DmAdapter::GetInstance().ToUUID(device)}; - if (IsNeedMetaSync(meta, devices) && !MetaDataManager::GetInstance().Sync(devices, [](auto &results) {}, true)) { + std::vector devices = { DmAdapter::GetInstance().ToUUID(device) }; + if (IsNeedMetaSync(meta, devices) && !MetaDataManager::GetInstance().Sync( + devices, [](auto &results) {}, true)) { ZLOGW("bundleName:%{public}s, storeName:%{public}s. meta sync failed", param.bundleName_.c_str(), Anonymous::Change(param.storeName_).c_str()); } @@ -506,7 +471,8 @@ int32_t RdbServiceImpl::Sync(const RdbSyncerParam ¶m, const Option &option, int RdbServiceImpl::DoSync(const RdbSyncerParam ¶m, const RdbService::Option &option, const PredicatesMemo &predicates, const AsyncDetail &async) { - auto store = GetStore(param); + StoreMetaData meta = GetStoreMetaData(param); + auto store = GetStore(meta); if (store == nullptr) { return RDB_ERROR; } @@ -516,10 +482,9 @@ int RdbServiceImpl::DoSync(const RdbSyncerParam ¶m, const RdbService::Option : DmAdapter::ToUUID(rdbQuery.GetDevices()); auto pid = IPCSkeleton::GetCallingPid(); SyncParam syncParam = { option.mode, 0, option.isCompensation }; - StoreMetaData meta = GetStoreMetaData(param); auto tokenId = IPCSkeleton::GetCallingTokenID(); ZLOGD("seqNum=%{public}u", option.seqNum); - auto complete = [this, rdbQuery, store, pid, syncParam, tokenId, async, seq = option.seqNum]( + auto complete = [this, rdbQuery, store, pid, syncParam, tokenId, seq = option.seqNum]( const auto &results) mutable { auto ret = ProcessResult(results); store->Sync( @@ -550,7 +515,7 @@ bool RdbServiceImpl::IsNeedMetaSync(const StoreMetaData &meta, const std::vector CapMetaData capMeta; auto capKey = CapMetaRow::GetKeyFor(uuid); if (!MetaDataManager::GetInstance().LoadMeta(std::string(capKey.begin(), capKey.end()), capMeta) || - !MetaDataManager::GetInstance().LoadMeta(metaData.GetKey(), metaData)) { + !MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData)) { isAfterMeta = true; break; } @@ -672,9 +637,8 @@ int32_t RdbServiceImpl::Subscribe(const RdbSyncerParam ¶m, const SubscribeOp return true; }); if (isCreate) { - auto subUser = GetSubUser(param.subUser_); - AutoCache::GetInstance().SetObserver(tokenId, RemoveSuffix(param.storeName_), - GetWatchers(tokenId, param.storeName_), subUser); + AutoCache::GetInstance().SetObserver(tokenId, GetWatchers(tokenId, param.storeName_), + GetPath(param)); } return RDB_OK; } @@ -702,9 +666,8 @@ int32_t RdbServiceImpl::UnSubscribe(const RdbSyncerParam ¶m, const Subscribe return true; }); if (destroyed) { - auto subUser = GetSubUser(param.subUser_); - AutoCache::GetInstance().SetObserver(tokenId, RemoveSuffix(param.storeName_), - GetWatchers(tokenId, param.storeName_), subUser); + AutoCache::GetInstance().SetObserver(tokenId, GetWatchers(tokenId, param.storeName_), + GetPath(param)); } return RDB_OK; } @@ -756,15 +719,22 @@ int32_t RdbServiceImpl::UnregisterAutoSyncCallback(const RdbSyncerParam& param, int32_t RdbServiceImpl::Delete(const RdbSyncerParam ¶m) { XCollie xcollie(__FUNCTION__, XCollie::XCOLLIE_LOG | XCollie::XCOLLIE_RECOVERY); + if (!CheckAccess(param.bundleName_, param.storeName_)) { + ZLOGE("bundleName:%{public}s, storeName:%{public}s. Permission error", param.bundleName_.c_str(), + Anonymous::Change(param.storeName_).c_str()); + return RDB_ERROR; + } auto tokenId = IPCSkeleton::GetCallingTokenID(); - auto subUser = GetSubUser(param.subUser_); - AutoCache::GetInstance().CloseStore(tokenId, RemoveSuffix(param.storeName_), subUser); - RdbSyncerParam tmpParam = param; - HapTokenInfo hapTokenInfo; - AccessTokenKit::GetHapTokenInfo(tokenId, hapTokenInfo); - tmpParam.bundleName_ = hapTokenInfo.bundleName; - auto storeMeta = GetStoreMetaData(tmpParam); - MetaDataManager::GetInstance().DelMeta(storeMeta.GetKey()); + if (param.bundleName_.empty()) { + ZLOGE("bundleName is empty! tokenId:%{public}d.", tokenId); + return RDB_ERROR; + } + auto storeMeta = GetStoreMetaData(param); + StoreMetaMapping storeMetaMapping(storeMeta); + MetaDataManager::GetInstance().LoadMeta(storeMetaMapping.GetKey(), storeMetaMapping, true); + storeMeta.dataDir = storeMetaMapping.dataDir; + AutoCache::GetInstance().CloseStore(tokenId, storeMeta.dataDir); + MetaDataManager::GetInstance().DelMeta(storeMeta.GetKeyWithoutPath()); MetaDataManager::GetInstance().DelMeta(storeMeta.GetKey(), true); MetaDataManager::GetInstance().DelMeta(storeMeta.GetKeyLocal(), true); MetaDataManager::GetInstance().DelMeta(storeMeta.GetSecretKey(), true); @@ -774,6 +744,22 @@ int32_t RdbServiceImpl::Delete(const RdbSyncerParam ¶m) MetaDataManager::GetInstance().DelMeta(storeMeta.GetDebugInfoKey(), true); MetaDataManager::GetInstance().DelMeta(storeMeta.GetDfxInfoKey(), true); MetaDataManager::GetInstance().DelMeta(storeMeta.GetCloneSecretKey(), true); + std::vector metaList; + if (MetaDataManager::GetInstance().LoadMeta(storeMeta.GetKeyWithoutPath(), metaList, true) && !metaList.empty()) { + if (storeMetaMapping.cloudPath == storeMetaMapping.dataDir) { + storeMetaMapping.cloudPath = ""; + } + if (storeMetaMapping.searchPath == storeMetaMapping.dataDir) { + storeMetaMapping.searchPath = ""; + } + if (storeMetaMapping.devicePath == storeMetaMapping.dataDir) { + storeMetaMapping.devicePath = ""; + } + storeMetaMapping = metaList[0]; + MetaDataManager::GetInstance().SaveMeta(storeMetaMapping.GetKey(), storeMetaMapping, true); + } else { + MetaDataManager::GetInstance().DelMeta(storeMetaMapping.GetKey(), true); + } return RDB_OK; } @@ -899,7 +885,7 @@ int32_t RdbServiceImpl::BeforeOpen(RdbSyncerParam ¶m) return RDB_OK; } -void RdbServiceImpl::SetReturnParam(StoreMetaData &metadata, RdbSyncerParam ¶m) +void RdbServiceImpl::SetReturnParam(const StoreMetaData &metadata, RdbSyncerParam ¶m) { param.bundleName_ = metadata.bundleName; param.type_ = metadata.storeType; @@ -952,6 +938,14 @@ int32_t RdbServiceImpl::AfterOpen(const RdbSyncerParam ¶m) } } + StoreMetaMapping metaMapping(meta); + MetaDataManager::GetInstance().LoadMeta(metaMapping.GetKey(), metaMapping, true); + if (meta.isSearchable) { + metaMapping.searchPath = meta.dataDir; + } + metaMapping = meta; + MetaDataManager::GetInstance().SaveMeta(metaMapping.GetKey(), metaMapping, true); + SaveDebugInfo(meta, param); SavePromiseInfo(meta, param); SaveDfxInfo(meta, param); @@ -961,7 +955,7 @@ int32_t RdbServiceImpl::AfterOpen(const RdbSyncerParam ¶m) } if (param.isEncrypt_ && !param.password_.empty()) { - if (SetSecretKey(param, meta) != RDB_OK) { + if (SaveSecretKey(param, meta) != RDB_OK) { ZLOGE("Set secret key failed, bundle:%{public}s store:%{public}s", meta.bundleName.c_str(), meta.GetStoreAlias().c_str()); return RDB_ERROR; @@ -1008,6 +1002,8 @@ void RdbServiceImpl::GetSchema(const RdbSyncerParam ¶m) storeInfo.instanceId = instanceId; storeInfo.user = user; storeInfo.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; + auto meta = GetStoreMetaData(param); + storeInfo.path = meta.dataDir; executors_->Execute([storeInfo]() { auto event = std::make_unique(CloudEvent::GET_SCHEMA, std::move(storeInfo)); EventCenter::GetInstance().PostEvent(move(event)); @@ -1048,7 +1044,7 @@ StoreMetaData RdbServiceImpl::GetStoreMetaData(const RdbSyncerParam ¶m) return metaData; } -int32_t RdbServiceImpl::SetSecretKey(const RdbSyncerParam ¶m, const StoreMetaData &meta) +int32_t RdbServiceImpl::SaveSecretKey(const RdbSyncerParam ¶m, const StoreMetaData &meta) { SecretKeyMetaData newSecretKey; newSecretKey.storeType = meta.storeType; @@ -1160,16 +1156,20 @@ int32_t RdbServiceImpl::OnBind(const BindInfo &bindInfo) StoreMetaData RdbServiceImpl::GetStoreMetaData(const Database &dataBase) { - StoreMetaData storeMetaData; - storeMetaData.storeId = dataBase.name; - storeMetaData.bundleName = dataBase.bundleName; - storeMetaData.user = dataBase.user; - storeMetaData.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; + StoreMetaMapping storeMetaMapping; + storeMetaMapping.storeId = dataBase.name; + storeMetaMapping.bundleName = dataBase.bundleName; + storeMetaMapping.user = dataBase.user; + storeMetaMapping.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; auto tokenId = IPCSkeleton::GetCallingTokenID(); - storeMetaData.tokenId = tokenId; - auto [instanceId, user] = GetInstIndexAndUser(storeMetaData.tokenId, storeMetaData.bundleName); - storeMetaData.instanceId = instanceId; - MetaDataManager::GetInstance().LoadMeta(storeMetaData.GetKey(), storeMetaData, true); + storeMetaMapping.tokenId = tokenId; + auto [instanceId, user] = GetInstIndexAndUser(storeMetaMapping.tokenId, storeMetaMapping.bundleName); + storeMetaMapping.instanceId = instanceId; + MetaDataManager::GetInstance().LoadMeta(storeMetaMapping.GetKey(), storeMetaMapping, true); + StoreMetaData storeMetaData = storeMetaMapping; + if (storeMetaMapping.dataDir != storeMetaMapping.devicePath) { + MetaDataManager::GetInstance().LoadMeta(storeMetaMapping.GetDeviceStoreMetaKey(), storeMetaData, true); + } return storeMetaData; } @@ -1202,16 +1202,14 @@ int RdbServiceImpl::DoAutoSync( ZLOGE("autosync store null, storeId:%{public}s", storeMetaData.GetStoreAlias().c_str()); return RDB_ERROR; } - SyncParam syncParam = {0, 0}; - auto pid = IPCSkeleton::GetCallingPid(); - DetailAsync async; if (executors_ == nullptr) { ZLOGE("autosync executors_ null, storeId:%{public}s", storeMetaData.GetStoreAlias().c_str()); return RDB_ERROR; } + SyncParam syncParam = { 0, 0 }; + DetailAsync async; for (auto &table : tables) { - executors_->Execute([this, table, store, pid, syncParam, tokenId, async, - devices, storeMetaData]() { + executors_->Execute([this, table, store, syncParam, async, devices, storeMetaData]() { RdbQuery rdbQuery; rdbQuery.MakeQuery(table); std::vector onDevices = GetReuseDevice(devices); @@ -1219,7 +1217,7 @@ int RdbServiceImpl::DoAutoSync( ZLOGE("autosync ondevices null, storeId:%{public}s", storeMetaData.GetStoreAlias().c_str()); return; } - auto complete = [this, rdbQuery, store, pid, syncParam, tokenId, async, seq = 0]( + auto complete = [this, rdbQuery, store, syncParam, async]( const auto &results) mutable { auto ret = ProcessResult(results); store->Sync(ret.first, rdbQuery, async, syncParam); @@ -1438,6 +1436,7 @@ int32_t RdbServiceImpl::NotifyDataChange( storeInfo.tokenId = IPCSkeleton::GetCallingTokenID(); storeInfo.bundleName = param.bundleName_; storeInfo.storeName = RemoveSuffix(param.storeName_); + storeInfo.path = GetPath(param); auto [instanceId, user] = GetInstIndexAndUser(storeInfo.tokenId, param.bundleName_); storeInfo.instanceId = instanceId; storeInfo.user = user; @@ -1445,7 +1444,7 @@ int32_t RdbServiceImpl::NotifyDataChange( DataChangeEvent::EventInfo eventInfo; eventInfo.isFull = rdbNotifyConfig.isFull_; if (!DoDataChangeSync(storeInfo, rdbChangedData)) { - ZLOGE("store datachange sync fail, storeId:%{public}s", storeInfo.storeName.c_str()); + ZLOGE("store datachange sync fail, storeId:%{public}s", Anonymous::Change(storeInfo.storeName).c_str()); } for (const auto &[key, value] : rdbChangedData.tableData) { if (value.isTrackedDataChange) { @@ -1453,7 +1452,7 @@ int32_t RdbServiceImpl::NotifyDataChange( eventInfo.tableProperties.insert_or_assign(key, std::move(tableChangeProperties)); } } - if (IsPostImmediately(IPCSkeleton::GetCallingPid(), rdbNotifyConfig, storeInfo, eventInfo, param.storeName_)) { + if (IsPostImmediately(IPCSkeleton::GetCallingPid(), rdbNotifyConfig, storeInfo, eventInfo, storeInfo.path)) { auto evt = std::make_unique(std::move(storeInfo), std::move(eventInfo)); EventCenter::GetInstance().PostEvent(std::move(evt)); } @@ -1461,12 +1460,12 @@ int32_t RdbServiceImpl::NotifyDataChange( } bool RdbServiceImpl::IsPostImmediately(const int32_t callingPid, const RdbNotifyConfig &rdbNotifyConfig, - StoreInfo &storeInfo, DataChangeEvent::EventInfo &eventInfo, const std::string &storeName) + StoreInfo &storeInfo, DataChangeEvent::EventInfo &eventInfo, const std::string &path) { bool postImmediately = false; heartbeatTaskIds_.Compute(callingPid, [this, &postImmediately, &rdbNotifyConfig, &storeInfo, &eventInfo, - &storeName](const int32_t &key, std::map &tasks) { - auto iter = tasks.find(storeName); + &path](const int32_t &key, std::map &tasks) { + auto iter = tasks.find(path); ExecutorPool::TaskId taskId = ExecutorPool::INVALID_TASK_ID; if (iter != tasks.end()) { taskId = iter->second; @@ -1476,7 +1475,7 @@ bool RdbServiceImpl::IsPostImmediately(const int32_t callingPid, const RdbNotify executors_->Remove(taskId); } postImmediately = true; - tasks.erase(storeName); + tasks.erase(path); return !tasks.empty(); } @@ -1491,7 +1490,7 @@ bool RdbServiceImpl::IsPostImmediately(const int32_t callingPid, const RdbNotify taskId = executors_->Reset(taskId, std::chrono::milliseconds(rdbNotifyConfig.delay_)); } } - tasks.insert_or_assign(storeName, taskId); + tasks.insert_or_assign(path, taskId); return true; }); return postImmediately; @@ -1521,6 +1520,7 @@ int32_t RdbServiceImpl::PostSearchEvent(int32_t evtId, const RdbSyncerParam& par storeInfo.instanceId = instanceId; storeInfo.user = user; storeInfo.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; + storeInfo.path = GetPath(param); auto evt = std::make_unique(std::move(storeInfo), std::move(eventInfo), evtId); EventCenter::GetInstance().PostEvent(std::move(evt)); @@ -1532,7 +1532,7 @@ int32_t RdbServiceImpl::Disable(const RdbSyncerParam ¶m) auto tokenId = IPCSkeleton::GetCallingTokenID(); auto storeId = RemoveSuffix(param.storeName_); auto userId = GetSubUser(param.subUser_); - AutoCache::GetInstance().Disable(tokenId, storeId, userId); + AutoCache::GetInstance().Disable(tokenId, GetPath(param)); return RDB_OK; } @@ -1541,7 +1541,7 @@ int32_t RdbServiceImpl::Enable(const RdbSyncerParam ¶m) auto tokenId = IPCSkeleton::GetCallingTokenID(); auto storeId = RemoveSuffix(param.storeName_); auto userId = GetSubUser(param.subUser_); - AutoCache::GetInstance().Enable(tokenId, storeId, userId); + AutoCache::GetInstance().Enable(tokenId, GetPath(param)); return RDB_OK; } @@ -1584,6 +1584,8 @@ StoreInfo RdbServiceImpl::GetStoreInfo(const RdbSyncerParam ¶m) storeInfo.tokenId = IPCSkeleton::GetCallingTokenID(); storeInfo.user = AccountDelegate::GetInstance()->GetUserByToken(storeInfo.tokenId); storeInfo.storeName = RemoveSuffix(param.storeName_); + auto meta = GetStoreMetaData(param); + storeInfo.path = meta.dataDir; return storeInfo; } @@ -1789,7 +1791,7 @@ bool RdbServiceImpl::TryUpdateDeviceId(const RdbSyncerParam ¶m, const StoreM StoreMetaData syncMeta; if (oldMeta.isNeedUpdateDeviceId && oldMeta.storeType >= StoreMetaData::StoreType::STORE_RELATIONAL_BEGIN && oldMeta.storeType <= StoreMetaData::StoreType::STORE_RELATIONAL_END && - MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), syncMeta)) { + MetaDataManager::GetInstance().LoadMeta(meta.GetKeyWithoutPath(), syncMeta)) { auto store = GetStore(param); if (store == nullptr) { ZLOGE("store is null, bundleName:%{public}s storeName:%{public}s", param.bundleName_.c_str(), @@ -1804,4 +1806,82 @@ bool RdbServiceImpl::TryUpdateDeviceId(const RdbSyncerParam ¶m, const StoreM } return true; } + +void RdbServiceImpl::RegisterEvent() +{ + auto process = [this](const Event &event) { + auto &evt = static_cast(event); + auto &storeInfo = evt.GetStoreInfo(); + StoreMetaMapping mapping(storeInfo); + mapping.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; + if (!MetaDataManager::GetInstance().LoadMeta(mapping.GetKey(), mapping, true)) { + ZLOGE("meta mapping empty, bundleName:%{public}s, storeId:%{public}s", mapping.bundleName.c_str(), + mapping.GetStoreAlias().c_str()); + return; + } + StoreMetaData meta = mapping; + if (!mapping.cloudPath.empty() && mapping.cloudPath != mapping.dataDir && + !MetaDataManager::GetInstance().LoadMeta(mapping.GetCloudStoreMetaKey(), meta, true)) { + ZLOGE("meta empty, bundleName:%{public}s, storeId:%{public}s", meta.bundleName.c_str(), + meta.GetStoreAlias().c_str()); + return; + } + if (meta.storeType < StoreMetaData::STORE_RELATIONAL_BEGIN || + meta.storeType > StoreMetaData::STORE_RELATIONAL_END) { + return; + } + auto watchers = GetWatchers(meta.tokenId, meta.storeId); + auto store = AutoCache::GetInstance().GetStore(meta, watchers); + if (store == nullptr) { + ZLOGE("store null, storeId:%{public}s", meta.GetStoreAlias().c_str()); + return; + } + store->RegisterDetailProgressObserver(GetCallbacks(meta.tokenId, storeInfo.storeName)); + }; + EventCenter::GetInstance().Subscribe(CloudEvent::CLOUD_SYNC, process); + EventCenter::GetInstance().Subscribe(CloudEvent::CLEAN_DATA, process); + + EventCenter::GetInstance().Subscribe(CloudEvent::MAKE_QUERY, [](const Event &event) { + auto &evt = static_cast(event); + auto callback = evt.GetCallback(); + if (!callback) { + return; + } + auto predicate = evt.GetPredicates(); + auto rdbQuery = std::make_shared(); + rdbQuery->MakeQuery(*predicate); + rdbQuery->SetColumns(evt.GetColumns()); + callback(rdbQuery); + }); + auto compensateSyncProcess = [this](const Event &event) { + auto &evt = static_cast(event); + DoCompensateSync(evt); + }; + EventCenter::GetInstance().Subscribe(BindEvent::COMPENSATE_SYNC, compensateSyncProcess); + EventCenter::GetInstance().Subscribe(BindEvent::RECOVER_SYNC, compensateSyncProcess); +} + +std::string RdbServiceImpl::GetPath(const RdbSyncerParam ¶m) +{ + StoreMetaData metaData; + metaData.uid = IPCSkeleton::GetCallingUid(); + metaData.tokenId = IPCSkeleton::GetCallingTokenID(); + auto [instanceId, user] = GetInstIndexAndUser(metaData.tokenId, param.bundleName_); + metaData.instanceId = instanceId; + metaData.bundleName = param.bundleName_; + metaData.storeId = RemoveSuffix(param.storeName_); + if (AccessTokenKit::GetTokenTypeFlag(metaData.tokenId) != TOKEN_HAP && param.subUser_ != 0) { + metaData.user = std::to_string(param.subUser_); + } else { + metaData.user = std::to_string(user); + } + metaData.storeType = param.type_; + metaData.securityLevel = param.level_; + metaData.area = param.area_; + metaData.appType = "harmony"; + metaData.hapName = param.hapName_; + metaData.customDir = param.customDir_; + return DirectoryManager::GetInstance().GetStorePath(metaData) + "/" + param.storeName_; +} + } // namespace OHOS::DistributedRdb \ No newline at end of file diff --git a/services/distributeddataservice/service/rdb/rdb_service_impl.h b/services/distributeddataservice/service/rdb/rdb_service_impl.h index 096c58c21..e10ae4239 100644 --- a/services/distributeddataservice/service/rdb/rdb_service_impl.h +++ b/services/distributeddataservice/service/rdb/rdb_service_impl.h @@ -168,6 +168,8 @@ private: void RegisterHandler(); + void RegisterEvent(); + void DumpRdbServiceInfo(int fd, std::map> ¶ms); void DoCloudSync(const RdbSyncerParam ¶m, const Option &option, const PredicatesMemo &predicates, @@ -190,29 +192,40 @@ private: DetailAsync GetCallbacks(uint32_t tokenId, const std::string &storeName); - bool CheckAccess(const std::string& bundleName, const std::string& storeName); + std::shared_ptr GetStore(const RdbSyncerParam& param); - bool CheckInvalidPath(const std::string& param); + std::shared_ptr GetStore(const StoreMetaData &storeMetaData); - bool CheckCustomDir(const std::string &customDir, int32_t upLimit); + void OnAsyncComplete(uint32_t tokenId, pid_t pid, uint32_t seqNum, Details &&result); - bool CheckParam(const RdbSyncerParam ¶m); + int32_t Upgrade(const RdbSyncerParam ¶m, const StoreMetaData &old); - std::shared_ptr GetStore(const RdbSyncerParam& param); + void GetSchema(const RdbSyncerParam ¶m); - std::shared_ptr GetStore(const StoreMetaData &storeMetaData); + bool IsPostImmediately(const int32_t callingPid, const RdbNotifyConfig &rdbNotifyConfig, StoreInfo &storeInfo, + DistributedData::DataChangeEvent::EventInfo &eventInfo, const std::string &storeName); - void OnAsyncComplete(uint32_t tokenId, pid_t pid, uint32_t seqNum, Details &&result); + bool TryUpdateDeviceId(const RdbSyncerParam ¶m, const StoreMetaData &oldMeta, StoreMetaData &meta); - StoreMetaData GetStoreMetaData(const RdbSyncerParam ¶m); + void SaveLaunchInfo(StoreMetaData &meta); - StoreMetaData GetStoreMetaData(const Database &dataBase); + static bool CheckAccess(const std::string& bundleName, const std::string& storeName); - int32_t SetSecretKey(const RdbSyncerParam ¶m, const StoreMetaData &meta); + static bool CheckInvalidPath(const std::string& param); - int32_t Upgrade(const RdbSyncerParam ¶m, const StoreMetaData &old); + static bool CheckCustomDir(const std::string &customDir, int32_t upLimit); - std::pair> AllocResource( + static bool CheckParam(const RdbSyncerParam ¶m); + + static StoreMetaData GetStoreMetaData(const RdbSyncerParam ¶m); + + static std::string GetPath(const RdbSyncerParam ¶m); + + static StoreMetaData GetStoreMetaData(const Database &dataBase); + + static int32_t SaveSecretKey(const RdbSyncerParam ¶m, const StoreMetaData &meta); + + static std::pair> AllocResource( StoreInfo& storeInfo, std::shared_ptr rdbQuery); static Details HandleGenDetails(const DistributedData::GenDetails &details); @@ -229,34 +242,26 @@ private: static bool SaveAppIDMeta(const StoreMetaData &meta, const StoreMetaData &old); - void GetSchema(const RdbSyncerParam ¶m); - - void SetReturnParam(StoreMetaData &metadata, RdbSyncerParam ¶m); + static void SetReturnParam(const StoreMetaData &metadata, RdbSyncerParam ¶m); - bool IsNeedMetaSync(const StoreMetaData &meta, const std::vector &uuids); + static bool IsNeedMetaSync(const StoreMetaData &meta, const std::vector &uuids); - SyncResult ProcessResult(const std::map &results); + static SyncResult ProcessResult(const std::map &results); - StoreInfo GetStoreInfo(const RdbSyncerParam ¶m); + static StoreInfo GetStoreInfo(const RdbSyncerParam ¶m); - int32_t SaveDebugInfo(const StoreMetaData &metaData, const RdbSyncerParam ¶m); + static int32_t SaveDebugInfo(const StoreMetaData &metaData, const RdbSyncerParam ¶m); - int32_t SaveDfxInfo(const StoreMetaData &metaData, const RdbSyncerParam ¶m); + static int32_t SaveDfxInfo(const StoreMetaData &metaData, const RdbSyncerParam ¶m); - int32_t SavePromiseInfo(const StoreMetaData &metaData, const RdbSyncerParam ¶m); + static int32_t SavePromiseInfo(const StoreMetaData &metaData, const RdbSyncerParam ¶m); - int32_t PostSearchEvent(int32_t evtId, const RdbSyncerParam& param, + static int32_t PostSearchEvent(int32_t evtId, const RdbSyncerParam& param, DistributedData::SetSearchableEvent::EventInfo &eventInfo); - bool IsPostImmediately(const int32_t callingPid, const RdbNotifyConfig &rdbNotifyConfig, StoreInfo &storeInfo, - DistributedData::DataChangeEvent::EventInfo &eventInfo, const std::string &storeName); - void UpdateMeta(const StoreMetaData &meta, const StoreMetaData &localMeta, AutoCache::Store store); - - bool UpgradeCloneSecretKey(const StoreMetaData &meta); + static void UpdateMeta(const StoreMetaData &meta, const StoreMetaData &localMeta, AutoCache::Store store); - bool TryUpdateDeviceId(const RdbSyncerParam ¶m, const StoreMetaData &oldMeta, StoreMetaData &meta); - - void SaveLaunchInfo(StoreMetaData &meta); + static bool UpgradeCloneSecretKey(const StoreMetaData &meta); static Factory factory_; ConcurrentMap syncAgents_; diff --git a/services/distributeddataservice/service/test/BUILD.gn b/services/distributeddataservice/service/test/BUILD.gn index 2fbe7f6eb..715b5b291 100644 --- a/services/distributeddataservice/service/test/BUILD.gn +++ b/services/distributeddataservice/service/test/BUILD.gn @@ -68,6 +68,7 @@ ohos_unittest("CloudDataTest") { "${data_service_path}/service/cloud/sync_manager.cpp", "${data_service_path}/service/cloud/sync_strategies/network_sync_strategy.cpp", "${data_service_path}/service/test/mock/checker_mock.cpp", + "${data_service_path}/service/test/mock/meta_data_manager_mock.cpp", "cloud_data_test.cpp", ] @@ -112,6 +113,7 @@ ohos_unittest("CloudServiceImplTest") { cfi = true cfi_cross_dso = true debug = false + blocklist = "${datamgr_service_path}/cfi_blocklist.txt" } module_out_path = module_output_path sources = [ @@ -123,6 +125,7 @@ ohos_unittest("CloudServiceImplTest") { "${data_service_path}/service/cloud/sync_manager.cpp", "${data_service_path}/service/cloud/sync_strategies/network_sync_strategy.cpp", "${data_service_path}/service/test/mock/checker_mock.cpp", + "${data_service_path}/service/test/mock/meta_data_manager_mock.cpp", "cloud_service_impl_test.cpp", ] @@ -131,12 +134,14 @@ ohos_unittest("CloudServiceImplTest") { external_deps = [ "access_token:libaccesstoken_sdk", "access_token:libtoken_setproc", + "cJSON:cjson", "c_utils:utils", "device_manager:devicemanagersdk", + "googletest:gmock", + "googletest:gtest", "hicollie:libhicollie", "hilog:libhilog", "ipc:ipc_single", - "cJSON:cjson", "kv_store:distributeddata_inner", "kv_store:distributeddb", "relational_store:native_rdb", diff --git a/services/distributeddataservice/service/test/cloud_data_test.cpp b/services/distributeddataservice/service/test/cloud_data_test.cpp index aa1070cad..3a6d50b56 100644 --- a/services/distributeddataservice/service/test/cloud_data_test.cpp +++ b/services/distributeddataservice/service/test/cloud_data_test.cpp @@ -105,6 +105,8 @@ static constexpr const char *PERMISSION_DISTRIBUTED_DATASYNC = "ohos.permission. static constexpr const char *PERMISSION_ACCESS_SERVICE_DM = "ohos.permission.ACCESS_SERVICE_DM"; static constexpr const char *PERMISSION_MANAGE_LOCAL_ACCOUNTS = "ohos.permission.MANAGE_LOCAL_ACCOUNTS"; static constexpr const char *PERMISSION_GET_BUNDLE_INFO = "ohos.permission.GET_BUNDLE_INFO_PRIVILEGED"; +static constexpr const char *TEST_CLOUD_PATH = + "/data/app/el2/100/database/test_cloud_bundleName/entry/rdb/test_cloud_store"; PermissionDef GetPermissionDef(const std::string &permission) { PermissionDef def = { .permissionName = permission, @@ -211,6 +213,7 @@ void CloudDataTest::InitMetaData() metaData_.isAutoSync = true; metaData_.storeType = DistributedRdb::RDB_DEVICE_COLLABORATION; metaData_.storeId = TEST_CLOUD_STORE; + metaData_.dataDir = TEST_CLOUD_PATH; PolicyValue value; value.type = OHOS::DistributedKv::PolicyType::IMMEDIATE_SYNC_ON_ONLINE; } @@ -303,6 +306,8 @@ void CloudDataTest::SetUp() { MetaDataManager::GetInstance().SaveMeta(cloudInfo_.GetKey(), cloudInfo_, true); MetaDataManager::GetInstance().SaveMeta(metaData_.GetKey(), metaData_, true); + StoreMetaMapping storeMetaMapping(metaData_); + MetaDataManager::GetInstance().SaveMeta(storeMetaMapping.GetKey(), storeMetaMapping, true); MetaDataManager::GetInstance().SaveMeta(cloudInfo_.GetSchemaKey(TEST_CLOUD_BUNDLE), schemaMeta_, true); } @@ -311,6 +316,8 @@ void CloudDataTest::TearDown() EventCenter::GetInstance().Unsubscribe(CloudEvent::LOCAL_CHANGE); MetaDataManager::GetInstance().DelMeta(cloudInfo_.GetKey(), true); MetaDataManager::GetInstance().DelMeta(metaData_.GetKey(), true); + StoreMetaMapping storeMetaMapping(metaData_); + MetaDataManager::GetInstance().DelMeta(storeMetaMapping.GetKey(), true); MetaDataManager::GetInstance().DelMeta(cloudInfo_.GetSchemaKey(TEST_CLOUD_BUNDLE), true); } @@ -2228,6 +2235,7 @@ HWTEST_F(CloudDataTest, PreShare, TestSize.Level0) info.bundleName = TEST_CLOUD_BUNDLE; info.storeName = TEST_CLOUD_BUNDLE; info.user = userId; + info.path = TEST_CLOUD_PATH; StoreMetaData meta(info); meta.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; MetaDataManager::GetInstance().SaveMeta(meta.GetKey(), meta, true); @@ -2722,12 +2730,12 @@ HWTEST_F(CloudDataTest, TryUpdateDeviceId001, TestSize.Level1) oldMeta.storeId = "test_storeid_001"; oldMeta.isNeedUpdateDeviceId = true; oldMeta.storeType = StoreMetaData::StoreType::STORE_RELATIONAL_BEGIN; - bool isSuccess = MetaDataManager::GetInstance().SaveMeta(oldMeta.GetKey(), oldMeta); + bool isSuccess = MetaDataManager::GetInstance().SaveMeta(oldMeta.GetKeyWithoutPath(), oldMeta); EXPECT_EQ(isSuccess, true); StoreMetaData meta1 = oldMeta; auto ret = rdbServiceImpl.TryUpdateDeviceId(param, oldMeta, meta1); EXPECT_EQ(ret, true); - MetaDataManager::GetInstance().DelMeta(oldMeta.GetKey()); + MetaDataManager::GetInstance().DelMeta(oldMeta.GetKeyWithoutPath()); } /** @@ -2748,12 +2756,12 @@ HWTEST_F(CloudDataTest, TryUpdateDeviceId002, TestSize.Level1) oldMeta.storeId = "test_storeid_001"; oldMeta.isNeedUpdateDeviceId = false; oldMeta.storeType = StoreMetaData::StoreType::STORE_RELATIONAL_BEGIN; - bool isSuccess = MetaDataManager::GetInstance().SaveMeta(oldMeta.GetKey(), oldMeta); + bool isSuccess = MetaDataManager::GetInstance().SaveMeta(oldMeta.GetKeyWithoutPath(), oldMeta); EXPECT_EQ(isSuccess, true); StoreMetaData meta1 = oldMeta; auto ret = rdbServiceImpl.TryUpdateDeviceId(param, oldMeta, meta1); EXPECT_EQ(ret, true); - MetaDataManager::GetInstance().DelMeta(oldMeta.GetKey()); + MetaDataManager::GetInstance().DelMeta(oldMeta.GetKeyWithoutPath()); } /** @@ -2774,12 +2782,12 @@ HWTEST_F(CloudDataTest, TryUpdateDeviceId003, TestSize.Level1) oldMeta.storeId = "test_storeid_001"; oldMeta.isNeedUpdateDeviceId = true; oldMeta.storeType = StoreMetaData::StoreType::STORE_RELATIONAL_END; - bool isSuccess = MetaDataManager::GetInstance().SaveMeta(oldMeta.GetKey(), oldMeta); + bool isSuccess = MetaDataManager::GetInstance().SaveMeta(oldMeta.GetKeyWithoutPath(), oldMeta); EXPECT_EQ(isSuccess, true); StoreMetaData meta1 = oldMeta; auto ret = rdbServiceImpl.TryUpdateDeviceId(param, oldMeta, meta1); EXPECT_EQ(ret, true); - MetaDataManager::GetInstance().DelMeta(oldMeta.GetKey()); + MetaDataManager::GetInstance().DelMeta(oldMeta.GetKeyWithoutPath()); } /** @@ -2800,12 +2808,12 @@ HWTEST_F(CloudDataTest, TryUpdateDeviceId004, TestSize.Level1) oldMeta.storeId = "test_storeid_001"; oldMeta.isNeedUpdateDeviceId = false; oldMeta.storeType = StoreMetaData::StoreType::STORE_RELATIONAL_END; - bool isSuccess = MetaDataManager::GetInstance().SaveMeta(oldMeta.GetKey(), oldMeta); + bool isSuccess = MetaDataManager::GetInstance().SaveMeta(oldMeta.GetKeyWithoutPath(), oldMeta); EXPECT_EQ(isSuccess, true); StoreMetaData meta1 = oldMeta; auto ret = rdbServiceImpl.TryUpdateDeviceId(param, oldMeta, meta1); EXPECT_EQ(ret, true); - MetaDataManager::GetInstance().DelMeta(oldMeta.GetKey()); + MetaDataManager::GetInstance().DelMeta(oldMeta.GetKeyWithoutPath()); } /** diff --git a/services/distributeddataservice/service/test/cloud_service_impl_test.cpp b/services/distributeddataservice/service/test/cloud_service_impl_test.cpp index 0a501550d..f7fa4e742 100644 --- a/services/distributeddataservice/service/test/cloud_service_impl_test.cpp +++ b/services/distributeddataservice/service/test/cloud_service_impl_test.cpp @@ -15,6 +15,7 @@ #define LOG_TAG "CloudServiceImplTest" #include "cloud_service_impl.h" +#include #include #include @@ -41,6 +42,7 @@ #include "metadata/store_meta_data_local.h" #include "mock/db_store_mock.h" #include "mock/general_store_mock.h" +#include "mock/meta_data_manager_mock.h" #include "model/component_config.h" #include "network/network_delegate.h" #include "network_delegate_mock.h" @@ -53,6 +55,7 @@ #include "token_setproc.h" using namespace testing::ext; +using namespace testing; using namespace OHOS::DistributedData; using namespace OHOS::Security::AccessToken; using Confirmation = OHOS::CloudData::Confirmation; @@ -73,6 +76,7 @@ public: void TearDown(); static std::shared_ptr cloudServiceImpl_; + static inline std::shared_ptr metaDataManagerMock = nullptr; static NetworkDelegateMock delegate_; }; std::shared_ptr CloudServiceImplTest::cloudServiceImpl_ = @@ -81,6 +85,8 @@ NetworkDelegateMock CloudServiceImplTest::delegate_; void CloudServiceImplTest::SetUpTestCase(void) { + metaDataManagerMock = std::make_shared(); + BMetaDataManager::metaDataManager = metaDataManagerMock; size_t max = 12; size_t min = 5; auto executor = std::make_shared(max, min); @@ -88,7 +94,11 @@ void CloudServiceImplTest::SetUpTestCase(void) NetworkDelegate::RegisterNetworkInstance(&delegate_); } -void CloudServiceImplTest::TearDownTestCase() { } +void CloudServiceImplTest::TearDownTestCase() +{ + metaDataManagerMock = nullptr; + BMetaDataManager::metaDataManager = nullptr; +} void CloudServiceImplTest::SetUp() { } @@ -418,6 +428,82 @@ HWTEST_F(CloudServiceImplTest, ConfirmInvitation001, TestSize.Level0) EXPECT_EQ(status, GeneralError::E_ERROR); } +/** + * @tc.name: GetStoreMetaData_001 + * @tc.desc: test GetStoreMetaData LoadMeta success. + * @tc.type: FUNC + */ +HWTEST_F(CloudServiceImplTest, GetStoreMetaData_001, TestSize.Level1) +{ + EXPECT_CALL(*metaDataManagerMock, LoadMeta(_, _, _)).WillOnce(Return(true)).WillOnce(Return(true)); + StoreMetaData meta; + bool res = cloudServiceImpl_->GetStoreMetaData(meta); + EXPECT_EQ(res, true); +} + +/** + * @tc.name: GetStoreMetaData_002 + * @tc.desc: test GetStoreMetaData LoadMeta failed and user is 0. + * @tc.type: FUNC + */ +HWTEST_F(CloudServiceImplTest, GetStoreMetaData_002, TestSize.Level1) +{ + EXPECT_CALL(*metaDataManagerMock, LoadMeta(_, _, _)).WillOnce(Return(false)); + StoreMetaData meta; + meta.user = "0"; + bool res = cloudServiceImpl_->GetStoreMetaData(meta); + EXPECT_EQ(res, false); +} + +/** + * @tc.name: GetStoreMetaData_003 + * @tc.desc: test GetStoreMetaData LoadMeta failed and user is not 0. + * @tc.type: FUNC + */ +HWTEST_F(CloudServiceImplTest, GetStoreMetaData_003, TestSize.Level1) +{ + EXPECT_CALL(*metaDataManagerMock, LoadMeta(_, _, _)).WillOnce(Return(false)).WillOnce(Return(false)); + StoreMetaData meta; + meta.user = "100"; + bool res = cloudServiceImpl_->GetStoreMetaData(meta); + EXPECT_EQ(res, false); +} + +/** + * @tc.name: GetStoreMetaData_004 + * @tc.desc: test GetStoreMetaData First load of metadata failed and the user is not 0, + * then the load of metadata succeeded. + * @tc.type: FUNC + */ +HWTEST_F(CloudServiceImplTest, GetStoreMetaData_004, TestSize.Level1) +{ + EXPECT_CALL(*metaDataManagerMock, LoadMeta(_, _, _)).WillOnce(Return(false)).WillRepeatedly(Return(true)); + StoreMetaData meta; + meta.user = "100"; + bool res = cloudServiceImpl_->GetStoreMetaData(meta); + EXPECT_EQ(res, true); +} + +/** + * @tc.name: PreShare_001 + * @tc.desc: test PreShare is dataDir empty. + * @tc.type: FUNC + */ +HWTEST_F(CloudServiceImplTest, PreShare_001, TestSize.Level1) +{ + EXPECT_CALL(*metaDataManagerMock, LoadMeta(_, _, _)).WillRepeatedly(Return(false)); + StoreInfo storeInfo; + storeInfo.path = ""; + std::shared_ptr query; + auto [errCode, cursor] = cloudServiceImpl_->PreShare(storeInfo, *query); + EXPECT_EQ(errCode, E_ERROR); + ASSERT_EQ(cursor, nullptr); + storeInfo.path = "test"; + std::tie(errCode, cursor) = cloudServiceImpl_->PreShare(storeInfo, *query); + EXPECT_EQ(errCode, E_ERROR); + ASSERT_EQ(cursor, nullptr); +} + /** * @tc.name: ChangeConfirmation001 * @tc.desc: Test the ChangeConfirmation with invalid parameters diff --git a/services/distributeddataservice/service/test/kvdb_service_impl_test.cpp b/services/distributeddataservice/service/test/kvdb_service_impl_test.cpp index 1717b304f..5a7ae7f43 100644 --- a/services/distributeddataservice/service/test/kvdb_service_impl_test.cpp +++ b/services/distributeddataservice/service/test/kvdb_service_impl_test.cpp @@ -541,6 +541,95 @@ HWTEST_F(KvdbServiceImplTest, UnregServiceNotifierTest001, TestSize.Level0) ASSERT_EQ(status, Status::SUCCESS); } +/** +* @tc.name: NotifyDataChange_001 +* @tc.desc: test NotifyDataChange LoadMeta success. +* @tc.type: FUNC +*/ +HWTEST_F(KvdbServiceImplTest, NotifyDataChange_001, TestSize.Level1) +{ + EXPECT_CALL(*metaDataManagerMock, LoadMeta(testing::_, testing::_, testing::_)).WillOnce(testing::Return(true)); + StoreId id1; + id1.storeId = "id1"; + auto status = kvdbServiceImpl_->NotifyDataChange(appId, id1, 0); + EXPECT_EQ(status, Status::SUCCESS); +} + +/** +* @tc.name: NotifyDataChange_002 +* @tc.desc: test NotifyDataChange LoadMeta failed. +* @tc.type: FUNC +*/ +HWTEST_F(KvdbServiceImplTest, NotifyDataChange_002, TestSize.Level1) +{ + EXPECT_CALL(*metaDataManagerMock, LoadMeta(testing::_, testing::_, testing::_)).WillOnce(testing::Return(false)); + StoreId id1; + id1.storeId = "id1"; + auto status = kvdbServiceImpl_->NotifyDataChange(appId, id1, 0); + EXPECT_EQ(status, Status::INVALID_ARGUMENT); +} + +/** +* @tc.name: SetConfig_001 +* @tc.desc: test SetConfig LoadMeta success and SaveMeta success. +* @tc.type: FUNC +*/ +HWTEST_F(KvdbServiceImplTest, SetConfig_001, TestSize.Level1) +{ + EXPECT_CALL(*metaDataManagerMock, LoadMeta(testing::_, testing::_, testing::_)) + .WillOnce(testing::Return(true)) + .WillOnce(testing::Return(true)) + .WillOnce(testing::Return(true)); + EXPECT_CALL(*metaDataManagerMock, SaveMeta(testing::_, testing::_, testing::_)) + .WillOnce(testing::Return(true)) + .WillOnce(testing::Return(true)); + StoreId id1; + id1.storeId = "id1"; + DistributedKv::StoreConfig config; + auto status = kvdbServiceImpl_->SetConfig(appId, id1, config); + EXPECT_EQ(status, Status::SUCCESS); +} + +/** +* @tc.name: SetConfig_002 +* @tc.desc: test SetConfig LoadMeta success and SaveMeta failed. +* @tc.type: FUNC +*/ +HWTEST_F(KvdbServiceImplTest, SetConfig_002, TestSize.Level1) +{ + EXPECT_CALL(*metaDataManagerMock, LoadMeta(testing::_, testing::_, testing::_)) + .WillOnce(testing::Return(true)) + .WillOnce(testing::Return(true)) + .WillOnce(testing::Return(true)); + EXPECT_CALL(*metaDataManagerMock, SaveMeta(testing::_, testing::_, testing::_)) + .WillOnce(testing::Return(true)) + .WillOnce(testing::Return(false)); + StoreId id1; + id1.storeId = "id1"; + DistributedKv::StoreConfig config; + auto status = kvdbServiceImpl_->SetConfig(appId, id1, config); + EXPECT_EQ(status, Status::ERROR); +} + +/** +* @tc.name: SetConfig_003 +* @tc.desc: test SetConfig LoadMeta failed. +* @tc.type: FUNC +*/ +HWTEST_F(KvdbServiceImplTest, SetConfig_003, TestSize.Level1) +{ + EXPECT_CALL(*metaDataManagerMock, LoadMeta(testing::_, testing::_, testing::_)) + .WillOnce(testing::Return(true)) + .WillOnce(testing::Return(true)) + .WillOnce(testing::Return(false)); + EXPECT_CALL(*metaDataManagerMock, SaveMeta(testing::_, testing::_, testing::_)).WillOnce(testing::Return(true)); + StoreId id1; + id1.storeId = "id1"; + DistributedKv::StoreConfig config; + auto status = kvdbServiceImpl_->SetConfig(appId, id1, config); + EXPECT_EQ(status, Status::SUCCESS); +} + /** * @tc.name: HandleGenDetailsTest001 * @tc.desc: HandleGenDetails test diff --git a/services/distributeddataservice/service/test/meta_data_test.cpp b/services/distributeddataservice/service/test/meta_data_test.cpp index 1476b51da..714fd0b53 100644 --- a/services/distributeddataservice/service/test/meta_data_test.cpp +++ b/services/distributeddataservice/service/test/meta_data_test.cpp @@ -29,6 +29,7 @@ #include "metadata/store_meta_data_local.h" #include "nativetoken_kit.h" #include "token_setproc.h" +#include "directory/directory_manager.h" using namespace testing::ext; using namespace OHOS::DistributedData; using namespace OHOS::Security::AccessToken; @@ -120,6 +121,8 @@ void MetaDataTest::SetUp() metaData_.instanceId = GetInstIndex(metaData_.tokenId, appId); metaData_.version = 1; MetaDataManager::GetInstance().DelMeta(metaData_.GetKey()); + metaData_.area = options_.area; + metaData_.dataDir = DirectoryManager::GetInstance().GetStorePath(metaData_); } void MetaDataTest::TearDown() {} @@ -138,7 +141,7 @@ HWTEST_F(MetaDataTest, SaveLoadMateData, TestSize.Level0) std::vector password {}; auto status = kvdbServiceImpl_->AfterCreate(appId, storeId, options_, password); ASSERT_EQ(status, Status::SUCCESS); - ASSERT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData_.GetKey(), metaData)); + ASSERT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData_.GetKeyWithoutPath(), metaData)); ASSERT_TRUE(metaData.isNeedCompress); } @@ -157,9 +160,9 @@ HWTEST_F(MetaDataTest, MateDataChanged, TestSize.Level0) std::vector password {}; auto status = kvdbServiceImpl_->AfterCreate(appId, storeId, options_, password); ASSERT_EQ(status, Status::SUCCESS); - ASSERT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData_.GetKey(), metaData)); + ASSERT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData_.GetKeyWithoutPath(), metaData)); ASSERT_FALSE(metaData.isNeedCompress); - ASSERT_TRUE(MetaDataManager::GetInstance().DelMeta(metaData_.GetKey())); + ASSERT_TRUE(MetaDataManager::GetInstance().DelMeta(metaData_.GetKeyWithoutPath())); } } // namespace DistributedDataTest } // namespace OHOS::Test diff --git a/services/distributeddataservice/service/test/mock/meta_data_manager_mock.cpp b/services/distributeddataservice/service/test/mock/meta_data_manager_mock.cpp index 6af7ba916..56307e54d 100644 --- a/services/distributeddataservice/service/test/mock/meta_data_manager_mock.cpp +++ b/services/distributeddataservice/service/test/mock/meta_data_manager_mock.cpp @@ -39,6 +39,11 @@ bool OHOS::DistributedData::MetaDataManager::LoadMeta(const std::string &key, Se return BMetaDataManager::metaDataManager->LoadMeta(key, value, isLocal); } +bool OHOS::DistributedData::MetaDataManager::SaveMeta(const std::string &key, const Serializable &value, bool isLocal) +{ + return BMetaDataManager::metaDataManager->SaveMeta(key, value, isLocal); +} + template<> bool OHOS::DistributedData::MetaDataManager::LoadMeta( const std::string &prefix, std::vector &values, bool isLocal) diff --git a/services/distributeddataservice/service/test/mock/meta_data_manager_mock.h b/services/distributeddataservice/service/test/mock/meta_data_manager_mock.h index 6db1bf937..4ac1fcb36 100644 --- a/services/distributeddataservice/service/test/mock/meta_data_manager_mock.h +++ b/services/distributeddataservice/service/test/mock/meta_data_manager_mock.h @@ -26,6 +26,7 @@ namespace OHOS::DistributedData { class BMetaDataManager { public: virtual bool LoadMeta(const std::string &, Serializable &, bool) = 0; + virtual bool SaveMeta(const std::string &, const Serializable &, bool) = 0; BMetaDataManager() = default; virtual ~BMetaDataManager() = default; static inline std::shared_ptr metaDataManager = nullptr; @@ -33,6 +34,7 @@ public: class MetaDataManagerMock : public BMetaDataManager { public: MOCK_METHOD(bool, LoadMeta, (const std::string &, Serializable &, bool), (override)); + MOCK_METHOD(bool, SaveMeta, (const std::string &, const Serializable &, bool), (override)); }; template class BMetaData { diff --git a/services/distributeddataservice/service/test/rdb_service_impl_test.cpp b/services/distributeddataservice/service/test/rdb_service_impl_test.cpp index 54f25eae2..b223515bf 100644 --- a/services/distributeddataservice/service/test/rdb_service_impl_test.cpp +++ b/services/distributeddataservice/service/test/rdb_service_impl_test.cpp @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - +#include "rdb_service_impl.h" #include "account/account_delegate.h" #include "bootstrap.h" #include "checker_mock.h" @@ -32,6 +32,7 @@ #include "rdb_types.h" #include "relational_store_manager.h" #include "gtest/gtest.h" +#include "directory/directory_manager.h" using namespace OHOS::DistributedRdb; using namespace OHOS::DistributedData; @@ -47,6 +48,7 @@ namespace DistributedRDBTest { static constexpr const char *TEST_BUNDLE = "test_rdb_service_impl_bundleName"; static constexpr const char *TEST_APPID = "test_rdb_service_impl_appid"; static constexpr const char *TEST_STORE = "test_rdb_service_impl_store"; +static constexpr uint32_t DELY_TIME = 10000; class RdbServiceImplTest : public testing::Test { public: @@ -78,6 +80,7 @@ void RdbServiceImplTest::InitMetaData() metaData_.isAutoSync = true; metaData_.storeType = DistributedRdb::RDB_DEVICE_COLLABORATION; metaData_.storeId = TEST_STORE; + metaData_.dataDir = DirectoryManager::GetInstance().GetStorePath(metaData_) + "/" + TEST_STORE; } void RdbServiceImplTest::InitMetaDataManager() @@ -158,7 +161,7 @@ HWTEST_F(RdbServiceImplTest, ResolveAutoLaunch002, TestSize.Level0) */ HWTEST_F(RdbServiceImplTest, ResolveAutoLaunch003, TestSize.Level0) { - auto ret = MetaDataManager::GetInstance().SaveMeta(metaData_.GetKey(), metaData_, false); + auto ret = MetaDataManager::GetInstance().SaveMeta(metaData_.GetKeyWithoutPath(), metaData_, false); EXPECT_EQ(ret, true); StoreMetaData meta; meta.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; @@ -171,7 +174,7 @@ HWTEST_F(RdbServiceImplTest, ResolveAutoLaunch003, TestSize.Level0) meta.area = OHOS::DistributedKv::EL1; meta.isAutoSync = true; - EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(meta.GetKey(), meta, false), true); + EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(meta.GetKeyWithoutPath(), meta, false), true); DistributedDB::AutoLaunchParam param; RdbServiceImpl service; @@ -180,7 +183,7 @@ HWTEST_F(RdbServiceImplTest, ResolveAutoLaunch003, TestSize.Level0) int32_t result = service.ResolveAutoLaunch(identifier, param); EXPECT_EQ(result, false); - EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKey(), false), true); + EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKeyWithoutPath(), false), true); } /** @@ -192,7 +195,7 @@ HWTEST_F(RdbServiceImplTest, ResolveAutoLaunch003, TestSize.Level0) */ HWTEST_F(RdbServiceImplTest, ResolveAutoLaunch004, TestSize.Level0) { - EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKey(), metaData_, false), true); + EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKeyWithoutPath(), metaData_, false), true); DistributedDB::AutoLaunchParam param; RdbServiceImpl service; RelationalStoreManager userMgr(metaData_.appId, metaData_.user, metaData_.storeId); @@ -201,7 +204,7 @@ HWTEST_F(RdbServiceImplTest, ResolveAutoLaunch004, TestSize.Level0) int32_t result = service.ResolveAutoLaunch(identifier, param); EXPECT_EQ(result, true); - EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKey(), false), true); + EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKeyWithoutPath(), false), true); } /** @@ -215,7 +218,7 @@ HWTEST_F(RdbServiceImplTest, ResolveAutoLaunch005, TestSize.Level0) { auto meta = metaData_; meta.isEncrypt = true; - EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(meta.GetKey(), meta, false), true); + EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(meta.GetKeyWithoutPath(), meta, false), true); DistributedDB::AutoLaunchParam param; RdbServiceImpl service; RelationalStoreManager userMgr1(meta.appId, meta.user, meta.storeId); @@ -224,7 +227,7 @@ HWTEST_F(RdbServiceImplTest, ResolveAutoLaunch005, TestSize.Level0) int32_t result = service.ResolveAutoLaunch(identifier, param); EXPECT_EQ(result, true); - EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(meta.GetKey(), false), true); + EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(meta.GetKeyWithoutPath(), false), true); } /** @@ -236,13 +239,13 @@ HWTEST_F(RdbServiceImplTest, ResolveAutoLaunch005, TestSize.Level0) */ HWTEST_F(RdbServiceImplTest, ResolveAutoLaunch006, TestSize.Level0) { - EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKey(), metaData_, false), true); + EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKeyWithoutPath(), metaData_, false), true); RdbServiceImpl service; auto deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; RdbSyncerParam param{ .bundleName_ = TEST_BUNDLE }; auto ret = service.ObtainDistributedTableName(param, deviceId, TEST_STORE); EXPECT_GT(ret.length(), 0); - EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKey(), false), true); + EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKeyWithoutPath(), false), true); } /** @@ -254,12 +257,12 @@ HWTEST_F(RdbServiceImplTest, ResolveAutoLaunch006, TestSize.Level0) */ HWTEST_F(RdbServiceImplTest, ObtainDistributedTableName001, TestSize.Level0) { - EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKey(), metaData_, false), true); + EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKeyWithoutPath(), metaData_, false), true); RdbServiceImpl service; RdbSyncerParam param; auto ret = service.ObtainDistributedTableName(param, "invalid_device_id", TEST_STORE); EXPECT_EQ(ret.length(), 0); - EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKey(), false), true); + EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKeyWithoutPath(), false), true); } /** @@ -280,7 +283,7 @@ HWTEST_F(RdbServiceImplTest, RemoteQuery001, TestSize.Level0) auto deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; auto ret = service.RemoteQuery(param, deviceId, "", selectionArgs); EXPECT_EQ(ret.first, RDB_ERROR); - EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKey(), false), true); + EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKeyWithoutPath(), false), true); } /** @@ -298,7 +301,7 @@ HWTEST_F(RdbServiceImplTest, RemoteQuery002, TestSize.Level0) auto deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; auto ret = service.RemoteQuery(param, deviceId, "", selectionArgs); EXPECT_EQ(ret.first, RDB_ERROR); - EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKey(), false), true); + EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKeyWithoutPath(), false), true); } /** @@ -324,11 +327,11 @@ HWTEST_F(RdbServiceImplTest, TransferStringToHex001, TestSize.Level0) */ HWTEST_F(RdbServiceImplTest, GetCallbacks001, TestSize.Level0) { - EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKey(), metaData_, false), true); + EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKeyWithoutPath(), metaData_, false), true); RdbServiceImpl service; auto ret = service.GetCallbacks(metaData_.tokenId, metaData_.storeId); EXPECT_EQ(ret, nullptr); - EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKey(), false), true); + EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKeyWithoutPath(), false), true); } /** @@ -359,7 +362,7 @@ HWTEST_F(RdbServiceImplTest, DoSync001, TestSize.Level0) */ HWTEST_F(RdbServiceImplTest, DoSync002, TestSize.Level0) { - EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKey(), metaData_, false), true); + EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKeyWithoutPath(), metaData_, false), true); RdbServiceImpl service; RdbSyncerParam param; @@ -384,7 +387,7 @@ HWTEST_F(RdbServiceImplTest, DoSync002, TestSize.Level0) auto result = service.DoSync(param, option, predicates, async); EXPECT_EQ(result, RDB_ERROR); - EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKey(), false), true); + EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKeyWithoutPath(), false), true); } /** @@ -396,13 +399,13 @@ HWTEST_F(RdbServiceImplTest, DoSync002, TestSize.Level0) */ HWTEST_F(RdbServiceImplTest, IsNeedMetaSync001, TestSize.Level0) { - EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKey(), metaData_, false), true); + EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKeyWithoutPath(), metaData_, false), true); std::vector devices = {DmAdapter::GetInstance().ToUUID(metaData_.deviceId)}; RdbServiceImpl service; bool result = service.IsNeedMetaSync(metaData_, devices); EXPECT_EQ(result, true); - EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKey(), false), true); + EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKeyWithoutPath(), false), true); } /** @@ -418,13 +421,13 @@ HWTEST_F(RdbServiceImplTest, IsNeedMetaSync002, TestSize.Level0) auto capKey = CapMetaRow::GetKeyFor(metaData_.deviceId); EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(std::string(capKey.begin(), capKey.end()), capMetaData), true); - EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKey(), metaData_, false), true); + EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKeyWithoutPath(), metaData_, false), true); std::vector devices = {DmAdapter::GetInstance().ToUUID(metaData_.deviceId)}; RdbServiceImpl service; bool result = service.IsNeedMetaSync(metaData_, devices); EXPECT_EQ(result, false); - EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKey(), false), true); + EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKeyWithoutPath(), false), true); } /** @@ -706,7 +709,7 @@ HWTEST_F(RdbServiceImplTest, AfterOpen002, TestSize.Level0) */ HWTEST_F(RdbServiceImplTest, AfterOpen003, TestSize.Level0) { - EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKey(), metaData_, false), true); + EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKeyWithoutPath(), metaData_, false), true); RdbServiceImpl service; RdbSyncerParam param; param.bundleName_ = metaData_.bundleName; @@ -714,7 +717,7 @@ HWTEST_F(RdbServiceImplTest, AfterOpen003, TestSize.Level0) int32_t result = service.AfterOpen(param); EXPECT_EQ(result, RDB_OK); - EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKey(), false), true); + EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKeyWithoutPath(), false), true); } /** @@ -756,6 +759,30 @@ HWTEST_F(RdbServiceImplTest, NotifyDataChange002, TestSize.Level0) EXPECT_EQ(result, RDB_ERROR); } +/** + * @tc.name: NotifyDataChange003 + * @tc.desc: Test NotifyDataChange when Check pass. + * @tc.type: FUNC + */ +HWTEST_F(RdbServiceImplTest, NotifyDataChange003, TestSize.Level0) +{ + RdbServiceImpl service; + RdbSyncerParam param; + param.storeName_ = "validStoreName"; + param.bundleName_ = "validBundleName"; + param.user_ = "validUser"; + param.hapName_ = "validHapName"; + param.customDir_ = "dir1/dir2"; + RdbChangedData rdbChangedData; + RdbNotifyConfig rdbNotifyConfig; + rdbNotifyConfig.delay_ = 0; + int32_t result = service.NotifyDataChange(param, rdbChangedData, rdbNotifyConfig); + EXPECT_EQ(result, RDB_OK); + rdbNotifyConfig.delay_ = DELY_TIME; + result = service.NotifyDataChange(param, rdbChangedData, rdbNotifyConfig); + EXPECT_EQ(result, RDB_OK); +} + /** * @tc.name: SetSearchable001 * @tc.desc: Test SetSearchable when CheckAccess fails. @@ -1259,7 +1286,7 @@ HWTEST_F(RdbServiceImplTest, GetDfxInfo003, TestSize.Level0) */ HWTEST_F(RdbServiceImplTest, GetDfxInfo004, TestSize.Level0) { - EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKey(), metaData_, false), true); + EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKeyWithoutPath(), metaData_, false), true); RdbServiceImpl service; RdbSyncerParam param; param.bundleName_ = TEST_BUNDLE; @@ -1267,7 +1294,7 @@ HWTEST_F(RdbServiceImplTest, GetDfxInfo004, TestSize.Level0) DistributedRdb::RdbDfxInfo dfxInfo; int32_t result = service.GetDfxInfo(param, dfxInfo); EXPECT_EQ(result, RDB_OK); - EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKey(), false), true); + EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKeyWithoutPath(), false), true); } /** @@ -1279,7 +1306,7 @@ HWTEST_F(RdbServiceImplTest, GetDfxInfo004, TestSize.Level0) */ HWTEST_F(RdbServiceImplTest, GetDfxInfo005, TestSize.Level0) { - EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKey(), metaData_, false), true); + EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKeyWithoutPath(), metaData_, false), true); EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(metaData_.GetDfxInfoKey(), metaData_, false), true); RdbServiceImpl service; RdbSyncerParam param; @@ -1288,7 +1315,7 @@ HWTEST_F(RdbServiceImplTest, GetDfxInfo005, TestSize.Level0) DistributedRdb::RdbDfxInfo dfxInfo; int32_t result = service.GetDfxInfo(param, dfxInfo); EXPECT_EQ(result, RDB_OK); - EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKey(), false), true); + EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKeyWithoutPath(), false), true); EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetDfxInfoKey(), false), true); } @@ -1319,7 +1346,7 @@ HWTEST_F(RdbServiceImplTest, LockCloudContainer001, TestSize.Level0) */ HWTEST_F(RdbServiceImplTest, LockCloudContainer002, TestSize.Level0) { - EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKey(), metaData_, false), true); + EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKeyWithoutPath(), metaData_, false), true); RdbServiceImpl service; RdbSyncerParam param; @@ -1332,7 +1359,7 @@ HWTEST_F(RdbServiceImplTest, LockCloudContainer002, TestSize.Level0) EXPECT_EQ(result.first, RDB_ERROR); EXPECT_EQ(result.second, 0); - EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKey(), false), true); + EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKeyWithoutPath(), false), true); } /** @@ -1361,7 +1388,7 @@ HWTEST_F(RdbServiceImplTest, UnlockCloudContainer001, TestSize.Level0) */ HWTEST_F(RdbServiceImplTest, UnlockCloudContainer002, TestSize.Level0) { - EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKey(), metaData_, false), true); + EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKeyWithoutPath(), metaData_, false), true); RdbServiceImpl service; RdbSyncerParam param; @@ -1373,7 +1400,7 @@ HWTEST_F(RdbServiceImplTest, UnlockCloudContainer002, TestSize.Level0) // Simulate callback execution EXPECT_EQ(result, RDB_ERROR); // Assuming the callback sets status to RDB_OK - EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKey(), false), true); + EXPECT_EQ(MetaDataManager::GetInstance().DelMeta(metaData_.GetKeyWithoutPath(), false), true); } /** @@ -1759,5 +1786,19 @@ HWTEST_F(RdbServiceImplTest, CheckParam007, TestSize.Level0) result = service.CheckParam(param); EXPECT_EQ(result, true); } + +/** + * @tc.name: Delete_001 + * @tc.desc: Test Delete when param is invalid. + * @tc.type: FUNC + */ +HWTEST_F(RdbServiceImplTest, Delete_001, TestSize.Level1) +{ + RdbServiceImpl service; + RdbSyncerParam param; + param.bundleName_ = ""; + auto errCode = service.Delete(param); + EXPECT_EQ(errCode, RDB_ERROR); +} } // namespace DistributedRDBTest } // namespace OHOS::Test \ No newline at end of file diff --git a/services/distributeddataservice/service/udmf/store/runtime_store.cpp b/services/distributeddataservice/service/udmf/store/runtime_store.cpp index 03705eeca..9117d4027 100644 --- a/services/distributeddataservice/service/udmf/store/runtime_store.cpp +++ b/services/distributeddataservice/service/udmf/store/runtime_store.cpp @@ -511,14 +511,14 @@ bool RuntimeStore::SaveMetaData() DistributedData::StoreMetaData loadLocal; DistributedData::StoreMetaData syncMeta; if (DistributedData::MetaDataManager::GetInstance().LoadMeta(saveMeta.GetKey(), loadLocal, true) && - DistributedData::MetaDataManager::GetInstance().LoadMeta(saveMeta.GetKey(), syncMeta, false)) { + DistributedData::MetaDataManager::GetInstance().LoadMeta(saveMeta.GetKeyLocalWithoutPath(), syncMeta, false)) { if (loadLocal == saveMeta && syncMeta == saveMeta) { ZLOGD("Meta data is already saved."); return true; } } - auto saved = DistributedData::MetaDataManager::GetInstance().SaveMeta(saveMeta.GetKey(), saveMeta) && + auto saved = DistributedData::MetaDataManager::GetInstance().SaveMeta(saveMeta.GetKeyWithoutPath(), saveMeta) && DistributedData::MetaDataManager::GetInstance().SaveMeta(saveMeta.GetKey(), saveMeta, true); if (!saved) { ZLOGE("SaveMeta failed, saveMeta.key:%{public}s", saveMeta.GetKey().c_str()); -- Gitee From 022615cbf11d6b43198f50c2bcab169d73dcc390 Mon Sep 17 00:00:00 2001 From: MengYao Date: Sat, 14 Jun 2025 20:08:31 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: MengYao --- .../framework/metadata/meta_data_manager.cpp | 3 + .../framework/test/BUILD.gn | 5 +- .../framework/test/meta_data_manager_test.cpp | 153 +++++++- .../framework/test/mock/db_store_mock.cpp | 364 ++++++++++++++++++ .../framework/test/mock/db_store_mock.h | 132 +++++++ 5 files changed, 650 insertions(+), 7 deletions(-) create mode 100644 services/distributeddataservice/framework/test/mock/db_store_mock.cpp create mode 100644 services/distributeddataservice/framework/test/mock/db_store_mock.h diff --git a/services/distributeddataservice/framework/metadata/meta_data_manager.cpp b/services/distributeddataservice/framework/metadata/meta_data_manager.cpp index ff46e2720..50453bfb6 100644 --- a/services/distributeddataservice/framework/metadata/meta_data_manager.cpp +++ b/services/distributeddataservice/framework/metadata/meta_data_manager.cpp @@ -357,6 +357,9 @@ bool MetaDataManager::Sync(const std::vector &devices, OnComplete c return false; } auto status = metaStore_->Sync(devices, DistributedDB::SyncMode::SYNC_MODE_PUSH_PULL, [complete](auto &dbResults) { + if (complete == nullptr) { + return; + } std::map results; for (auto &[uuid, status] : dbResults) { results.insert_or_assign(uuid, static_cast(status)); diff --git a/services/distributeddataservice/framework/test/BUILD.gn b/services/distributeddataservice/framework/test/BUILD.gn index 7864242c9..cf488b7af 100644 --- a/services/distributeddataservice/framework/test/BUILD.gn +++ b/services/distributeddataservice/framework/test/BUILD.gn @@ -262,7 +262,10 @@ ohos_unittest("FeatureTest") { ohos_unittest("MetaDataManagerTest") { module_out_path = module_output_path - sources = [ "meta_data_manager_test.cpp" ] + sources = [ + "meta_data_manager_test.cpp", + "mock/db_store_mock.cpp", + ] configs = [ ":module_private_config" ] diff --git a/services/distributeddataservice/framework/test/meta_data_manager_test.cpp b/services/distributeddataservice/framework/test/meta_data_manager_test.cpp index 6dc449c3f..b8ba534dd 100644 --- a/services/distributeddataservice/framework/test/meta_data_manager_test.cpp +++ b/services/distributeddataservice/framework/test/meta_data_manager_test.cpp @@ -14,26 +14,61 @@ */ #define LOG_TAG "MetaDataManagerTest" -#include "log_print.h" #include "metadata/meta_data_manager.h" #include + +#include "log_print.h" +#include "mock/db_store_mock.h" using namespace OHOS; using namespace testing::ext; using namespace OHOS::DistributedData; using namespace OHOS::DistributedKv; namespace OHOS::Test { +class DBStoreMockImpl; class MetaDataManagerTest : public testing::Test { public: static const std::string INVALID_DEVICE_ID; - static const std::string EMPTY_DEVICE_ID; - static void SetUpTestCase(void) {}; + static void SetUpTestCase(void); static void TearDownTestCase(void) {}; void SetUp() {}; void TearDown() {}; + static std::shared_ptr metaStore; }; const std::string MetaDataManagerTest::INVALID_DEVICE_ID = "1234567890"; -const std::string MetaDataManagerTest::EMPTY_DEVICE_ID = ""; +std::shared_ptr MetaDataManagerTest::metaStore = nullptr; +class DBStoreMockImpl : public DBStoreMock { +public: + using PutLocalBatchFunc = std::function &)>; + PutLocalBatchFunc putLocalBatchFunc; + DBStatus PutLocalBatch(const std::vector &entries) override + { + if (putLocalBatchFunc) { + return putLocalBatchFunc(entries); + } + return DBStoreMock::PutLocalBatch(entries); + } + using DeleteLocalBatchFunc = std::function &)>; + DeleteLocalBatchFunc deleteLocalBatchFunc; + DBStatus DeleteLocalBatch(const std::vector &keys) override + { + if (deleteLocalBatchFunc) { + return deleteLocalBatchFunc(keys); + } + return DBStoreMock::DeleteLocalBatch(keys); + } +}; + +void MetaDataManagerTest::SetUpTestCase(void) +{ + metaStore = std::make_shared(); + MetaDataManager::GetInstance().Initialize( + metaStore, + [](const auto &store) { + return 0; + }, + "meta"); +}; /** * @tc.name: FilterConstructorAndGetKeyTest * @tc.desc: FilterConstructor and GetKey. @@ -79,7 +114,6 @@ HWTEST_F(MetaDataManagerTest, FilterOperatorTest, TestSize.Level1) HWTEST_F(MetaDataManagerTest, SyncTest001, TestSize.Level1) { std::vector devices; - devices.emplace_back(EMPTY_DEVICE_ID); MetaDataManager::OnComplete complete; auto result = MetaDataManager::GetInstance().Sync(devices, complete); EXPECT_FALSE(result); @@ -98,6 +132,113 @@ HWTEST_F(MetaDataManagerTest, SyncTest002, TestSize.Level1) devices.emplace_back(INVALID_DEVICE_ID); MetaDataManager::OnComplete complete; auto result = MetaDataManager::GetInstance().Sync(devices, complete); - EXPECT_FALSE(result); + EXPECT_TRUE(result); +} + +/** + * @tc.name: SyncTest003 + * @tc.desc: devices is invalid. + * @tc.type: FUNC + * @tc.require: + * @tc.author: SQL + */ +HWTEST_F(MetaDataManagerTest, SyncTest003, TestSize.Level1) +{ + std::vector devices; + devices.emplace_back(INVALID_DEVICE_ID); + MetaDataManager::OnComplete complete = [](auto &results) {}; + auto result = MetaDataManager::GetInstance().Sync(devices, complete); + EXPECT_TRUE(result); +} + +/** + * @tc.name: SaveMetaTest001 + * @tc.desc: Batch save empty. + * @tc.type: FUNC + * @tc.require: + * @tc.author: + */ +HWTEST_F(MetaDataManagerTest, SaveMetaTest001, TestSize.Level1) +{ + std::vector values; + EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(values, true)); +} + +/** + * @tc.name: SaveMetaTest002 + * @tc.desc: Return error code when saving. + * @tc.type: FUNC + * @tc.require: + * @tc.author: + */ +HWTEST_F(MetaDataManagerTest, SaveMetaTest002, TestSize.Level1) +{ + std::vector values; + values.push_back({ "SaveMetaTest002", "value" }); + metaStore->putLocalBatchFunc = [](auto &entries) { + return DistributedDB::DBStatus::DB_ERROR; + }; + EXPECT_FALSE(MetaDataManager::GetInstance().SaveMeta(values, true)); + metaStore->putLocalBatchFunc = nullptr; +} + +/** + * @tc.name: SaveMetaTest004 + * @tc.desc: Trigger sync. + * @tc.type: FUNC + * @tc.require: + * @tc.author: + */ +HWTEST_F(MetaDataManagerTest, SaveMetaTest003, TestSize.Level1) +{ + metaStore->putLocalBatchFunc = nullptr; + std::vector values; + values.push_back({ "SaveMetaTest004", "value" }); + bool flag = false; + MetaDataManager::GetInstance().SetCloudSyncer([&flag]() { + flag = true; + return; + }); + EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(values, false)); + EXPECT_TRUE(flag); + MetaDataManager::GetInstance().SetCloudSyncer(nullptr); +} + +/** + * @tc.name: DelMetaTest001 + * @tc.desc: Return INVALID_PASSWD_OR_CORRUPTED_DB when del meta. + * @tc.type: FUNC + * @tc.require: + * @tc.author: + */ +HWTEST_F(MetaDataManagerTest, DelMetaTest001, TestSize.Level1) +{ + metaStore->deleteLocalBatchFunc = nullptr; + std::vector keys{ "DelMetaTest001" }; + metaStore->deleteLocalBatchFunc = [](auto &keys) { + return DistributedDB::DBStatus::DB_ERROR; + }; + EXPECT_FALSE(MetaDataManager::GetInstance().DelMeta(keys, true)); + metaStore->deleteLocalBatchFunc = nullptr; +} + +/** + * @tc.name: DelMetaTest003 + * @tc.desc: Trigger sync. + * @tc.type: FUNC + * @tc.require: + * @tc.author: + */ +HWTEST_F(MetaDataManagerTest, DelMetaTest002, TestSize.Level1) +{ + std::vector keys{ "DelMetaTest003" }; + bool flag = false; + MetaDataManager::GetInstance().SetCloudSyncer([&flag]() { + flag = true; + return; + }); + EXPECT_TRUE(MetaDataManager::GetInstance().DelMeta(keys, false)); + EXPECT_TRUE(flag); + MetaDataManager::GetInstance().SetCloudSyncer(nullptr); } } // namespace OHOS::Test \ No newline at end of file diff --git a/services/distributeddataservice/framework/test/mock/db_store_mock.cpp b/services/distributeddataservice/framework/test/mock/db_store_mock.cpp new file mode 100644 index 000000000..012561f38 --- /dev/null +++ b/services/distributeddataservice/framework/test/mock/db_store_mock.cpp @@ -0,0 +1,364 @@ +/* + * Copyright (c) 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "db_store_mock.h" + +namespace OHOS { +namespace DistributedData { +using namespace DistributedDB; +DBStatus DBStoreMock::Get(const Key &key, Value &value) const +{ + return Get(entries_, key, value); +} + +DBStatus DBStoreMock::GetEntries(const Key &keyPrefix, std::vector &entries) const +{ + return GetEntries(entries_, keyPrefix, entries); +} + +DBStatus DBStoreMock::GetEntries(const Key &keyPrefix, KvStoreResultSet *&resultSet) const +{ + resultSet = nullptr; + return NOT_SUPPORT; +} + +DBStatus DBStoreMock::GetEntries(const Query &query, std::vector &entries) const +{ + return NOT_SUPPORT; +} + +DBStatus DBStoreMock::GetEntries(const Query &query, KvStoreResultSet *&resultSet) const +{ + resultSet = nullptr; + return NOT_SUPPORT; +} + +DBStatus DBStoreMock::GetCount(const Query &query, int &count) const +{ + count = 0; + return NOT_SUPPORT; +} + +DBStatus DBStoreMock::CloseResultSet(KvStoreResultSet *&resultSet) +{ + return NOT_SUPPORT; +} + +DBStatus DBStoreMock::Put(const Key &key, const Value &value) +{ + return PutBatch(entries_, { { key, value } }); +} + +DBStatus DBStoreMock::PutBatch(const std::vector &entries) +{ + return PutBatch(entries_, entries); +} + +DBStatus DBStoreMock::DeleteBatch(const std::vector &keys) +{ + return DeleteBatch(entries_, keys); +} + +DBStatus DBStoreMock::Delete(const Key &key) +{ + return DeleteBatch(entries_, { key }); +} + +DBStatus DBStoreMock::GetLocal(const Key &key, Value &value) const +{ + return Get(localEntries_, key, value); +} + +DBStatus DBStoreMock::GetLocalEntries(const Key &keyPrefix, std::vector &entries) const +{ + return GetEntries(localEntries_, keyPrefix, entries); +} + +DBStatus DBStoreMock::PutLocal(const Key &key, const Value &value) +{ + return PutBatch(localEntries_, { { key, value } }); +} + +DBStatus DBStoreMock::DeleteLocal(const Key &key) +{ + return DeleteBatch(localEntries_, { key }); +} + +DBStatus DBStoreMock::PublishLocal(const Key &key, bool deleteLocal, bool updateTimestamp, + const KvStoreNbPublishOnConflict &onConflict) +{ + return NOT_SUPPORT; +} + +DBStatus DBStoreMock::UnpublishToLocal(const Key &key, bool deletePublic, bool updateTimestamp) +{ + return NOT_SUPPORT; +} + +DBStatus DBStoreMock::RegisterObserver(const Key &key, unsigned int mode, KvStoreObserver *observer) +{ + observers_.Compute(observer, [key](auto &, std::set &prefixes) { + prefixes.insert(key); + return !prefixes.empty(); + }); + return OK; +} + +DBStatus DBStoreMock::UnRegisterObserver(const KvStoreObserver *observer) +{ + KvStoreObserver *key = const_cast(observer); + observers_.Erase(key); + return OK; +} + +DBStatus DBStoreMock::RemoveDeviceData(const std::string &device) +{ + return NOT_SUPPORT; +} + +std::string DBStoreMock::GetStoreId() const +{ + return std::string(); +} + +DBStatus DBStoreMock::Sync(const std::vector &devices, SyncMode mode, + const std::function &)> &onComplete, bool wait) +{ + std::map result; + for (const auto &device : devices) { + result[device] = OK; + } + onComplete(result); + return OK; +} + +DBStatus DBStoreMock::Pragma(PragmaCmd cmd, PragmaData ¶mData) +{ + return NOT_SUPPORT; +} + +DBStatus DBStoreMock::SetConflictNotifier(int conflictType, const KvStoreNbConflictNotifier ¬ifier) +{ + return NOT_SUPPORT; +} + +DBStatus DBStoreMock::Rekey(const CipherPassword &password) +{ + return NOT_SUPPORT; +} + +DBStatus DBStoreMock::Export(const std::string &filePath, const CipherPassword &passwd, bool force) +{ + return NOT_SUPPORT; +} + +DBStatus DBStoreMock::Import(const std::string &filePath, const CipherPassword &passwd, bool isNeedIntegrityCheck) +{ + return NOT_SUPPORT; +} + +DBStatus DBStoreMock::StartTransaction() +{ + return NOT_SUPPORT; +} + +DBStatus DBStoreMock::Commit() +{ + return NOT_SUPPORT; +} + +DBStatus DBStoreMock::Rollback() +{ + return NOT_SUPPORT; +} + +DBStatus DBStoreMock::PutLocalBatch(const std::vector &entries) +{ + return PutBatch(localEntries_, entries); +} + +DBStatus DBStoreMock::DeleteLocalBatch(const std::vector &keys) +{ + return DeleteBatch(localEntries_, keys); +} + +DBStatus DBStoreMock::GetSecurityOption(SecurityOption &option) const +{ + return NOT_SUPPORT; +} + +DBStatus DBStoreMock::SetRemotePushFinishedNotify(const RemotePushFinishedNotifier ¬ifier) +{ + return NOT_SUPPORT; +} + +DBStatus DBStoreMock::Sync(const std::vector &devices, SyncMode mode, + const std::function &)> &onComplete, const Query &query, bool wait) +{ + return NOT_SUPPORT; +} + +DBStatus DBStoreMock::CheckIntegrity() const +{ + return NOT_SUPPORT; +} + +DBStatus DBStoreMock::SetEqualIdentifier(const std::string &identifier, const std::vector &targets) +{ + return NOT_SUPPORT; +} + +DBStatus DBStoreMock::SetPushDataInterceptor(const PushDataInterceptor &interceptor) +{ + return NOT_SUPPORT; +} +DBStatus DBStoreMock::SubscribeRemoteQuery(const std::vector &devices, + const std::function &)> &onComplete, const Query &query, bool wait) +{ + return NOT_SUPPORT; +} + +DBStatus DBStoreMock::UnSubscribeRemoteQuery(const std::vector &devices, + const std::function &)> &onComplete, const Query &query, bool wait) +{ + return NOT_SUPPORT; +} + +DBStatus DBStoreMock::RemoveDeviceData() +{ + return NOT_SUPPORT; +} + +DBStatus DBStoreMock::GetKeys(const Key &keyPrefix, std::vector &keys) const +{ + return NOT_SUPPORT; +} + +size_t DBStoreMock::GetSyncDataSize(const std::string &device) const +{ + return DEFAULT_SIZE; +} + +DBStatus DBStoreMock::Get(ConcurrentMap &store, const Key &key, Value &value) const +{ + auto it = store.Find(key); + value = std::move(it.second); + return it.first ? OK : NOT_FOUND; +} + +DBStatus DBStoreMock::GetEntries(ConcurrentMap &store, const Key &keyPrefix, + std::vector &entries) const +{ + store.ForEach([&entries, &keyPrefix](const Key &key, Value &value) { + auto it = std::search(key.begin(), key.end(), keyPrefix.begin(), keyPrefix.end()); + if (it == key.begin()) { + entries.push_back({key, value}); + } + return false; + }); + return entries.size() > 0 ? OK : NOT_FOUND; +} + +DBStatus DBStoreMock::PutBatch(ConcurrentMap &store, const std::vector &entries) +{ + return OK; +} + +DBStatus DBStoreMock::DeleteBatch(ConcurrentMap &store, const std::vector &keys) +{ + return OK; +} + +DBStatus DBStoreMock::UpdateKey(const UpdateKeyCallback &callback) +{ + return NOT_SUPPORT; +} + +std::pair DBStoreMock::GetWatermarkInfo(const std::string &device) +{ + WatermarkInfo mark; + return { DBStatus::OK, mark }; +} + +DBStatus DBStoreMock::Sync(const CloudSyncOption &option, const SyncProcessCallback &onProcess) +{ + return NOT_SUPPORT; +} + +DBStatus DBStoreMock::SetCloudDB(const std::map> &cloudDBs) +{ + return NOT_SUPPORT; +} + +DBStatus DBStoreMock::SetCloudDbSchema(const std::map &schema) +{ + return NOT_SUPPORT; +} + +DBStatus DBStoreMock::RemoveDeviceData(const std::string &device, ClearMode mode) +{ + return NOT_SUPPORT; +} + +DBStatus DBStoreMock::RemoveDeviceData(const std::string &device, const std::string &user, + ClearMode mode) +{ + return NOT_SUPPORT; +} + +int32_t DBStoreMock::GetTaskCount() +{ + return 0; +} + +void DBStoreMock::SetGenCloudVersionCallback(const GenerateCloudVersionCallback &callback) +{ +} + +std::pair> DBStoreMock::GetCloudVersion(const std::string &device) +{ + return { NOT_SUPPORT, {} }; +} + +DBStatus DBStoreMock::SetCloudSyncConfig(const CloudSyncConfig &config) +{ + return NOT_SUPPORT; +} + +DBStatus DBStoreMock::SetReceiveDataInterceptor(const DataInterceptor &interceptor) +{ + return NOT_SUPPORT; +} + +DBStatus DBStoreMock::GetDeviceEntries(const std::string &device, std::vector &entries) const +{ + return NOT_SUPPORT; +} + +DBStatus DBStoreMock::Sync(const DeviceSyncOption &option, const DeviceSyncProcessCallback &onProcess) +{ + return NOT_SUPPORT; +} + +DBStatus DBStoreMock::CancelSync(uint32_t syncId) +{ + return NOT_SUPPORT; +}; + +KvStoreNbDelegate::DatabaseStatus DBStoreMock::GetDatabaseStatus() const +{ + return {}; +} +} // namespace DistributedData +} // namespace OHOS \ No newline at end of file diff --git a/services/distributeddataservice/framework/test/mock/db_store_mock.h b/services/distributeddataservice/framework/test/mock/db_store_mock.h new file mode 100644 index 000000000..ae250effc --- /dev/null +++ b/services/distributeddataservice/framework/test/mock/db_store_mock.h @@ -0,0 +1,132 @@ +/* + * Copyright (c) 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef OHOS_DISTRIBUTEDDATA_SERVICE_TEST_DB_STORE_MOCK_H +#define OHOS_DISTRIBUTEDDATA_SERVICE_TEST_DB_STORE_MOCK_H +#include "concurrent_map.h" +#include "kv_store_nb_delegate.h" +#include "store_types.h" +namespace OHOS { +namespace DistributedData { +class DBStoreMock : public DistributedDB::KvStoreNbDelegate { +public: + using DBStatus = DistributedDB::DBStatus; + DBStatus Reset(); + using Entry = DistributedDB::Entry; + using Key = DistributedDB::Key; + using Value = DistributedDB::Value; + using KvStoreResultSet = DistributedDB::KvStoreResultSet; + using Query = DistributedDB::Query; + using KvStoreNbPublishOnConflict = DistributedDB::KvStoreNbPublishOnConflict; + using KvStoreObserver = DistributedDB::KvStoreObserver; + using SyncMode = DistributedDB::SyncMode; + using PragmaCmd = DistributedDB::PragmaCmd; + using PragmaData = DistributedDB::PragmaData; + using CipherPassword = DistributedDB::CipherPassword; + using KvStoreNbConflictNotifier = DistributedDB::KvStoreNbConflictNotifier; + using SecurityOption = DistributedDB::SecurityOption; + using RemotePushFinishedNotifier = DistributedDB::RemotePushFinishedNotifier; + using PushDataInterceptor = DistributedDB::PushDataInterceptor; + using UpdateKeyCallback = DistributedDB::UpdateKeyCallback; + using WatermarkInfo = DistributedDB::WatermarkInfo; + using ClearMode = DistributedDB::ClearMode; + using DataBaseSchema = DistributedDB::DataBaseSchema; + using ICloudDb = DistributedDB::ICloudDb; + using CloudSyncOption = DistributedDB::CloudSyncOption; + using SyncProcessCallback = DistributedDB::SyncProcessCallback; + using GenerateCloudVersionCallback = DistributedDB::GenerateCloudVersionCallback; + using CloudSyncConfig = DistributedDB::CloudSyncConfig; + using DataInterceptor = DistributedDB::DataInterceptor; + using DeviceSyncOption = DistributedDB::DeviceSyncOption; + using DeviceSyncProcessCallback = DistributedDB::DeviceSyncProcessCallback; + DBStatus Get(const Key &key, Value &value) const override; + DBStatus GetEntries(const Key &keyPrefix, std::vector &entries) const override; + DBStatus GetEntries(const Key &keyPrefix, KvStoreResultSet *&resultSet) const override; + DBStatus GetEntries(const Query &query, std::vector &entries) const override; + DBStatus GetEntries(const Query &query, KvStoreResultSet *&resultSet) const override; + DBStatus GetCount(const Query &query, int &count) const override; + DBStatus CloseResultSet(KvStoreResultSet *&resultSet) override; + DBStatus Put(const Key &key, const Value &value) override; + DBStatus PutBatch(const std::vector &entries) override; + DBStatus DeleteBatch(const std::vector &keys) override; + DBStatus Delete(const Key &key) override; + DBStatus GetLocal(const Key &key, Value &value) const override; + DBStatus GetLocalEntries(const Key &keyPrefix, std::vector &entries) const override; + DBStatus PutLocal(const Key &key, const Value &value) override; + DBStatus DeleteLocal(const Key &key) override; + DBStatus PublishLocal(const Key &key, bool deleteLocal, bool updateTimestamp, + const KvStoreNbPublishOnConflict &onConflict) override; + DBStatus UnpublishToLocal(const Key &key, bool deletePublic, bool updateTimestamp) override; + DBStatus RegisterObserver(const Key &key, unsigned int mode, KvStoreObserver *observer) override; + DBStatus UnRegisterObserver(const KvStoreObserver *observer) override; + DBStatus RemoveDeviceData(const std::string &device) override; + std::string GetStoreId() const override; + DBStatus Sync(const std::vector &devices, SyncMode mode, + const std::function &)> &onComplete, bool wait) override; + DBStatus Pragma(PragmaCmd cmd, PragmaData ¶mData) override; + DBStatus SetConflictNotifier(int conflictType, const KvStoreNbConflictNotifier ¬ifier) override; + DBStatus Rekey(const CipherPassword &password) override; + DBStatus Export(const std::string &filePath, const CipherPassword &passwd, bool force) override; + DBStatus Import(const std::string &filePath, const CipherPassword &passwd, bool isNeedIntegrityCheck) override; + DBStatus StartTransaction() override; + DBStatus Commit() override; + DBStatus Rollback() override; + DBStatus PutLocalBatch(const std::vector &entries) override; + DBStatus DeleteLocalBatch(const std::vector &keys) override; + DBStatus GetSecurityOption(SecurityOption &option) const override; + DBStatus SetRemotePushFinishedNotify(const RemotePushFinishedNotifier ¬ifier) override; + DBStatus Sync(const std::vector &devices, SyncMode mode, + const std::function &)> &onComplete, const Query &query, + bool wait) override; + DBStatus CheckIntegrity() const override; + DBStatus SetEqualIdentifier(const std::string &identifier, const std::vector &targets) override; + DBStatus SetPushDataInterceptor(const PushDataInterceptor &interceptor) override; + DBStatus SubscribeRemoteQuery(const std::vector &devices, + const std::function &)> &onComplete, const Query &query, + bool wait) override; + DBStatus UnSubscribeRemoteQuery(const std::vector &devices, + const std::function &)> &onComplete, const Query &query, + bool wait) override; + DBStatus RemoveDeviceData() override; + DBStatus GetKeys(const Key &keyPrefix, std::vector &keys) const override; + size_t GetSyncDataSize(const std::string &device) const override; + DBStatus UpdateKey(const UpdateKeyCallback &callback) override; + std::pair GetWatermarkInfo(const std::string &device) override; + DBStatus Sync(const CloudSyncOption &option, const SyncProcessCallback &onProcess) override; + DBStatus SetCloudDB(const std::map> &cloudDBs) override; + DBStatus SetCloudDbSchema(const std::map &schema) override; + DBStatus RemoveDeviceData(const std::string &device, ClearMode mode) override; + DBStatus RemoveDeviceData(const std::string &device, const std::string &user, ClearMode mode) override; + int32_t GetTaskCount() override; + void SetGenCloudVersionCallback(const GenerateCloudVersionCallback &callback) override; + std::pair> GetCloudVersion(const std::string &device) override; + DBStatus SetCloudSyncConfig(const CloudSyncConfig &config) override; + DBStatus SetReceiveDataInterceptor(const DataInterceptor &interceptor) override; + DBStatus GetDeviceEntries(const std::string &device, std::vector &entries) const override; + DBStatus Sync(const DeviceSyncOption &option, const DeviceSyncProcessCallback &onProcess) override; + DBStatus CancelSync(uint32_t syncId) override; + DatabaseStatus GetDatabaseStatus() const override; +private: + static const uint32_t DEFAULT_SIZE = 0; + DBStatus Get(ConcurrentMap &store, const Key &key, Value &value) const; + DBStatus GetEntries(ConcurrentMap &store, const Key &keyPrefix, std::vector &entries) const; + DBStatus PutBatch(ConcurrentMap &store, const std::vector &entries); + DBStatus DeleteBatch(ConcurrentMap &store, const std::vector &keys); + mutable ConcurrentMap entries_; + mutable ConcurrentMap localEntries_; + mutable ConcurrentMap> observers_; +}; +} // namespace DistributedData +} // namespace OHOS +#endif // OHOS_DISTRIBUTEDDATA_SERVICE_TEST_DB_STORE_MOCK_H -- Gitee From a6dff2f72ed2722f5b24718cd6a72b176265d0f9 Mon Sep 17 00:00:00 2001 From: MengYao Date: Sat, 14 Jun 2025 20:28:17 +0800 Subject: [PATCH 3/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: MengYao --- .../test/unittest/kvstore_meta_manager_update_key_test.cpp | 4 ++-- .../distributeddataservice/framework/test/meta_data_test.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/services/distributeddataservice/app/test/unittest/kvstore_meta_manager_update_key_test.cpp b/services/distributeddataservice/app/test/unittest/kvstore_meta_manager_update_key_test.cpp index 3d67106ca..6b7bdb28e 100644 --- a/services/distributeddataservice/app/test/unittest/kvstore_meta_manager_update_key_test.cpp +++ b/services/distributeddataservice/app/test/unittest/kvstore_meta_manager_update_key_test.cpp @@ -311,8 +311,8 @@ HWTEST_F(KvstoreMetaManagerUpdateKeyTest, KeyUpdataTest007, TestSize.Level1) MetaDataManager::GetInstance().SaveMeta(versionMeta.GetKey(), versionMeta, true); KvStoreMetaManager::GetInstance().InitMetaData(); - EXPECT_FALSE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyLocalWithoutPath(), metaDataLocal, true)); - EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyLocal(), metaDataLocal, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyLocalWithoutPath(), metaDataLocal, true)); + EXPECT_FALSE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyLocal(), metaDataLocal, true)); StoreMetaMapping storeMetaMapping(metaData); EXPECT_TRUE(MetaDataManager::GetInstance().DelMeta(storeMetaMapping.GetKey(), true)); diff --git a/services/distributeddataservice/framework/test/meta_data_test.cpp b/services/distributeddataservice/framework/test/meta_data_test.cpp index 1c740a152..053aabaae 100644 --- a/services/distributeddataservice/framework/test/meta_data_test.cpp +++ b/services/distributeddataservice/framework/test/meta_data_test.cpp @@ -575,7 +575,7 @@ HWTEST_F(ServiceMetaDataTest, StoreMetaData009, TestSize.Level1) storeMetaData.deviceId = "009_uuid"; storeMetaData.bundleName = "009_bundleName"; - std::string key = "StoreDfxInfo###009_uuid###100###default###009_bundleName###test_store###1"; + std::string key = "StoreDfxInfo###009_uuid###100###default###009_bundleName###test_store###1###"; EXPECT_EQ(storeMetaData.GetDfxInfoKeyWithoutPath(), key); } -- Gitee From c2700f1ef8889dfa8a9780f48b7973aea08db17c Mon Sep 17 00:00:00 2001 From: MengYao Date: Sat, 14 Jun 2025 23:43:04 +0800 Subject: [PATCH 4/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: MengYao --- .../kvstore_meta_manager_update_key_test.cpp | 53 ----------- .../service/rdb/rdb_service_impl.cpp | 1 - .../service/test/kvdb_service_impl_test.cpp | 89 ------------------- 3 files changed, 143 deletions(-) diff --git a/services/distributeddataservice/app/test/unittest/kvstore_meta_manager_update_key_test.cpp b/services/distributeddataservice/app/test/unittest/kvstore_meta_manager_update_key_test.cpp index 6b7bdb28e..fa747a9e0 100644 --- a/services/distributeddataservice/app/test/unittest/kvstore_meta_manager_update_key_test.cpp +++ b/services/distributeddataservice/app/test/unittest/kvstore_meta_manager_update_key_test.cpp @@ -318,57 +318,4 @@ HWTEST_F(KvstoreMetaManagerUpdateKeyTest, KeyUpdataTest007, TestSize.Level1) EXPECT_TRUE(MetaDataManager::GetInstance().DelMeta(storeMetaMapping.GetKey(), true)); EXPECT_TRUE(MetaDataManager::GetInstance().DelMeta(metaData.GetKeyLocal(), true)); } - -/** -* @tc.name: keyUpdataTestWithUuid -* @tc.desc: key updata test -* @tc.type: FUNC -* @tc.require: -* @tc.author: cjx -*/ -HWTEST_F(KvstoreMetaManagerUpdateKeyTest, KeyUpdataTest008, TestSize.Level1) -{ - auto store = KvStoreMetaManager::GetInstance().GetMetaKvStore(); - - StoreMetaData metaData; - metaData.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; - metaData.user = "KeyUpdataTest008_user"; - metaData.bundleName = "KeyUpdataTest008_bundleName"; - metaData.storeId = "KeyUpdataTest008_storeId"; - metaData.dataDir = "KeyUpdataTest008_dataDir"; - EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData.GetKeyWithoutPath(), metaData, true)); - EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData, true)); - EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData.GetKeyWithoutPath(), metaData)); - EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData)); - StoreMetaDataLocal metaDataLocal; - EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData.GetKeyLocalWithoutPath(), metaDataLocal, true)); - EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyLocalWithoutPath(), metaDataLocal, true)); - SecretKeyMetaData secretKeymetaData; - EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData.GetSecretKeyWithoutPath(), secretKeymetaData, true)); - EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetSecretKeyWithoutPath(), secretKeymetaData, true)); - - VersionMetaData versionMeta; - versionMeta.version = VersionMetaData::CURRENT_VERSION; - MetaDataManager::GetInstance().SaveMeta(versionMeta.GetKey(), versionMeta, true); - - KvStoreMetaManager::GetInstance().InitMetaData(); - metaData.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; - - EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData, true)); - EXPECT_FALSE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKey(), metaData, true)); - EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData)); - - EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyLocalWithoutPath(), metaDataLocal, true)); - EXPECT_FALSE(MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyLocal(), metaDataLocal, true)); - - EXPECT_TRUE(MetaDataManager::GetInstance().LoadMeta(metaData.GetSecretKeyWithoutPath(), secretKeymetaData, true)); - EXPECT_FALSE(MetaDataManager::GetInstance().LoadMeta(metaData.GetSecretKey(), secretKeymetaData, true)); - - StoreMetaMapping storeMetaMapping(metaData); - EXPECT_TRUE(MetaDataManager::GetInstance().DelMeta(storeMetaMapping.GetKey(), true)); - EXPECT_TRUE(MetaDataManager::GetInstance().DelMeta(metaData.GetKey(), true)); - EXPECT_TRUE(MetaDataManager::GetInstance().DelMeta(metaData.GetKeyWithoutPath())); - EXPECT_TRUE(MetaDataManager::GetInstance().DelMeta(metaData.GetKeyLocal(), true)); - EXPECT_TRUE(MetaDataManager::GetInstance().DelMeta(metaData.GetSecretKey(), true)); -} } // namespace \ No newline at end of file diff --git a/services/distributeddataservice/service/rdb/rdb_service_impl.cpp b/services/distributeddataservice/service/rdb/rdb_service_impl.cpp index 86b9a306b..edd40f201 100644 --- a/services/distributeddataservice/service/rdb/rdb_service_impl.cpp +++ b/services/distributeddataservice/service/rdb/rdb_service_impl.cpp @@ -1196,7 +1196,6 @@ int RdbServiceImpl::DoAutoSync( const std::vector &devices, const Database &dataBase, std::vector tables) { StoreMetaData storeMetaData = GetStoreMetaData(dataBase); - auto tokenId = storeMetaData.tokenId; auto store = GetStore(storeMetaData); if (store == nullptr) { ZLOGE("autosync store null, storeId:%{public}s", storeMetaData.GetStoreAlias().c_str()); diff --git a/services/distributeddataservice/service/test/kvdb_service_impl_test.cpp b/services/distributeddataservice/service/test/kvdb_service_impl_test.cpp index 5a7ae7f43..1717b304f 100644 --- a/services/distributeddataservice/service/test/kvdb_service_impl_test.cpp +++ b/services/distributeddataservice/service/test/kvdb_service_impl_test.cpp @@ -541,95 +541,6 @@ HWTEST_F(KvdbServiceImplTest, UnregServiceNotifierTest001, TestSize.Level0) ASSERT_EQ(status, Status::SUCCESS); } -/** -* @tc.name: NotifyDataChange_001 -* @tc.desc: test NotifyDataChange LoadMeta success. -* @tc.type: FUNC -*/ -HWTEST_F(KvdbServiceImplTest, NotifyDataChange_001, TestSize.Level1) -{ - EXPECT_CALL(*metaDataManagerMock, LoadMeta(testing::_, testing::_, testing::_)).WillOnce(testing::Return(true)); - StoreId id1; - id1.storeId = "id1"; - auto status = kvdbServiceImpl_->NotifyDataChange(appId, id1, 0); - EXPECT_EQ(status, Status::SUCCESS); -} - -/** -* @tc.name: NotifyDataChange_002 -* @tc.desc: test NotifyDataChange LoadMeta failed. -* @tc.type: FUNC -*/ -HWTEST_F(KvdbServiceImplTest, NotifyDataChange_002, TestSize.Level1) -{ - EXPECT_CALL(*metaDataManagerMock, LoadMeta(testing::_, testing::_, testing::_)).WillOnce(testing::Return(false)); - StoreId id1; - id1.storeId = "id1"; - auto status = kvdbServiceImpl_->NotifyDataChange(appId, id1, 0); - EXPECT_EQ(status, Status::INVALID_ARGUMENT); -} - -/** -* @tc.name: SetConfig_001 -* @tc.desc: test SetConfig LoadMeta success and SaveMeta success. -* @tc.type: FUNC -*/ -HWTEST_F(KvdbServiceImplTest, SetConfig_001, TestSize.Level1) -{ - EXPECT_CALL(*metaDataManagerMock, LoadMeta(testing::_, testing::_, testing::_)) - .WillOnce(testing::Return(true)) - .WillOnce(testing::Return(true)) - .WillOnce(testing::Return(true)); - EXPECT_CALL(*metaDataManagerMock, SaveMeta(testing::_, testing::_, testing::_)) - .WillOnce(testing::Return(true)) - .WillOnce(testing::Return(true)); - StoreId id1; - id1.storeId = "id1"; - DistributedKv::StoreConfig config; - auto status = kvdbServiceImpl_->SetConfig(appId, id1, config); - EXPECT_EQ(status, Status::SUCCESS); -} - -/** -* @tc.name: SetConfig_002 -* @tc.desc: test SetConfig LoadMeta success and SaveMeta failed. -* @tc.type: FUNC -*/ -HWTEST_F(KvdbServiceImplTest, SetConfig_002, TestSize.Level1) -{ - EXPECT_CALL(*metaDataManagerMock, LoadMeta(testing::_, testing::_, testing::_)) - .WillOnce(testing::Return(true)) - .WillOnce(testing::Return(true)) - .WillOnce(testing::Return(true)); - EXPECT_CALL(*metaDataManagerMock, SaveMeta(testing::_, testing::_, testing::_)) - .WillOnce(testing::Return(true)) - .WillOnce(testing::Return(false)); - StoreId id1; - id1.storeId = "id1"; - DistributedKv::StoreConfig config; - auto status = kvdbServiceImpl_->SetConfig(appId, id1, config); - EXPECT_EQ(status, Status::ERROR); -} - -/** -* @tc.name: SetConfig_003 -* @tc.desc: test SetConfig LoadMeta failed. -* @tc.type: FUNC -*/ -HWTEST_F(KvdbServiceImplTest, SetConfig_003, TestSize.Level1) -{ - EXPECT_CALL(*metaDataManagerMock, LoadMeta(testing::_, testing::_, testing::_)) - .WillOnce(testing::Return(true)) - .WillOnce(testing::Return(true)) - .WillOnce(testing::Return(false)); - EXPECT_CALL(*metaDataManagerMock, SaveMeta(testing::_, testing::_, testing::_)).WillOnce(testing::Return(true)); - StoreId id1; - id1.storeId = "id1"; - DistributedKv::StoreConfig config; - auto status = kvdbServiceImpl_->SetConfig(appId, id1, config); - EXPECT_EQ(status, Status::SUCCESS); -} - /** * @tc.name: HandleGenDetailsTest001 * @tc.desc: HandleGenDetails test -- Gitee From acce4b3cdca39f45c1ef53a6c445e7d560b6937b Mon Sep 17 00:00:00 2001 From: MengYao Date: Sat, 14 Jun 2025 23:55:03 +0800 Subject: [PATCH 5/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9gn?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: MengYao --- services/distributeddataservice/service/test/BUILD.gn | 2 ++ .../service/test/cloud_service_impl_test.cpp | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/services/distributeddataservice/service/test/BUILD.gn b/services/distributeddataservice/service/test/BUILD.gn index 715b5b291..7af271c21 100644 --- a/services/distributeddataservice/service/test/BUILD.gn +++ b/services/distributeddataservice/service/test/BUILD.gn @@ -82,6 +82,8 @@ ohos_unittest("CloudDataTest") { "device_manager:devicemanagersdk", "hicollie:libhicollie", "hilog:libhilog", + "googletest:gmock", + "googletest:gtest", "ipc:ipc_single", "cJSON:cjson", "kv_store:distributeddata_inner", diff --git a/services/distributeddataservice/service/test/cloud_service_impl_test.cpp b/services/distributeddataservice/service/test/cloud_service_impl_test.cpp index f7fa4e742..59672869f 100644 --- a/services/distributeddataservice/service/test/cloud_service_impl_test.cpp +++ b/services/distributeddataservice/service/test/cloud_service_impl_test.cpp @@ -435,7 +435,7 @@ HWTEST_F(CloudServiceImplTest, ConfirmInvitation001, TestSize.Level0) */ HWTEST_F(CloudServiceImplTest, GetStoreMetaData_001, TestSize.Level1) { - EXPECT_CALL(*metaDataManagerMock, LoadMeta(_, _, _)).WillOnce(Return(true)).WillOnce(Return(true)); + EXPECT_CALL(*metaDataManagerMock, LoadMeta(_, _, _)).WillOnce(Return(true)).WillOnce(Return(false)); StoreMetaData meta; bool res = cloudServiceImpl_->GetStoreMetaData(meta); EXPECT_EQ(res, true); @@ -448,7 +448,7 @@ HWTEST_F(CloudServiceImplTest, GetStoreMetaData_001, TestSize.Level1) */ HWTEST_F(CloudServiceImplTest, GetStoreMetaData_002, TestSize.Level1) { - EXPECT_CALL(*metaDataManagerMock, LoadMeta(_, _, _)).WillOnce(Return(false)); + EXPECT_CALL(*metaDataManagerMock, LoadMeta(_, _, _)).WillOnce(Return(false)).WillOnce(Return(false)); StoreMetaData meta; meta.user = "0"; bool res = cloudServiceImpl_->GetStoreMetaData(meta); -- Gitee From 6dae8992603686dddecb6bc34c6853ab6ec28543 Mon Sep 17 00:00:00 2001 From: MengYao Date: Sun, 15 Jun 2025 11:25:36 +0800 Subject: [PATCH 6/7] =?UTF-8?q?=E4=BF=AE=E8=A1=A5=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: MengYao --- .../service/rdb/rdb_service_impl.cpp | 5 ++--- .../service/test/cloud_data_test.cpp | 2 +- .../service/test/cloud_service_impl_test.cpp | 4 ++-- .../service/test/mock/meta_data_manager_mock.cpp | 9 --------- .../service/test/udmf_service_impl_mock_test.cpp | 2 +- 5 files changed, 6 insertions(+), 16 deletions(-) diff --git a/services/distributeddataservice/service/rdb/rdb_service_impl.cpp b/services/distributeddataservice/service/rdb/rdb_service_impl.cpp index edd40f201..e7d4b9075 100644 --- a/services/distributeddataservice/service/rdb/rdb_service_impl.cpp +++ b/services/distributeddataservice/service/rdb/rdb_service_impl.cpp @@ -439,7 +439,7 @@ std::pair> RdbServiceImpl::R } std::vector devices = { DmAdapter::GetInstance().ToUUID(device) }; if (IsNeedMetaSync(meta, devices) && !MetaDataManager::GetInstance().Sync( - devices, [](auto &results) {}, true)) { + devices, [](auto &results) {}, true)) { ZLOGW("bundleName:%{public}s, storeName:%{public}s. meta sync failed", param.bundleName_.c_str(), Anonymous::Change(param.storeName_).c_str()); } @@ -1814,8 +1814,7 @@ void RdbServiceImpl::RegisterEvent() StoreMetaMapping mapping(storeInfo); mapping.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; if (!MetaDataManager::GetInstance().LoadMeta(mapping.GetKey(), mapping, true)) { - ZLOGE("meta mapping empty, bundleName:%{public}s, storeId:%{public}s", mapping.bundleName.c_str(), - mapping.GetStoreAlias().c_str()); + ZLOGE("bundle:%{public}s, storeId:%{public}s", mapping.bundleName.c_str(), mapping.GetStoreAlias().c_str()); return; } StoreMetaData meta = mapping; diff --git a/services/distributeddataservice/service/test/cloud_data_test.cpp b/services/distributeddataservice/service/test/cloud_data_test.cpp index 3a6d50b56..56fa1f08d 100644 --- a/services/distributeddataservice/service/test/cloud_data_test.cpp +++ b/services/distributeddataservice/service/test/cloud_data_test.cpp @@ -340,7 +340,7 @@ HWTEST_F(CloudDataTest, GetSchema, TestSize.Level1) auto event = std::make_unique(CloudEvent::GET_SCHEMA, storeInfo); EventCenter::GetInstance().PostEvent(std::move(event)); auto ret = MetaDataManager::GetInstance().LoadMeta(cloudInfo.GetSchemaKey(TEST_CLOUD_BUNDLE), schemaMeta, true); - ASSERT_TRUE(ret); + ASSERT_FALSE(ret); } /** diff --git a/services/distributeddataservice/service/test/cloud_service_impl_test.cpp b/services/distributeddataservice/service/test/cloud_service_impl_test.cpp index 59672869f..08aea3fe6 100644 --- a/services/distributeddataservice/service/test/cloud_service_impl_test.cpp +++ b/services/distributeddataservice/service/test/cloud_service_impl_test.cpp @@ -438,7 +438,7 @@ HWTEST_F(CloudServiceImplTest, GetStoreMetaData_001, TestSize.Level1) EXPECT_CALL(*metaDataManagerMock, LoadMeta(_, _, _)).WillOnce(Return(true)).WillOnce(Return(false)); StoreMetaData meta; bool res = cloudServiceImpl_->GetStoreMetaData(meta); - EXPECT_EQ(res, true); + EXPECT_EQ(res, false); } /** @@ -481,7 +481,7 @@ HWTEST_F(CloudServiceImplTest, GetStoreMetaData_004, TestSize.Level1) StoreMetaData meta; meta.user = "100"; bool res = cloudServiceImpl_->GetStoreMetaData(meta); - EXPECT_EQ(res, true); + EXPECT_EQ(res, false); } /** diff --git a/services/distributeddataservice/service/test/mock/meta_data_manager_mock.cpp b/services/distributeddataservice/service/test/mock/meta_data_manager_mock.cpp index 56307e54d..f30af0a31 100644 --- a/services/distributeddataservice/service/test/mock/meta_data_manager_mock.cpp +++ b/services/distributeddataservice/service/test/mock/meta_data_manager_mock.cpp @@ -34,15 +34,6 @@ OHOS::DistributedData::MetaDataManager::MetaDataManager() OHOS::DistributedData::MetaDataManager::~MetaDataManager() { } -bool OHOS::DistributedData::MetaDataManager::LoadMeta(const std::string &key, Serializable &value, bool isLocal) -{ - return BMetaDataManager::metaDataManager->LoadMeta(key, value, isLocal); -} - -bool OHOS::DistributedData::MetaDataManager::SaveMeta(const std::string &key, const Serializable &value, bool isLocal) -{ - return BMetaDataManager::metaDataManager->SaveMeta(key, value, isLocal); -} template<> bool OHOS::DistributedData::MetaDataManager::LoadMeta( diff --git a/services/distributeddataservice/service/test/udmf_service_impl_mock_test.cpp b/services/distributeddataservice/service/test/udmf_service_impl_mock_test.cpp index c782a4346..dac0fb614 100644 --- a/services/distributeddataservice/service/test/udmf_service_impl_mock_test.cpp +++ b/services/distributeddataservice/service/test/udmf_service_impl_mock_test.cpp @@ -97,7 +97,7 @@ HWTEST_F(UdmfServiceImplMockTest, IsNeedMetaSyncTest001, TestSize.Level0) .WillOnce(testing::Return(true)) .WillOnce(testing::Return(true)); isNeedSync = udmfServiceImpl.IsNeedMetaSync(meta, devices); - EXPECT_EQ(isNeedSync, false); + EXPECT_EQ(isNeedSync, true); } /** -- Gitee From b77588e5d4ef614139e04f1b8b9ad11048ca13be Mon Sep 17 00:00:00 2001 From: MengYao Date: Sun, 15 Jun 2025 11:35:13 +0800 Subject: [PATCH 7/7] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: MengYao --- .../distributeddataservice/service/rdb/rdb_service_impl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/distributeddataservice/service/rdb/rdb_service_impl.cpp b/services/distributeddataservice/service/rdb/rdb_service_impl.cpp index e7d4b9075..d5b5e2ee3 100644 --- a/services/distributeddataservice/service/rdb/rdb_service_impl.cpp +++ b/services/distributeddataservice/service/rdb/rdb_service_impl.cpp @@ -439,7 +439,7 @@ std::pair> RdbServiceImpl::R } std::vector devices = { DmAdapter::GetInstance().ToUUID(device) }; if (IsNeedMetaSync(meta, devices) && !MetaDataManager::GetInstance().Sync( - devices, [](auto &results) {}, true)) { + devices, [](auto &results) {}, true)) { ZLOGW("bundleName:%{public}s, storeName:%{public}s. meta sync failed", param.bundleName_.c_str(), Anonymous::Change(param.storeName_).c_str()); } -- Gitee