From e1fde11f91f2116d0a143aa40edc40802dd835a2 Mon Sep 17 00:00:00 2001 From: z30053452 Date: Sun, 13 Jul 2025 17:30:48 +0800 Subject: [PATCH 01/15] code fix Signed-off-by: z30053452 --- services/distributeddataservice/app/BUILD.gn | 1 - .../app/src/kvstore_data_service.cpp | 10 ++++++++-- .../distributeddataservice/service/common/xcollie.h | 5 +++-- .../service/kvdb/kvdb_service_impl.cpp | 3 ++- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/services/distributeddataservice/app/BUILD.gn b/services/distributeddataservice/app/BUILD.gn index 9368b28c5..2415418df 100644 --- a/services/distributeddataservice/app/BUILD.gn +++ b/services/distributeddataservice/app/BUILD.gn @@ -93,7 +93,6 @@ ohos_shared_library("distributeddataservice") { ubsan = true } sources = [ - "${data_service_path}/service/common/xcollie.cpp", "src/clone/clone_backup_info.cpp", "src/clone/secret_key_backup_data.cpp", "src/db_info_handle_impl.cpp", diff --git a/services/distributeddataservice/app/src/kvstore_data_service.cpp b/services/distributeddataservice/app/src/kvstore_data_service.cpp index c77fc1334..797bc9762 100644 --- a/services/distributeddataservice/app/src/kvstore_data_service.cpp +++ b/services/distributeddataservice/app/src/kvstore_data_service.cpp @@ -335,7 +335,10 @@ void KvStoreDataService::OnStart() AccountDelegate::GetInstance()->RegisterHashFunc(Crypto::Sha256); DmAdapter::GetInstance().Init(executors_); AutoCache::GetInstance().Bind(executors_); - NetworkDelegate::GetInstance()->BindExecutor(executors_); + auto instance = NetworkDelegate::GetInstance(); + if (instance != nullptr) { + instance->BindExector(executors_); + } static constexpr int32_t RETRY_TIMES = 50; static constexpr int32_t RETRY_INTERVAL = 500 * 1000; // unit is ms for (BlockInteger retry(RETRY_INTERVAL); retry < RETRY_TIMES; ++retry) { @@ -404,7 +407,10 @@ void KvStoreDataService::OnAddSystemAbility(int32_t systemAbilityId, const std:: Memory::MemMgrClient::GetInstance().NotifyProcessStatus(getpid(), 1, 1, DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID); } else if (systemAbilityId == COMM_NET_CONN_MANAGER_SYS_ABILITY_ID) { - NetworkDelegate::GetInstance()->RegOnNetworkChange(); + auto instance = NetworkDelegate::GetInstance(); + if (instance != nullptr) { + instance->RegOnNetworkChange(); + } } return; } diff --git a/services/distributeddataservice/service/common/xcollie.h b/services/distributeddataservice/service/common/xcollie.h index 68f8436ce..c5a880c0d 100644 --- a/services/distributeddataservice/service/common/xcollie.h +++ b/services/distributeddataservice/service/common/xcollie.h @@ -18,6 +18,7 @@ #include #include "xcollie/xcollie.h" +#include "visibility.h" namespace OHOS::DistributedData { class XCollie { @@ -26,9 +27,9 @@ public: XCOLLIE_LOG = 0x1, XCOLLIE_RECOVERY = 0x2 }; - XCollie(const std::string &tag, uint32_t flag, uint32_t timeoutSeconds = RESTART_TIME_THRESHOLD, + API_EXPORT XCollie(const std::string &tag, uint32_t flag, uint32_t timeoutSeconds = RESTART_TIME_THRESHOLD, std::function func = nullptr, void *arg = nullptr); - ~XCollie(); + API_EXPORT ~XCollie(); private: int32_t id_ = -1; diff --git a/services/distributeddataservice/service/kvdb/kvdb_service_impl.cpp b/services/distributeddataservice/service/kvdb/kvdb_service_impl.cpp index 06373b517..a589d7d0a 100644 --- a/services/distributeddataservice/service/kvdb/kvdb_service_impl.cpp +++ b/services/distributeddataservice/service/kvdb/kvdb_service_impl.cpp @@ -1040,7 +1040,8 @@ Status KVDBServiceImpl::DoCloudSync(const StoreMetaData &meta, const SyncInfo &s if (instance == nullptr) { return Status::CLOUD_DISABLED; } - if (!NetworkDelegate::GetInstance()->IsNetworkAvailable()) { + auto network = NetworkDelegate::GetInstance(); + if (network != nullptr || !network->IsNetworkAvailable()) { return Status::NETWORK_ERROR; } std::vector users; -- Gitee From 75babf3801be7b1aee49c9da55783d3e29ef7cd6 Mon Sep 17 00:00:00 2001 From: z30053452 Date: Mon, 14 Jul 2025 11:50:21 +0800 Subject: [PATCH 02/15] code fix Signed-off-by: z30053452 --- .../distributeddataservice/app/src/kvstore_data_service.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/distributeddataservice/app/src/kvstore_data_service.cpp b/services/distributeddataservice/app/src/kvstore_data_service.cpp index 797bc9762..dffdca2bd 100644 --- a/services/distributeddataservice/app/src/kvstore_data_service.cpp +++ b/services/distributeddataservice/app/src/kvstore_data_service.cpp @@ -337,7 +337,7 @@ void KvStoreDataService::OnStart() AutoCache::GetInstance().Bind(executors_); auto instance = NetworkDelegate::GetInstance(); if (instance != nullptr) { - instance->BindExector(executors_); + instance->BindExecutor(executors_); } static constexpr int32_t RETRY_TIMES = 50; static constexpr int32_t RETRY_INTERVAL = 500 * 1000; // unit is ms -- Gitee From 1c21127d76899fc3dbd310c0df4d66ce4796160d Mon Sep 17 00:00:00 2001 From: z30053452 Date: Mon, 14 Jul 2025 19:41:29 +0800 Subject: [PATCH 03/15] code fix Signed-off-by: z30053452 --- .../app/src/kvstore_data_service.cpp | 10 ++-------- services/distributeddataservice/service/cloud/BUILD.gn | 1 - 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/services/distributeddataservice/app/src/kvstore_data_service.cpp b/services/distributeddataservice/app/src/kvstore_data_service.cpp index dffdca2bd..c77fc1334 100644 --- a/services/distributeddataservice/app/src/kvstore_data_service.cpp +++ b/services/distributeddataservice/app/src/kvstore_data_service.cpp @@ -335,10 +335,7 @@ void KvStoreDataService::OnStart() AccountDelegate::GetInstance()->RegisterHashFunc(Crypto::Sha256); DmAdapter::GetInstance().Init(executors_); AutoCache::GetInstance().Bind(executors_); - auto instance = NetworkDelegate::GetInstance(); - if (instance != nullptr) { - instance->BindExecutor(executors_); - } + NetworkDelegate::GetInstance()->BindExecutor(executors_); static constexpr int32_t RETRY_TIMES = 50; static constexpr int32_t RETRY_INTERVAL = 500 * 1000; // unit is ms for (BlockInteger retry(RETRY_INTERVAL); retry < RETRY_TIMES; ++retry) { @@ -407,10 +404,7 @@ void KvStoreDataService::OnAddSystemAbility(int32_t systemAbilityId, const std:: Memory::MemMgrClient::GetInstance().NotifyProcessStatus(getpid(), 1, 1, DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID); } else if (systemAbilityId == COMM_NET_CONN_MANAGER_SYS_ABILITY_ID) { - auto instance = NetworkDelegate::GetInstance(); - if (instance != nullptr) { - instance->RegOnNetworkChange(); - } + NetworkDelegate::GetInstance()->RegOnNetworkChange(); } return; } diff --git a/services/distributeddataservice/service/cloud/BUILD.gn b/services/distributeddataservice/service/cloud/BUILD.gn index a0772df87..1b874d23a 100755 --- a/services/distributeddataservice/service/cloud/BUILD.gn +++ b/services/distributeddataservice/service/cloud/BUILD.gn @@ -63,7 +63,6 @@ ohos_source_set("distributeddata_cloud") { ] deps = [ - "${data_service_path}/adapter/network:distributeddata_network", "${data_service_path}/adapter/schema_helper:distributeddata_schema_helper", ] -- Gitee From 5efc7ec421dd64bae6300a98de77fa7ddad22f05 Mon Sep 17 00:00:00 2001 From: z30053452 Date: Tue, 15 Jul 2025 10:43:27 +0800 Subject: [PATCH 04/15] code fix Signed-off-by: z30053452 --- services/distributeddataservice/service/BUILD.gn | 1 + .../distributeddataservice/service/kvdb/kvdb_service_impl.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/services/distributeddataservice/service/BUILD.gn b/services/distributeddataservice/service/BUILD.gn index 0eb4d94fe..799699962 100644 --- a/services/distributeddataservice/service/BUILD.gn +++ b/services/distributeddataservice/service/BUILD.gn @@ -73,6 +73,7 @@ ohos_shared_library("distributeddatasvc") { "${data_service_path}/adapter/account:distributeddata_account", "${data_service_path}/adapter/communicator:distributeddata_communicator", "${data_service_path}/adapter/dfx:distributeddata_dfx", + "${data_service_path}/adapter/network:distributeddata_network", "${data_service_path}/adapter/utils:distributeddata_utils", "${data_service_path}/framework:distributeddatasvcfwk", "${data_service_path}/service/backup:distributeddata_backup", diff --git a/services/distributeddataservice/service/kvdb/kvdb_service_impl.cpp b/services/distributeddataservice/service/kvdb/kvdb_service_impl.cpp index a589d7d0a..7c628c8d4 100644 --- a/services/distributeddataservice/service/kvdb/kvdb_service_impl.cpp +++ b/services/distributeddataservice/service/kvdb/kvdb_service_impl.cpp @@ -1041,7 +1041,7 @@ Status KVDBServiceImpl::DoCloudSync(const StoreMetaData &meta, const SyncInfo &s return Status::CLOUD_DISABLED; } auto network = NetworkDelegate::GetInstance(); - if (network != nullptr || !network->IsNetworkAvailable()) { + if (network == nullptr || !network->IsNetworkAvailable()) { return Status::NETWORK_ERROR; } std::vector users; -- Gitee From 543208ccce860cb204142120b05d3c2fe5f25a3b Mon Sep 17 00:00:00 2001 From: z30053452 Date: Thu, 17 Jul 2025 16:07:55 +0800 Subject: [PATCH 05/15] code fix Signed-off-by: z30053452 --- .../service/{ => udmf}/test/udmf_service_impl_mock_test.cpp | 4 ++-- .../service/{ => udmf}/test/udmf_service_impl_test.cpp | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename services/distributeddataservice/service/{ => udmf}/test/udmf_service_impl_mock_test.cpp (97%) rename services/distributeddataservice/service/{ => udmf}/test/udmf_service_impl_test.cpp (100%) diff --git a/services/distributeddataservice/service/test/udmf_service_impl_mock_test.cpp b/services/distributeddataservice/service/udmf/test/udmf_service_impl_mock_test.cpp similarity index 97% rename from services/distributeddataservice/service/test/udmf_service_impl_mock_test.cpp rename to services/distributeddataservice/service/udmf/test/udmf_service_impl_mock_test.cpp index 9c7e3c2db..49b5a610c 100644 --- a/services/distributeddataservice/service/test/udmf_service_impl_mock_test.cpp +++ b/services/distributeddataservice/service/udmf/test/udmf_service_impl_mock_test.cpp @@ -22,8 +22,8 @@ #include "bootstrap.h" #include "executor_pool.h" #include "ipc_skeleton.h" -#include "mock/access_token_mock.h" -#include "mock/meta_data_manager_mock.h" +#include "../../test/mock/access_token_mock.h" +#include "../../test/mock/meta_data_manager_mock.h" #include "nativetoken_kit.h" #include "token_setproc.h" #include "kvstore_meta_manager.h" diff --git a/services/distributeddataservice/service/test/udmf_service_impl_test.cpp b/services/distributeddataservice/service/udmf/test/udmf_service_impl_test.cpp similarity index 100% rename from services/distributeddataservice/service/test/udmf_service_impl_test.cpp rename to services/distributeddataservice/service/udmf/test/udmf_service_impl_test.cpp -- Gitee From 25d1615f7c5e5edf92319960fdfad18b717dca19 Mon Sep 17 00:00:00 2001 From: z30053452 Date: Thu, 17 Jul 2025 16:08:44 +0800 Subject: [PATCH 06/15] code fix Signed-off-by: z30053452 --- .../service/{udmf => }/test/udmf_service_impl_mock_test.cpp | 4 ++-- .../service/{udmf => }/test/udmf_service_impl_test.cpp | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename services/distributeddataservice/service/{udmf => }/test/udmf_service_impl_mock_test.cpp (97%) rename services/distributeddataservice/service/{udmf => }/test/udmf_service_impl_test.cpp (100%) diff --git a/services/distributeddataservice/service/udmf/test/udmf_service_impl_mock_test.cpp b/services/distributeddataservice/service/test/udmf_service_impl_mock_test.cpp similarity index 97% rename from services/distributeddataservice/service/udmf/test/udmf_service_impl_mock_test.cpp rename to services/distributeddataservice/service/test/udmf_service_impl_mock_test.cpp index 49b5a610c..9c7e3c2db 100644 --- a/services/distributeddataservice/service/udmf/test/udmf_service_impl_mock_test.cpp +++ b/services/distributeddataservice/service/test/udmf_service_impl_mock_test.cpp @@ -22,8 +22,8 @@ #include "bootstrap.h" #include "executor_pool.h" #include "ipc_skeleton.h" -#include "../../test/mock/access_token_mock.h" -#include "../../test/mock/meta_data_manager_mock.h" +#include "mock/access_token_mock.h" +#include "mock/meta_data_manager_mock.h" #include "nativetoken_kit.h" #include "token_setproc.h" #include "kvstore_meta_manager.h" diff --git a/services/distributeddataservice/service/udmf/test/udmf_service_impl_test.cpp b/services/distributeddataservice/service/test/udmf_service_impl_test.cpp similarity index 100% rename from services/distributeddataservice/service/udmf/test/udmf_service_impl_test.cpp rename to services/distributeddataservice/service/test/udmf_service_impl_test.cpp -- Gitee From e891bb11b3d9490f31258b49d14bf90453e6fcdb Mon Sep 17 00:00:00 2001 From: z30053452 Date: Thu, 17 Jul 2025 16:13:59 +0800 Subject: [PATCH 07/15] code fix Signed-off-by: z30053452 --- .../service/test/kvdb_general_store_test.cpp | 963 ------------------ 1 file changed, 963 deletions(-) diff --git a/services/distributeddataservice/service/test/kvdb_general_store_test.cpp b/services/distributeddataservice/service/test/kvdb_general_store_test.cpp index efcb43852..f3c65dd29 100644 --- a/services/distributeddataservice/service/test/kvdb_general_store_test.cpp +++ b/services/distributeddataservice/service/test/kvdb_general_store_test.cpp @@ -152,968 +152,5 @@ public: return isCleared; } }; - -/** -* @tc.name: GetDBPasswordTest_001 -* @tc.desc: get password with all exception branch -* @tc.type: FUNC -*/ -HWTEST_F(KVDBGeneralStoreTest, GetDBPasswordTest_001, TestSize.Level0) -{ - metaData_.isEncrypt = false; - auto dbPassword = KVDBGeneralStore::GetDBPassword(metaData_); - ASSERT_EQ(dbPassword.GetSize(), 0); - - MetaDataManager::GetInstance().Initialize(dbStoreMock_, nullptr, ""); - - metaData_.isEncrypt = true; - dbPassword = KVDBGeneralStore::GetDBPassword(metaData_); - ASSERT_EQ(dbPassword.GetSize(), 0); - - SecretKeyMetaData secretKey; - auto result = MetaDataManager::GetInstance().SaveMeta(metaData_.GetSecretKey(), secretKey, true); - ASSERT_TRUE(result); - dbPassword = KVDBGeneralStore::GetDBPassword(metaData_); - ASSERT_EQ(dbPassword.GetSize(), 0); - - std::vector randomKey = Random(KEY_LENGTH); - ASSERT_FALSE(randomKey.empty()); - secretKey.sKey = randomKey; - result = MetaDataManager::GetInstance().SaveMeta(metaData_.GetSecretKey(), secretKey, true); - ASSERT_TRUE(result); - dbPassword = KVDBGeneralStore::GetDBPassword(metaData_); - ASSERT_EQ(dbPassword.GetSize(), 0); -} - -/** -* @tc.name: GetDBPasswordTest_002 -* @tc.desc: GetDBPassword from meta. -* @tc.type: FUNC -*/ -HWTEST_F(KVDBGeneralStoreTest, GetDBPasswordTest_002, TestSize.Level0) -{ - MetaDataManager::GetInstance().Initialize(dbStoreMock_, nullptr, ""); - EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKey(), metaData_, true)); - EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData_.GetSecretKey(), metaData_, true)); - auto dbPassword = KVDBGeneralStore::GetDBPassword(metaData_); - ASSERT_TRUE(dbPassword.GetSize() == 0); -} - -/** -* @tc.name: GetDBPasswordTest_003 -* @tc.desc: GetDBPassword from encrypt meta. -* @tc.type: FUNC -*/ -HWTEST_F(KVDBGeneralStoreTest, GetDBPasswordTest_003, TestSize.Level0) -{ - ZLOGI("GetDBPasswordTest_002 start"); - MetaDataManager::GetInstance().Initialize(dbStoreMock_, nullptr, ""); - metaData_.isEncrypt = true; - EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKey(), metaData_, true)); - - auto errCode = CryptoManager::GetInstance().GenerateRootKey(); - EXPECT_EQ(errCode, CryptoManager::ErrCode::SUCCESS); - - std::vector randomKey = Random(KEY_LENGTH); - ASSERT_FALSE(randomKey.empty()); - SecretKeyMetaData secretKey; - secretKey.storeType = metaData_.storeType; - CryptoManager::CryptoParams encryptParams = { .area = metaData_.area, .userId = metaData_.user }; - secretKey.sKey = CryptoManager::GetInstance().Encrypt(randomKey, encryptParams); - ASSERT_FALSE(secretKey.sKey.empty()); - ASSERT_FALSE(encryptParams.nonce.empty()); - secretKey.area = metaData_.area; - secretKey.nonce = encryptParams.nonce; - EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData_.GetSecretKey(), secretKey, true)); - - auto dbPassword = KVDBGeneralStore::GetDBPassword(metaData_); - ASSERT_TRUE(dbPassword.GetSize() != 0); - randomKey.assign(randomKey.size(), 0); -} - -/** -* @tc.name: GetDBPasswordTest_004 -* @tc.desc: get password with exception branch -* @tc.type: FUNC -*/ -HWTEST_F(KVDBGeneralStoreTest, GetDBPasswordTest_004, TestSize.Level0) -{ - metaData_.bundleName = INVALID_APPID; - auto dbPassword = KVDBGeneralStore::GetDBPassword(metaData_); - ASSERT_EQ(dbPassword.GetSize(), 0); - - MetaDataManager::GetInstance().Initialize(dbStoreMock_, nullptr, ""); - - SecretKeyMetaData secretKey; - auto result = MetaDataManager::GetInstance().SaveMeta(metaData_.GetSecretKey(), secretKey, true); - ASSERT_TRUE(result); - dbPassword = KVDBGeneralStore::GetDBPassword(metaData_); - ASSERT_EQ(dbPassword.GetSize(), 0); - - auto key = Random(KEY_LENGTH); - ASSERT_FALSE(key.empty()); - secretKey.sKey = key; - result = MetaDataManager::GetInstance().SaveMeta(metaData_.GetSecretKey(), secretKey, true); - ASSERT_TRUE(result); - dbPassword = KVDBGeneralStore::GetDBPassword(metaData_); - ASSERT_EQ(dbPassword.GetSize(), 0); - MetaDataManager::GetInstance().DelMeta(metaData_.GetSecretKey(), true); -} - -/** -* @tc.name: GetDBSecurityTest -* @tc.desc: GetDBSecurity -* @tc.type: FUNC -* @tc.require: -* @tc.author: Hollokin -*/ -HWTEST_F(KVDBGeneralStoreTest, GetDBSecurityTest, TestSize.Level0) -{ - auto dbSecurity = KVDBGeneralStore::GetDBSecurity(SecurityLevel::INVALID_LABEL); - EXPECT_EQ(dbSecurity.securityLabel, DistributedDB::NOT_SET); - EXPECT_EQ(dbSecurity.securityFlag, DistributedDB::ECE); - - dbSecurity = KVDBGeneralStore::GetDBSecurity(SecurityLevel::NO_LABEL); - EXPECT_EQ(dbSecurity.securityLabel, DistributedDB::NOT_SET); - EXPECT_EQ(dbSecurity.securityFlag, DistributedDB::ECE); - - dbSecurity = KVDBGeneralStore::GetDBSecurity(SecurityLevel::S0); - EXPECT_EQ(dbSecurity.securityLabel, DistributedDB::S0); - EXPECT_EQ(dbSecurity.securityFlag, DistributedDB::ECE); - - dbSecurity = KVDBGeneralStore::GetDBSecurity(SecurityLevel::S1); - EXPECT_EQ(dbSecurity.securityLabel, DistributedDB::S1); - EXPECT_EQ(dbSecurity.securityFlag, DistributedDB::ECE); - - dbSecurity = KVDBGeneralStore::GetDBSecurity(SecurityLevel::S2); - EXPECT_EQ(dbSecurity.securityLabel, DistributedDB::S2); - EXPECT_EQ(dbSecurity.securityFlag, DistributedDB::ECE); - - dbSecurity = KVDBGeneralStore::GetDBSecurity(SecurityLevel::S3); - EXPECT_EQ(dbSecurity.securityLabel, DistributedDB::S3); - EXPECT_EQ(dbSecurity.securityFlag, DistributedDB::SECE); - - dbSecurity = KVDBGeneralStore::GetDBSecurity(SecurityLevel::S4); - EXPECT_EQ(dbSecurity.securityLabel, DistributedDB::S4); - EXPECT_EQ(dbSecurity.securityFlag, DistributedDB::ECE); - - auto action = static_cast(SecurityLevel::S4 + 1); - dbSecurity = KVDBGeneralStore::GetDBSecurity(action); - EXPECT_EQ(dbSecurity.securityLabel, DistributedDB::NOT_SET); - EXPECT_EQ(dbSecurity.securityFlag, DistributedDB::ECE); -} - -/** -* @tc.name: GetDBOptionTest -* @tc.desc: GetDBOption from meta and dbPassword -* @tc.type: FUNC -* @tc.require: -* @tc.author: Hollokin -*/ -HWTEST_F(KVDBGeneralStoreTest, GetDBOptionTest, TestSize.Level0) -{ - metaData_.isEncrypt = true; - auto dbPassword = KVDBGeneralStore::GetDBPassword(metaData_); - auto dbOption = KVDBGeneralStore::GetDBOption(metaData_, dbPassword); - EXPECT_EQ(dbOption.syncDualTupleMode, true); - EXPECT_EQ(dbOption.createIfNecessary, false); - EXPECT_EQ(dbOption.isMemoryDb, false); - EXPECT_EQ(dbOption.isEncryptedDb, metaData_.isEncrypt); - EXPECT_EQ(dbOption.isNeedCompressOnSync, metaData_.isNeedCompress); - EXPECT_EQ(dbOption.schema, metaData_.schema); - EXPECT_EQ(dbOption.passwd, dbPassword); - EXPECT_EQ(dbOption.cipher, DistributedDB::CipherType::AES_256_GCM); - EXPECT_EQ(dbOption.conflictResolvePolicy, DistributedDB::LAST_WIN); - EXPECT_EQ(dbOption.createDirByStoreIdOnly, true); - EXPECT_EQ(dbOption.secOption, KVDBGeneralStore::GetDBSecurity(metaData_.securityLevel)); -} - -/** -* @tc.name: CloseTest -* @tc.desc: Close kvdb general store and test the functionality of different branches. -* @tc.type: FUNC -* @tc.require: -* @tc.author: Hollokin -*/ -HWTEST_F(KVDBGeneralStoreTest, CloseTest, TestSize.Level0) -{ - auto store = new (std::nothrow) KVDBGeneralStore(metaData_); - ASSERT_NE(store, nullptr); - auto ret = store->Close(); - EXPECT_EQ(ret, GeneralError::E_OK); - - KvStoreNbDelegateMock mockDelegate; - mockDelegate.taskCountMock_ = 1; - store->delegate_ = &mockDelegate; - EXPECT_NE(store->delegate_, nullptr); - ret = store->Close(); - EXPECT_EQ(ret, GeneralError::E_BUSY); -} - -/** -* @tc.name: Close -* @tc.desc: RdbGeneralStore Close test -* @tc.type: FUNC -* @tc.require: -* @tc.author: shaoyuanzhao -*/ -HWTEST_F(KVDBGeneralStoreTest, BusyClose, TestSize.Level0) -{ - auto store = std::make_shared(metaData_); - ASSERT_NE(store, nullptr); - std::thread thread([store]() { - std::unique_lockrwMutex_)> lock(store->rwMutex_); - std::this_thread::sleep_for(std::chrono::seconds(1)); - }); - std::this_thread::sleep_for(std::chrono::milliseconds(500)); - auto ret = store->Close(); - EXPECT_EQ(ret, GeneralError::E_BUSY); - thread.join(); - ret = store->Close(); - EXPECT_EQ(ret, GeneralError::E_OK); -} - -/** -* @tc.name: SyncTest -* @tc.desc: Sync. -* @tc.type: FUNC -* @tc.require: -* @tc.author: Hollokin -*/ -HWTEST_F(KVDBGeneralStoreTest, SyncTest, TestSize.Level0) -{ - ZLOGI("SyncTest start"); - mkdir(("/data/service/el1/public/database/" + std::string(bundleName)).c_str(), - (S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)); - auto store = new (std::nothrow) KVDBGeneralStore(metaData_); - ASSERT_NE(store, nullptr); - uint32_t syncMode = GeneralStore::SyncMode::NEARBY_SUBSCRIBE_REMOTE; - uint32_t highMode = GeneralStore::HighMode::MANUAL_SYNC_MODE; - auto mixMode = GeneralStore::MixMode(syncMode, highMode); - std::string kvQuery = ""; - DistributedKv::KVDBQuery query(kvQuery); - SyncParam syncParam{}; - syncParam.mode = mixMode; - auto ret = store->Sync({}, query, [](const GenDetails &result) {}, syncParam); - EXPECT_NE(ret.first, GeneralError::E_OK); - auto status = store->Close(); - EXPECT_EQ(status, GeneralError::E_OK); -} - -/** -* @tc.name: BindTest -* @tc.desc: Bind test the functionality of different branches. -* @tc.type: FUNC -* @tc.require: -* @tc.author: SQL -*/ -HWTEST_F(KVDBGeneralStoreTest, BindTest, TestSize.Level0) -{ - auto store = new (std::nothrow) KVDBGeneralStore(metaData_); - ASSERT_NE(store, nullptr); - DistributedData::Database database; - std::map bindInfos; - GeneralStore::CloudConfig config; - EXPECT_EQ(bindInfos.empty(), true); - auto ret = store->Bind(database, bindInfos, config); - EXPECT_EQ(ret, GeneralError::E_OK); - - std::shared_ptr db; - std::shared_ptr loader; - GeneralStore::BindInfo bindInfo1(db, loader); - uint32_t key = 1; - bindInfos[key] = bindInfo1; - ret = store->Bind(database, bindInfos, config); - EXPECT_EQ(ret, GeneralError::E_INVALID_ARGS); - std::shared_ptr dbs = std::make_shared(); - std::shared_ptr loaders = std::make_shared(); - GeneralStore::BindInfo bindInfo2(dbs, loaders); - bindInfos[key] = bindInfo2; - EXPECT_EQ(store->IsBound(key), false); - ret = store->Bind(database, bindInfos, config); - EXPECT_EQ(ret, GeneralError::E_ALREADY_CLOSED); - - store->bindInfos_.clear(); - KvStoreNbDelegateMock mockDelegate; - store->delegate_ = &mockDelegate; - EXPECT_NE(store->delegate_, nullptr); - EXPECT_EQ(store->IsBound(key), false); - ret = store->Bind(database, bindInfos, config); - EXPECT_EQ(ret, GeneralError::E_OK); - - EXPECT_EQ(store->IsBound(key), true); - ret = store->Bind(database, bindInfos, config); - EXPECT_EQ(ret, GeneralError::E_OK); -} - -/** -* @tc.name: BindWithDifferentUsersTest -* @tc.desc: Bind test the functionality of different users. -* @tc.type: FUNC -* @tc.require: -* @tc.author: Hollokin -*/ -HWTEST_F(KVDBGeneralStoreTest, BindWithDifferentUsersTest, TestSize.Level0) -{ - auto store = new (std::nothrow) KVDBGeneralStore(metaData_); - KvStoreNbDelegateMock mockDelegate; - store->delegate_ = &mockDelegate; - EXPECT_NE(store->delegate_, nullptr); - ASSERT_NE(store, nullptr); - DistributedData::Database database; - std::map bindInfos; - GeneralStore::CloudConfig config; - - std::shared_ptr dbs = std::make_shared(); - std::shared_ptr loaders = std::make_shared(); - GeneralStore::BindInfo bindInfo(dbs, loaders); - uint32_t key0 = 100; - uint32_t key1 = 101; - bindInfos[key0] = bindInfo; - bindInfos[key1] = bindInfo; - EXPECT_EQ(store->IsBound(key0), false); - EXPECT_EQ(store->IsBound(key1), false); - auto ret = store->Bind(database, bindInfos, config); - EXPECT_EQ(ret, GeneralError::E_OK); - EXPECT_EQ(store->IsBound(key0), true); - EXPECT_EQ(store->IsBound(key1), true); - - uint32_t key2 = 102; - bindInfos[key2] = bindInfo; - EXPECT_EQ(store->IsBound(key2), false); - ret = store->Bind(database, bindInfos, config); - EXPECT_EQ(ret, GeneralError::E_OK); - EXPECT_EQ(store->IsBound(key2), true); -} - -/** -* @tc.name: GetDBSyncCompleteCB -* @tc.desc: GetDBSyncCompleteCB test the functionality of different branches. -* @tc.type: FUNC -* @tc.require: -* @tc.author: SQL -*/ -HWTEST_F(KVDBGeneralStoreTest, GetDBSyncCompleteCB, TestSize.Level0) -{ - auto store = new (std::nothrow) KVDBGeneralStore(metaData_); - ASSERT_NE(store, nullptr); - GeneralStore::DetailAsync async; - EXPECT_EQ(async, nullptr); - KVDBGeneralStore::DBSyncCallback ret = store->GetDBSyncCompleteCB(async); - EXPECT_NE(ret, nullptr); - auto asyncs = [](const GenDetails &result) {}; - EXPECT_NE(asyncs, nullptr); - ret = store->GetDBSyncCompleteCB(asyncs); - EXPECT_NE(ret, nullptr); -} - -/** -* @tc.name: CloudSync -* @tc.desc: CloudSync test the functionality of different branches. -* @tc.type: FUNC -* @tc.require: -* @tc.author: SQL -*/ -HWTEST_F(KVDBGeneralStoreTest, CloudSync, TestSize.Level0) -{ - auto store = new (std::nothrow) KVDBGeneralStore(metaData_); - ASSERT_NE(store, nullptr); - store->SetEqualIdentifier(bundleName, storeName); - KvStoreNbDelegateMock mockDelegate; - store->delegate_ = &mockDelegate; - std::vector devices = { "device1", "device2" }; - auto asyncs = [](const GenDetails &result) {}; - store->storeInfo_.user = 0; - auto cloudSyncMode = DistributedDB::SyncMode::SYNC_MODE_PUSH_ONLY; - store->SetEqualIdentifier(bundleName, storeName); - std::string prepareTraceId; - auto ret = store->CloudSync(devices, cloudSyncMode, asyncs, 0, prepareTraceId); - EXPECT_EQ(ret, DBStatus::OK); - - store->storeInfo_.user = 1; - cloudSyncMode = DistributedDB::SyncMode::SYNC_MODE_CLOUD_FORCE_PUSH; - ret = store->CloudSync(devices, cloudSyncMode, asyncs, 0, prepareTraceId); - EXPECT_EQ(ret, DBStatus::OK); -} - -/** -* @tc.name: GetIdentifierParams -* @tc.desc: GetIdentifierParams test. -* @tc.type: FUNC -* @tc.require: -* @tc.author: wangbin -*/ -HWTEST_F(KVDBGeneralStoreTest, GetIdentifierParams, TestSize.Level0) -{ - auto store = new (std::nothrow) KVDBGeneralStore(metaData_); - std::vector sameAccountDevs{}; - std::vector uuids{"uuidtest01", "uuidtest02", "uuidtest03"}; - store->GetIdentifierParams(sameAccountDevs, uuids, 0); // NO_ACCOUNT - for (const auto &devId : uuids) { - EXPECT_EQ(DMAdapter::GetInstance().IsOHOSType(devId), false); - EXPECT_EQ(DMAdapter::GetInstance().GetAuthType(devId), 0); // NO_ACCOUNT - } - EXPECT_EQ(sameAccountDevs.empty(), false); -} - -/** -* @tc.name: Sync -* @tc.desc: Sync test the functionality of different branches. -* @tc.type: FUNC -* @tc.require: -* @tc.author: SQL -*/ -HWTEST_F(KVDBGeneralStoreTest, Sync, TestSize.Level0) -{ - mkdir(("/data/service/el1/public/database/" + std::string(bundleName)).c_str(), - (S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)); - auto store = new (std::nothrow) KVDBGeneralStore(metaData_); - ASSERT_NE(store, nullptr); - uint32_t syncMode = GeneralStore::SyncMode::CLOUD_BEGIN; - uint32_t highMode = GeneralStore::HighMode::MANUAL_SYNC_MODE; - auto mixMode = GeneralStore::MixMode(syncMode, highMode); - std::string kvQuery = ""; - DistributedKv::KVDBQuery query(kvQuery); - SyncParam syncParam{}; - syncParam.mode = mixMode; - KvStoreNbDelegateMock mockDelegate; - store->delegate_ = &mockDelegate; - auto ret = store->Sync({}, query, [](const GenDetails &result) {}, syncParam); - EXPECT_EQ(ret.first, GeneralError::E_NOT_SUPPORT); - GeneralStore::StoreConfig storeConfig; - storeConfig.enableCloud_ = true; - store->SetConfig(storeConfig); - ret = store->Sync({}, query, [](const GenDetails &result) {}, syncParam); - EXPECT_EQ(ret.first, GeneralError::E_OK); - - syncMode = GeneralStore::SyncMode::NEARBY_END; - mixMode = GeneralStore::MixMode(syncMode, highMode); - syncParam.mode = mixMode; - ret = store->Sync({}, query, [](const GenDetails &result) {}, syncParam); - EXPECT_EQ(ret.first, GeneralError::E_INVALID_ARGS); - - std::vector devices = { "device1", "device2" }; - syncMode = GeneralStore::SyncMode::NEARBY_SUBSCRIBE_REMOTE; - mixMode = GeneralStore::MixMode(syncMode, highMode); - syncParam.mode = mixMode; - ret = store->Sync(devices, query, [](const GenDetails &result) {}, syncParam); - EXPECT_EQ(ret.first, GeneralError::E_OK); - - syncMode = GeneralStore::SyncMode::NEARBY_UNSUBSCRIBE_REMOTE; - mixMode = GeneralStore::MixMode(syncMode, highMode); - syncParam.mode = mixMode; - ret = store->Sync(devices, query, [](const GenDetails &result) {}, syncParam); - EXPECT_EQ(ret.first, GeneralError::E_OK); - - syncMode = GeneralStore::SyncMode::NEARBY_PULL_PUSH; - mixMode = GeneralStore::MixMode(syncMode, highMode); - syncParam.mode = mixMode; - ret = store->Sync(devices, query, [](const GenDetails &result) {}, syncParam); - EXPECT_EQ(ret.first, GeneralError::E_OK); - - syncMode = GeneralStore::SyncMode::MODE_BUTT; - mixMode = GeneralStore::MixMode(syncMode, highMode); - syncParam.mode = mixMode; - ret = store->Sync(devices, query, [](const GenDetails &result) {}, syncParam); - EXPECT_EQ(ret.first, GeneralError::E_INVALID_ARGS); -} - -/** -* @tc.name: Clean -* @tc.desc: Clean test the functionality of different branches. -* @tc.type: FUNC -* @tc.require: -* @tc.author: SQL -*/ -HWTEST_F(KVDBGeneralStoreTest, Clean, TestSize.Level0) -{ - auto store = new (std::nothrow) KVDBGeneralStore(metaData_); - ASSERT_NE(store, nullptr); - std::vector devices = { "device1", "device2" }; - std::string tableName = "tableName"; - auto ret = store->Clean(devices, -1, tableName); - EXPECT_EQ(ret, GeneralError::E_INVALID_ARGS); - ret = store->Clean(devices, 6, tableName); - EXPECT_EQ(ret, GeneralError::E_INVALID_ARGS); - ret = store->Clean(devices, GeneralStore::CleanMode::NEARBY_DATA, tableName); - EXPECT_EQ(ret, GeneralError::E_ALREADY_CLOSED); - - KvStoreNbDelegateMock mockDelegate; - store->delegate_ = &mockDelegate; - ret = store->Clean(devices, GeneralStore::CleanMode::CLOUD_INFO, tableName); - EXPECT_EQ(ret, GeneralError::E_OK); - - ret = store->Clean(devices, GeneralStore::CleanMode::CLOUD_DATA, tableName); - EXPECT_EQ(ret, GeneralError::E_OK); - - ret = store->Clean({}, GeneralStore::CleanMode::NEARBY_DATA, tableName); - EXPECT_EQ(ret, GeneralError::E_OK); - ret = store->Clean(devices, GeneralStore::CleanMode::NEARBY_DATA, tableName); - EXPECT_EQ(ret, GeneralError::E_OK); - - ret = store->Clean(devices, GeneralStore::CleanMode::LOCAL_DATA, tableName); - EXPECT_EQ(ret, GeneralError::E_ERROR); - - ret = store->Clean(devices, GeneralStore::CleanMode::CLEAN_WATER, tableName); - EXPECT_EQ(ret, GeneralError::E_OK); -} - -/** -* @tc.name: Watch -* @tc.desc: Watch and Unwatch test the functionality of different branches. -* @tc.type: FUNC -* @tc.require: -* @tc.author: SQL -*/ -HWTEST_F(KVDBGeneralStoreTest, Watch, TestSize.Level0) -{ - auto store = new (std::nothrow) KVDBGeneralStore(metaData_); - ASSERT_NE(store, nullptr); - DistributedDataTest::MockGeneralWatcher watcher; - auto ret = store->Watch(GeneralWatcher::Origin::ORIGIN_CLOUD, watcher); - EXPECT_EQ(ret, GeneralError::E_INVALID_ARGS); - ret = store->Unwatch(GeneralWatcher::Origin::ORIGIN_CLOUD, watcher); - EXPECT_EQ(ret, GeneralError::E_INVALID_ARGS); - - ret = store->Watch(GeneralWatcher::Origin::ORIGIN_ALL, watcher); - EXPECT_EQ(ret, GeneralError::E_OK); - ret = store->Watch(GeneralWatcher::Origin::ORIGIN_ALL, watcher); - EXPECT_EQ(ret, GeneralError::E_INVALID_ARGS); - - ret = store->Unwatch(GeneralWatcher::Origin::ORIGIN_ALL, watcher); - EXPECT_EQ(ret, GeneralError::E_OK); - ret = store->Unwatch(GeneralWatcher::Origin::ORIGIN_ALL, watcher); - EXPECT_EQ(ret, GeneralError::E_INVALID_ARGS); -} - -/** -* @tc.name: Release -* @tc.desc: Release and AddRef test the functionality of different branches. -* @tc.type: FUNC -* @tc.require: -* @tc.author: SQL -*/ -HWTEST_F(KVDBGeneralStoreTest, Release, TestSize.Level0) -{ - auto store = new (std::nothrow) KVDBGeneralStore(metaData_); - ASSERT_NE(store, nullptr); - auto ret = store->Release(); - EXPECT_EQ(ret, 0); - store = new (std::nothrow) KVDBGeneralStore(metaData_); - store->ref_ = 0; - ret = store->Release(); - EXPECT_EQ(ret, 0); - store->ref_ = 2; - ret = store->Release(); - EXPECT_EQ(ret, 1); - - ret = store->AddRef(); - EXPECT_EQ(ret, 2); - store->ref_ = 0; - ret = store->AddRef(); - EXPECT_EQ(ret, 0); -} - -/** -* @tc.name: ConvertStatus -* @tc.desc: ConvertStatus test the functionality of different branches. -* @tc.type: FUNC -* @tc.require: -* @tc.author: SQL -*/ -HWTEST_F(KVDBGeneralStoreTest, ConvertStatus, TestSize.Level0) -{ - auto store = new (std::nothrow) KVDBGeneralStore(metaData_); - ASSERT_NE(store, nullptr); - auto ret = store->ConvertStatus(DBStatus::OK); - EXPECT_EQ(ret, GeneralError::E_OK); - ret = store->ConvertStatus(DBStatus::CLOUD_NETWORK_ERROR); - EXPECT_EQ(ret, GeneralError::E_NETWORK_ERROR); - ret = store->ConvertStatus(DBStatus::CLOUD_LOCK_ERROR); - EXPECT_EQ(ret, GeneralError::E_LOCKED_BY_OTHERS); - ret = store->ConvertStatus(DBStatus::CLOUD_FULL_RECORDS); - EXPECT_EQ(ret, GeneralError::E_RECODE_LIMIT_EXCEEDED); - ret = store->ConvertStatus(DBStatus::CLOUD_ASSET_SPACE_INSUFFICIENT); - EXPECT_EQ(ret, GeneralError::E_NO_SPACE_FOR_ASSET); - ret = store->ConvertStatus(DBStatus::CLOUD_SYNC_TASK_MERGED); - EXPECT_EQ(ret, GeneralError::E_SYNC_TASK_MERGED); - ret = store->ConvertStatus(DBStatus::DB_ERROR); - EXPECT_EQ(ret, GeneralError::E_DB_ERROR); -} - -/** -* @tc.name: OnChange -* @tc.desc: OnChange test the functionality of different branches. -* @tc.type: FUNC -* @tc.require: -* @tc.author: SQL -*/ -HWTEST_F(KVDBGeneralStoreTest, OnChange, TestSize.Level0) -{ - auto store = new (std::nothrow) KVDBGeneralStore(metaData_); - ASSERT_NE(store, nullptr); - DistributedDataTest::MockGeneralWatcher watcher; - DistributedDataTest::MockKvStoreChangedData data; - DistributedDB::ChangedData changedData; - store->observer_.OnChange(data); - store->observer_.OnChange(DistributedDB::Origin::ORIGIN_CLOUD, "originalId", std::move(changedData)); - auto result = store->Watch(GeneralWatcher::Origin::ORIGIN_ALL, watcher); - EXPECT_EQ(result, GeneralError::E_OK); - store->observer_.OnChange(data); - store->observer_.OnChange(DistributedDB::Origin::ORIGIN_CLOUD, "originalId", std::move(changedData)); - result = store->Unwatch(GeneralWatcher::Origin::ORIGIN_ALL, watcher); - EXPECT_EQ(result, GeneralError::E_OK); -} - -/** -* @tc.name: Delete -* @tc.desc: Delete test the function. -* @tc.type: FUNC -* @tc.require: -* @tc.author: SQL -*/ -HWTEST_F(KVDBGeneralStoreTest, Delete, TestSize.Level0) -{ - auto store = new (std::nothrow) KVDBGeneralStore(metaData_); - ASSERT_NE(store, nullptr); - KvStoreNbDelegateMock mockDelegate; - store->delegate_ = &mockDelegate; - store->SetDBPushDataInterceptor(DistributedKv::KvStoreType::DEVICE_COLLABORATION); - store->SetDBReceiveDataInterceptor(DistributedKv::KvStoreType::DEVICE_COLLABORATION); - DistributedData::VBuckets values; - auto ret = store->Insert("table", std::move(values)); - EXPECT_EQ(ret, GeneralError::E_NOT_SUPPORT); - - DistributedData::Values args; - store->SetDBPushDataInterceptor(DistributedKv::KvStoreType::SINGLE_VERSION); - store->SetDBReceiveDataInterceptor(DistributedKv::KvStoreType::SINGLE_VERSION); - ret = store->Delete("table", "sql", std::move(args)); - EXPECT_EQ(ret, GeneralError::E_NOT_SUPPORT); -} - -/** -* @tc.name: Query001 -* @tc.desc: KVDBGeneralStoreTest Query function test -* @tc.type: FUNC -* @tc.require: -* @tc.author: SQL -*/ -HWTEST_F(KVDBGeneralStoreTest, Query001, TestSize.Level1) -{ - auto store = new (std::nothrow) KVDBGeneralStore(metaData_); - ASSERT_NE(store, nullptr); - std::string table = "table"; - std::string sql = "sql"; - auto [errCode, result] = store->Query(table, sql, {}); - EXPECT_EQ(errCode, GeneralError::E_NOT_SUPPORT); - EXPECT_EQ(result, nullptr); -} - -/** -* @tc.name: Query002 -* @tc.desc: KVDBGeneralStoreTest Query function test -* @tc.type: FUNC -* @tc.require: -* @tc.author: SQL -*/ -HWTEST_F(KVDBGeneralStoreTest, Query002, TestSize.Level1) -{ - auto store = new (std::nothrow) KVDBGeneralStore(metaData_); - ASSERT_NE(store, nullptr); - std::string table = "table"; - MockQuery query; - auto [errCode, result] = store->Query(table, query); - EXPECT_EQ(errCode, GeneralError::E_NOT_SUPPORT); - EXPECT_EQ(result, nullptr); -} - -/** -* @tc.name: GetDBOption -* @tc.desc: GetDBOption from meta and dbPassword -* @tc.type: FUNC -* @tc.require: -* @tc.author: -*/ -HWTEST_F(KVDBGeneralStoreTest, GetDBOption001, TestSize.Level0) -{ - metaData_.isEncrypt = false; - metaData_.appId = "distributeddata"; - auto dbPassword = KVDBGeneralStore::GetDBPassword(metaData_); - auto dbOption = KVDBGeneralStore::GetDBOption(metaData_, dbPassword); - EXPECT_FALSE(MetaDataManager::GetInstance().LoadMeta(metaData_.GetKeyLocal(), metaData_, true)); - EXPECT_EQ(metaData_.appId, Bootstrap::GetInstance().GetProcessLabel()); - EXPECT_EQ(dbOption.createIfNecessary, false); - EXPECT_EQ(dbOption.isMemoryDb, false); - EXPECT_EQ(dbOption.isEncryptedDb, metaData_.isEncrypt); - EXPECT_EQ(dbOption.isNeedCompressOnSync, metaData_.isNeedCompress); - EXPECT_EQ(dbOption.schema, metaData_.schema); - EXPECT_EQ(dbOption.conflictResolvePolicy, DistributedDB::LAST_WIN); - EXPECT_EQ(dbOption.createDirByStoreIdOnly, true); - EXPECT_EQ(dbOption.secOption, KVDBGeneralStore::GetDBSecurity(metaData_.securityLevel)); -} - -/** -* @tc.name: Sync -* @tc.desc: Sync test the functionality of different branches. -* @tc.type: FUNC -* @tc.require: -*/ -HWTEST_F(KVDBGeneralStoreTest, Sync001, TestSize.Level0) -{ - mkdir(("/data/service/el1/public/database/" + std::string(bundleName)).c_str(), - (S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)); - auto store = new (std::nothrow) KVDBGeneralStore(metaData_); - ASSERT_NE(store, nullptr); - uint32_t syncMode = GeneralStore::SyncMode::CLOUD_BEGIN; - uint32_t highMode = GeneralStore::HighMode::MANUAL_SYNC_MODE; - auto mixMode = GeneralStore::MixMode(syncMode, highMode); - std::string kvQuery = "querytest"; - DistributedKv::KVDBQuery query(kvQuery); - SyncParam syncParam{}; - syncParam.mode = mixMode; - KvStoreNbDelegateMock mockDelegate; - store->delegate_ = &mockDelegate; - EXPECT_NE(store->delegate_, nullptr); - auto ret = store->Sync({}, query, [](const GenDetails &result) {}, syncParam); - EXPECT_EQ(ret.first, GeneralError::E_NOT_SUPPORT); - GeneralStore::StoreConfig storeConfig; - storeConfig.enableCloud_ = false; - store->SetConfig(storeConfig); - ret = store->Sync({}, query, [](const GenDetails &result) {}, syncParam); - EXPECT_EQ(ret.first, GeneralError::E_NOT_SUPPORT); - - std::vector devices = { "device1", "device2" }; - syncMode = GeneralStore::SyncMode::CLOUD_END; - mixMode = GeneralStore::MixMode(syncMode, highMode); - syncParam.mode = mixMode; - ret = store->Sync({}, query, [](const GenDetails &result) {}, syncParam); - EXPECT_EQ(ret.first, GeneralError::E_INVALID_ARGS); - - syncMode = GeneralStore::SyncMode::NEARBY_PULL; - mixMode = GeneralStore::MixMode(syncMode, highMode); - syncParam.mode = mixMode; - ret = store->Sync(devices, query, [](const GenDetails &result) {}, syncParam); - EXPECT_EQ(ret.first, GeneralError::E_INVALID_ARGS); - store->delegate_ = nullptr; - delete store; -} - - -/** -* @tc.name: SetEqualIdentifier -* @tc.desc: SetEqualIdentifier test. -* @tc.type: FUNC -* @tc.require: -* @tc.author: -*/ -HWTEST_F(KVDBGeneralStoreTest, SetEqualIdentifier, TestSize.Level0) -{ - auto store = new (std::nothrow) KVDBGeneralStore(metaData_); - ASSERT_NE(store, nullptr); - std::vector sameAccountDevs{"account01", "account02", "account03"}; - std::vector uuids{"uuidtest01", "uuidtest02", "uuidtest03"}; - AppId appId01 = { "ohos.kvdbservice.test01" }; - StoreId storeId01 = { "meta_test_storeid" }; - std::string account = "account"; - store->SetEqualIdentifier(appId01, storeId01, account); - EXPECT_EQ(uuids.empty(), false); - EXPECT_EQ(sameAccountDevs.empty(), false); - delete store; -} - -/** -* @tc.name: GetIdentifierParams -* @tc.desc: GetIdentifierParams test. -* @tc.type: FUNC -* @tc.require: -*/ -HWTEST_F(KVDBGeneralStoreTest, GetIdentifierParams001, TestSize.Level0) -{ - auto store = new (std::nothrow) KVDBGeneralStore(metaData_); - ASSERT_NE(store, nullptr); - std::vector sameAccountDevs{"account01", "account02", "account03"}; - std::vector uuids{"uuidtest01", "uuidtest02", "uuidtest03"}; - store->GetIdentifierParams(sameAccountDevs, uuids, 1); // - for (const auto &devId : uuids) { - EXPECT_EQ(DMAdapter::GetInstance().IsOHOSType(devId), false); - EXPECT_EQ(DMAdapter::GetInstance().GetAuthType(devId), 0); // - } - EXPECT_EQ(sameAccountDevs.empty(), false); - delete store; -} - -/** -* @tc.name: ConvertStatus -* @tc.desc: ConvertStatus test. -* @tc.type: FUNC -* @tc.require: -* @tc.author: -*/ -HWTEST_F(KVDBGeneralStoreTest, ConvertStatus001, TestSize.Level0) -{ - auto store = new (std::nothrow) KVDBGeneralStore(metaData_); - ASSERT_NE(store, nullptr); - auto ret = store->ConvertStatus(DBStatus::NOT_SUPPORT); - EXPECT_EQ(ret, GeneralError::E_NOT_SUPPORT); - DBStatus unknownStatus = static_cast(0xDEAD); - ret = store->ConvertStatus(unknownStatus); - EXPECT_EQ(ret, GeneralError::E_ERROR); - delete store; -} - -/** -* @tc.name: GetDBProcessCB -* @tc.desc: GetDBProcessCB test. -* @tc.type: FUNC -* @tc.require: -*/ -HWTEST_F(KVDBGeneralStoreTest, GetDBProcessCB, TestSize.Level0) -{ - auto store = new (std::nothrow) KVDBGeneralStore(metaData_); - ASSERT_NE(store, nullptr); - bool asyncCalled = false; - auto async = [&asyncCalled](const DistributedData::GenDetails &details) { - asyncCalled = true; - EXPECT_TRUE(details.empty()); - }; - - std::map processes; - auto callback = store->GetDBProcessCB(async); - callback(processes); - EXPECT_TRUE(asyncCalled); - delete store; -} - -/** -* @tc.name: GetDBProcessCB -* @tc.desc: GetDBProcessCB test. -* @tc.type: FUNC -* @tc.require: -*/ -HWTEST_F(KVDBGeneralStoreTest, GetDBProcessCB001, TestSize.Level0) -{ - auto store = new (std::nothrow) KVDBGeneralStore(metaData_); - ASSERT_NE(store, nullptr); - GeneralStore::DetailAsync async; - EXPECT_EQ(async, nullptr); - auto process = store->GetDBProcessCB(async); - EXPECT_NE(process, nullptr); - auto asyncs = [](const GenDetails &result) {}; - EXPECT_NE(asyncs, nullptr); - process = store->GetDBProcessCB(asyncs); - EXPECT_NE(process, nullptr); - store->delegate_ = nullptr; - delete store; -} - -/** -* @tc.name: GetDBProcessCB -* @tc.desc: GetDBProcessCB test. -* @tc.type: FUNC -* @tc.require: -*/ -HWTEST_F(KVDBGeneralStoreTest, GetDBProcessCB002, TestSize.Level0) -{ - auto store = new (std::nothrow) KVDBGeneralStore(metaData_); - ASSERT_NE(store, nullptr); - std::map processes = {{"test_id", {}}}; - GeneralStore::DetailAsync async; - EXPECT_EQ(async, nullptr); - auto callback = store->GetDBProcessCB(async); - callback(processes); - delete store; -} - -/** -* @tc.name: Delete -* @tc.desc: Delete test the function. -* @tc.type: FUNC -* @tc.require: -*/ -HWTEST_F(KVDBGeneralStoreTest, SetDBPushDataInterceptor, TestSize.Level0) -{ - auto store = new (std::nothrow) KVDBGeneralStore(metaData_); - ASSERT_NE(store, nullptr); - KvStoreNbDelegateMock mockDelegate; - store->delegate_ = &mockDelegate; - EXPECT_NE(store->delegate_, nullptr); - store->SetDBPushDataInterceptor(DistributedKv::KvStoreType::MULTI_VERSION); - store->SetDBReceiveDataInterceptor(DistributedKv::KvStoreType::MULTI_VERSION); - EXPECT_NE(metaData_.storeType, DistributedKv::KvStoreType::MULTI_VERSION); - - store->SetDBPushDataInterceptor(DistributedKv::KvStoreType::SINGLE_VERSION); - store->SetDBReceiveDataInterceptor(DistributedKv::KvStoreType::SINGLE_VERSION); - EXPECT_EQ(metaData_.storeType, DistributedKv::KvStoreType::SINGLE_VERSION); - store->delegate_ = nullptr; - delete store; -} - -/** -* @tc.name: CloseTest -* @tc.desc: Close kvdb general store -* @tc.type: FUNC -* @tc.require: -*/ -HWTEST_F(KVDBGeneralStoreTest, CloseTest001, TestSize.Level0) -{ - auto store = new (std::nothrow) KVDBGeneralStore(metaData_); - ASSERT_NE(store, nullptr); - EXPECT_EQ(store->delegate_, nullptr); - auto ret = store->Close(); - EXPECT_EQ(ret, GeneralError::E_OK); - - bool isForce = false; - ret = store->Close(isForce); - EXPECT_EQ(ret, DBStatus::OK); - delete store; -} - -/** -* @tc.name: ConstructorTest -* @tc.desc: Test KVDBGeneralStore constructor with different scenarios -* @tc.type: FUNC -* @tc.require: -*/ -HWTEST_F(KVDBGeneralStoreTest, ConstructorTest, TestSize.Level0) -{ - // Test manager initialization with same appId - metaData_.appId = Bootstrap::GetInstance().GetProcessLabel(); - auto store1 = new (std::nothrow) KVDBGeneralStore(metaData_); - ASSERT_NE(store1, nullptr); - delete store1; - - // Test manager initialization with different appId - metaData_.appId = "different_app_id"; - auto store2 = new (std::nothrow) KVDBGeneralStore(metaData_); - ASSERT_NE(store2, nullptr); - delete store2; - - // Test GetKvStore failure path - metaData_.storeId = "invalid_store"; - auto store3 = new (std::nothrow) KVDBGeneralStore(metaData_); - ASSERT_NE(store3, nullptr); - EXPECT_EQ(store3->delegate_, nullptr); - delete store3; - - // Test observer registration - metaData_.storeId = storeName; - metaData_.storeType = DistributedKv::KvStoreType::SINGLE_VERSION; - auto store4 = new (std::nothrow) KVDBGeneralStore(metaData_); - ASSERT_NE(store4, nullptr); - delete store4; - - // Test remote push notification setup - metaData_.storeType = DistributedKv::KvStoreType::DEVICE_COLLABORATION; - auto store5 = new (std::nothrow) KVDBGeneralStore(metaData_); - ASSERT_NE(store5, nullptr); - delete store5; - - // Test auto-sync configuration - metaData_.isAutoSync = true; - auto store6 = new (std::nothrow) KVDBGeneralStore(metaData_); - ASSERT_NE(store6, nullptr); - EXPECT_EQ(store6->delegate_, nullptr); - delete store6; -} } // namespace DistributedDataTest } // namespace OHOS::Test \ No newline at end of file -- Gitee From c268963c767525942caee13555d1c461ee6d6c4e Mon Sep 17 00:00:00 2001 From: z30053452 Date: Thu, 17 Jul 2025 16:14:35 +0800 Subject: [PATCH 08/15] code fix Signed-off-by: z30053452 --- .../service/test/kvdb_general_store_test.cpp | 963 ++++++++++++++++++ 1 file changed, 963 insertions(+) diff --git a/services/distributeddataservice/service/test/kvdb_general_store_test.cpp b/services/distributeddataservice/service/test/kvdb_general_store_test.cpp index f3c65dd29..efcb43852 100644 --- a/services/distributeddataservice/service/test/kvdb_general_store_test.cpp +++ b/services/distributeddataservice/service/test/kvdb_general_store_test.cpp @@ -152,5 +152,968 @@ public: return isCleared; } }; + +/** +* @tc.name: GetDBPasswordTest_001 +* @tc.desc: get password with all exception branch +* @tc.type: FUNC +*/ +HWTEST_F(KVDBGeneralStoreTest, GetDBPasswordTest_001, TestSize.Level0) +{ + metaData_.isEncrypt = false; + auto dbPassword = KVDBGeneralStore::GetDBPassword(metaData_); + ASSERT_EQ(dbPassword.GetSize(), 0); + + MetaDataManager::GetInstance().Initialize(dbStoreMock_, nullptr, ""); + + metaData_.isEncrypt = true; + dbPassword = KVDBGeneralStore::GetDBPassword(metaData_); + ASSERT_EQ(dbPassword.GetSize(), 0); + + SecretKeyMetaData secretKey; + auto result = MetaDataManager::GetInstance().SaveMeta(metaData_.GetSecretKey(), secretKey, true); + ASSERT_TRUE(result); + dbPassword = KVDBGeneralStore::GetDBPassword(metaData_); + ASSERT_EQ(dbPassword.GetSize(), 0); + + std::vector randomKey = Random(KEY_LENGTH); + ASSERT_FALSE(randomKey.empty()); + secretKey.sKey = randomKey; + result = MetaDataManager::GetInstance().SaveMeta(metaData_.GetSecretKey(), secretKey, true); + ASSERT_TRUE(result); + dbPassword = KVDBGeneralStore::GetDBPassword(metaData_); + ASSERT_EQ(dbPassword.GetSize(), 0); +} + +/** +* @tc.name: GetDBPasswordTest_002 +* @tc.desc: GetDBPassword from meta. +* @tc.type: FUNC +*/ +HWTEST_F(KVDBGeneralStoreTest, GetDBPasswordTest_002, TestSize.Level0) +{ + MetaDataManager::GetInstance().Initialize(dbStoreMock_, nullptr, ""); + EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKey(), metaData_, true)); + EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData_.GetSecretKey(), metaData_, true)); + auto dbPassword = KVDBGeneralStore::GetDBPassword(metaData_); + ASSERT_TRUE(dbPassword.GetSize() == 0); +} + +/** +* @tc.name: GetDBPasswordTest_003 +* @tc.desc: GetDBPassword from encrypt meta. +* @tc.type: FUNC +*/ +HWTEST_F(KVDBGeneralStoreTest, GetDBPasswordTest_003, TestSize.Level0) +{ + ZLOGI("GetDBPasswordTest_002 start"); + MetaDataManager::GetInstance().Initialize(dbStoreMock_, nullptr, ""); + metaData_.isEncrypt = true; + EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData_.GetKey(), metaData_, true)); + + auto errCode = CryptoManager::GetInstance().GenerateRootKey(); + EXPECT_EQ(errCode, CryptoManager::ErrCode::SUCCESS); + + std::vector randomKey = Random(KEY_LENGTH); + ASSERT_FALSE(randomKey.empty()); + SecretKeyMetaData secretKey; + secretKey.storeType = metaData_.storeType; + CryptoManager::CryptoParams encryptParams = { .area = metaData_.area, .userId = metaData_.user }; + secretKey.sKey = CryptoManager::GetInstance().Encrypt(randomKey, encryptParams); + ASSERT_FALSE(secretKey.sKey.empty()); + ASSERT_FALSE(encryptParams.nonce.empty()); + secretKey.area = metaData_.area; + secretKey.nonce = encryptParams.nonce; + EXPECT_TRUE(MetaDataManager::GetInstance().SaveMeta(metaData_.GetSecretKey(), secretKey, true)); + + auto dbPassword = KVDBGeneralStore::GetDBPassword(metaData_); + ASSERT_TRUE(dbPassword.GetSize() != 0); + randomKey.assign(randomKey.size(), 0); +} + +/** +* @tc.name: GetDBPasswordTest_004 +* @tc.desc: get password with exception branch +* @tc.type: FUNC +*/ +HWTEST_F(KVDBGeneralStoreTest, GetDBPasswordTest_004, TestSize.Level0) +{ + metaData_.bundleName = INVALID_APPID; + auto dbPassword = KVDBGeneralStore::GetDBPassword(metaData_); + ASSERT_EQ(dbPassword.GetSize(), 0); + + MetaDataManager::GetInstance().Initialize(dbStoreMock_, nullptr, ""); + + SecretKeyMetaData secretKey; + auto result = MetaDataManager::GetInstance().SaveMeta(metaData_.GetSecretKey(), secretKey, true); + ASSERT_TRUE(result); + dbPassword = KVDBGeneralStore::GetDBPassword(metaData_); + ASSERT_EQ(dbPassword.GetSize(), 0); + + auto key = Random(KEY_LENGTH); + ASSERT_FALSE(key.empty()); + secretKey.sKey = key; + result = MetaDataManager::GetInstance().SaveMeta(metaData_.GetSecretKey(), secretKey, true); + ASSERT_TRUE(result); + dbPassword = KVDBGeneralStore::GetDBPassword(metaData_); + ASSERT_EQ(dbPassword.GetSize(), 0); + MetaDataManager::GetInstance().DelMeta(metaData_.GetSecretKey(), true); +} + +/** +* @tc.name: GetDBSecurityTest +* @tc.desc: GetDBSecurity +* @tc.type: FUNC +* @tc.require: +* @tc.author: Hollokin +*/ +HWTEST_F(KVDBGeneralStoreTest, GetDBSecurityTest, TestSize.Level0) +{ + auto dbSecurity = KVDBGeneralStore::GetDBSecurity(SecurityLevel::INVALID_LABEL); + EXPECT_EQ(dbSecurity.securityLabel, DistributedDB::NOT_SET); + EXPECT_EQ(dbSecurity.securityFlag, DistributedDB::ECE); + + dbSecurity = KVDBGeneralStore::GetDBSecurity(SecurityLevel::NO_LABEL); + EXPECT_EQ(dbSecurity.securityLabel, DistributedDB::NOT_SET); + EXPECT_EQ(dbSecurity.securityFlag, DistributedDB::ECE); + + dbSecurity = KVDBGeneralStore::GetDBSecurity(SecurityLevel::S0); + EXPECT_EQ(dbSecurity.securityLabel, DistributedDB::S0); + EXPECT_EQ(dbSecurity.securityFlag, DistributedDB::ECE); + + dbSecurity = KVDBGeneralStore::GetDBSecurity(SecurityLevel::S1); + EXPECT_EQ(dbSecurity.securityLabel, DistributedDB::S1); + EXPECT_EQ(dbSecurity.securityFlag, DistributedDB::ECE); + + dbSecurity = KVDBGeneralStore::GetDBSecurity(SecurityLevel::S2); + EXPECT_EQ(dbSecurity.securityLabel, DistributedDB::S2); + EXPECT_EQ(dbSecurity.securityFlag, DistributedDB::ECE); + + dbSecurity = KVDBGeneralStore::GetDBSecurity(SecurityLevel::S3); + EXPECT_EQ(dbSecurity.securityLabel, DistributedDB::S3); + EXPECT_EQ(dbSecurity.securityFlag, DistributedDB::SECE); + + dbSecurity = KVDBGeneralStore::GetDBSecurity(SecurityLevel::S4); + EXPECT_EQ(dbSecurity.securityLabel, DistributedDB::S4); + EXPECT_EQ(dbSecurity.securityFlag, DistributedDB::ECE); + + auto action = static_cast(SecurityLevel::S4 + 1); + dbSecurity = KVDBGeneralStore::GetDBSecurity(action); + EXPECT_EQ(dbSecurity.securityLabel, DistributedDB::NOT_SET); + EXPECT_EQ(dbSecurity.securityFlag, DistributedDB::ECE); +} + +/** +* @tc.name: GetDBOptionTest +* @tc.desc: GetDBOption from meta and dbPassword +* @tc.type: FUNC +* @tc.require: +* @tc.author: Hollokin +*/ +HWTEST_F(KVDBGeneralStoreTest, GetDBOptionTest, TestSize.Level0) +{ + metaData_.isEncrypt = true; + auto dbPassword = KVDBGeneralStore::GetDBPassword(metaData_); + auto dbOption = KVDBGeneralStore::GetDBOption(metaData_, dbPassword); + EXPECT_EQ(dbOption.syncDualTupleMode, true); + EXPECT_EQ(dbOption.createIfNecessary, false); + EXPECT_EQ(dbOption.isMemoryDb, false); + EXPECT_EQ(dbOption.isEncryptedDb, metaData_.isEncrypt); + EXPECT_EQ(dbOption.isNeedCompressOnSync, metaData_.isNeedCompress); + EXPECT_EQ(dbOption.schema, metaData_.schema); + EXPECT_EQ(dbOption.passwd, dbPassword); + EXPECT_EQ(dbOption.cipher, DistributedDB::CipherType::AES_256_GCM); + EXPECT_EQ(dbOption.conflictResolvePolicy, DistributedDB::LAST_WIN); + EXPECT_EQ(dbOption.createDirByStoreIdOnly, true); + EXPECT_EQ(dbOption.secOption, KVDBGeneralStore::GetDBSecurity(metaData_.securityLevel)); +} + +/** +* @tc.name: CloseTest +* @tc.desc: Close kvdb general store and test the functionality of different branches. +* @tc.type: FUNC +* @tc.require: +* @tc.author: Hollokin +*/ +HWTEST_F(KVDBGeneralStoreTest, CloseTest, TestSize.Level0) +{ + auto store = new (std::nothrow) KVDBGeneralStore(metaData_); + ASSERT_NE(store, nullptr); + auto ret = store->Close(); + EXPECT_EQ(ret, GeneralError::E_OK); + + KvStoreNbDelegateMock mockDelegate; + mockDelegate.taskCountMock_ = 1; + store->delegate_ = &mockDelegate; + EXPECT_NE(store->delegate_, nullptr); + ret = store->Close(); + EXPECT_EQ(ret, GeneralError::E_BUSY); +} + +/** +* @tc.name: Close +* @tc.desc: RdbGeneralStore Close test +* @tc.type: FUNC +* @tc.require: +* @tc.author: shaoyuanzhao +*/ +HWTEST_F(KVDBGeneralStoreTest, BusyClose, TestSize.Level0) +{ + auto store = std::make_shared(metaData_); + ASSERT_NE(store, nullptr); + std::thread thread([store]() { + std::unique_lockrwMutex_)> lock(store->rwMutex_); + std::this_thread::sleep_for(std::chrono::seconds(1)); + }); + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + auto ret = store->Close(); + EXPECT_EQ(ret, GeneralError::E_BUSY); + thread.join(); + ret = store->Close(); + EXPECT_EQ(ret, GeneralError::E_OK); +} + +/** +* @tc.name: SyncTest +* @tc.desc: Sync. +* @tc.type: FUNC +* @tc.require: +* @tc.author: Hollokin +*/ +HWTEST_F(KVDBGeneralStoreTest, SyncTest, TestSize.Level0) +{ + ZLOGI("SyncTest start"); + mkdir(("/data/service/el1/public/database/" + std::string(bundleName)).c_str(), + (S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)); + auto store = new (std::nothrow) KVDBGeneralStore(metaData_); + ASSERT_NE(store, nullptr); + uint32_t syncMode = GeneralStore::SyncMode::NEARBY_SUBSCRIBE_REMOTE; + uint32_t highMode = GeneralStore::HighMode::MANUAL_SYNC_MODE; + auto mixMode = GeneralStore::MixMode(syncMode, highMode); + std::string kvQuery = ""; + DistributedKv::KVDBQuery query(kvQuery); + SyncParam syncParam{}; + syncParam.mode = mixMode; + auto ret = store->Sync({}, query, [](const GenDetails &result) {}, syncParam); + EXPECT_NE(ret.first, GeneralError::E_OK); + auto status = store->Close(); + EXPECT_EQ(status, GeneralError::E_OK); +} + +/** +* @tc.name: BindTest +* @tc.desc: Bind test the functionality of different branches. +* @tc.type: FUNC +* @tc.require: +* @tc.author: SQL +*/ +HWTEST_F(KVDBGeneralStoreTest, BindTest, TestSize.Level0) +{ + auto store = new (std::nothrow) KVDBGeneralStore(metaData_); + ASSERT_NE(store, nullptr); + DistributedData::Database database; + std::map bindInfos; + GeneralStore::CloudConfig config; + EXPECT_EQ(bindInfos.empty(), true); + auto ret = store->Bind(database, bindInfos, config); + EXPECT_EQ(ret, GeneralError::E_OK); + + std::shared_ptr db; + std::shared_ptr loader; + GeneralStore::BindInfo bindInfo1(db, loader); + uint32_t key = 1; + bindInfos[key] = bindInfo1; + ret = store->Bind(database, bindInfos, config); + EXPECT_EQ(ret, GeneralError::E_INVALID_ARGS); + std::shared_ptr dbs = std::make_shared(); + std::shared_ptr loaders = std::make_shared(); + GeneralStore::BindInfo bindInfo2(dbs, loaders); + bindInfos[key] = bindInfo2; + EXPECT_EQ(store->IsBound(key), false); + ret = store->Bind(database, bindInfos, config); + EXPECT_EQ(ret, GeneralError::E_ALREADY_CLOSED); + + store->bindInfos_.clear(); + KvStoreNbDelegateMock mockDelegate; + store->delegate_ = &mockDelegate; + EXPECT_NE(store->delegate_, nullptr); + EXPECT_EQ(store->IsBound(key), false); + ret = store->Bind(database, bindInfos, config); + EXPECT_EQ(ret, GeneralError::E_OK); + + EXPECT_EQ(store->IsBound(key), true); + ret = store->Bind(database, bindInfos, config); + EXPECT_EQ(ret, GeneralError::E_OK); +} + +/** +* @tc.name: BindWithDifferentUsersTest +* @tc.desc: Bind test the functionality of different users. +* @tc.type: FUNC +* @tc.require: +* @tc.author: Hollokin +*/ +HWTEST_F(KVDBGeneralStoreTest, BindWithDifferentUsersTest, TestSize.Level0) +{ + auto store = new (std::nothrow) KVDBGeneralStore(metaData_); + KvStoreNbDelegateMock mockDelegate; + store->delegate_ = &mockDelegate; + EXPECT_NE(store->delegate_, nullptr); + ASSERT_NE(store, nullptr); + DistributedData::Database database; + std::map bindInfos; + GeneralStore::CloudConfig config; + + std::shared_ptr dbs = std::make_shared(); + std::shared_ptr loaders = std::make_shared(); + GeneralStore::BindInfo bindInfo(dbs, loaders); + uint32_t key0 = 100; + uint32_t key1 = 101; + bindInfos[key0] = bindInfo; + bindInfos[key1] = bindInfo; + EXPECT_EQ(store->IsBound(key0), false); + EXPECT_EQ(store->IsBound(key1), false); + auto ret = store->Bind(database, bindInfos, config); + EXPECT_EQ(ret, GeneralError::E_OK); + EXPECT_EQ(store->IsBound(key0), true); + EXPECT_EQ(store->IsBound(key1), true); + + uint32_t key2 = 102; + bindInfos[key2] = bindInfo; + EXPECT_EQ(store->IsBound(key2), false); + ret = store->Bind(database, bindInfos, config); + EXPECT_EQ(ret, GeneralError::E_OK); + EXPECT_EQ(store->IsBound(key2), true); +} + +/** +* @tc.name: GetDBSyncCompleteCB +* @tc.desc: GetDBSyncCompleteCB test the functionality of different branches. +* @tc.type: FUNC +* @tc.require: +* @tc.author: SQL +*/ +HWTEST_F(KVDBGeneralStoreTest, GetDBSyncCompleteCB, TestSize.Level0) +{ + auto store = new (std::nothrow) KVDBGeneralStore(metaData_); + ASSERT_NE(store, nullptr); + GeneralStore::DetailAsync async; + EXPECT_EQ(async, nullptr); + KVDBGeneralStore::DBSyncCallback ret = store->GetDBSyncCompleteCB(async); + EXPECT_NE(ret, nullptr); + auto asyncs = [](const GenDetails &result) {}; + EXPECT_NE(asyncs, nullptr); + ret = store->GetDBSyncCompleteCB(asyncs); + EXPECT_NE(ret, nullptr); +} + +/** +* @tc.name: CloudSync +* @tc.desc: CloudSync test the functionality of different branches. +* @tc.type: FUNC +* @tc.require: +* @tc.author: SQL +*/ +HWTEST_F(KVDBGeneralStoreTest, CloudSync, TestSize.Level0) +{ + auto store = new (std::nothrow) KVDBGeneralStore(metaData_); + ASSERT_NE(store, nullptr); + store->SetEqualIdentifier(bundleName, storeName); + KvStoreNbDelegateMock mockDelegate; + store->delegate_ = &mockDelegate; + std::vector devices = { "device1", "device2" }; + auto asyncs = [](const GenDetails &result) {}; + store->storeInfo_.user = 0; + auto cloudSyncMode = DistributedDB::SyncMode::SYNC_MODE_PUSH_ONLY; + store->SetEqualIdentifier(bundleName, storeName); + std::string prepareTraceId; + auto ret = store->CloudSync(devices, cloudSyncMode, asyncs, 0, prepareTraceId); + EXPECT_EQ(ret, DBStatus::OK); + + store->storeInfo_.user = 1; + cloudSyncMode = DistributedDB::SyncMode::SYNC_MODE_CLOUD_FORCE_PUSH; + ret = store->CloudSync(devices, cloudSyncMode, asyncs, 0, prepareTraceId); + EXPECT_EQ(ret, DBStatus::OK); +} + +/** +* @tc.name: GetIdentifierParams +* @tc.desc: GetIdentifierParams test. +* @tc.type: FUNC +* @tc.require: +* @tc.author: wangbin +*/ +HWTEST_F(KVDBGeneralStoreTest, GetIdentifierParams, TestSize.Level0) +{ + auto store = new (std::nothrow) KVDBGeneralStore(metaData_); + std::vector sameAccountDevs{}; + std::vector uuids{"uuidtest01", "uuidtest02", "uuidtest03"}; + store->GetIdentifierParams(sameAccountDevs, uuids, 0); // NO_ACCOUNT + for (const auto &devId : uuids) { + EXPECT_EQ(DMAdapter::GetInstance().IsOHOSType(devId), false); + EXPECT_EQ(DMAdapter::GetInstance().GetAuthType(devId), 0); // NO_ACCOUNT + } + EXPECT_EQ(sameAccountDevs.empty(), false); +} + +/** +* @tc.name: Sync +* @tc.desc: Sync test the functionality of different branches. +* @tc.type: FUNC +* @tc.require: +* @tc.author: SQL +*/ +HWTEST_F(KVDBGeneralStoreTest, Sync, TestSize.Level0) +{ + mkdir(("/data/service/el1/public/database/" + std::string(bundleName)).c_str(), + (S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)); + auto store = new (std::nothrow) KVDBGeneralStore(metaData_); + ASSERT_NE(store, nullptr); + uint32_t syncMode = GeneralStore::SyncMode::CLOUD_BEGIN; + uint32_t highMode = GeneralStore::HighMode::MANUAL_SYNC_MODE; + auto mixMode = GeneralStore::MixMode(syncMode, highMode); + std::string kvQuery = ""; + DistributedKv::KVDBQuery query(kvQuery); + SyncParam syncParam{}; + syncParam.mode = mixMode; + KvStoreNbDelegateMock mockDelegate; + store->delegate_ = &mockDelegate; + auto ret = store->Sync({}, query, [](const GenDetails &result) {}, syncParam); + EXPECT_EQ(ret.first, GeneralError::E_NOT_SUPPORT); + GeneralStore::StoreConfig storeConfig; + storeConfig.enableCloud_ = true; + store->SetConfig(storeConfig); + ret = store->Sync({}, query, [](const GenDetails &result) {}, syncParam); + EXPECT_EQ(ret.first, GeneralError::E_OK); + + syncMode = GeneralStore::SyncMode::NEARBY_END; + mixMode = GeneralStore::MixMode(syncMode, highMode); + syncParam.mode = mixMode; + ret = store->Sync({}, query, [](const GenDetails &result) {}, syncParam); + EXPECT_EQ(ret.first, GeneralError::E_INVALID_ARGS); + + std::vector devices = { "device1", "device2" }; + syncMode = GeneralStore::SyncMode::NEARBY_SUBSCRIBE_REMOTE; + mixMode = GeneralStore::MixMode(syncMode, highMode); + syncParam.mode = mixMode; + ret = store->Sync(devices, query, [](const GenDetails &result) {}, syncParam); + EXPECT_EQ(ret.first, GeneralError::E_OK); + + syncMode = GeneralStore::SyncMode::NEARBY_UNSUBSCRIBE_REMOTE; + mixMode = GeneralStore::MixMode(syncMode, highMode); + syncParam.mode = mixMode; + ret = store->Sync(devices, query, [](const GenDetails &result) {}, syncParam); + EXPECT_EQ(ret.first, GeneralError::E_OK); + + syncMode = GeneralStore::SyncMode::NEARBY_PULL_PUSH; + mixMode = GeneralStore::MixMode(syncMode, highMode); + syncParam.mode = mixMode; + ret = store->Sync(devices, query, [](const GenDetails &result) {}, syncParam); + EXPECT_EQ(ret.first, GeneralError::E_OK); + + syncMode = GeneralStore::SyncMode::MODE_BUTT; + mixMode = GeneralStore::MixMode(syncMode, highMode); + syncParam.mode = mixMode; + ret = store->Sync(devices, query, [](const GenDetails &result) {}, syncParam); + EXPECT_EQ(ret.first, GeneralError::E_INVALID_ARGS); +} + +/** +* @tc.name: Clean +* @tc.desc: Clean test the functionality of different branches. +* @tc.type: FUNC +* @tc.require: +* @tc.author: SQL +*/ +HWTEST_F(KVDBGeneralStoreTest, Clean, TestSize.Level0) +{ + auto store = new (std::nothrow) KVDBGeneralStore(metaData_); + ASSERT_NE(store, nullptr); + std::vector devices = { "device1", "device2" }; + std::string tableName = "tableName"; + auto ret = store->Clean(devices, -1, tableName); + EXPECT_EQ(ret, GeneralError::E_INVALID_ARGS); + ret = store->Clean(devices, 6, tableName); + EXPECT_EQ(ret, GeneralError::E_INVALID_ARGS); + ret = store->Clean(devices, GeneralStore::CleanMode::NEARBY_DATA, tableName); + EXPECT_EQ(ret, GeneralError::E_ALREADY_CLOSED); + + KvStoreNbDelegateMock mockDelegate; + store->delegate_ = &mockDelegate; + ret = store->Clean(devices, GeneralStore::CleanMode::CLOUD_INFO, tableName); + EXPECT_EQ(ret, GeneralError::E_OK); + + ret = store->Clean(devices, GeneralStore::CleanMode::CLOUD_DATA, tableName); + EXPECT_EQ(ret, GeneralError::E_OK); + + ret = store->Clean({}, GeneralStore::CleanMode::NEARBY_DATA, tableName); + EXPECT_EQ(ret, GeneralError::E_OK); + ret = store->Clean(devices, GeneralStore::CleanMode::NEARBY_DATA, tableName); + EXPECT_EQ(ret, GeneralError::E_OK); + + ret = store->Clean(devices, GeneralStore::CleanMode::LOCAL_DATA, tableName); + EXPECT_EQ(ret, GeneralError::E_ERROR); + + ret = store->Clean(devices, GeneralStore::CleanMode::CLEAN_WATER, tableName); + EXPECT_EQ(ret, GeneralError::E_OK); +} + +/** +* @tc.name: Watch +* @tc.desc: Watch and Unwatch test the functionality of different branches. +* @tc.type: FUNC +* @tc.require: +* @tc.author: SQL +*/ +HWTEST_F(KVDBGeneralStoreTest, Watch, TestSize.Level0) +{ + auto store = new (std::nothrow) KVDBGeneralStore(metaData_); + ASSERT_NE(store, nullptr); + DistributedDataTest::MockGeneralWatcher watcher; + auto ret = store->Watch(GeneralWatcher::Origin::ORIGIN_CLOUD, watcher); + EXPECT_EQ(ret, GeneralError::E_INVALID_ARGS); + ret = store->Unwatch(GeneralWatcher::Origin::ORIGIN_CLOUD, watcher); + EXPECT_EQ(ret, GeneralError::E_INVALID_ARGS); + + ret = store->Watch(GeneralWatcher::Origin::ORIGIN_ALL, watcher); + EXPECT_EQ(ret, GeneralError::E_OK); + ret = store->Watch(GeneralWatcher::Origin::ORIGIN_ALL, watcher); + EXPECT_EQ(ret, GeneralError::E_INVALID_ARGS); + + ret = store->Unwatch(GeneralWatcher::Origin::ORIGIN_ALL, watcher); + EXPECT_EQ(ret, GeneralError::E_OK); + ret = store->Unwatch(GeneralWatcher::Origin::ORIGIN_ALL, watcher); + EXPECT_EQ(ret, GeneralError::E_INVALID_ARGS); +} + +/** +* @tc.name: Release +* @tc.desc: Release and AddRef test the functionality of different branches. +* @tc.type: FUNC +* @tc.require: +* @tc.author: SQL +*/ +HWTEST_F(KVDBGeneralStoreTest, Release, TestSize.Level0) +{ + auto store = new (std::nothrow) KVDBGeneralStore(metaData_); + ASSERT_NE(store, nullptr); + auto ret = store->Release(); + EXPECT_EQ(ret, 0); + store = new (std::nothrow) KVDBGeneralStore(metaData_); + store->ref_ = 0; + ret = store->Release(); + EXPECT_EQ(ret, 0); + store->ref_ = 2; + ret = store->Release(); + EXPECT_EQ(ret, 1); + + ret = store->AddRef(); + EXPECT_EQ(ret, 2); + store->ref_ = 0; + ret = store->AddRef(); + EXPECT_EQ(ret, 0); +} + +/** +* @tc.name: ConvertStatus +* @tc.desc: ConvertStatus test the functionality of different branches. +* @tc.type: FUNC +* @tc.require: +* @tc.author: SQL +*/ +HWTEST_F(KVDBGeneralStoreTest, ConvertStatus, TestSize.Level0) +{ + auto store = new (std::nothrow) KVDBGeneralStore(metaData_); + ASSERT_NE(store, nullptr); + auto ret = store->ConvertStatus(DBStatus::OK); + EXPECT_EQ(ret, GeneralError::E_OK); + ret = store->ConvertStatus(DBStatus::CLOUD_NETWORK_ERROR); + EXPECT_EQ(ret, GeneralError::E_NETWORK_ERROR); + ret = store->ConvertStatus(DBStatus::CLOUD_LOCK_ERROR); + EXPECT_EQ(ret, GeneralError::E_LOCKED_BY_OTHERS); + ret = store->ConvertStatus(DBStatus::CLOUD_FULL_RECORDS); + EXPECT_EQ(ret, GeneralError::E_RECODE_LIMIT_EXCEEDED); + ret = store->ConvertStatus(DBStatus::CLOUD_ASSET_SPACE_INSUFFICIENT); + EXPECT_EQ(ret, GeneralError::E_NO_SPACE_FOR_ASSET); + ret = store->ConvertStatus(DBStatus::CLOUD_SYNC_TASK_MERGED); + EXPECT_EQ(ret, GeneralError::E_SYNC_TASK_MERGED); + ret = store->ConvertStatus(DBStatus::DB_ERROR); + EXPECT_EQ(ret, GeneralError::E_DB_ERROR); +} + +/** +* @tc.name: OnChange +* @tc.desc: OnChange test the functionality of different branches. +* @tc.type: FUNC +* @tc.require: +* @tc.author: SQL +*/ +HWTEST_F(KVDBGeneralStoreTest, OnChange, TestSize.Level0) +{ + auto store = new (std::nothrow) KVDBGeneralStore(metaData_); + ASSERT_NE(store, nullptr); + DistributedDataTest::MockGeneralWatcher watcher; + DistributedDataTest::MockKvStoreChangedData data; + DistributedDB::ChangedData changedData; + store->observer_.OnChange(data); + store->observer_.OnChange(DistributedDB::Origin::ORIGIN_CLOUD, "originalId", std::move(changedData)); + auto result = store->Watch(GeneralWatcher::Origin::ORIGIN_ALL, watcher); + EXPECT_EQ(result, GeneralError::E_OK); + store->observer_.OnChange(data); + store->observer_.OnChange(DistributedDB::Origin::ORIGIN_CLOUD, "originalId", std::move(changedData)); + result = store->Unwatch(GeneralWatcher::Origin::ORIGIN_ALL, watcher); + EXPECT_EQ(result, GeneralError::E_OK); +} + +/** +* @tc.name: Delete +* @tc.desc: Delete test the function. +* @tc.type: FUNC +* @tc.require: +* @tc.author: SQL +*/ +HWTEST_F(KVDBGeneralStoreTest, Delete, TestSize.Level0) +{ + auto store = new (std::nothrow) KVDBGeneralStore(metaData_); + ASSERT_NE(store, nullptr); + KvStoreNbDelegateMock mockDelegate; + store->delegate_ = &mockDelegate; + store->SetDBPushDataInterceptor(DistributedKv::KvStoreType::DEVICE_COLLABORATION); + store->SetDBReceiveDataInterceptor(DistributedKv::KvStoreType::DEVICE_COLLABORATION); + DistributedData::VBuckets values; + auto ret = store->Insert("table", std::move(values)); + EXPECT_EQ(ret, GeneralError::E_NOT_SUPPORT); + + DistributedData::Values args; + store->SetDBPushDataInterceptor(DistributedKv::KvStoreType::SINGLE_VERSION); + store->SetDBReceiveDataInterceptor(DistributedKv::KvStoreType::SINGLE_VERSION); + ret = store->Delete("table", "sql", std::move(args)); + EXPECT_EQ(ret, GeneralError::E_NOT_SUPPORT); +} + +/** +* @tc.name: Query001 +* @tc.desc: KVDBGeneralStoreTest Query function test +* @tc.type: FUNC +* @tc.require: +* @tc.author: SQL +*/ +HWTEST_F(KVDBGeneralStoreTest, Query001, TestSize.Level1) +{ + auto store = new (std::nothrow) KVDBGeneralStore(metaData_); + ASSERT_NE(store, nullptr); + std::string table = "table"; + std::string sql = "sql"; + auto [errCode, result] = store->Query(table, sql, {}); + EXPECT_EQ(errCode, GeneralError::E_NOT_SUPPORT); + EXPECT_EQ(result, nullptr); +} + +/** +* @tc.name: Query002 +* @tc.desc: KVDBGeneralStoreTest Query function test +* @tc.type: FUNC +* @tc.require: +* @tc.author: SQL +*/ +HWTEST_F(KVDBGeneralStoreTest, Query002, TestSize.Level1) +{ + auto store = new (std::nothrow) KVDBGeneralStore(metaData_); + ASSERT_NE(store, nullptr); + std::string table = "table"; + MockQuery query; + auto [errCode, result] = store->Query(table, query); + EXPECT_EQ(errCode, GeneralError::E_NOT_SUPPORT); + EXPECT_EQ(result, nullptr); +} + +/** +* @tc.name: GetDBOption +* @tc.desc: GetDBOption from meta and dbPassword +* @tc.type: FUNC +* @tc.require: +* @tc.author: +*/ +HWTEST_F(KVDBGeneralStoreTest, GetDBOption001, TestSize.Level0) +{ + metaData_.isEncrypt = false; + metaData_.appId = "distributeddata"; + auto dbPassword = KVDBGeneralStore::GetDBPassword(metaData_); + auto dbOption = KVDBGeneralStore::GetDBOption(metaData_, dbPassword); + EXPECT_FALSE(MetaDataManager::GetInstance().LoadMeta(metaData_.GetKeyLocal(), metaData_, true)); + EXPECT_EQ(metaData_.appId, Bootstrap::GetInstance().GetProcessLabel()); + EXPECT_EQ(dbOption.createIfNecessary, false); + EXPECT_EQ(dbOption.isMemoryDb, false); + EXPECT_EQ(dbOption.isEncryptedDb, metaData_.isEncrypt); + EXPECT_EQ(dbOption.isNeedCompressOnSync, metaData_.isNeedCompress); + EXPECT_EQ(dbOption.schema, metaData_.schema); + EXPECT_EQ(dbOption.conflictResolvePolicy, DistributedDB::LAST_WIN); + EXPECT_EQ(dbOption.createDirByStoreIdOnly, true); + EXPECT_EQ(dbOption.secOption, KVDBGeneralStore::GetDBSecurity(metaData_.securityLevel)); +} + +/** +* @tc.name: Sync +* @tc.desc: Sync test the functionality of different branches. +* @tc.type: FUNC +* @tc.require: +*/ +HWTEST_F(KVDBGeneralStoreTest, Sync001, TestSize.Level0) +{ + mkdir(("/data/service/el1/public/database/" + std::string(bundleName)).c_str(), + (S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)); + auto store = new (std::nothrow) KVDBGeneralStore(metaData_); + ASSERT_NE(store, nullptr); + uint32_t syncMode = GeneralStore::SyncMode::CLOUD_BEGIN; + uint32_t highMode = GeneralStore::HighMode::MANUAL_SYNC_MODE; + auto mixMode = GeneralStore::MixMode(syncMode, highMode); + std::string kvQuery = "querytest"; + DistributedKv::KVDBQuery query(kvQuery); + SyncParam syncParam{}; + syncParam.mode = mixMode; + KvStoreNbDelegateMock mockDelegate; + store->delegate_ = &mockDelegate; + EXPECT_NE(store->delegate_, nullptr); + auto ret = store->Sync({}, query, [](const GenDetails &result) {}, syncParam); + EXPECT_EQ(ret.first, GeneralError::E_NOT_SUPPORT); + GeneralStore::StoreConfig storeConfig; + storeConfig.enableCloud_ = false; + store->SetConfig(storeConfig); + ret = store->Sync({}, query, [](const GenDetails &result) {}, syncParam); + EXPECT_EQ(ret.first, GeneralError::E_NOT_SUPPORT); + + std::vector devices = { "device1", "device2" }; + syncMode = GeneralStore::SyncMode::CLOUD_END; + mixMode = GeneralStore::MixMode(syncMode, highMode); + syncParam.mode = mixMode; + ret = store->Sync({}, query, [](const GenDetails &result) {}, syncParam); + EXPECT_EQ(ret.first, GeneralError::E_INVALID_ARGS); + + syncMode = GeneralStore::SyncMode::NEARBY_PULL; + mixMode = GeneralStore::MixMode(syncMode, highMode); + syncParam.mode = mixMode; + ret = store->Sync(devices, query, [](const GenDetails &result) {}, syncParam); + EXPECT_EQ(ret.first, GeneralError::E_INVALID_ARGS); + store->delegate_ = nullptr; + delete store; +} + + +/** +* @tc.name: SetEqualIdentifier +* @tc.desc: SetEqualIdentifier test. +* @tc.type: FUNC +* @tc.require: +* @tc.author: +*/ +HWTEST_F(KVDBGeneralStoreTest, SetEqualIdentifier, TestSize.Level0) +{ + auto store = new (std::nothrow) KVDBGeneralStore(metaData_); + ASSERT_NE(store, nullptr); + std::vector sameAccountDevs{"account01", "account02", "account03"}; + std::vector uuids{"uuidtest01", "uuidtest02", "uuidtest03"}; + AppId appId01 = { "ohos.kvdbservice.test01" }; + StoreId storeId01 = { "meta_test_storeid" }; + std::string account = "account"; + store->SetEqualIdentifier(appId01, storeId01, account); + EXPECT_EQ(uuids.empty(), false); + EXPECT_EQ(sameAccountDevs.empty(), false); + delete store; +} + +/** +* @tc.name: GetIdentifierParams +* @tc.desc: GetIdentifierParams test. +* @tc.type: FUNC +* @tc.require: +*/ +HWTEST_F(KVDBGeneralStoreTest, GetIdentifierParams001, TestSize.Level0) +{ + auto store = new (std::nothrow) KVDBGeneralStore(metaData_); + ASSERT_NE(store, nullptr); + std::vector sameAccountDevs{"account01", "account02", "account03"}; + std::vector uuids{"uuidtest01", "uuidtest02", "uuidtest03"}; + store->GetIdentifierParams(sameAccountDevs, uuids, 1); // + for (const auto &devId : uuids) { + EXPECT_EQ(DMAdapter::GetInstance().IsOHOSType(devId), false); + EXPECT_EQ(DMAdapter::GetInstance().GetAuthType(devId), 0); // + } + EXPECT_EQ(sameAccountDevs.empty(), false); + delete store; +} + +/** +* @tc.name: ConvertStatus +* @tc.desc: ConvertStatus test. +* @tc.type: FUNC +* @tc.require: +* @tc.author: +*/ +HWTEST_F(KVDBGeneralStoreTest, ConvertStatus001, TestSize.Level0) +{ + auto store = new (std::nothrow) KVDBGeneralStore(metaData_); + ASSERT_NE(store, nullptr); + auto ret = store->ConvertStatus(DBStatus::NOT_SUPPORT); + EXPECT_EQ(ret, GeneralError::E_NOT_SUPPORT); + DBStatus unknownStatus = static_cast(0xDEAD); + ret = store->ConvertStatus(unknownStatus); + EXPECT_EQ(ret, GeneralError::E_ERROR); + delete store; +} + +/** +* @tc.name: GetDBProcessCB +* @tc.desc: GetDBProcessCB test. +* @tc.type: FUNC +* @tc.require: +*/ +HWTEST_F(KVDBGeneralStoreTest, GetDBProcessCB, TestSize.Level0) +{ + auto store = new (std::nothrow) KVDBGeneralStore(metaData_); + ASSERT_NE(store, nullptr); + bool asyncCalled = false; + auto async = [&asyncCalled](const DistributedData::GenDetails &details) { + asyncCalled = true; + EXPECT_TRUE(details.empty()); + }; + + std::map processes; + auto callback = store->GetDBProcessCB(async); + callback(processes); + EXPECT_TRUE(asyncCalled); + delete store; +} + +/** +* @tc.name: GetDBProcessCB +* @tc.desc: GetDBProcessCB test. +* @tc.type: FUNC +* @tc.require: +*/ +HWTEST_F(KVDBGeneralStoreTest, GetDBProcessCB001, TestSize.Level0) +{ + auto store = new (std::nothrow) KVDBGeneralStore(metaData_); + ASSERT_NE(store, nullptr); + GeneralStore::DetailAsync async; + EXPECT_EQ(async, nullptr); + auto process = store->GetDBProcessCB(async); + EXPECT_NE(process, nullptr); + auto asyncs = [](const GenDetails &result) {}; + EXPECT_NE(asyncs, nullptr); + process = store->GetDBProcessCB(asyncs); + EXPECT_NE(process, nullptr); + store->delegate_ = nullptr; + delete store; +} + +/** +* @tc.name: GetDBProcessCB +* @tc.desc: GetDBProcessCB test. +* @tc.type: FUNC +* @tc.require: +*/ +HWTEST_F(KVDBGeneralStoreTest, GetDBProcessCB002, TestSize.Level0) +{ + auto store = new (std::nothrow) KVDBGeneralStore(metaData_); + ASSERT_NE(store, nullptr); + std::map processes = {{"test_id", {}}}; + GeneralStore::DetailAsync async; + EXPECT_EQ(async, nullptr); + auto callback = store->GetDBProcessCB(async); + callback(processes); + delete store; +} + +/** +* @tc.name: Delete +* @tc.desc: Delete test the function. +* @tc.type: FUNC +* @tc.require: +*/ +HWTEST_F(KVDBGeneralStoreTest, SetDBPushDataInterceptor, TestSize.Level0) +{ + auto store = new (std::nothrow) KVDBGeneralStore(metaData_); + ASSERT_NE(store, nullptr); + KvStoreNbDelegateMock mockDelegate; + store->delegate_ = &mockDelegate; + EXPECT_NE(store->delegate_, nullptr); + store->SetDBPushDataInterceptor(DistributedKv::KvStoreType::MULTI_VERSION); + store->SetDBReceiveDataInterceptor(DistributedKv::KvStoreType::MULTI_VERSION); + EXPECT_NE(metaData_.storeType, DistributedKv::KvStoreType::MULTI_VERSION); + + store->SetDBPushDataInterceptor(DistributedKv::KvStoreType::SINGLE_VERSION); + store->SetDBReceiveDataInterceptor(DistributedKv::KvStoreType::SINGLE_VERSION); + EXPECT_EQ(metaData_.storeType, DistributedKv::KvStoreType::SINGLE_VERSION); + store->delegate_ = nullptr; + delete store; +} + +/** +* @tc.name: CloseTest +* @tc.desc: Close kvdb general store +* @tc.type: FUNC +* @tc.require: +*/ +HWTEST_F(KVDBGeneralStoreTest, CloseTest001, TestSize.Level0) +{ + auto store = new (std::nothrow) KVDBGeneralStore(metaData_); + ASSERT_NE(store, nullptr); + EXPECT_EQ(store->delegate_, nullptr); + auto ret = store->Close(); + EXPECT_EQ(ret, GeneralError::E_OK); + + bool isForce = false; + ret = store->Close(isForce); + EXPECT_EQ(ret, DBStatus::OK); + delete store; +} + +/** +* @tc.name: ConstructorTest +* @tc.desc: Test KVDBGeneralStore constructor with different scenarios +* @tc.type: FUNC +* @tc.require: +*/ +HWTEST_F(KVDBGeneralStoreTest, ConstructorTest, TestSize.Level0) +{ + // Test manager initialization with same appId + metaData_.appId = Bootstrap::GetInstance().GetProcessLabel(); + auto store1 = new (std::nothrow) KVDBGeneralStore(metaData_); + ASSERT_NE(store1, nullptr); + delete store1; + + // Test manager initialization with different appId + metaData_.appId = "different_app_id"; + auto store2 = new (std::nothrow) KVDBGeneralStore(metaData_); + ASSERT_NE(store2, nullptr); + delete store2; + + // Test GetKvStore failure path + metaData_.storeId = "invalid_store"; + auto store3 = new (std::nothrow) KVDBGeneralStore(metaData_); + ASSERT_NE(store3, nullptr); + EXPECT_EQ(store3->delegate_, nullptr); + delete store3; + + // Test observer registration + metaData_.storeId = storeName; + metaData_.storeType = DistributedKv::KvStoreType::SINGLE_VERSION; + auto store4 = new (std::nothrow) KVDBGeneralStore(metaData_); + ASSERT_NE(store4, nullptr); + delete store4; + + // Test remote push notification setup + metaData_.storeType = DistributedKv::KvStoreType::DEVICE_COLLABORATION; + auto store5 = new (std::nothrow) KVDBGeneralStore(metaData_); + ASSERT_NE(store5, nullptr); + delete store5; + + // Test auto-sync configuration + metaData_.isAutoSync = true; + auto store6 = new (std::nothrow) KVDBGeneralStore(metaData_); + ASSERT_NE(store6, nullptr); + EXPECT_EQ(store6->delegate_, nullptr); + delete store6; +} } // namespace DistributedDataTest } // namespace OHOS::Test \ No newline at end of file -- Gitee From e8ce16ef208562b8f63168aca39ab6c464bc1e20 Mon Sep 17 00:00:00 2001 From: z30053452 Date: Thu, 17 Jul 2025 16:31:45 +0800 Subject: [PATCH 09/15] code fix Signed-off-by: z30053452 --- .../service/test/object_manager_test.cpp | 1143 ----------------- 1 file changed, 1143 deletions(-) diff --git a/services/distributeddataservice/service/test/object_manager_test.cpp b/services/distributeddataservice/service/test/object_manager_test.cpp index e68fbf262..f45764070 100644 --- a/services/distributeddataservice/service/test/object_manager_test.cpp +++ b/services/distributeddataservice/service/test/object_manager_test.cpp @@ -62,1147 +62,4 @@ protected: AssetValue assetValue_; static inline std::shared_ptr devMgrAdapterMock = nullptr; }; - -void ObjectManagerTest::SetUp() -{ - uri_ = "file:://com.examples.hmos.notepad/data/storage/el2/distributedfiles/dir/asset1.jpg"; - Asset asset{ - .name = "test_name", - .uri = uri_, - .modifyTime = "modifyTime", - .size = "size", - .hash = "modifyTime_size", - }; - asset_ = asset; - - AssetValue assetValue{ - .id = "test_name", - .name = uri_, - .uri = uri_, - .createTime = "2024.07.23", - .modifyTime = "modifyTime", - .size = "size", - .hash = "modifyTime_size", - .path = "/data/storage/el2", - }; - assetValue_ = assetValue; - - data_.push_back(10); // 10 is for testing - data_.push_back(20); // 20 is for testing - data_.push_back(30); // 30 is for testing - - OHOS::ObjectStore::AssetBindInfo AssetBindInfo{ - .storeName = "store_test", - .tableName = "table_test", - .field = "attachment", - .assetName = "asset1.jpg", - }; - assetBindInfo_ = AssetBindInfo; -} - -void ObjectManagerTest::SetUpTestCase(void) -{ - devMgrAdapterMock = make_shared(); - BDeviceManagerAdapter::deviceManagerAdapter = devMgrAdapterMock; - std::shared_ptr executors = std::make_shared(1, 0); - Bootstrap::GetInstance().LoadDirectory(); - Bootstrap::GetInstance().LoadCheckers(); - DistributedKv::KvStoreMetaManager::GetInstance().BindExecutor(executors); - DistributedKv::KvStoreMetaManager::GetInstance().InitMetaParameter(); - DistributedKv::KvStoreMetaManager::GetInstance().InitMetaListener(); -} - -void ObjectManagerTest::TearDownTestCase(void) -{ - BDeviceManagerAdapter::deviceManagerAdapter = nullptr; - devMgrAdapterMock = nullptr; -} - -void ObjectManagerTest::TearDown() {} - -/** -* @tc.name: DeleteNotifier001 -* @tc.desc: DeleteNotifier test. -* @tc.type: FUNC -* @tc.require: -* @tc.author: wangbin -*/ -HWTEST_F(ObjectManagerTest, DeleteNotifier001, TestSize.Level0) -{ - auto syncManager = SequenceSyncManager::GetInstance(); - auto result = syncManager->DeleteNotifier(sequenceId_, userId_); - ASSERT_EQ(result, SequenceSyncManager::ERR_SID_NOT_EXIST); -} - -/** -* @tc.name: Process001 -* @tc.desc: Process test. -* @tc.type: FUNC -* @tc.require: -* @tc.author: wangbin -*/ -HWTEST_F(ObjectManagerTest, Process001, TestSize.Level0) -{ - auto syncManager = SequenceSyncManager::GetInstance(); - std::map results; - results = {{ "test_cloud", DistributedDB::DBStatus::OK }}; - - std::function &results)> func; - func = [](const std::map &results) { - return results; - }; - auto result = syncManager->Process(sequenceId_, results, userId_); - ASSERT_EQ(result, SequenceSyncManager::ERR_SID_NOT_EXIST); - syncManager->seqIdCallbackRelations_.emplace(sequenceId_, func); - result = syncManager->Process(sequenceId_, results, userId_); - ASSERT_EQ(result, SequenceSyncManager::SUCCESS_USER_HAS_FINISHED); -} - -/** -* @tc.name: DeleteNotifierNoLock001 -* @tc.desc: DeleteNotifierNoLock test. -* @tc.type: FUNC -* @tc.require: -* @tc.author: wangbin -*/ -HWTEST_F(ObjectManagerTest, DeleteNotifierNoLock001, TestSize.Level0) -{ - auto syncManager = SequenceSyncManager::GetInstance(); - std::function &results)> func; - func = [](const std::map &results) { - return results; - }; - syncManager->seqIdCallbackRelations_.emplace(sequenceId_, func); - std::vector seqIds = {sequenceId_, sequenceId_2, sequenceId_3}; - std::string userId = "user_1"; - auto result = syncManager->DeleteNotifierNoLock(sequenceId_, userId_); - ASSERT_EQ(result, SequenceSyncManager::SUCCESS_USER_HAS_FINISHED); - syncManager->userIdSeqIdRelations_[userId] = seqIds; - result = syncManager->DeleteNotifierNoLock(sequenceId_, userId_); - ASSERT_EQ(result, SequenceSyncManager::SUCCESS_USER_IN_USE); -} - -/** -* @tc.name: Clear001 -* @tc.desc: Clear test. -* @tc.type: FUNC -* @tc.require: -* @tc.author: wangbin -*/ -HWTEST_F(ObjectManagerTest, Clear001, TestSize.Level0) -{ - auto manager = ObjectStoreManager::GetInstance(); - std::string dataDir = "/data/app/el2/100/database"; - manager->SetData(dataDir, userId_); - auto result = manager->Clear(); - ASSERT_EQ(result, OHOS::DistributedObject::OBJECT_SUCCESS); - auto size = manager->callbacks_.Size(); - ASSERT_EQ(size, 0); -} - -/** -* @tc.name: registerAndUnregisterRemoteCallback001 -* @tc.desc: test RegisterRemoteCallback and UnregisterRemoteCallback. -* @tc.type: FUNC -* @tc.require: -* @tc.author: wangbin -*/ -HWTEST_F(ObjectManagerTest, registerAndUnregisterRemoteCallback001, TestSize.Level0) -{ - auto manager = ObjectStoreManager::GetInstance(); - sptr callback; - manager->RegisterRemoteCallback(bundleName_, sessionId_, pid_, tokenId_, callback); - ObjectStoreManager::CallbackInfo callbackInfo = manager->callbacks_.Find(tokenId_).second; - std::string prefix = bundleName_ + sessionId_; - ASSERT_NE(callbackInfo.observers_.find(prefix), callbackInfo.observers_.end()); - manager->UnregisterRemoteCallback(bundleName_, pid_, tokenId_, sessionId_); - callbackInfo = manager->callbacks_.Find(tokenId_).second; - ASSERT_EQ(callbackInfo.observers_.find(prefix), callbackInfo.observers_.end()); -} - -/** -* @tc.name: registerAndUnregisterRemoteCallback002 -* @tc.desc: abnormal use cases. -* @tc.type: FUNC -* @tc.require: -* @tc.author: wangbin -*/ -HWTEST_F(ObjectManagerTest, registerAndUnregisterRemoteCallback002, TestSize.Level0) -{ - auto manager = ObjectStoreManager::GetInstance(); - sptr callback; - uint32_t tokenId = 101; - manager->RegisterRemoteCallback("", sessionId_, pid_, tokenId, callback); - manager->RegisterRemoteCallback(bundleName_, "", pid_, tokenId, callback); - manager->RegisterRemoteCallback("", "", pid_, tokenId, callback); - ASSERT_EQ(manager->callbacks_.Find(tokenId).first, false); - manager->UnregisterRemoteCallback("", pid_, tokenId, sessionId_); -} - -/** -* @tc.name: NotifyDataChanged001 -* @tc.desc: NotifyDataChanged test. -* @tc.type: FUNC -* @tc.require: -* @tc.author: wangbin -*/ -HWTEST_F(ObjectManagerTest, NotifyDataChanged001, TestSize.Level0) -{ - auto manager = ObjectStoreManager::GetInstance(); - std::string bundleName1_ = "com.examples.ophm.notepad"; - std::string objectKey = bundleName1_ + sessionId_; - std::map>> data; - std::map> data1; - std::vector data1_; - data1_.push_back(RestoreStatus::DATA_READY); - data1_.push_back(RestoreStatus::ASSETS_READY); - data1_.push_back(RestoreStatus::ALL_READY); - data1 = {{ "objectKey", data1_ }}; - data = {{ objectKey, data1 }}; - std::shared_ptr executors = std::make_shared(5, 3); // executor pool - manager->SetThreadPool(executors); - ASSERT_EQ(manager->restoreStatus_.Find(objectKey).first, false); - manager->NotifyDataChanged(data, {}); - ASSERT_EQ(manager->restoreStatus_.Find(objectKey).second, RestoreStatus::DATA_READY); -} - -/** -* @tc.name: NotifyAssetsReady001 -* @tc.desc: NotifyAssetsReady test. -* @tc.type: FUNC -* @tc.require: -* @tc.author: wangbin -*/ -HWTEST_F(ObjectManagerTest, NotifyAssetsReady001, TestSize.Level0) -{ - auto manager = ObjectStoreManager::GetInstance(); - std::string objectKey = bundleName_ + sessionId_; - std::string srcNetworkId = "1"; - ASSERT_EQ(manager->restoreStatus_.Find(objectKey).first, false); - manager->NotifyAssetsReady(objectKey, srcNetworkId); - ASSERT_EQ(manager->restoreStatus_.Find(objectKey).second, RestoreStatus::ASSETS_READY); - manager->restoreStatus_.Clear(); - manager->restoreStatus_.Insert(objectKey, RestoreStatus::DATA_READY); - manager->NotifyAssetsReady(objectKey, srcNetworkId); - ASSERT_EQ(manager->restoreStatus_.Find(objectKey).second, RestoreStatus::ALL_READY); -} - -/** - * @tc.name: NotifyAssetsReady002 - * @tc.desc: NotifyAssetsReady test. - * @tc.type: FUNC - */ -HWTEST_F(ObjectManagerTest, NotifyAssetsReady002, TestSize.Level0) -{ - auto manager = ObjectStoreManager::GetInstance(); - std::string objectKey="com.example.myapplicaiton123456"; - std::string srcNetworkId = "654321"; - - manager->restoreStatus_.Clear(); - manager->NotifyAssetsStart(objectKey, srcNetworkId); - auto [has0, value0] = manager->restoreStatus_.Find(objectKey); - EXPECT_TRUE(has0); - EXPECT_EQ(value0, RestoreStatus::NONE); - - manager->restoreStatus_.Clear(); - manager->NotifyAssetsReady(objectKey, srcNetworkId); - auto [has1, value1] = manager->restoreStatus_.Find(objectKey); - EXPECT_TRUE(has1); - EXPECT_EQ(value1, RestoreStatus::ASSETS_READY); - - manager->restoreStatus_.Clear(); - manager->restoreStatus_.Insert(objectKey, RestoreStatus::DATA_NOTIFIED); - manager->NotifyAssetsReady(objectKey, srcNetworkId); - auto [has2, value2] = manager->restoreStatus_.Find(objectKey); - EXPECT_TRUE(has2); - EXPECT_EQ(value2, RestoreStatus::ALL_READY); - - manager->restoreStatus_.Clear(); - manager->restoreStatus_.Insert(objectKey, RestoreStatus::DATA_READY); - manager->NotifyAssetsReady(objectKey, srcNetworkId); - auto [has3, value3] = manager->restoreStatus_.Find(objectKey); - EXPECT_TRUE(has3); - EXPECT_EQ(value3, RestoreStatus::ALL_READY); - manager->restoreStatus_.Clear(); -} - -/** -* @tc.name: NotifyChange001 -* @tc.desc: NotifyChange test. -* @tc.type: FUNC -* @tc.require: -* @tc.author: wangbin -*/ -HWTEST_F(ObjectManagerTest, NotifyChange001, TestSize.Level0) -{ - auto manager = ObjectStoreManager::GetInstance(); - std::map> data; - std::map> data1; - std::vector data1_; - data1_.push_back(RestoreStatus::DATA_READY); - data_.push_back(RestoreStatus::ALL_READY); - data = {{ "test_cloud", data_ }}; - data1 = {{ "p_###SAVEINFO###001", data1_ }}; - manager->NotifyChange(data1); - EXPECT_FALSE(manager->restoreStatus_.Find("p_###SAVEINFO###001").first); - manager->NotifyChange(data); - EXPECT_FALSE(manager->restoreStatus_.Find("test_cloud").first); -} - -/** - * @tc.name: NotifyChange002 - * @tc.desc: NotifyChange test. - * @tc.type: FUNC - */ -HWTEST_F(ObjectManagerTest, NotifyChange002, TestSize.Level0) -{ - auto manager = ObjectStoreManager::GetInstance(); - std::shared_ptr executor = std::make_shared(1, 0); - manager->SetThreadPool(executor); - std::map> data{}; - std::vector value{0}; - std::string bundleName = "com.example.myapplication"; - std::string sessionId = "123456"; - std::string source = "source"; - std::string target = "target"; - std::string timestamp = "1234567890"; - ObjectStoreManager::SaveInfo saveInfo(bundleName, sessionId, source, target, timestamp); - std::string saveInfoStr = DistributedData::Serializable::Marshall(saveInfo); - auto saveInfoValue = std::vector(saveInfoStr.begin(), saveInfoStr.end()); - std::string prefix = saveInfo.ToPropertyPrefix(); - std::string assetPrefix = prefix + "p_asset"; - data.insert_or_assign(prefix + "p_###SAVEINFO###", saveInfoValue); - data.insert_or_assign(prefix + "p_data", value); - data.insert_or_assign(assetPrefix + ObjectStore::NAME_SUFFIX, value); - data.insert_or_assign(assetPrefix + ObjectStore::URI_SUFFIX, value); - data.insert_or_assign(assetPrefix + ObjectStore::PATH_SUFFIX, value); - data.insert_or_assign(assetPrefix + ObjectStore::CREATE_TIME_SUFFIX, value); - data.insert_or_assign(assetPrefix + ObjectStore::MODIFY_TIME_SUFFIX, value); - data.insert_or_assign(assetPrefix + ObjectStore::SIZE_SUFFIX, value); - data.insert_or_assign("testkey", value); - EXPECT_CALL(*devMgrAdapterMock, IsSameAccount(_)).WillOnce(Return(true)); - manager->NotifyChange(data); - EXPECT_TRUE(manager->restoreStatus_.Contains(bundleName+sessionId)); - auto [has, taskId] = manager->objectTimer_.Find(bundleName+sessionId); - EXPECT_TRUE(has); - manager->restoreStatus_.Clear(); - manager->executors_->Remove(taskId); - manager->objectTimer_.Clear(); -} - -/** - * @tc.name: ComputeStatus001 - * @tc.desc: ComputeStatus.test - * @tc.type: FUNC - */ -HWTEST_F(ObjectManagerTest, ComputeStatus001, TestSize.Level0) -{ - auto manager = ObjectStoreManager::GetInstance(); - std::shared_ptr executor = std::make_shared(1, 0); - manager->SetThreadPool(executor); - std::string objectKey="com.example.myapplicaiton123456"; - std::map>> data{}; - manager->restoreStatus_.Clear(); - manager->ComputeStatus(objectKey, {}, data); - auto [has0, value0] = manager->restoreStatus_.Find(objectKey); - EXPECT_TRUE(has0); - EXPECT_EQ(value0, RestoreStatus::DATA_READY); - auto [has1, taskId1] = manager->objectTimer_.Find(objectKey); - EXPECT_TRUE(has1); - manager->executors_->Remove(taskId1); - manager->objectTimer_.Clear(); - manager->restoreStatus_.Clear(); - - manager->restoreStatus_.Insert(objectKey, RestoreStatus::ASSETS_READY); - manager->ComputeStatus(objectKey, {}, data); - auto [has2, value2] = manager->restoreStatus_.Find(objectKey); - EXPECT_TRUE(has2); - EXPECT_EQ(value2, RestoreStatus::ALL_READY); - auto [has3, taskId3] = manager->objectTimer_.Find(objectKey); - EXPECT_FALSE(has3); - manager->restoreStatus_.Clear(); -} - -/** -* @tc.name: Open001 -* @tc.desc: Open test. -* @tc.type: FUNC -* @tc.require: -* @tc.author: wangbin -*/ -HWTEST_F(ObjectManagerTest, Open001, TestSize.Level0) -{ - auto manager = ObjectStoreManager::GetInstance(); - manager->kvStoreDelegateManager_ = nullptr; - auto result = manager->Open(); - ASSERT_EQ(result, DistributedObject::OBJECT_INNER_ERROR); - std::string dataDir = "/data/app/el2/100/database"; - manager->SetData(dataDir, userId_); - manager->delegate_ = nullptr; - result = manager->Open(); - ASSERT_EQ(result, DistributedObject::OBJECT_SUCCESS); - manager->delegate_ = manager->OpenObjectKvStore(); - result = manager->Open(); - ASSERT_EQ(result, DistributedObject::OBJECT_SUCCESS); -} - -/** -* @tc.name: OnAssetChanged001 -* @tc.desc: OnAssetChanged test. -* @tc.type: FUNC -* @tc.require: -* @tc.author: wangbin -*/ -HWTEST_F(ObjectManagerTest, OnAssetChanged001, TestSize.Level0) -{ - auto manager = ObjectStoreManager::GetInstance(); - std::shared_ptr snapshot = std::make_shared(); - auto snapshotKey = appId_ + "_" + sessionId_; - auto result = manager->OnAssetChanged(tokenId_, appId_, sessionId_, deviceId_, assetValue_); - ASSERT_EQ(result, DistributedObject::OBJECT_INNER_ERROR); - manager->snapshots_.Insert(snapshotKey, snapshot); - result = manager->OnAssetChanged(tokenId_, appId_, sessionId_, deviceId_, assetValue_); - ASSERT_EQ(result, DistributedObject::OBJECT_SUCCESS); -} - -/** -* @tc.name: DeleteSnapshot001 -* @tc.desc: DeleteSnapshot test. -* @tc.type: FUNC -* @tc.require: -* @tc.author: wangbin -*/ -HWTEST_F(ObjectManagerTest, DeleteSnapshot001, TestSize.Level0) -{ - auto manager = ObjectStoreManager::GetInstance(); - std::shared_ptr snapshot = std::make_shared(); - auto snapshotKey = bundleName_ + "_" + sessionId_; - auto snapshots = manager->snapshots_.Find(snapshotKey).second; - ASSERT_EQ(snapshots, nullptr); - manager->DeleteSnapshot(bundleName_, sessionId_); - - manager->snapshots_.Insert(snapshotKey, snapshot); - snapshots = manager->snapshots_.Find(snapshotKey).second; - ASSERT_NE(snapshots, nullptr); - manager->DeleteSnapshot(bundleName_, sessionId_); -} - -/** -* @tc.name: FlushClosedStore001 -* @tc.desc: FlushClosedStore test. -* @tc.type: FUNC -* @tc.require: -* @tc.author: wangbin -*/ -HWTEST_F(ObjectManagerTest, FlushClosedStore001, TestSize.Level0) -{ - auto manager = ObjectStoreManager::GetInstance(); - manager->isSyncing_ = true; - manager->syncCount_ = 10; // test syncCount_ - manager->delegate_ = nullptr; - manager->FlushClosedStore(); - manager->isSyncing_ = false; - manager->FlushClosedStore(); - manager->syncCount_ = 0; // test syncCount_ - manager->FlushClosedStore(); - manager->delegate_ = manager->OpenObjectKvStore(); - ASSERT_NE(manager->delegate_, nullptr); - manager->FlushClosedStore(); - ASSERT_EQ(manager->delegate_, nullptr); -} - -/** -* @tc.name: Close001 -* @tc.desc: Close test. -* @tc.type: FUNC -* @tc.require: -* @tc.author: wangbin -*/ -HWTEST_F(ObjectManagerTest, Close001, TestSize.Level0) -{ - auto manager = ObjectStoreManager::GetInstance(); - manager->syncCount_ = 1; // test syncCount_ - manager->Close(); - ASSERT_EQ(manager->syncCount_, 1); // 1 is for testing - manager->delegate_ = manager->OpenObjectKvStore(); - manager->Close(); - ASSERT_EQ(manager->syncCount_, 0); // 0 is for testing -} - -/** -* @tc.name: SyncOnStore001 -* @tc.desc: SyncOnStore test. -* @tc.type: FUNC -* @tc.require: -* @tc.author: wangbin -*/ -HWTEST_F(ObjectManagerTest, SyncOnStore001, TestSize.Level0) -{ - auto manager = ObjectStoreManager::GetInstance(); - manager->delegate_ = manager->OpenObjectKvStore(); - std::function &results)> func; - func = [](const std::map &results) { - return results; - }; - std::string prefix = "ObjectManagerTest"; - std::vector deviceList; - // not local device & syncDevices empty - deviceList.push_back("local1"); - EXPECT_CALL(*devMgrAdapterMock, IsSameAccount(_)).WillOnce(Return(true)); - auto result = manager->SyncOnStore(prefix, deviceList, func); - ASSERT_NE(result, OBJECT_SUCCESS); - // local device - deviceList.push_back("local"); - EXPECT_CALL(*devMgrAdapterMock, IsSameAccount(_)).WillOnce(Return(true)); - result = manager->SyncOnStore(prefix, deviceList, func); - ASSERT_EQ(result, OBJECT_SUCCESS); -} - -/** -* @tc.name: RetrieveFromStore001 -* @tc.desc: RetrieveFromStore test. -* @tc.type: FUNC -* @tc.require: -* @tc.author: wangbin -*/ -HWTEST_F(ObjectManagerTest, RetrieveFromStore001, TestSize.Level0) -{ - auto manager = ObjectStoreManager::GetInstance(); - DistributedDB::KvStoreNbDelegateMock mockDelegate; - manager->delegate_ = &mockDelegate; - std::vector id; - id.push_back(1); // for testing - id.push_back(2); // for testing - std::map> results; - results = {{ "test_cloud", id }}; - auto result = manager->RetrieveFromStore(appId_, sessionId_, results); - ASSERT_EQ(result, OBJECT_SUCCESS); -} - -/** -* @tc.name: SyncCompleted001 -* @tc.desc: SyncCompleted test. -* @tc.type: FUNC -* @tc.require: -* @tc.author: wangbin -*/ -HWTEST_F(ObjectManagerTest, SyncCompleted001, TestSize.Level0) -{ - auto manager = ObjectStoreManager::GetInstance(); - auto syncManager = SequenceSyncManager::GetInstance(); - std::map results; - results = {{ "test_cloud", DistributedDB::DBStatus::OK }}; - std::function &results)> func; - func = [](const std::map &results) { - return results; - }; - manager->userId_ = "99"; - std::vector userId; - userId.push_back(99); - userId.push_back(100); - manager->SyncCompleted(results, sequenceId_); - syncManager->userIdSeqIdRelations_ = {{ "test_cloud", userId }}; - manager->SyncCompleted(results, sequenceId_); - userId.clear(); - syncManager->seqIdCallbackRelations_.emplace(sequenceId_, func); - manager->SyncCompleted(results, sequenceId_); - userId.push_back(99); - userId.push_back(100); - manager->SyncCompleted(results, sequenceId_); - EXPECT_FALSE(manager->isSyncing_); -} - -/** -* @tc.name: SplitEntryKey001 -* @tc.desc: SplitEntryKey test. -* @tc.type: FUNC -* @tc.require: -* @tc.author: wangbin -*/ -HWTEST_F(ObjectManagerTest, SplitEntryKey001, TestSize.Level0) -{ - auto manager = ObjectStoreManager::GetInstance(); - std::string key1 = ""; - std::string key2 = "ObjectManagerTest"; - auto result = manager->SplitEntryKey(key1); - ASSERT_EQ(result.empty(), true); - result = manager->SplitEntryKey(key2); - ASSERT_EQ(result.empty(), true); -} - -/** -* @tc.name: SplitEntryKey002 -* @tc.desc: SplitEntryKey test. -* @tc.type: FUNC -*/ -HWTEST_F(ObjectManagerTest, SplitEntryKey002, TestSize.Level0) -{ - auto manager = ObjectStoreManager::GetInstance(); - std::string key1 = "com.example.myapplication_sessionId_source_target_1234567890_p_propertyName"; - auto res = manager->SplitEntryKey(key1); - EXPECT_EQ(res[0], "com.example.myapplication"); - EXPECT_EQ(res[1], "sessionId"); - EXPECT_EQ(res[2], "source"); - EXPECT_EQ(res[3], "target"); - EXPECT_EQ(res[4], "1234567890"); - EXPECT_EQ(res[5], "p_propertyName"); - - std::string key2 = "com.example.myapplication_sessionId_source_target_000_p_propertyName"; - res = manager->SplitEntryKey(key2); - EXPECT_TRUE(res.empty()); - - std::string key3 = "com.example.myapplicationsessionIdsourcetarget_1234567890_p_propertyName"; - res = manager->SplitEntryKey(key3); - EXPECT_TRUE(res.empty()); - - std::string key4 = "com.example.myapplicationsessionIdsource_target_1234567890_p_propertyName"; - res = manager->SplitEntryKey(key4); - EXPECT_TRUE(res.empty()); - - std::string key5 = "com.example.myapplicationsessionId_source_target_1234567890_p_propertyName"; - res = manager->SplitEntryKey(key5); - EXPECT_TRUE(res.empty()); -} - -/** -* @tc.name: ProcessOldEntry001 -* @tc.desc: ProcessOldEntry test. -* @tc.type: FUNC -* @tc.require: -* @tc.author: wangbin -*/ -HWTEST_F(ObjectManagerTest, ProcessOldEntry001, TestSize.Level0) -{ - auto manager = ObjectStoreManager::GetInstance(); - manager->delegate_ = manager->OpenObjectKvStore(); - std::vector entries; - auto status = manager->delegate_->GetEntries(std::vector(appId_.begin(), appId_.end()), entries); - ASSERT_EQ(status, DistributedDB::DBStatus::NOT_FOUND); - manager->ProcessOldEntry(appId_); - - DistributedDB::KvStoreNbDelegateMock mockDelegate; - manager->delegate_ = &mockDelegate; - status = manager->delegate_->GetEntries(std::vector(appId_.begin(), appId_.end()), entries); - ASSERT_EQ(status, DistributedDB::DBStatus::OK); - manager->ProcessOldEntry(appId_); -} - -/** -* @tc.name: ProcessSyncCallback001 -* @tc.desc: ProcessSyncCallback test. -* @tc.type: FUNC -* @tc.require: -* @tc.author: wangbin -*/ -HWTEST_F(ObjectManagerTest, ProcessSyncCallback001, TestSize.Level0) -{ - auto manager = ObjectStoreManager::GetInstance(); - std::map results; - manager->ProcessSyncCallback(results, appId_, sessionId_, deviceId_); - results.insert({"local", 1}); // for testing - ASSERT_EQ(results.empty(), false); - ASSERT_NE(results.find("local"), results.end()); - manager->ProcessSyncCallback(results, appId_, sessionId_, deviceId_); -} - -/** -* @tc.name: ProcessSyncCallback002 -* @tc.desc: ProcessSyncCallback test. -* @tc.type: FUNC -*/ -HWTEST_F(ObjectManagerTest, ProcessSyncCallback002, TestSize.Level0) -{ - std::string dataDir = "/data/app/el2/100/database"; - auto manager = ObjectStoreManager::GetInstance(); - std::map results; - - results.insert({"remote", 1}); // for testing - ASSERT_EQ(results.empty(), false); - ASSERT_EQ(results.find("local"), results.end()); - - manager->kvStoreDelegateManager_ = nullptr; - // open store failed -> success - manager->ProcessSyncCallback(results, appId_, sessionId_, deviceId_); - - // open store success -> success - manager->SetData(dataDir, userId_); - ASSERT_NE(manager->kvStoreDelegateManager_, nullptr); - manager->delegate_ = manager->OpenObjectKvStore(); - ASSERT_NE(manager->delegate_, nullptr); - manager->ProcessSyncCallback(results, appId_, sessionId_, deviceId_); -} - -/** -* @tc.name: IsAssetComplete001 -* @tc.desc: IsAssetComplete test. -* @tc.type: FUNC -* @tc.require: -* @tc.author: wangbin -*/ -HWTEST_F(ObjectManagerTest, IsAssetComplete001, TestSize.Level0) -{ - auto manager = ObjectStoreManager::GetInstance(); - std::map> results; - std::vector completes; - completes.push_back(1); // for testing - completes.push_back(2); // for testing - std::string assetPrefix = "IsAssetComplete_test"; - results.insert({assetPrefix, completes}); - auto result = manager->IsAssetComplete(results, assetPrefix); - ASSERT_EQ(result, false); - results.insert({assetPrefix + ObjectStore::NAME_SUFFIX, completes}); - result = manager->IsAssetComplete(results, assetPrefix); - ASSERT_EQ(result, false); - results.insert({assetPrefix + ObjectStore::URI_SUFFIX, completes}); - result = manager->IsAssetComplete(results, assetPrefix); - ASSERT_EQ(result, false); - results.insert({assetPrefix + ObjectStore::PATH_SUFFIX, completes}); - result = manager->IsAssetComplete(results, assetPrefix); - ASSERT_EQ(result, false); - results.insert({assetPrefix + ObjectStore::CREATE_TIME_SUFFIX, completes}); - result = manager->IsAssetComplete(results, assetPrefix); - ASSERT_EQ(result, false); - results.insert({assetPrefix + ObjectStore::MODIFY_TIME_SUFFIX, completes}); - result = manager->IsAssetComplete(results, assetPrefix); - ASSERT_EQ(result, false); - results.insert({assetPrefix + ObjectStore::SIZE_SUFFIX, completes}); - result = manager->IsAssetComplete(results, assetPrefix); - ASSERT_EQ(result, true); -} - -/** -* @tc.name: GetAssetsFromDBRecords001 -* @tc.desc: GetAssetsFromDBRecords test. -* @tc.type: FUNC -* @tc.require: -* @tc.author: wangbin -*/ -HWTEST_F(ObjectManagerTest, GetAssetsFromDBRecords001, TestSize.Level0) -{ - auto manager = ObjectStoreManager::GetInstance(); - std::map> results; - std::vector completes; - completes.push_back(1); // for testing - completes.push_back(2); // for testing - std::string assetPrefix = "IsAssetComplete_test"; - results.insert({assetPrefix, completes}); - results.insert({assetPrefix + ObjectStore::NAME_SUFFIX, completes}); - results.insert({assetPrefix + ObjectStore::URI_SUFFIX, completes}); - results.insert({assetPrefix + ObjectStore::MODIFY_TIME_SUFFIX, completes}); - results.insert({assetPrefix + ObjectStore::SIZE_SUFFIX, completes}); - auto result = manager->GetAssetsFromDBRecords(results); - ASSERT_EQ(result.empty(), false); -} - -/** -* @tc.name: GetAssetsFromDBRecords002 -* @tc.desc: GetAssetsFromDBRecords test. -* @tc.type: FUNC -*/ -HWTEST_F(ObjectManagerTest, GetAssetsFromDBRecords002, TestSize.Level0) -{ - auto manager = ObjectStoreManager::GetInstance(); - std::map> result; - - std::vector value0{0}; - std::string data0 = "[STRING]test"; - value0.insert(value0.end(), data0.begin(), data0.end()); - - std::vector value1{0}; - std::string data1 = "(string)test"; - value1.insert(value1.end(), data1.begin(), data1.end()); - - std::string prefix = "bundleName_sessionId_source_target_timestamp"; - std::string dataKey = prefix + "_p_data"; - std::string assetPrefix0 = prefix + "_p_asset0"; - std::string assetPrefix1 = prefix + "_p_asset1"; - - result.insert({dataKey, value0}); - auto assets = manager->GetAssetsFromDBRecords(result); - EXPECT_TRUE(assets.empty()); - - result.clear(); - result.insert({assetPrefix0 + ObjectStore::URI_SUFFIX, value0}); - assets = manager->GetAssetsFromDBRecords(result); - EXPECT_TRUE(assets.empty()); - - result.clear(); - result.insert({assetPrefix1 + ObjectStore::NAME_SUFFIX, value1}); - assets = manager->GetAssetsFromDBRecords(result); - EXPECT_TRUE(assets.empty()); - - result.clear(); - result.insert({assetPrefix0 + ObjectStore::NAME_SUFFIX, value0}); - result.insert({assetPrefix0 + ObjectStore::URI_SUFFIX, value0}); - result.insert({assetPrefix0 + ObjectStore::MODIFY_TIME_SUFFIX, value0}); - result.insert({assetPrefix0 + ObjectStore::SIZE_SUFFIX, value0}); - assets = manager->GetAssetsFromDBRecords(result); - ASSERT_EQ(assets.size(), 1); - EXPECT_EQ(assets[0].name, "test"); - EXPECT_EQ(assets[0].uri, "test"); - EXPECT_EQ(assets[0].modifyTime, "test"); - EXPECT_EQ(assets[0].size, "test"); - EXPECT_EQ(assets[0].hash, "test_test"); - - result.clear(); - result.insert({assetPrefix1 + ObjectStore::NAME_SUFFIX, value1}); - result.insert({assetPrefix1 + ObjectStore::URI_SUFFIX, value1}); - result.insert({assetPrefix1 + ObjectStore::MODIFY_TIME_SUFFIX, value1}); - result.insert({assetPrefix1 + ObjectStore::SIZE_SUFFIX, value1}); - assets = manager->GetAssetsFromDBRecords(result); - ASSERT_EQ(assets.size(), 1); - EXPECT_EQ(assets[0].name, "(string)test"); - EXPECT_EQ(assets[0].uri, "(string)test"); - EXPECT_EQ(assets[0].modifyTime, "(string)test"); - EXPECT_EQ(assets[0].size, "(string)test"); - EXPECT_EQ(assets[0].hash, "(string)test_(string)test"); -} - -/** -* @tc.name: RegisterAssetsLister001 -* @tc.desc: RegisterAssetsLister test. -* @tc.type: FUNC -* @tc.require: -* @tc.author: wangbin -*/ -HWTEST_F(ObjectManagerTest, RegisterAssetsLister001, TestSize.Level0) -{ - auto manager = ObjectStoreManager::GetInstance(); - manager->objectAssetsSendListener_ = nullptr; - manager->objectAssetsRecvListener_ = nullptr; - auto result = manager->RegisterAssetsLister(); - ASSERT_EQ(result, true); - manager->objectAssetsSendListener_ = new ObjectAssetsSendListener(); - manager->objectAssetsRecvListener_ = new ObjectAssetsRecvListener();; - result = manager->RegisterAssetsLister(); - ASSERT_EQ(result, true); -} - -/** -* @tc.name: PushAssets001 -* @tc.desc: PushAssets test. -* @tc.type: FUNC -* @tc.require: -* @tc.author: wangbin -*/ -HWTEST_F(ObjectManagerTest, PushAssets001, TestSize.Level0) -{ - auto manager = ObjectStoreManager::GetInstance(); - std::map> data; - std::string assetPrefix = "PushAssets_test"; - std::vector completes; - completes.push_back(1); // for testing - completes.push_back(2); // for testing - data.insert({assetPrefix, completes}); - auto result = manager->PushAssets(appId_, appId_, sessionId_, data, deviceId_); - ASSERT_EQ(result, DistributedObject::OBJECT_SUCCESS); -} - -/** -* @tc.name: PushAssets002 -* @tc.desc: PushAssets test. -* @tc.type: FUNC -*/ -HWTEST_F(ObjectManagerTest, PushAssets002, TestSize.Level0) -{ - auto manager = ObjectStoreManager::GetInstance(); - std::map> data; - std::vector value{0}; - std::string data0 = "[STRING]test"; - value.insert(value.end(), data0.begin(), data0.end()); - - std::string prefix = "bundleName_sessionId_source_target_timestamp"; - std::string dataKey = prefix + "_p_data"; - std::string assetPrefix = prefix + "_p_asset0"; - std::string fieldsPrefix = "p_"; - std::string deviceIdKey = "__deviceId"; - - data.insert({assetPrefix + ObjectStore::NAME_SUFFIX, value}); - data.insert({assetPrefix + ObjectStore::URI_SUFFIX, value}); - data.insert({assetPrefix + ObjectStore::MODIFY_TIME_SUFFIX, value}); - data.insert({assetPrefix + ObjectStore::SIZE_SUFFIX, value}); - data.insert({fieldsPrefix + deviceIdKey, value}); - - manager->objectAssetsSendListener_ = nullptr; - int32_t ret = manager->PushAssets(appId_, appId_, sessionId_, data, deviceId_); - EXPECT_NE(ret, DistributedObject::OBJECT_SUCCESS); - - manager->objectAssetsSendListener_ = new ObjectAssetsSendListener(); - ASSERT_NE(manager->objectAssetsSendListener_, nullptr); - ret = manager->PushAssets(appId_, appId_, sessionId_, data, deviceId_); - EXPECT_NE(ret, DistributedObject::OBJECT_SUCCESS); -} - -/** -* @tc.name: AddNotifier001 -* @tc.desc: AddNotifie and DeleteNotifier test. -* @tc.type: FUNC -*/ -HWTEST_F(ObjectManagerTest, AddNotifier001, TestSize.Level0) -{ - auto syncManager = SequenceSyncManager::GetInstance(); - std::function &results)> func; - func = [](const std::map &results) { - return results; - }; - auto sequenceId_ = syncManager->AddNotifier(userId_, func); - auto result = syncManager->DeleteNotifier(sequenceId_, userId_); - ASSERT_EQ(result, SequenceSyncManager::SUCCESS_USER_HAS_FINISHED); -} - -/** -* @tc.name: AddNotifier002 -* @tc.desc: AddNotifie and DeleteNotifier test. -* @tc.type: FUNC -*/ -HWTEST_F(ObjectManagerTest, AddNotifier002, TestSize.Level0) -{ - auto syncManager = SequenceSyncManager::GetInstance(); - std::function &results)> func; - func = [](const std::map &results) { - return results; - }; - auto sequenceId = syncManager->AddNotifier(userId_, func); - ASSERT_NE(sequenceId, sequenceId_); - auto result = syncManager->DeleteNotifier(sequenceId_, userId_); - ASSERT_EQ(result, SequenceSyncManager::ERR_SID_NOT_EXIST); -} - -/** -* @tc.name: BindAsset 001 -* @tc.desc: BindAsset test. -* @tc.type: FUNC -*/ -HWTEST_F(ObjectManagerTest, BindAsset001, TestSize.Level0) -{ - auto manager = ObjectStoreManager::GetInstance(); - std::string bundleName = "BindAsset"; - uint32_t tokenId = IPCSkeleton::GetCallingTokenID(); - auto result = manager->BindAsset(tokenId, bundleName, sessionId_, assetValue_, assetBindInfo_); - ASSERT_EQ(result, DistributedObject::OBJECT_DBSTATUS_ERROR); -} - -/** -* @tc.name: OnFinished001 -* @tc.desc: OnFinished test. -* @tc.type: FUNC -*/ -HWTEST_F(ObjectManagerTest, OnFinished001, TestSize.Level1) -{ - std::string srcNetworkId = "srcNetworkId"; - sptr assetObj = nullptr; - int32_t result = 100; - ObjectAssetsRecvListener listener; - int32_t ret = listener.OnFinished(srcNetworkId, assetObj, result); - EXPECT_NE(ret, DistributedObject::OBJECT_SUCCESS); - - sptr assetObj_1 = new AssetObj(); - assetObj_1->dstBundleName_ = bundleName_; - assetObj_1->srcBundleName_ = bundleName_; - assetObj_1->dstNetworkId_ = "1"; - assetObj_1->sessionId_ = "123"; - ret = listener.OnFinished(srcNetworkId, assetObj_1, result); - EXPECT_EQ(ret, DistributedObject::OBJECT_SUCCESS); -} - -/** -* @tc.name: GetObjectData001 -* @tc.desc: GetObjectData test. -* @tc.type: FUNC -*/ -HWTEST_F(ObjectManagerTest, GetObjectData001, TestSize.Level1) -{ - auto manager = ObjectStoreManager::GetInstance(); - - std::string bundleName = bundleName_; - std::string sessionId = sessionId_; - std::string source = "sourceDeviceId"; - std::string target = "targetDeviceId"; - std::string timestamp = "1234567890"; - ObjectStoreManager::SaveInfo saveInfo(bundleName, sessionId, source, target, timestamp); - std::string prefix = saveInfo.ToPropertyPrefix(); - EXPECT_FALSE(prefix.empty()); - - // p_name not asset key - std::string p_name = "p_namejpg"; - std::string key = bundleName + "_" + sessionId + "_" + source + "_" + target + "_" + timestamp + "_" + p_name; - std::map> changedData = {{ key, data_ }}; - bool hasAsset = false; - auto ret = manager->GetObjectData(changedData, saveInfo, hasAsset); - EXPECT_FALSE(ret.empty()); - EXPECT_FALSE(hasAsset); -} - -/** -* @tc.name: GetObjectData002 -* @tc.desc: GetObjectData test. -* @tc.type: FUNC -*/ -HWTEST_F(ObjectManagerTest, GetObjectData002, TestSize.Level1) -{ - auto manager = ObjectStoreManager::GetInstance(); - - std::string bundleName = ""; - std::string sessionId = ""; - std::string source = ""; - std::string target = ""; - std::string timestamp = ""; - ObjectStoreManager::SaveInfo saveInfo(bundleName, sessionId, source, target, timestamp); - std::string prefix = saveInfo.ToPropertyPrefix(); - EXPECT_TRUE(prefix.empty()); - - // saveInfo.bundleName, sourceDeviceId, targetDeviceId empty - saveInfo.sessionId = sessionId_; - saveInfo.timestamp = "1234567890"; - - bundleName = bundleName_; - sessionId = sessionId_; - source = "sourceDeviceId"; - target = "targetDeviceId"; - timestamp = "1234567890"; - std::string p_name = "p_name.jpg"; - std::string key = bundleName + "_" + sessionId + "_" + source + "_" + target + "_" + timestamp + "_" + p_name; - std::map> changedData = {{ key, data_ }}; - bool hasAsset = false; - auto ret = manager->GetObjectData(changedData, saveInfo, hasAsset); - EXPECT_FALSE(ret.empty()); - EXPECT_EQ(saveInfo.bundleName, bundleName); - EXPECT_TRUE(hasAsset); - - // only targetDeviceId empty - saveInfo.bundleName = "test_bundleName"; - saveInfo.sourceDeviceId = "test_source"; - // p_name not asset key - p_name = "p_namejpg"; - std::string key_1 = bundleName + "_" + sessionId + "_" + source + "_" + target + "_" + timestamp + "_" + p_name; - std::map> changedData_1 = {{ key_1, data_ }}; - hasAsset = false; - ret = manager->GetObjectData(changedData_1, saveInfo, hasAsset); - EXPECT_FALSE(ret.empty()); - EXPECT_NE(saveInfo.bundleName, bundleName); - EXPECT_FALSE(hasAsset); -} - -/** -* @tc.name: InitUserMeta001 -* @tc.desc: test clear old user meta. -* @tc.type: FUNC -*/ -HWTEST_F(ObjectManagerTest, InitUserMeta001, TestSize.Level1) -{ - auto manager = ObjectStoreManager::GetInstance(); - auto status = manager->InitUserMeta(); - ASSERT_EQ(status, DistributedObject::OBJECT_SUCCESS); -} - -/** -* @tc.name: registerAndUnregisterProgressObserverCallback001 -* @tc.desc: test RegisterProgressObserverCallback and UnregisterProgressObserverCallback. -* @tc.type: FUNC -* @tc.require: -* @tc.author: -*/ -HWTEST_F(ObjectManagerTest, registerAndUnregisterProgressObserverCallback001, TestSize.Level0) -{ - auto manager = ObjectStoreManager::GetInstance(); - sptr callback; - manager->RegisterProgressObserverCallback(bundleName_, sessionId_, pid_, tokenId_, callback); - ObjectStoreManager::ProgressCallbackInfo progressCallbackInfo = manager->processCallbacks_.Find(tokenId_).second; - std::string objectKey = bundleName_ + sessionId_; - ASSERT_NE(progressCallbackInfo.observers_.find(objectKey), progressCallbackInfo.observers_.end()); - manager->UnregisterProgressObserverCallback(bundleName_, pid_, tokenId_, sessionId_); - progressCallbackInfo = manager->processCallbacks_.Find(tokenId_).second; - ASSERT_EQ(progressCallbackInfo.observers_.find(objectKey), progressCallbackInfo.observers_.end()); -} - -/** -* @tc.name: registerAndUnregisterProgressObserverCallback002 -* @tc.desc: abnormal use cases. -* @tc.type: FUNC -* @tc.require: -* @tc.author: -*/ -HWTEST_F(ObjectManagerTest, registerAndUnregisterProgressObserverCallback002, TestSize.Level0) -{ - auto manager = ObjectStoreManager::GetInstance(); - sptr callback; - uint32_t tokenId = 101; - manager->RegisterProgressObserverCallback("", sessionId_, pid_, tokenId, callback); - manager->RegisterProgressObserverCallback(bundleName_, "", pid_, tokenId, callback); - manager->RegisterProgressObserverCallback("", "", pid_, tokenId, callback); - ObjectStoreManager::ProgressCallbackInfo progressCallbackInfo = manager->processCallbacks_.Find(tokenId_).second; - progressCallbackInfo.pid = pid_; - manager->RegisterProgressObserverCallback(bundleName_, sessionId_, pid_, tokenId_, callback); - ASSERT_EQ(manager->processCallbacks_.Find(tokenId).first, false); - manager->UnregisterProgressObserverCallback("", pid_, tokenId, sessionId_); - manager->UnregisterProgressObserverCallback("", pid_, tokenId, ""); - manager->UnregisterProgressObserverCallback(bundleName_, pid_, tokenId, ""); -} - -/** -* @tc.name: NotifyAssetsRecvProgress001 -* @tc.desc: NotifyAssetsRecvProgress test. -* @tc.type: FUNC -* @tc.require: -* @tc.author: -*/ -HWTEST_F(ObjectManagerTest, NotifyAssetsRecvProgress001, TestSize.Level0) -{ - auto manager = ObjectStoreManager::GetInstance(); - std::string objectKey = bundleName_ + sessionId_; - std::string errProgress = "errProgress"; - int32_t progress = 100; - ASSERT_EQ(manager->assetsRecvProgress_.Find(objectKey).first, true); - ObjectStoreManager::ProgressCallbackInfo progressCallbackInfo = manager->processCallbacks_.Find(tokenId_).second; - manager->NotifyAssetsRecvProgress(errProgress, progress); - manager->assetsRecvProgress_.Clear(); - manager->assetsRecvProgress_.Insert(objectKey, progress); - progressCallbackInfo.observers_.clear(); - manager->NotifyAssetsRecvProgress(errProgress, progress); -} - -/** -* @tc.name: OnRecvProgress001 -* @tc.desc: OnRecvProgress test. -* @tc.type: FUNC -*/ -HWTEST_F(ObjectManagerTest, OnRecvProgress001, TestSize.Level1) -{ - std::string srcNetworkId = "srcNetworkId"; - sptr assetObj = nullptr; - uint64_t totalBytes = 100; - uint64_t processBytes = 100; - ObjectAssetsRecvListener listener; - int32_t ret = listener.OnRecvProgress(srcNetworkId, assetObj, totalBytes, processBytes); - EXPECT_EQ(ret, DistributedObject::OBJECT_INNER_ERROR); - uint64_t totalBytes_01 = 0; - ret = listener.OnRecvProgress(srcNetworkId, assetObj, totalBytes_01, processBytes); - EXPECT_EQ(ret, DistributedObject::OBJECT_INNER_ERROR); - sptr assetObj_1 = new AssetObj(); - ret = listener.OnRecvProgress(srcNetworkId, assetObj_1, totalBytes_01, processBytes); - EXPECT_EQ(ret, DistributedObject::OBJECT_INNER_ERROR); - ret = listener.OnRecvProgress(srcNetworkId, assetObj_1, totalBytes, processBytes); - EXPECT_EQ(ret, DistributedObject::OBJECT_SUCCESS); -} - -/** -* @tc.name: OnFinished002 -* @tc.desc: OnFinished test. -* @tc.type: FUNC -*/ -HWTEST_F(ObjectManagerTest, OnFinished002, TestSize.Level1) -{ - std::string srcNetworkId = "srcNetworkId"; - ObjectAssetsRecvListener listener; - sptr assetObj_1 = new AssetObj(); - assetObj_1->dstBundleName_ = bundleName_; - assetObj_1->srcBundleName_ = bundleName_; - assetObj_1->dstNetworkId_ = "1"; - assetObj_1->sessionId_ = "123"; - int32_t result = 100; - auto ret = listener.OnFinished(srcNetworkId, assetObj_1, result); - int32_t result_1 = 0; - ret = listener.OnFinished(srcNetworkId, assetObj_1, result_1); - EXPECT_EQ(ret, DistributedObject::OBJECT_SUCCESS); -} } // namespace OHOS::Test -- Gitee From 2999e43022cda712e0f27ad85c2467f82a5faa8a Mon Sep 17 00:00:00 2001 From: z30053452 Date: Thu, 17 Jul 2025 16:32:27 +0800 Subject: [PATCH 10/15] code fix Signed-off-by: z30053452 --- .../service/test/object_manager_test.cpp | 1143 +++++++++++++++++ 1 file changed, 1143 insertions(+) diff --git a/services/distributeddataservice/service/test/object_manager_test.cpp b/services/distributeddataservice/service/test/object_manager_test.cpp index f45764070..ce37ca79c 100644 --- a/services/distributeddataservice/service/test/object_manager_test.cpp +++ b/services/distributeddataservice/service/test/object_manager_test.cpp @@ -62,4 +62,1147 @@ protected: AssetValue assetValue_; static inline std::shared_ptr devMgrAdapterMock = nullptr; }; + +void ObjectManagerTest::SetUp() +{ + uri_ = "file:://com.examples.hmos.notepad/data/storage/el2/distributedfiles/dir/asset1.jpg"; + Asset asset{ + .name = "test_name", + .uri = uri_, + .modifyTime = "modifyTime", + .size = "size", + .hash = "modifyTime_size", + }; + asset_ = asset; + + AssetValue assetValue{ + .id = "test_name", + .name = uri_, + .uri = uri_, + .createTime = "2024.07.23", + .modifyTime = "modifyTime", + .size = "size", + .hash = "modifyTime_size", + .path = "/data/storage/el2", + }; + assetValue_ = assetValue; + + data_.push_back(10); // 10 is for testing + data_.push_back(20); // 20 is for testing + data_.push_back(30); // 30 is for testing + + OHOS::ObjectStore::AssetBindInfo AssetBindInfo{ + .storeName = "store_test", + .tableName = "table_test", + .field = "attachment", + .assetName = "asset1.jpg", + }; + assetBindInfo_ = AssetBindInfo; +} + +void ObjectManagerTest::SetUpTestCase(void) +{ + devMgrAdapterMock = make_shared(); + BDeviceManagerAdapter::deviceManagerAdapter = devMgrAdapterMock; + std::shared_ptr executors = std::make_shared(1, 0); + Bootstrap::GetInstance().LoadDirectory(); + Bootstrap::GetInstance().LoadCheckers(); + DistributedKv::KvStoreMetaManager::GetInstance().BindExecutor(executors); + DistributedKv::KvStoreMetaManager::GetInstance().InitMetaParameter(); + DistributedKv::KvStoreMetaManager::GetInstance().InitMetaListener(); +} + +void ObjectManagerTest::TearDownTestCase(void) +{ + BDeviceManagerAdapter::deviceManagerAdapter = nullptr; + devMgrAdapterMock = nullptr; +} + +void ObjectManagerTest::TearDown() {} + +/** +* @tc.name: DeleteNotifier001 +* @tc.desc: DeleteNotifier test. +* @tc.type: FUNC +* @tc.require: +* @tc.author: wangbin +*/ +HWTEST_F(ObjectManagerTest, DeleteNotifier001, TestSize.Level0) +{ + auto syncManager = SequenceSyncManager::GetInstance(); + auto result = syncManager->DeleteNotifier(sequenceId_, userId_); + ASSERT_EQ(result, SequenceSyncManager::ERR_SID_NOT_EXIST); +} + +/** +* @tc.name: Process001 +* @tc.desc: Process test. +* @tc.type: FUNC +* @tc.require: +* @tc.author: wangbin +*/ +HWTEST_F(ObjectManagerTest, Process001, TestSize.Level0) +{ + auto syncManager = SequenceSyncManager::GetInstance(); + std::map results; + results = {{ "test_cloud", DistributedDB::DBStatus::OK }}; + + std::function &results)> func; + func = [](const std::map &results) { + return results; + }; + auto result = syncManager->Process(sequenceId_, results, userId_); + ASSERT_EQ(result, SequenceSyncManager::ERR_SID_NOT_EXIST); + syncManager->seqIdCallbackRelations_.emplace(sequenceId_, func); + result = syncManager->Process(sequenceId_, results, userId_); + ASSERT_EQ(result, SequenceSyncManager::SUCCESS_USER_HAS_FINISHED); +} + +/** +* @tc.name: DeleteNotifierNoLock001 +* @tc.desc: DeleteNotifierNoLock test. +* @tc.type: FUNC +* @tc.require: +* @tc.author: wangbin +*/ +HWTEST_F(ObjectManagerTest, DeleteNotifierNoLock001, TestSize.Level0) +{ + auto syncManager = SequenceSyncManager::GetInstance(); + std::function &results)> func; + func = [](const std::map &results) { + return results; + }; + syncManager->seqIdCallbackRelations_.emplace(sequenceId_, func); + std::vector seqIds = {sequenceId_, sequenceId_2, sequenceId_3}; + std::string userId = "user_1"; + auto result = syncManager->DeleteNotifierNoLock(sequenceId_, userId_); + ASSERT_EQ(result, SequenceSyncManager::SUCCESS_USER_HAS_FINISHED); + syncManager->userIdSeqIdRelations_[userId] = seqIds; + result = syncManager->DeleteNotifierNoLock(sequenceId_, userId_); + ASSERT_EQ(result, SequenceSyncManager::SUCCESS_USER_IN_USE); +} + +/** +* @tc.name: Clear001 +* @tc.desc: Clear test. +* @tc.type: FUNC +* @tc.require: +* @tc.author: wangbin +*/ +HWTEST_F(ObjectManagerTest, Clear001, TestSize.Level0) +{ + auto manager = ObjectStoreManager::GetInstance(); + std::string dataDir = "/data/app/el2/100/database"; + manager->SetData(dataDir, userId_); + auto result = manager->Clear(); + ASSERT_EQ(result, OHOS::DistributedObject::OBJECT_SUCCESS); + auto size = manager->callbacks_.Size(); + ASSERT_EQ(size, 0); +} + +/** +* @tc.name: registerAndUnregisterRemoteCallback001 +* @tc.desc: test RegisterRemoteCallback and UnregisterRemoteCallback. +* @tc.type: FUNC +* @tc.require: +* @tc.author: wangbin +*/ +HWTEST_F(ObjectManagerTest, registerAndUnregisterRemoteCallback001, TestSize.Level0) +{ + auto manager = ObjectStoreManager::GetInstance(); + sptr callback; + manager->RegisterRemoteCallback(bundleName_, sessionId_, pid_, tokenId_, callback); + ObjectStoreManager::CallbackInfo callbackInfo = manager->callbacks_.Find(tokenId_).second; + std::string prefix = bundleName_ + sessionId_; + ASSERT_NE(callbackInfo.observers_.find(prefix), callbackInfo.observers_.end()); + manager->UnregisterRemoteCallback(bundleName_, pid_, tokenId_, sessionId_); + callbackInfo = manager->callbacks_.Find(tokenId_).second; + ASSERT_EQ(callbackInfo.observers_.find(prefix), callbackInfo.observers_.end()); +} + +/** +* @tc.name: registerAndUnregisterRemoteCallback002 +* @tc.desc: abnormal use cases. +* @tc.type: FUNC +* @tc.require: +* @tc.author: wangbin +*/ +HWTEST_F(ObjectManagerTest, registerAndUnregisterRemoteCallback002, TestSize.Level0) +{ + auto manager = ObjectStoreManager::GetInstance(); + sptr callback; + uint32_t tokenId = 101; + manager->RegisterRemoteCallback("", sessionId_, pid_, tokenId, callback); + manager->RegisterRemoteCallback(bundleName_, "", pid_, tokenId, callback); + manager->RegisterRemoteCallback("", "", pid_, tokenId, callback); + ASSERT_EQ(manager->callbacks_.Find(tokenId).first, false); + manager->UnregisterRemoteCallback("", pid_, tokenId, sessionId_); +} + +/** +* @tc.name: NotifyDataChanged001 +* @tc.desc: NotifyDataChanged test. +* @tc.type: FUNC +* @tc.require: +* @tc.author: wangbin +*/ +HWTEST_F(ObjectManagerTest, NotifyDataChanged001, TestSize.Level0) +{ + auto manager = ObjectStoreManager::GetInstance(); + std::string bundleName1_ = "com.examples.ophm.notepad"; + std::string objectKey = bundleName1_ + sessionId_; + std::map>> data; + std::map> data1; + std::vector data1_; + data1_.push_back(RestoreStatus::DATA_READY); + data1_.push_back(RestoreStatus::ASSETS_READY); + data1_.push_back(RestoreStatus::ALL_READY); + data1 = {{ "objectKey", data1_ }}; + data = {{ objectKey, data1 }}; + std::shared_ptr executors = std::make_shared(5, 3); // executor pool + manager->SetThreadPool(executors); + ASSERT_EQ(manager->restoreStatus_.Find(objectKey).first, false); + manager->NotifyDataChanged(data, {}); + ASSERT_EQ(manager->restoreStatus_.Find(objectKey).second, RestoreStatus::DATA_READY); +} + +/** +* @tc.name: NotifyAssetsReady001 +* @tc.desc: NotifyAssetsReady test. +* @tc.type: FUNC +* @tc.require: +* @tc.author: wangbin +*/ +HWTEST_F(ObjectManagerTest, NotifyAssetsReady001, TestSize.Level0) +{ + auto manager = ObjectStoreManager::GetInstance(); + std::string objectKey = bundleName_ + sessionId_; + std::string srcNetworkId = "1"; + ASSERT_EQ(manager->restoreStatus_.Find(objectKey).first, false); + manager->NotifyAssetsReady(objectKey, srcNetworkId); + ASSERT_EQ(manager->restoreStatus_.Find(objectKey).second, RestoreStatus::ASSETS_READY); + manager->restoreStatus_.Clear(); + manager->restoreStatus_.Insert(objectKey, RestoreStatus::DATA_READY); + manager->NotifyAssetsReady(objectKey, srcNetworkId); + ASSERT_EQ(manager->restoreStatus_.Find(objectKey).second, RestoreStatus::ALL_READY); +} + +/** + * @tc.name: NotifyAssetsReady002 + * @tc.desc: NotifyAssetsReady test. + * @tc.type: FUNC + */ +HWTEST_F(ObjectManagerTest, NotifyAssetsReady002, TestSize.Level0) +{ + auto manager = ObjectStoreManager::GetInstance(); + std::string objectKey="com.example.myapplicaiton123456"; + std::string srcNetworkId = "654321"; + + manager->restoreStatus_.Clear(); + manager->NotifyAssetsStart(objectKey, srcNetworkId); + auto [has0, value0] = manager->restoreStatus_.Find(objectKey); + EXPECT_TRUE(has0); + EXPECT_EQ(value0, RestoreStatus::NONE); + + manager->restoreStatus_.Clear(); + manager->NotifyAssetsReady(objectKey, srcNetworkId); + auto [has1, value1] = manager->restoreStatus_.Find(objectKey); + EXPECT_TRUE(has1); + EXPECT_EQ(value1, RestoreStatus::ASSETS_READY); + + manager->restoreStatus_.Clear(); + manager->restoreStatus_.Insert(objectKey, RestoreStatus::DATA_NOTIFIED); + manager->NotifyAssetsReady(objectKey, srcNetworkId); + auto [has2, value2] = manager->restoreStatus_.Find(objectKey); + EXPECT_TRUE(has2); + EXPECT_EQ(value2, RestoreStatus::ALL_READY); + + manager->restoreStatus_.Clear(); + manager->restoreStatus_.Insert(objectKey, RestoreStatus::DATA_READY); + manager->NotifyAssetsReady(objectKey, srcNetworkId); + auto [has3, value3] = manager->restoreStatus_.Find(objectKey); + EXPECT_TRUE(has3); + EXPECT_EQ(value3, RestoreStatus::ALL_READY); + manager->restoreStatus_.Clear(); +} + +/** +* @tc.name: NotifyChange001 +* @tc.desc: NotifyChange test. +* @tc.type: FUNC +* @tc.require: +* @tc.author: wangbin +*/ +HWTEST_F(ObjectManagerTest, NotifyChange001, TestSize.Level0) +{ + auto manager = ObjectStoreManager::GetInstance(); + std::map> data; + std::map> data1; + std::vector data1_; + data1_.push_back(RestoreStatus::DATA_READY); + data_.push_back(RestoreStatus::ALL_READY); + data = {{ "test_cloud", data_ }}; + data1 = {{ "p_###SAVEINFO###001", data1_ }}; + manager->NotifyChange(data1); + EXPECT_FALSE(manager->restoreStatus_.Find("p_###SAVEINFO###001").first); + manager->NotifyChange(data); + EXPECT_FALSE(manager->restoreStatus_.Find("test_cloud").first); +} + +/** + * @tc.name: NotifyChange002 + * @tc.desc: NotifyChange test. + * @tc.type: FUNC + */ +HWTEST_F(ObjectManagerTest, NotifyChange002, TestSize.Level0) +{ + auto manager = ObjectStoreManager::GetInstance(); + std::shared_ptr executor = std::make_shared(1, 0); + manager->SetThreadPool(executor); + std::map> data{}; + std::vector value{0}; + std::string bundleName = "com.example.myapplication"; + std::string sessionId = "123456"; + std::string source = "source"; + std::string target = "target"; + std::string timestamp = "1234567890"; + ObjectStoreManager::SaveInfo saveInfo(bundleName, sessionId, source, target, timestamp); + std::string saveInfoStr = DistributedData::Serializable::Marshall(saveInfo); + auto saveInfoValue = std::vector(saveInfoStr.begin(), saveInfoStr.end()); + std::string prefix = saveInfo.ToPropertyPrefix(); + std::string assetPrefix = prefix + "p_asset"; + data.insert_or_assign(prefix + "p_###SAVEINFO###", saveInfoValue); + data.insert_or_assign(prefix + "p_data", value); + data.insert_or_assign(assetPrefix + ObjectStore::NAME_SUFFIX, value); + data.insert_or_assign(assetPrefix + ObjectStore::URI_SUFFIX, value); + data.insert_or_assign(assetPrefix + ObjectStore::PATH_SUFFIX, value); + data.insert_or_assign(assetPrefix + ObjectStore::CREATE_TIME_SUFFIX, value); + data.insert_or_assign(assetPrefix + ObjectStore::MODIFY_TIME_SUFFIX, value); + data.insert_or_assign(assetPrefix + ObjectStore::SIZE_SUFFIX, value); + data.insert_or_assign("testkey", value); + EXPECT_CALL(*devMgrAdapterMock, IsSameAccount(_)).WillOnce(Return(true)); + manager->NotifyChange(data); + EXPECT_TRUE(manager->restoreStatus_.Contains(bundleName+sessionId)); + auto [has, taskId] = manager->objectTimer_.Find(bundleName+sessionId); + EXPECT_TRUE(has); + manager->restoreStatus_.Clear(); + manager->executors_->Remove(taskId); + manager->objectTimer_.Clear(); +} + +/** + * @tc.name: ComputeStatus001 + * @tc.desc: ComputeStatus.test + * @tc.type: FUNC + */ +HWTEST_F(ObjectManagerTest, ComputeStatus001, TestSize.Level0) +{ + auto manager = ObjectStoreManager::GetInstance(); + std::shared_ptr executor = std::make_shared(1, 0); + manager->SetThreadPool(executor); + std::string objectKey="com.example.myapplicaiton123456"; + std::map>> data{}; + manager->restoreStatus_.Clear(); + manager->ComputeStatus(objectKey, {}, data); + auto [has0, value0] = manager->restoreStatus_.Find(objectKey); + EXPECT_TRUE(has0); + EXPECT_EQ(value0, RestoreStatus::DATA_READY); + auto [has1, taskId1] = manager->objectTimer_.Find(objectKey); + EXPECT_TRUE(has1); + manager->executors_->Remove(taskId1); + manager->objectTimer_.Clear(); + manager->restoreStatus_.Clear(); + + manager->restoreStatus_.Insert(objectKey, RestoreStatus::ASSETS_READY); + manager->ComputeStatus(objectKey, {}, data); + auto [has2, value2] = manager->restoreStatus_.Find(objectKey); + EXPECT_TRUE(has2); + EXPECT_EQ(value2, RestoreStatus::ALL_READY); + auto [has3, taskId3] = manager->objectTimer_.Find(objectKey); + EXPECT_FALSE(has3); + manager->restoreStatus_.Clear(); +} + +/** +* @tc.name: Open001 +* @tc.desc: Open test. +* @tc.type: FUNC +* @tc.require: +* @tc.author: wangbin +*/ +HWTEST_F(ObjectManagerTest, Open001, TestSize.Level0) +{ + auto manager = ObjectStoreManager::GetInstance(); + manager->kvStoreDelegateManager_ = nullptr; + auto result = manager->Open(); + ASSERT_EQ(result, DistributedObject::OBJECT_INNER_ERROR); + std::string dataDir = "/data/app/el2/100/database"; + manager->SetData(dataDir, userId_); + manager->delegate_ = nullptr; + result = manager->Open(); + ASSERT_EQ(result, DistributedObject::OBJECT_SUCCESS); + manager->delegate_ = manager->OpenObjectKvStore(); + result = manager->Open(); + ASSERT_EQ(result, DistributedObject::OBJECT_SUCCESS); +} + +/** +* @tc.name: OnAssetChanged001 +* @tc.desc: OnAssetChanged test. +* @tc.type: FUNC +* @tc.require: +* @tc.author: wangbin +*/ +HWTEST_F(ObjectManagerTest, OnAssetChanged001, TestSize.Level0) +{ + auto manager = ObjectStoreManager::GetInstance(); + std::shared_ptr snapshot = std::make_shared(); + auto snapshotKey = appId_ + "_" + sessionId_; + auto result = manager->OnAssetChanged(tokenId_, appId_, sessionId_, deviceId_, assetValue_); + ASSERT_EQ(result, DistributedObject::OBJECT_INNER_ERROR); + manager->snapshots_.Insert(snapshotKey, snapshot); + result = manager->OnAssetChanged(tokenId_, appId_, sessionId_, deviceId_, assetValue_); + ASSERT_EQ(result, DistributedObject::OBJECT_SUCCESS); +} + +/** +* @tc.name: DeleteSnapshot001 +* @tc.desc: DeleteSnapshot test. +* @tc.type: FUNC +* @tc.require: +* @tc.author: wangbin +*/ +HWTEST_F(ObjectManagerTest, DeleteSnapshot001, TestSize.Level0) +{ + auto manager = ObjectStoreManager::GetInstance(); + std::shared_ptr snapshot = std::make_shared(); + auto snapshotKey = bundleName_ + "_" + sessionId_; + auto snapshots = manager->snapshots_.Find(snapshotKey).second; + ASSERT_EQ(snapshots, nullptr); + manager->DeleteSnapshot(bundleName_, sessionId_); + + manager->snapshots_.Insert(snapshotKey, snapshot); + snapshots = manager->snapshots_.Find(snapshotKey).second; + ASSERT_NE(snapshots, nullptr); + manager->DeleteSnapshot(bundleName_, sessionId_); +} + +/** +* @tc.name: FlushClosedStore001 +* @tc.desc: FlushClosedStore test. +* @tc.type: FUNC +* @tc.require: +* @tc.author: wangbin +*/ +HWTEST_F(ObjectManagerTest, FlushClosedStore001, TestSize.Level0) +{ + auto manager = ObjectStoreManager::GetInstance(); + manager->isSyncing_ = true; + manager->syncCount_ = 10; // test syncCount_ + manager->delegate_ = nullptr; + manager->FlushClosedStore(); + manager->isSyncing_ = false; + manager->FlushClosedStore(); + manager->syncCount_ = 0; // test syncCount_ + manager->FlushClosedStore(); + manager->delegate_ = manager->OpenObjectKvStore(); + ASSERT_NE(manager->delegate_, nullptr); + manager->FlushClosedStore(); + ASSERT_EQ(manager->delegate_, nullptr); +} + +/** +* @tc.name: Close001 +* @tc.desc: Close test. +* @tc.type: FUNC +* @tc.require: +* @tc.author: wangbin +*/ +HWTEST_F(ObjectManagerTest, Close001, TestSize.Level0) +{ + auto manager = ObjectStoreManager::GetInstance(); + manager->syncCount_ = 1; // test syncCount_ + manager->Close(); + ASSERT_EQ(manager->syncCount_, 1); // 1 is for testing + manager->delegate_ = manager->OpenObjectKvStore(); + manager->Close(); + ASSERT_EQ(manager->syncCount_, 0); // 0 is for testing +} + +/** +* @tc.name: SyncOnStore001 +* @tc.desc: SyncOnStore test. +* @tc.type: FUNC +* @tc.require: +* @tc.author: wangbin +*/ +HWTEST_F(ObjectManagerTest, SyncOnStore001, TestSize.Level0) +{ + auto manager = ObjectStoreManager::GetInstance(); + manager->delegate_ = manager->OpenObjectKvStore(); + std::function &results)> func; + func = [](const std::map &results) { + return results; + }; + std::string prefix = "ObjectManagerTest"; + std::vector deviceList; + // not local device & syncDevices empty + deviceList.push_back("local1"); + EXPECT_CALL(*devMgrAdapterMock, IsSameAccount(_)).WillOnce(Return(true)); + auto result = manager->SyncOnStore(prefix, deviceList, func); + ASSERT_NE(result, OBJECT_SUCCESS); + // local device + deviceList.push_back("local"); + EXPECT_CALL(*devMgrAdapterMock, IsSameAccount(_)).WillOnce(Return(true)); + result = manager->SyncOnStore(prefix, deviceList, func); + ASSERT_EQ(result, OBJECT_SUCCESS); +} + +/** +* @tc.name: RetrieveFromStore001 +* @tc.desc: RetrieveFromStore test. +* @tc.type: FUNC +* @tc.require: +* @tc.author: wangbin +*/ +HWTEST_F(ObjectManagerTest, RetrieveFromStore001, TestSize.Level0) +{ + auto manager = ObjectStoreManager::GetInstance(); + DistributedDB::KvStoreNbDelegateMock mockDelegate; + manager->delegate_ = &mockDelegate; + std::vector id; + id.push_back(1); // for testing + id.push_back(2); // for testing + std::map> results; + results = {{ "test_cloud", id }}; + auto result = manager->RetrieveFromStore(appId_, sessionId_, results); + ASSERT_EQ(result, OBJECT_SUCCESS); +} + +/** +* @tc.name: SyncCompleted001 +* @tc.desc: SyncCompleted test. +* @tc.type: FUNC +* @tc.require: +* @tc.author: wangbin +*/ +HWTEST_F(ObjectManagerTest, SyncCompleted001, TestSize.Level0) +{ + auto manager = ObjectStoreManager::GetInstance(); + auto syncManager = SequenceSyncManager::GetInstance(); + std::map results; + results = {{ "test_cloud", DistributedDB::DBStatus::OK }}; + std::function &results)> func; + func = [](const std::map &results) { + return results; + }; + manager->userId_ = "99"; + std::vector userId; + userId.push_back(99); + userId.push_back(100); + manager->SyncCompleted(results, sequenceId_); + syncManager->userIdSeqIdRelations_ = {{ "test_cloud", userId }}; + manager->SyncCompleted(results, sequenceId_); + userId.clear(); + syncManager->seqIdCallbackRelations_.emplace(sequenceId_, func); + manager->SyncCompleted(results, sequenceId_); + userId.push_back(99); + userId.push_back(100); + manager->SyncCompleted(results, sequenceId_); + EXPECT_FALSE(manager->isSyncing_); +} + +/** +* @tc.name: SplitEntryKey001 +* @tc.desc: SplitEntryKey test. +* @tc.type: FUNC +* @tc.require: +* @tc.author: wangbin +*/ +HWTEST_F(ObjectManagerTest, SplitEntryKey001, TestSize.Level0) +{ + auto manager = ObjectStoreManager::GetInstance(); + std::string key1 = ""; + std::string key2 = "ObjectManagerTest"; + auto result = manager->SplitEntryKey(key1); + ASSERT_EQ(result.empty(), true); + result = manager->SplitEntryKey(key2); + ASSERT_EQ(result.empty(), true); +} + +/** +* @tc.name: SplitEntryKey002 +* @tc.desc: SplitEntryKey test. +* @tc.type: FUNC +*/ +HWTEST_F(ObjectManagerTest, SplitEntryKey002, TestSize.Level0) +{ + auto manager = ObjectStoreManager::GetInstance(); + std::string key1 = "com.example.myapplication_sessionId_source_target_1234567890_p_propertyName"; + auto res = manager->SplitEntryKey(key1); + EXPECT_EQ(res[0], "com.example.myapplication"); + EXPECT_EQ(res[1], "sessionId"); + EXPECT_EQ(res[2], "source"); + EXPECT_EQ(res[3], "target"); + EXPECT_EQ(res[4], "1234567890"); + EXPECT_EQ(res[5], "p_propertyName"); + + std::string key2 = "com.example.myapplication_sessionId_source_target_000_p_propertyName"; + res = manager->SplitEntryKey(key2); + EXPECT_TRUE(res.empty()); + + std::string key3 = "com.example.myapplicationsessionIdsourcetarget_1234567890_p_propertyName"; + res = manager->SplitEntryKey(key3); + EXPECT_TRUE(res.empty()); + + std::string key4 = "com.example.myapplicationsessionIdsource_target_1234567890_p_propertyName"; + res = manager->SplitEntryKey(key4); + EXPECT_TRUE(res.empty()); + + std::string key5 = "com.example.myapplicationsessionId_source_target_1234567890_p_propertyName"; + res = manager->SplitEntryKey(key5); + EXPECT_TRUE(res.empty()); +} + +/** +* @tc.name: ProcessOldEntry001 +* @tc.desc: ProcessOldEntry test. +* @tc.type: FUNC +* @tc.require: +* @tc.author: wangbin +*/ +HWTEST_F(ObjectManagerTest, ProcessOldEntry001, TestSize.Level0) +{ + auto manager = ObjectStoreManager::GetInstance(); + manager->delegate_ = manager->OpenObjectKvStore(); + std::vector entries; + auto status = manager->delegate_->GetEntries(std::vector(appId_.begin(), appId_.end()), entries); + ASSERT_EQ(status, DistributedDB::DBStatus::NOT_FOUND); + manager->ProcessOldEntry(appId_); + + DistributedDB::KvStoreNbDelegateMock mockDelegate; + manager->delegate_ = &mockDelegate; + status = manager->delegate_->GetEntries(std::vector(appId_.begin(), appId_.end()), entries); + ASSERT_EQ(status, DistributedDB::DBStatus::OK); + manager->ProcessOldEntry(appId_); +} + +/** +* @tc.name: ProcessSyncCallback001 +* @tc.desc: ProcessSyncCallback test. +* @tc.type: FUNC +* @tc.require: +* @tc.author: wangbin +*/ +HWTEST_F(ObjectManagerTest, ProcessSyncCallback001, TestSize.Level0) +{ + auto manager = ObjectStoreManager::GetInstance(); + std::map results; + manager->ProcessSyncCallback(results, appId_, sessionId_, deviceId_); + results.insert({"local", 1}); // for testing + ASSERT_EQ(results.empty(), false); + ASSERT_NE(results.find("local"), results.end()); + manager->ProcessSyncCallback(results, appId_, sessionId_, deviceId_); +} + +/** +* @tc.name: ProcessSyncCallback002 +* @tc.desc: ProcessSyncCallback test. +* @tc.type: FUNC +*/ +HWTEST_F(ObjectManagerTest, ProcessSyncCallback002, TestSize.Level0) +{ + std::string dataDir = "/data/app/el2/100/database"; + auto manager = ObjectStoreManager::GetInstance(); + std::map results; + + results.insert({"remote", 1}); // for testing + ASSERT_EQ(results.empty(), false); + ASSERT_EQ(results.find("local"), results.end()); + + manager->kvStoreDelegateManager_ = nullptr; + // open store failed -> success + manager->ProcessSyncCallback(results, appId_, sessionId_, deviceId_); + + // open store success -> success + manager->SetData(dataDir, userId_); + ASSERT_NE(manager->kvStoreDelegateManager_, nullptr); + manager->delegate_ = manager->OpenObjectKvStore(); + ASSERT_NE(manager->delegate_, nullptr); + manager->ProcessSyncCallback(results, appId_, sessionId_, deviceId_); +} + +/** +* @tc.name: IsAssetComplete001 +* @tc.desc: IsAssetComplete test. +* @tc.type: FUNC +* @tc.require: +* @tc.author: wangbin +*/ +HWTEST_F(ObjectManagerTest, IsAssetComplete001, TestSize.Level0) +{ + auto manager = ObjectStoreManager::GetInstance(); + std::map> results; + std::vector completes; + completes.push_back(1); // for testing + completes.push_back(2); // for testing + std::string assetPrefix = "IsAssetComplete_test"; + results.insert({assetPrefix, completes}); + auto result = manager->IsAssetComplete(results, assetPrefix); + ASSERT_EQ(result, false); + results.insert({assetPrefix + ObjectStore::NAME_SUFFIX, completes}); + result = manager->IsAssetComplete(results, assetPrefix); + ASSERT_EQ(result, false); + results.insert({assetPrefix + ObjectStore::URI_SUFFIX, completes}); + result = manager->IsAssetComplete(results, assetPrefix); + ASSERT_EQ(result, false); + results.insert({assetPrefix + ObjectStore::PATH_SUFFIX, completes}); + result = manager->IsAssetComplete(results, assetPrefix); + ASSERT_EQ(result, false); + results.insert({assetPrefix + ObjectStore::CREATE_TIME_SUFFIX, completes}); + result = manager->IsAssetComplete(results, assetPrefix); + ASSERT_EQ(result, false); + results.insert({assetPrefix + ObjectStore::MODIFY_TIME_SUFFIX, completes}); + result = manager->IsAssetComplete(results, assetPrefix); + ASSERT_EQ(result, false); + results.insert({assetPrefix + ObjectStore::SIZE_SUFFIX, completes}); + result = manager->IsAssetComplete(results, assetPrefix); + ASSERT_EQ(result, true); +} + +/** +* @tc.name: GetAssetsFromDBRecords001 +* @tc.desc: GetAssetsFromDBRecords test. +* @tc.type: FUNC +* @tc.require: +* @tc.author: wangbin +*/ +HWTEST_F(ObjectManagerTest, GetAssetsFromDBRecords001, TestSize.Level0) +{ + auto manager = ObjectStoreManager::GetInstance(); + std::map> results; + std::vector completes; + completes.push_back(1); // for testing + completes.push_back(2); // for testing + std::string assetPrefix = "IsAssetComplete_test"; + results.insert({assetPrefix, completes}); + results.insert({assetPrefix + ObjectStore::NAME_SUFFIX, completes}); + results.insert({assetPrefix + ObjectStore::URI_SUFFIX, completes}); + results.insert({assetPrefix + ObjectStore::MODIFY_TIME_SUFFIX, completes}); + results.insert({assetPrefix + ObjectStore::SIZE_SUFFIX, completes}); + auto result = manager->GetAssetsFromDBRecords(results); + ASSERT_EQ(result.empty(), false); +} + +/** +* @tc.name: GetAssetsFromDBRecords002 +* @tc.desc: GetAssetsFromDBRecords test. +* @tc.type: FUNC +*/ +HWTEST_F(ObjectManagerTest, GetAssetsFromDBRecords002, TestSize.Level0) +{ + auto manager = ObjectStoreManager::GetInstance(); + std::map> result; + + std::vector value0{0}; + std::string data0 = "[STRING]test"; + value0.insert(value0.end(), data0.begin(), data0.end()); + + std::vector value1{0}; + std::string data1 = "(string)test"; + value1.insert(value1.end(), data1.begin(), data1.end()); + + std::string prefix = "bundleName_sessionId_source_target_timestamp"; + std::string dataKey = prefix + "_p_data"; + std::string assetPrefix0 = prefix + "_p_asset0"; + std::string assetPrefix1 = prefix + "_p_asset1"; + + result.insert({dataKey, value0}); + auto assets = manager->GetAssetsFromDBRecords(result); + EXPECT_TRUE(assets.empty()); + + result.clear(); + result.insert({assetPrefix0 + ObjectStore::URI_SUFFIX, value0}); + assets = manager->GetAssetsFromDBRecords(result); + EXPECT_TRUE(assets.empty()); + + result.clear(); + result.insert({assetPrefix1 + ObjectStore::NAME_SUFFIX, value1}); + assets = manager->GetAssetsFromDBRecords(result); + EXPECT_TRUE(assets.empty()); + + result.clear(); + result.insert({assetPrefix0 + ObjectStore::NAME_SUFFIX, value0}); + result.insert({assetPrefix0 + ObjectStore::URI_SUFFIX, value0}); + result.insert({assetPrefix0 + ObjectStore::MODIFY_TIME_SUFFIX, value0}); + result.insert({assetPrefix0 + ObjectStore::SIZE_SUFFIX, value0}); + assets = manager->GetAssetsFromDBRecords(result); + ASSERT_EQ(assets.size(), 1); + EXPECT_EQ(assets[0].name, "test"); + EXPECT_EQ(assets[0].uri, "test"); + EXPECT_EQ(assets[0].modifyTime, "test"); + EXPECT_EQ(assets[0].size, "test"); + EXPECT_EQ(assets[0].hash, "test_test"); + + result.clear(); + result.insert({assetPrefix1 + ObjectStore::NAME_SUFFIX, value1}); + result.insert({assetPrefix1 + ObjectStore::URI_SUFFIX, value1}); + result.insert({assetPrefix1 + ObjectStore::MODIFY_TIME_SUFFIX, value1}); + result.insert({assetPrefix1 + ObjectStore::SIZE_SUFFIX, value1}); + assets = manager->GetAssetsFromDBRecords(result); + ASSERT_EQ(assets.size(), 1); + EXPECT_EQ(assets[0].name, "(string)test"); + EXPECT_EQ(assets[0].uri, "(string)test"); + EXPECT_EQ(assets[0].modifyTime, "(string)test"); + EXPECT_EQ(assets[0].size, "(string)test"); + EXPECT_EQ(assets[0].hash, "(string)test_(string)test"); +} + +/** +* @tc.name: RegisterAssetsLister001 +* @tc.desc: RegisterAssetsLister test. +* @tc.type: FUNC +* @tc.require: +* @tc.author: wangbin +*/ +HWTEST_F(ObjectManagerTest, RegisterAssetsLister001, TestSize.Level0) +{ + auto manager = ObjectStoreManager::GetInstance(); + manager->objectAssetsSendListener_ = nullptr; + manager->objectAssetsRecvListener_ = nullptr; + auto result = manager->RegisterAssetsLister(); + ASSERT_EQ(result, true); + manager->objectAssetsSendListener_ = new ObjectAssetsSendListener(); + manager->objectAssetsRecvListener_ = new ObjectAssetsRecvListener();; + result = manager->RegisterAssetsLister(); + ASSERT_EQ(result, true); +} + +/** +* @tc.name: PushAssets001 +* @tc.desc: PushAssets test. +* @tc.type: FUNC +* @tc.require: +* @tc.author: wangbin +*/ +HWTEST_F(ObjectManagerTest, PushAssets001, TestSize.Level0) +{ + auto manager = ObjectStoreManager::GetInstance(); + std::map> data; + std::string assetPrefix = "PushAssets_test"; + std::vector completes; + completes.push_back(1); // for testing + completes.push_back(2); // for testing + data.insert({assetPrefix, completes}); + auto result = manager->PushAssets(appId_, appId_, sessionId_, data, deviceId_); + ASSERT_EQ(result, DistributedObject::OBJECT_SUCCESS); +} + +/** +* @tc.name: PushAssets002 +* @tc.desc: PushAssets test. +* @tc.type: FUNC +*/ +HWTEST_F(ObjectManagerTest, PushAssets002, TestSize.Level0) +{ + auto manager = ObjectStoreManager::GetInstance(); + std::map> data; + std::vector value{0}; + std::string data0 = "[STRING]test"; + value.insert(value.end(), data0.begin(), data0.end()); + + std::string prefix = "bundleName_sessionId_source_target_timestamp"; + std::string dataKey = prefix + "_p_data"; + std::string assetPrefix = prefix + "_p_asset0"; + std::string fieldsPrefix = "p_"; + std::string deviceIdKey = "__deviceId"; + + data.insert({assetPrefix + ObjectStore::NAME_SUFFIX, value}); + data.insert({assetPrefix + ObjectStore::URI_SUFFIX, value}); + data.insert({assetPrefix + ObjectStore::MODIFY_TIME_SUFFIX, value}); + data.insert({assetPrefix + ObjectStore::SIZE_SUFFIX, value}); + data.insert({fieldsPrefix + deviceIdKey, value}); + + manager->objectAssetsSendListener_ = nullptr; + int32_t ret = manager->PushAssets(appId_, appId_, sessionId_, data, deviceId_); + EXPECT_NE(ret, DistributedObject::OBJECT_SUCCESS); + + manager->objectAssetsSendListener_ = new ObjectAssetsSendListener(); + ASSERT_NE(manager->objectAssetsSendListener_, nullptr); + ret = manager->PushAssets(appId_, appId_, sessionId_, data, deviceId_); + EXPECT_NE(ret, DistributedObject::OBJECT_SUCCESS); +} + +/** +* @tc.name: AddNotifier001 +* @tc.desc: AddNotifie and DeleteNotifier test. +* @tc.type: FUNC +*/ +HWTEST_F(ObjectManagerTest, AddNotifier001, TestSize.Level0) +{ + auto syncManager = SequenceSyncManager::GetInstance(); + std::function &results)> func; + func = [](const std::map &results) { + return results; + }; + auto sequenceId_ = syncManager->AddNotifier(userId_, func); + auto result = syncManager->DeleteNotifier(sequenceId_, userId_); + ASSERT_EQ(result, SequenceSyncManager::SUCCESS_USER_HAS_FINISHED); +} + +/** +* @tc.name: AddNotifier002 +* @tc.desc: AddNotifie and DeleteNotifier test. +* @tc.type: FUNC +*/ +HWTEST_F(ObjectManagerTest, AddNotifier002, TestSize.Level0) +{ + auto syncManager = SequenceSyncManager::GetInstance(); + std::function &results)> func; + func = [](const std::map &results) { + return results; + }; + auto sequenceId = syncManager->AddNotifier(userId_, func); + ASSERT_NE(sequenceId, sequenceId_); + auto result = syncManager->DeleteNotifier(sequenceId_, userId_); + ASSERT_EQ(result, SequenceSyncManager::ERR_SID_NOT_EXIST); +} + +/** +* @tc.name: BindAsset 001 +* @tc.desc: BindAsset test. +* @tc.type: FUNC +*/ +HWTEST_F(ObjectManagerTest, BindAsset001, TestSize.Level0) +{ + auto manager = ObjectStoreManager::GetInstance(); + std::string bundleName = "BindAsset"; + uint32_t tokenId = IPCSkeleton::GetCallingTokenID(); + auto result = manager->BindAsset(tokenId, bundleName, sessionId_, assetValue_, assetBindInfo_); + ASSERT_EQ(result, DistributedObject::OBJECT_DBSTATUS_ERROR); +} + +/** +* @tc.name: OnFinished001 +* @tc.desc: OnFinished test. +* @tc.type: FUNC +*/ +HWTEST_F(ObjectManagerTest, OnFinished001, TestSize.Level1) +{ + std::string srcNetworkId = "srcNetworkId"; + sptr assetObj = nullptr; + int32_t result = 100; + ObjectAssetsRecvListener listener; + int32_t ret = listener.OnFinished(srcNetworkId, assetObj, result); + EXPECT_NE(ret, DistributedObject::OBJECT_SUCCESS); + + sptr assetObj_1 = new AssetObj(); + assetObj_1->dstBundleName_ = bundleName_; + assetObj_1->srcBundleName_ = bundleName_; + assetObj_1->dstNetworkId_ = "1"; + assetObj_1->sessionId_ = "123"; + ret = listener.OnFinished(srcNetworkId, assetObj_1, result); + EXPECT_EQ(ret, DistributedObject::OBJECT_SUCCESS); +} + +/** +* @tc.name: GetObjectData001 +* @tc.desc: GetObjectData test. +* @tc.type: FUNC +*/ +HWTEST_F(ObjectManagerTest, GetObjectData001, TestSize.Level1) +{ + auto manager = ObjectStoreManager::GetInstance(); + + std::string bundleName = bundleName_; + std::string sessionId = sessionId_; + std::string source = "sourceDeviceId"; + std::string target = "targetDeviceId"; + std::string timestamp = "1234567890"; + ObjectStoreManager::SaveInfo saveInfo(bundleName, sessionId, source, target, timestamp); + std::string prefix = saveInfo.ToPropertyPrefix(); + EXPECT_FALSE(prefix.empty()); + + // p_name not asset key + std::string p_name = "p_namejpg"; + std::string key = bundleName + "_" + sessionId + "_" + source + "_" + target + "_" + timestamp + "_" + p_name; + std::map> changedData = {{ key, data_ }}; + bool hasAsset = false; + auto ret = manager->GetObjectData(changedData, saveInfo, hasAsset); + EXPECT_FALSE(ret.empty()); + EXPECT_FALSE(hasAsset); +} + +/** +* @tc.name: GetObjectData002 +* @tc.desc: GetObjectData test. +* @tc.type: FUNC +*/ +HWTEST_F(ObjectManagerTest, GetObjectData002, TestSize.Level1) +{ + auto manager = ObjectStoreManager::GetInstance(); + + std::string bundleName = ""; + std::string sessionId = ""; + std::string source = ""; + std::string target = ""; + std::string timestamp = ""; + ObjectStoreManager::SaveInfo saveInfo(bundleName, sessionId, source, target, timestamp); + std::string prefix = saveInfo.ToPropertyPrefix(); + EXPECT_TRUE(prefix.empty()); + + // saveInfo.bundleName, sourceDeviceId, targetDeviceId empty + saveInfo.sessionId = sessionId_; + saveInfo.timestamp = "1234567890"; + + bundleName = bundleName_; + sessionId = sessionId_; + source = "sourceDeviceId"; + target = "targetDeviceId"; + timestamp = "1234567890"; + std::string p_name = "p_name.jpg"; + std::string key = bundleName + "_" + sessionId + "_" + source + "_" + target + "_" + timestamp + "_" + p_name; + std::map> changedData = {{ key, data_ }}; + bool hasAsset = false; + auto ret = manager->GetObjectData(changedData, saveInfo, hasAsset); + EXPECT_FALSE(ret.empty()); + EXPECT_EQ(saveInfo.bundleName, bundleName); + EXPECT_TRUE(hasAsset); + + // only targetDeviceId empty + saveInfo.bundleName = "test_bundleName"; + saveInfo.sourceDeviceId = "test_source"; + // p_name not asset key + p_name = "p_namejpg"; + std::string key_1 = bundleName + "_" + sessionId + "_" + source + "_" + target + "_" + timestamp + "_" + p_name; + std::map> changedData_1 = {{ key_1, data_ }}; + hasAsset = false; + ret = manager->GetObjectData(changedData_1, saveInfo, hasAsset); + EXPECT_FALSE(ret.empty()); + EXPECT_NE(saveInfo.bundleName, bundleName); + EXPECT_FALSE(hasAsset); +} + +/** +* @tc.name: InitUserMeta001 +* @tc.desc: test clear old user meta. +* @tc.type: FUNC +*/ +HWTEST_F(ObjectManagerTest, InitUserMeta001, TestSize.Level1) +{ + auto manager = ObjectStoreManager::GetInstance(); + auto status = manager->InitUserMeta(); + ASSERT_EQ(status, DistributedObject::OBJECT_SUCCESS); +} + +/** +* @tc.name: registerAndUnregisterProgressObserverCallback001 +* @tc.desc: test RegisterProgressObserverCallback and UnregisterProgressObserverCallback. +* @tc.type: FUNC +* @tc.require: +* @tc.author: +*/ +HWTEST_F(ObjectManagerTest, registerAndUnregisterProgressObserverCallback001, TestSize.Level0) +{ + auto manager = ObjectStoreManager::GetInstance(); + sptr callback; + manager->RegisterProgressObserverCallback(bundleName_, sessionId_, pid_, tokenId_, callback); + ObjectStoreManager::ProgressCallbackInfo progressCallbackInfo = manager->processCallbacks_.Find(tokenId_).second; + std::string objectKey = bundleName_ + sessionId_; + ASSERT_NE(progressCallbackInfo.observers_.find(objectKey), progressCallbackInfo.observers_.end()); + manager->UnregisterProgressObserverCallback(bundleName_, pid_, tokenId_, sessionId_); + progressCallbackInfo = manager->processCallbacks_.Find(tokenId_).second; + ASSERT_EQ(progressCallbackInfo.observers_.find(objectKey), progressCallbackInfo.observers_.end()); +} + +/** +* @tc.name: registerAndUnregisterProgressObserverCallback002 +* @tc.desc: abnormal use cases. +* @tc.type: FUNC +* @tc.require: +* @tc.author: +*/ +HWTEST_F(ObjectManagerTest, registerAndUnregisterProgressObserverCallback002, TestSize.Level0) +{ + auto manager = ObjectStoreManager::GetInstance(); + sptr callback; + uint32_t tokenId = 101; + manager->RegisterProgressObserverCallback("", sessionId_, pid_, tokenId, callback); + manager->RegisterProgressObserverCallback(bundleName_, "", pid_, tokenId, callback); + manager->RegisterProgressObserverCallback("", "", pid_, tokenId, callback); + ObjectStoreManager::ProgressCallbackInfo progressCallbackInfo = manager->processCallbacks_.Find(tokenId_).second; + progressCallbackInfo.pid = pid_; + manager->RegisterProgressObserverCallback(bundleName_, sessionId_, pid_, tokenId_, callback); + ASSERT_EQ(manager->processCallbacks_.Find(tokenId).first, false); + manager->UnregisterProgressObserverCallback("", pid_, tokenId, sessionId_); + manager->UnregisterProgressObserverCallback("", pid_, tokenId, ""); + manager->UnregisterProgressObserverCallback(bundleName_, pid_, tokenId, ""); +} + +/** +* @tc.name: NotifyAssetsRecvProgress001 +* @tc.desc: NotifyAssetsRecvProgress test. +* @tc.type: FUNC +* @tc.require: +* @tc.author: +*/ +HWTEST_F(ObjectManagerTest, NotifyAssetsRecvProgress001, TestSize.Level0) +{ + auto manager = ObjectStoreManager::GetInstance(); + std::string objectKey = bundleName_ + sessionId_; + std::string errProgress = "errProgress"; + int32_t progress = 100; + ASSERT_EQ(manager->assetsRecvProgress_.Find(objectKey).first, true); + ObjectStoreManager::ProgressCallbackInfo progressCallbackInfo = manager->processCallbacks_.Find(tokenId_).second; + manager->NotifyAssetsRecvProgress(errProgress, progress); + manager->assetsRecvProgress_.Clear(); + manager->assetsRecvProgress_.Insert(objectKey, progress); + progressCallbackInfo.observers_.clear(); + manager->NotifyAssetsRecvProgress(errProgress, progress); +} + +/** +* @tc.name: OnRecvProgress001 +* @tc.desc: OnRecvProgress test. +* @tc.type: FUNC +*/ +HWTEST_F(ObjectManagerTest, OnRecvProgress001, TestSize.Level1) +{ + std::string srcNetworkId = "srcNetworkId"; + sptr assetObj = nullptr; + uint64_t totalBytes = 100; + uint64_t processBytes = 100; + ObjectAssetsRecvListener listener; + int32_t ret = listener.OnRecvProgress(srcNetworkId, assetObj, totalBytes, processBytes); + EXPECT_EQ(ret, DistributedObject::OBJECT_INNER_ERROR); + uint64_t totalBytes_01 = 0; + ret = listener.OnRecvProgress(srcNetworkId, assetObj, totalBytes_01, processBytes); + EXPECT_EQ(ret, DistributedObject::OBJECT_INNER_ERROR); + sptr assetObj_1 = new AssetObj(); + ret = listener.OnRecvProgress(srcNetworkId, assetObj_1, totalBytes_01, processBytes); + EXPECT_EQ(ret, DistributedObject::OBJECT_INNER_ERROR); + ret = listener.OnRecvProgress(srcNetworkId, assetObj_1, totalBytes, processBytes); + EXPECT_EQ(ret, DistributedObject::OBJECT_SUCCESS); +} + +/** +* @tc.name: OnFinished002 +* @tc.desc: OnFinished test. +* @tc.type: FUNC +*/ +HWTEST_F(ObjectManagerTest, OnFinished002, TestSize.Level1) +{ + std::string srcNetworkId = "srcNetworkId"; + ObjectAssetsRecvListener listener; + sptr assetObj_1 = new AssetObj(); + assetObj_1->dstBundleName_ = bundleName_; + assetObj_1->srcBundleName_ = bundleName_; + assetObj_1->dstNetworkId_ = "1"; + assetObj_1->sessionId_ = "123"; + int32_t result = 100; + auto ret = listener.OnFinished(srcNetworkId, assetObj_1, result); + int32_t result_1 = 0; + ret = listener.OnFinished(srcNetworkId, assetObj_1, result_1); + EXPECT_EQ(ret, DistributedObject::OBJECT_SUCCESS); +} } // namespace OHOS::Test -- Gitee From c42058d0ade3458844a587c8dff3d4cdb31984d5 Mon Sep 17 00:00:00 2001 From: z30053452 Date: Thu, 17 Jul 2025 19:09:17 +0800 Subject: [PATCH 11/15] code fix Signed-off-by: z30053452 --- .../service/test/object_manager_test.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/services/distributeddataservice/service/test/object_manager_test.cpp b/services/distributeddataservice/service/test/object_manager_test.cpp index ce37ca79c..d21dde99c 100644 --- a/services/distributeddataservice/service/test/object_manager_test.cpp +++ b/services/distributeddataservice/service/test/object_manager_test.cpp @@ -715,7 +715,6 @@ HWTEST_F(ObjectManagerTest, ProcessSyncCallback002, TestSize.Level0) std::string dataDir = "/data/app/el2/100/database"; auto manager = ObjectStoreManager::GetInstance(); std::map results; - results.insert({"remote", 1}); // for testing ASSERT_EQ(results.empty(), false); ASSERT_EQ(results.find("local"), results.end()); @@ -819,8 +818,7 @@ HWTEST_F(ObjectManagerTest, GetAssetsFromDBRecords002, TestSize.Level0) result.insert({dataKey, value0}); auto assets = manager->GetAssetsFromDBRecords(result); - EXPECT_TRUE(assets.empty()); - + EXPECT_TRUE(assets.empty()); result.clear(); result.insert({assetPrefix0 + ObjectStore::URI_SUFFIX, value0}); assets = manager->GetAssetsFromDBRecords(result); -- Gitee From b6a206d2ea91c39dfe067ab9f8a69d970f5b3c46 Mon Sep 17 00:00:00 2001 From: z30053452 Date: Thu, 17 Jul 2025 19:11:17 +0800 Subject: [PATCH 12/15] code fix Signed-off-by: z30053452 --- .../service/test/object_manager_test.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/services/distributeddataservice/service/test/object_manager_test.cpp b/services/distributeddataservice/service/test/object_manager_test.cpp index d21dde99c..ce37ca79c 100644 --- a/services/distributeddataservice/service/test/object_manager_test.cpp +++ b/services/distributeddataservice/service/test/object_manager_test.cpp @@ -715,6 +715,7 @@ HWTEST_F(ObjectManagerTest, ProcessSyncCallback002, TestSize.Level0) std::string dataDir = "/data/app/el2/100/database"; auto manager = ObjectStoreManager::GetInstance(); std::map results; + results.insert({"remote", 1}); // for testing ASSERT_EQ(results.empty(), false); ASSERT_EQ(results.find("local"), results.end()); @@ -818,7 +819,8 @@ HWTEST_F(ObjectManagerTest, GetAssetsFromDBRecords002, TestSize.Level0) result.insert({dataKey, value0}); auto assets = manager->GetAssetsFromDBRecords(result); - EXPECT_TRUE(assets.empty()); + EXPECT_TRUE(assets.empty()); + result.clear(); result.insert({assetPrefix0 + ObjectStore::URI_SUFFIX, value0}); assets = manager->GetAssetsFromDBRecords(result); -- Gitee From f95bac7b53c4969cadfdb3f1542c6d3b9f4a9427 Mon Sep 17 00:00:00 2001 From: z30053452 Date: Thu, 17 Jul 2025 19:17:17 +0800 Subject: [PATCH 13/15] code fix Signed-off-by: z30053452 --- .../distributeddataservice/service/test/object_manager_test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/distributeddataservice/service/test/object_manager_test.cpp b/services/distributeddataservice/service/test/object_manager_test.cpp index ce37ca79c..1cfde83ab 100644 --- a/services/distributeddataservice/service/test/object_manager_test.cpp +++ b/services/distributeddataservice/service/test/object_manager_test.cpp @@ -820,7 +820,7 @@ HWTEST_F(ObjectManagerTest, GetAssetsFromDBRecords002, TestSize.Level0) result.insert({dataKey, value0}); auto assets = manager->GetAssetsFromDBRecords(result); EXPECT_TRUE(assets.empty()); - + result.clear(); result.insert({assetPrefix0 + ObjectStore::URI_SUFFIX, value0}); assets = manager->GetAssetsFromDBRecords(result); -- Gitee From f8de91187340729d095f647be121e40fc3abbe69 Mon Sep 17 00:00:00 2001 From: z30053452 Date: Thu, 17 Jul 2025 19:18:48 +0800 Subject: [PATCH 14/15] code fix Signed-off-by: z30053452 --- .../service/test/object_manager_test.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/distributeddataservice/service/test/object_manager_test.cpp b/services/distributeddataservice/service/test/object_manager_test.cpp index 1cfde83ab..c64096ecc 100644 --- a/services/distributeddataservice/service/test/object_manager_test.cpp +++ b/services/distributeddataservice/service/test/object_manager_test.cpp @@ -715,7 +715,7 @@ HWTEST_F(ObjectManagerTest, ProcessSyncCallback002, TestSize.Level0) std::string dataDir = "/data/app/el2/100/database"; auto manager = ObjectStoreManager::GetInstance(); std::map results; - + results.insert({"remote", 1}); // for testing ASSERT_EQ(results.empty(), false); ASSERT_EQ(results.find("local"), results.end()); @@ -820,7 +820,7 @@ HWTEST_F(ObjectManagerTest, GetAssetsFromDBRecords002, TestSize.Level0) result.insert({dataKey, value0}); auto assets = manager->GetAssetsFromDBRecords(result); EXPECT_TRUE(assets.empty()); - + result.clear(); result.insert({assetPrefix0 + ObjectStore::URI_SUFFIX, value0}); assets = manager->GetAssetsFromDBRecords(result); -- Gitee From 40fcd4716b54da41ce969ef0faa7a67a0cc538b2 Mon Sep 17 00:00:00 2001 From: zhiyihang Date: Thu, 17 Jul 2025 11:26:57 +0000 Subject: [PATCH 15/15] update services/distributeddataservice/service/test/object_manager_test.cpp. Signed-off-by: zhiyihang --- .../distributeddataservice/service/test/object_manager_test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/distributeddataservice/service/test/object_manager_test.cpp b/services/distributeddataservice/service/test/object_manager_test.cpp index c64096ecc..e68fbf262 100644 --- a/services/distributeddataservice/service/test/object_manager_test.cpp +++ b/services/distributeddataservice/service/test/object_manager_test.cpp @@ -820,7 +820,7 @@ HWTEST_F(ObjectManagerTest, GetAssetsFromDBRecords002, TestSize.Level0) result.insert({dataKey, value0}); auto assets = manager->GetAssetsFromDBRecords(result); EXPECT_TRUE(assets.empty()); - + result.clear(); result.insert({assetPrefix0 + ObjectStore::URI_SUFFIX, value0}); assets = manager->GetAssetsFromDBRecords(result); -- Gitee