diff --git a/services/distributeddataservice/framework/include/metadata/appid_meta_data.h b/services/distributeddataservice/framework/include/metadata/appid_meta_data.h index 627440f1ad3a8a9f20d1c791d12f3be4307798ae..ac4e60e04f056eeff29f5776e5e156085d731ba3 100644 --- a/services/distributeddataservice/framework/include/metadata/appid_meta_data.h +++ b/services/distributeddataservice/framework/include/metadata/appid_meta_data.h @@ -27,6 +27,7 @@ struct API_EXPORT AppIDMetaData final : public Serializable { API_EXPORT AppIDMetaData(const std::string &appId, const std::string &bundleName); API_EXPORT ~AppIDMetaData(); API_EXPORT bool operator==(const AppIDMetaData &appIdMetaData) const; + API_EXPORT bool operator!=(const AppIDMetaData &appIdMetaData) const; API_EXPORT bool Marshal(json &node) const override; API_EXPORT bool Unmarshal(const json &node) override; API_EXPORT std::string GetKey() const; diff --git a/services/distributeddataservice/framework/metadata/appid_meta_data.cpp b/services/distributeddataservice/framework/metadata/appid_meta_data.cpp index 1a1a7c856ecbfaf7c35b9aafd489e65847a14524..256d08650bdecc214c81bf649984037cd82332f5 100644 --- a/services/distributeddataservice/framework/metadata/appid_meta_data.cpp +++ b/services/distributeddataservice/framework/metadata/appid_meta_data.cpp @@ -52,6 +52,11 @@ std::string AppIDMetaData::GetKey() const { return appId; } + +bool AppIDMetaData::operator!=(const AppIDMetaData &appIdMetaData) const +{ + return !(*this == appIdMetaData); +} } // namespace DistributedData } // namespace OHOS diff --git a/services/distributeddataservice/service/object/include/object_service_impl.h b/services/distributeddataservice/service/object/include/object_service_impl.h index 98f0fcd616966ccde0ad575a327a4d0fbf01c540..12f6049f27b017cf9fa93d0c182c78120ac2be41 100644 --- a/services/distributeddataservice/service/object/include/object_service_impl.h +++ b/services/distributeddataservice/service/object/include/object_service_impl.h @@ -71,7 +71,8 @@ private: }; void RegisterObjectServiceInfo(); void RegisterHandler(); - int32_t SaveMetaData(StoreMetaData& saveMeta); + int32_t SaveMetaData(const std::string &userId); + StoreMetaData GetMetaData(const std::string &deviceId, const std::string &userId); void UpdateMetaData(); static Factory factory_; diff --git a/services/distributeddataservice/service/object/src/object_manager.cpp b/services/distributeddataservice/service/object/src/object_manager.cpp index 7d419e11b966b20985952169d226210e36c027da..696a530237e1072366e18c6e71ed8dc1806a4aa7 100644 --- a/services/distributeddataservice/service/object/src/object_manager.cpp +++ b/services/distributeddataservice/service/object/src/object_manager.cpp @@ -48,6 +48,7 @@ using AccessTokenKit = Security::AccessToken::AccessTokenKit; using ValueProxy = OHOS::DistributedData::ValueProxy; using DistributedFileDaemonManager = Storage::DistributedFile::DistributedFileDaemonManager; using DmAdapter = OHOS::DistributedData::DeviceManagerAdapter; +using ObjectUserMetaData = OHOS::DistributedData::ObjectUserMetaData; constexpr const char *SAVE_INFO = "p_###SAVEINFO###"; constexpr int32_t PROGRESS_MAX = 100; @@ -1372,12 +1373,12 @@ void ObjectStoreManager::SaveUserToMeta() return; } std::string appId = DistributedData::Bootstrap::GetInstance().GetProcessLabel(); - DistributedData::ObjectUserMetaData userMeta; - userMeta.userId = userId; - auto saved = DistributedData::MetaDataManager::GetInstance().SaveMeta( - DistributedData::ObjectUserMetaData::GetKey(), userMeta, true); - if (!saved) { - ZLOGE("userMeta save failed, userId:%{public}s", userId.c_str()); + ObjectUserMetaData userMeta; + if (!MetaDataManager::GetInstance().LoadMeta(userMeta.GetKey(), userMeta, true) || userId != userMeta.userId) { + userMeta.userId = userId; + if (!MetaDataManager::GetInstance().SaveMeta(ObjectUserMetaData::GetKey(), userMeta, true)) { + ZLOGE("userMeta save failed, userId:%{public}s", userId.c_str()); + } } } diff --git a/services/distributeddataservice/service/object/src/object_service_impl.cpp b/services/distributeddataservice/service/object/src/object_service_impl.cpp index 12346d8923df6270280a79737511edde2d39225d..16c6c23b5a1fc77691e1ec273a6e7f427bf1fbf1 100644 --- a/services/distributeddataservice/service/object/src/object_service_impl.cpp +++ b/services/distributeddataservice/service/object/src/object_service_impl.cpp @@ -44,6 +44,7 @@ using StoreMetaData = OHOS::DistributedData::StoreMetaData; using FeatureSystem = OHOS::DistributedData::FeatureSystem; using DumpManager = OHOS::DistributedData::DumpManager; using CheckerManager = OHOS::DistributedData::CheckerManager; +using AppIDMetaData = OHOS::DistributedData::AppIDMetaData; __attribute__((used)) ObjectServiceImpl::Factory ObjectServiceImpl::factory_; constexpr const char *METADATA_STORE_PATH = "/data/service/el1/public/database/distributeddata/kvdb"; ObjectServiceImpl::Factory::Factory() @@ -145,9 +146,11 @@ int32_t ObjectServiceImpl::OnInitialize() return OBJECT_INNER_ERROR; } executors_->Schedule(std::chrono::seconds(WAIT_ACCOUNT_SERVICE), [this]() { - StoreMetaData saveMeta; - SaveMetaData(saveMeta); - ObjectStoreManager::GetInstance().SetData(saveMeta.dataDir, saveMeta.user); + int foregroundUserId = 0; + DistributedData::AccountDelegate::GetInstance()->QueryForegroundUserId(foregroundUserId); + std::string userId = std::to_string(foregroundUserId); + SaveMetaData(userId); + ObjectStoreManager::GetInstance().SetData(METADATA_STORE_PATH, userId); ObjectStoreManager::GetInstance().InitUserMeta(); RegisterObjectServiceInfo(); RegisterHandler(); @@ -157,49 +160,42 @@ int32_t ObjectServiceImpl::OnInitialize() return OBJECT_SUCCESS; } -int32_t ObjectServiceImpl::SaveMetaData(StoreMetaData &saveMeta) +int32_t ObjectServiceImpl::SaveMetaData(const std::string &userId) { auto localDeviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; if (localDeviceId.empty()) { ZLOGE("failed to get local device id"); return OBJECT_INNER_ERROR; } - saveMeta.appType = "default"; - saveMeta.deviceId = localDeviceId; - saveMeta.storeId = DistributedObject::ObjectCommon::OBJECTSTORE_DB_STOREID; - saveMeta.isAutoSync = false; - saveMeta.isBackup = false; - saveMeta.isEncrypt = false; - saveMeta.bundleName = DistributedData::Bootstrap::GetInstance().GetProcessLabel(); - saveMeta.appId = DistributedData::Bootstrap::GetInstance().GetProcessLabel(); - saveMeta.account = DistributedData::AccountDelegate::GetInstance()->GetCurrentAccountId(); - saveMeta.tokenId = IPCSkeleton::GetCallingTokenID(); - saveMeta.securityLevel = DistributedKv::SecurityLevel::S1; - saveMeta.area = DistributedKv::Area::EL1; - saveMeta.uid = IPCSkeleton::GetCallingUid(); - saveMeta.storeType = ObjectDistributedType::OBJECT_SINGLE_VERSION; - saveMeta.dataType = DistributedKv::DataType::TYPE_DYNAMICAL; - saveMeta.authType = DistributedKv::AuthType::IDENTICAL_ACCOUNT; - int foregroundUserId = 0; - DistributedData::AccountDelegate::GetInstance()->QueryForegroundUserId(foregroundUserId); - saveMeta.user = std::to_string(foregroundUserId); - saveMeta.dataDir = METADATA_STORE_PATH; + auto saveMeta = GetMetaData(localDeviceId, userId); if (!DistributedData::DirectoryManager::GetInstance().CreateDirectory(saveMeta.dataDir)) { ZLOGE("Create directory error, dataDir: %{public}s.", Anonymous::Change(saveMeta.dataDir).c_str()); return OBJECT_INNER_ERROR; } - bool isSaved = DistributedData::MetaDataManager::GetInstance().SaveMeta(saveMeta.GetKeyWithoutPath(), saveMeta) && - DistributedData::MetaDataManager::GetInstance().SaveMeta(saveMeta.GetKey(), saveMeta, true); - if (!isSaved) { - ZLOGE("SaveMeta failed"); - return OBJECT_INNER_ERROR; + StoreMetaData oldStoreMetaData; + if (!MetaDataManager::GetInstance().LoadMeta(saveMeta.GetKey(), oldStoreMetaData, true) + || saveMeta != oldStoreMetaData) { + if (!MetaDataManager::GetInstance().SaveMeta(saveMeta.GetKey(), saveMeta, true)) { + ZLOGE("SaveMeta getKey failed"); + return OBJECT_INNER_ERROR; + } + } + if (!MetaDataManager::GetInstance().LoadMeta(saveMeta.GetKeyWithoutPath(), oldStoreMetaData) + || saveMeta != oldStoreMetaData) { + if (!MetaDataManager::GetInstance().SaveMeta(saveMeta.GetKeyWithoutPath(), saveMeta)) { + ZLOGE("SaveMeta getKeyWithoutPath failed"); + return OBJECT_INNER_ERROR; + } } - DistributedData::AppIDMetaData appIdMeta; + AppIDMetaData appIdMeta; appIdMeta.bundleName = saveMeta.bundleName; appIdMeta.appId = saveMeta.appId; - isSaved = DistributedData::MetaDataManager::GetInstance().SaveMeta(appIdMeta.GetKey(), appIdMeta, true); - if (!isSaved) { - ZLOGE("Save appIdMeta failed"); + AppIDMetaData oldAppIdMeta; + if (!MetaDataManager::GetInstance().LoadMeta(appIdMeta.GetKey(), oldAppIdMeta, true) || appIdMeta != oldAppIdMeta) { + if (!MetaDataManager::GetInstance().SaveMeta(appIdMeta.GetKey(), appIdMeta, true)) { + ZLOGE("Save appIdMeta failed"); + return OBJECT_INNER_ERROR; + } } ZLOGI("SaveMeta success appId %{public}s, storeId %{public}s", saveMeta.appId.c_str(), saveMeta.GetStoreAlias().c_str()); @@ -213,9 +209,11 @@ int32_t ObjectServiceImpl::OnUserChange(uint32_t code, const std::string &user, if (status != OBJECT_SUCCESS) { ZLOGE("Clear fail user:%{public}s, status: %{public}d", user.c_str(), status); } - StoreMetaData saveMeta; - SaveMetaData(saveMeta); - ObjectStoreManager::GetInstance().SetData(saveMeta.dataDir, saveMeta.user); + int foregroundUserId = 0; + DistributedData::AccountDelegate::GetInstance()->QueryForegroundUserId(foregroundUserId); + std::string userId = std::to_string(foregroundUserId); + SaveMetaData(userId); + ObjectStoreManager::GetInstance().SetData(METADATA_STORE_PATH, userId); } return Feature::OnUserChange(code, user, account); } @@ -456,4 +454,28 @@ int32_t ObjectServiceImpl::OnBind(const BindInfo &bindInfo) ObjectAssetLoader::GetInstance().SetThreadPool(executors_); return 0; } + +StoreMetaData ObjectServiceImpl::GetMetaData(const std::string &deviceId, const std::string &userId) +{ + StoreMetaData storeMetaData; + storeMetaData.appType = "default"; + storeMetaData.deviceId = deviceId; + storeMetaData.storeId = DistributedObject::ObjectCommon::OBJECTSTORE_DB_STOREID; + storeMetaData.isAutoSync = false; + storeMetaData.isBackup = false; + storeMetaData.isEncrypt = false; + storeMetaData.bundleName = DistributedData::Bootstrap::GetInstance().GetProcessLabel(); + storeMetaData.appId = DistributedData::Bootstrap::GetInstance().GetProcessLabel(); + storeMetaData.account = DistributedData::AccountDelegate::GetInstance()->GetCurrentAccountId(); + storeMetaData.tokenId = IPCSkeleton::GetCallingTokenID(); + storeMetaData.securityLevel = DistributedKv::SecurityLevel::S1; + storeMetaData.area = DistributedKv::Area::EL1; + storeMetaData.uid = IPCSkeleton::GetCallingUid(); + storeMetaData.storeType = ObjectDistributedType::OBJECT_SINGLE_VERSION; + storeMetaData.dataType = DistributedKv::DataType::TYPE_DYNAMICAL; + storeMetaData.authType = DistributedKv::AuthType::IDENTICAL_ACCOUNT; + storeMetaData.user = userId; + storeMetaData.dataDir = METADATA_STORE_PATH; + return storeMetaData; +} } // namespace OHOS::DistributedObject diff --git a/services/distributeddataservice/service/test/fuzztest/objectserviceimp3_fuzzer/objectserviceimp3_fuzzer.cpp b/services/distributeddataservice/service/test/fuzztest/objectserviceimp3_fuzzer/objectserviceimp3_fuzzer.cpp index fceecb58d8bc781aeebc88df22987fbbc0e2366a..8790f5c102284b302cd1c9798a2f106af1044787 100644 --- a/services/distributeddataservice/service/test/fuzztest/objectserviceimp3_fuzzer/objectserviceimp3_fuzzer.cpp +++ b/services/distributeddataservice/service/test/fuzztest/objectserviceimp3_fuzzer/objectserviceimp3_fuzzer.cpp @@ -38,8 +38,8 @@ void DumpObjectServiceInfoFuzzTest(FuzzedDataProvider &provider) void SaveMetaDataFuzzTest(FuzzedDataProvider &provider) { std::shared_ptr objectServiceImpl = std::make_shared(); - StoreMetaData saveMeta; - objectServiceImpl->SaveMetaData(saveMeta); + std::string userId = provider.ConsumeRandomLengthString(100); + objectServiceImpl->SaveMetaData(userId); auto &dmAdapter = DeviceManagerAdapter::GetInstance(); std::string uuid = provider.ConsumeRandomLengthString(100); std::string udid = provider.ConsumeRandomLengthString(100); @@ -51,7 +51,7 @@ void SaveMetaDataFuzzTest(FuzzedDataProvider &provider) } dmAdapter.localInfo_.uuid = uuid; dmAdapter.localInfo_.udid = udid; - objectServiceImpl->SaveMetaData(saveMeta); + objectServiceImpl->SaveMetaData(userId); } void BindAssetStoreFuzzTest(FuzzedDataProvider &provider) diff --git a/services/distributeddataservice/service/test/object_manager_test.cpp b/services/distributeddataservice/service/test/object_manager_test.cpp index a7364119f07758ca4a482900e0757655727189a9..4d3df5cf607d5730630eb9a57fe6f0d4cae0c0d9 100644 --- a/services/distributeddataservice/service/test/object_manager_test.cpp +++ b/services/distributeddataservice/service/test/object_manager_test.cpp @@ -1496,4 +1496,28 @@ HWTEST_F(ObjectManagerTest, SetData001, TestSize.Level1) manager.SetData(dataDir, userId_); EXPECT_EQ(manager.userId_, userId_); } + +/** +* @tc.name: SaveUserToMeta001 +* @tc.desc: SaveUserToMeta test. +* @tc.type: FUNC +*/ +HWTEST_F(ObjectManagerTest, SaveUserToMeta001, TestSize.Level1) +{ + auto &manager = ObjectStoreManager::GetInstance(); + manager.SaveUserToMeta(); + ObjectUserMetaData testUserMeta; + MetaDataManager::GetInstance().DelMeta(ObjectUserMetaData::GetKey(), true); + auto ret = MetaDataManager::GetInstance().LoadMeta(ObjectUserMetaData::GetKey(), testUserMeta, true); + EXPECT_EQ(ret, false); + manager.SaveUserToMeta(); + ret = MetaDataManager::GetInstance().LoadMeta(ObjectUserMetaData::GetKey(), testUserMeta, true); + EXPECT_EQ(ret, true); + ObjectUserMetaData testUserMeta1; + testUserMeta1.userId = "1000"; + MetaDataManager::GetInstance().SaveMeta(ObjectUserMetaData::GetKey(), testUserMeta1, true); + ret = MetaDataManager::GetInstance().LoadMeta(ObjectUserMetaData::GetKey(), testUserMeta1, true); + manager.SaveUserToMeta(); + EXPECT_EQ(ret, true); +} } // namespace OHOS::Test diff --git a/services/distributeddataservice/service/test/object_service_impl_test.cpp b/services/distributeddataservice/service/test/object_service_impl_test.cpp index 79bd608f9ce0742a8e1dabc568dac49e36957164..aeb23c78e2a061f47a3fb37174fab80a2aeeea43 100644 --- a/services/distributeddataservice/service/test/object_service_impl_test.cpp +++ b/services/distributeddataservice/service/test/object_service_impl_test.cpp @@ -19,10 +19,16 @@ #include +#include "account/account_delegate.h" #include "accesstoken_kit.h" #include "device_manager_adapter_mock.h" #include "ipc_skeleton.h" #include "token_setproc.h" +#include "metadata/meta_data_manager.h" +#include "metadata/object_user_meta_data.h" +#include "metadata/appid_meta_data.h" +#include "bootstrap.h" +#include "device_manager_adapter.h" using namespace testing::ext; using namespace OHOS::DistributedObject; @@ -201,4 +207,137 @@ HWTEST_F(ObjectServiceImplTest, UnregisterProgressObserver001, TestSize.Level1) int32_t ret = objectServiceImpl->UnregisterProgressObserver(bundleName_, sessionId_); EXPECT_EQ(ret, OBJECT_PERMISSION_DENIED); } + +/** + * @tc.name: SaveMeta001 + * @tc.desc: Save StoreMetaData test. + * @tc.type: FUNC + */ +HWTEST_F(ObjectServiceImplTest, SaveMeta001, TestSize.Level1) +{ + std::shared_ptr objectServiceImpl = std::make_shared(); + DeviceInfo devInfo = { .uuid = "123" }; + EXPECT_CALL(*devMgrAdapterMock, GetLocalDevice()).WillRepeatedly(Return(devInfo)); + int foregroundUserId = 0; + AccountDelegate::GetInstance()->QueryForegroundUserId(foregroundUserId); + std::string userId = std::to_string(foregroundUserId); + + StoreMetaData testUserMeta; + std::string deviceId = DistributedData::DeviceManagerAdapter::GetInstance().GetLocalDevice().uuid; + testUserMeta = objectServiceImpl->GetMetaData(deviceId, userId); + auto ret = objectServiceImpl->SaveMetaData(userId); + EXPECT_EQ(ret, OBJECT_SUCCESS); + auto exist = MetaDataManager::GetInstance().LoadMeta(testUserMeta.GetKey(), testUserMeta, true); + EXPECT_EQ(exist, true); + + StoreMetaData testUserMeta1; + MetaDataManager::GetInstance().LoadMeta(testUserMeta.GetKey(), testUserMeta1, true); + testUserMeta1.appType = "test_appType"; + EXPECT_NE(testUserMeta, testUserMeta1); + MetaDataManager::GetInstance().SaveMeta(testUserMeta.GetKey(), testUserMeta1, true); + ret = objectServiceImpl->SaveMetaData(userId); + MetaDataManager::GetInstance().LoadMeta(testUserMeta.GetKey(), testUserMeta1, true); + EXPECT_EQ(ret, OBJECT_SUCCESS); + EXPECT_EQ(testUserMeta, testUserMeta1); + + StoreMetaData testUserMeta2; + MetaDataManager::GetInstance().DelMeta(testUserMeta.GetKey(), true); + exist = MetaDataManager::GetInstance().LoadMeta(testUserMeta.GetKey(), testUserMeta2, true); + EXPECT_EQ(exist, false); + ret = objectServiceImpl->SaveMetaData(userId); + EXPECT_EQ(ret, OBJECT_SUCCESS); + exist = MetaDataManager::GetInstance().LoadMeta(testUserMeta.GetKey(), testUserMeta2, true); + EXPECT_EQ(exist, true); + EXPECT_EQ(testUserMeta, testUserMeta2); +} + +/** + * @tc.name: SaveMeta002 + * @tc.desc: Save key StoreMetaData test. + * @tc.type: FUNC + */ +HWTEST_F(ObjectServiceImplTest, SaveMeta002, TestSize.Level1) +{ + std::shared_ptr objectServiceImpl = std::make_shared(); + DeviceInfo devInfo = { .uuid = "123" }; + EXPECT_CALL(*devMgrAdapterMock, GetLocalDevice()).WillRepeatedly(Return(devInfo)); + int foregroundUserId = 0; + AccountDelegate::GetInstance()->QueryForegroundUserId(foregroundUserId); + std::string userId = std::to_string(foregroundUserId); + + StoreMetaData testUserMeta; + std::string deviceId = DistributedData::DeviceManagerAdapter::GetInstance().GetLocalDevice().uuid; + testUserMeta = objectServiceImpl->GetMetaData(deviceId, userId); + auto ret = objectServiceImpl->SaveMetaData(userId); + EXPECT_EQ(ret, OBJECT_SUCCESS); + auto exist = MetaDataManager::GetInstance().LoadMeta(testUserMeta.GetKeyWithoutPath(), testUserMeta); + EXPECT_EQ(exist, true); + + StoreMetaData testUserMeta1; + MetaDataManager::GetInstance().LoadMeta(testUserMeta.GetKeyWithoutPath(), testUserMeta1); + testUserMeta1.appType = "test_appType"; + EXPECT_NE(testUserMeta, testUserMeta1); + MetaDataManager::GetInstance().SaveMeta(testUserMeta.GetKeyWithoutPath(), testUserMeta1); + ret = objectServiceImpl->SaveMetaData(userId); + EXPECT_EQ(ret, OBJECT_SUCCESS); + MetaDataManager::GetInstance().LoadMeta(testUserMeta.GetKeyWithoutPath(), testUserMeta1); + EXPECT_EQ(testUserMeta, testUserMeta1); + + StoreMetaData testUserMeta2; + MetaDataManager::GetInstance().DelMeta(testUserMeta.GetKeyWithoutPath()); + exist = MetaDataManager::GetInstance().LoadMeta(testUserMeta.GetKeyWithoutPath(), testUserMeta2); + EXPECT_EQ(exist, false); + ret = objectServiceImpl->SaveMetaData(userId); + EXPECT_EQ(ret, OBJECT_SUCCESS); + exist = MetaDataManager::GetInstance().LoadMeta(testUserMeta.GetKeyWithoutPath(), testUserMeta2); + EXPECT_EQ(exist, true); + EXPECT_EQ(testUserMeta, testUserMeta2); +} + +/** + * @tc.name: SaveMeta003 + * @tc.desc: Save AppIDMetaData test. + * @tc.type: FUNC + */ +HWTEST_F(ObjectServiceImplTest, SaveMeta003, TestSize.Level1) +{ + std::shared_ptr objectServiceImpl = std::make_shared(); + DeviceInfo devInfo = { .uuid = "123" }; + EXPECT_CALL(*devMgrAdapterMock, GetLocalDevice()).WillRepeatedly(Return(devInfo)); + int foregroundUserId = 0; + AccountDelegate::GetInstance()->QueryForegroundUserId(foregroundUserId); + std::string userId = std::to_string(foregroundUserId); + StoreMetaData testUserMeta; + std::string deviceId = DistributedData::DeviceManagerAdapter::GetInstance().GetLocalDevice().uuid; + testUserMeta = objectServiceImpl->GetMetaData(deviceId, userId); + AppIDMetaData testAppIdMeta; + testAppIdMeta.appId = testUserMeta.appId; + testAppIdMeta.bundleName = testUserMeta.bundleName; + auto ret = objectServiceImpl->SaveMetaData(userId); + EXPECT_EQ(ret, OBJECT_SUCCESS); + auto exist = MetaDataManager::GetInstance().LoadMeta(testAppIdMeta.GetKey(), testAppIdMeta, true); + EXPECT_EQ(exist, true); + + AppIDMetaData testAppIdMeta1; + MetaDataManager::GetInstance().LoadMeta(testAppIdMeta.GetKey(), testAppIdMeta1, true); + testAppIdMeta.bundleName = "test_app"; + EXPECT_NE(testAppIdMeta, testAppIdMeta1); + MetaDataManager::GetInstance().SaveMeta(testAppIdMeta.GetKey(), testAppIdMeta1, true); + ret = objectServiceImpl->SaveMetaData(userId); + EXPECT_EQ(ret, OBJECT_SUCCESS); + MetaDataManager::GetInstance().LoadMeta(testAppIdMeta.GetKey(), testAppIdMeta1, true); + EXPECT_NE(testAppIdMeta, testAppIdMeta1); + + AppIDMetaData testAppIdMeta3; + MetaDataManager::GetInstance().LoadMeta(testAppIdMeta.GetKey(), testAppIdMeta3, true); + MetaDataManager::GetInstance().DelMeta(testAppIdMeta.GetKey(), true); + AppIDMetaData testAppIdMeta2; + exist = MetaDataManager::GetInstance().LoadMeta(testAppIdMeta.GetKey(), testAppIdMeta2, true); + EXPECT_EQ(exist, false); + ret = objectServiceImpl->SaveMetaData(userId); + EXPECT_EQ(ret, OBJECT_SUCCESS); + exist = MetaDataManager::GetInstance().LoadMeta(testAppIdMeta.GetKey(), testAppIdMeta2, true); + EXPECT_EQ(exist, true); + EXPECT_EQ(testAppIdMeta3, testAppIdMeta2); +} } \ No newline at end of file