1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include <gtest/gtest.h>
17 #include <chrono>
18 #include <fstream>
19 #include <thread>
20 
21 #include "db_constant.h"
22 #include "db_common.h"
23 #include "distributeddb_data_generate_unit_test.h"
24 #include "distributeddb_tools_unit_test.h"
25 
26 using namespace testing::ext;
27 using namespace DistributedDB;
28 using namespace DistributedDBUnitTest;
29 using namespace std;
30 
31 namespace {
32     // define some variables to init a KvStoreDelegateManager object.
33     KvStoreDelegateManager g_mgr(APP_ID, USER_ID);
34     string g_testDir;
35     KvStoreConfig g_config;
36 
37     // define the g_kvNbDelegateCallback, used to get some information when open a kv store.
38     DBStatus g_kvDelegateStatus = INVALID_ARGS;
39     KvStoreNbDelegate *g_kvNbDelegatePtr = nullptr;
40     KvStoreNbDelegate::Option g_nbOption;
41 
42     // the type of g_kvNbDelegateCallback is function<void(DBStatus, KvStoreDelegate*)>
43     auto g_kvNbDelegateCallback = bind(&DistributedDBToolsUnitTest::KvStoreNbDelegateCallback, placeholders::_1,
44         placeholders::_2, std::ref(g_kvDelegateStatus), std::ref(g_kvNbDelegatePtr));
45 #ifndef OMIT_MULTI_VER
46     KvStoreDelegate *g_kvDelegatePtr = nullptr;
47 
48     // the type of g_kvDelegateCallback is function<void(DBStatus, KvStoreDelegate*)>
49     auto g_kvDelegateCallback = bind(&DistributedDBToolsUnitTest::KvStoreDelegateCallback, placeholders::_1,
50         placeholders::_2, std::ref(g_kvDelegateStatus), std::ref(g_kvDelegatePtr));
51 #endif // OMIT_MULTI_VER
52 
53     std::string g_storeId;
54     std::string g_identifier;
55     vector<string> g_singleVerFileNames;
56     vector<string> g_commitLogFileNames;
57     vector<string> g_metaStorageFileNames;
58     vector<string> g_multiVerDataFileNames;
59     vector<string> g_ValueStorageFileNames;
60 
GetRealFileUrl()61     void GetRealFileUrl()
62     {
63         std::string origIdentifier = USER_ID + "-" + APP_ID + "-" + g_storeId;
64         std::string hashIdentifier = DBCommon::TransferHashString(origIdentifier);
65         g_identifier = DBCommon::TransferStringToHex(hashIdentifier);
66 
67         g_singleVerFileNames = {
68             g_testDir + "/" + g_identifier + "/single_ver/main/gen_natural_store.db",
69             g_testDir + "/" + g_identifier + "/single_ver/main/gen_natural_store.db-shm",
70             g_testDir + "/" + g_identifier + "/single_ver/main/gen_natural_store.db-wal"};
71         g_commitLogFileNames = {
72             g_testDir + "/" + g_identifier + "/multi_ver/commit_logs.db",
73             g_testDir + "/" + g_identifier + "/multi_ver/commit_logs.db-shm",
74             g_testDir + "/" + g_identifier + "/multi_ver/commit_logs.db-wal"};
75         g_metaStorageFileNames = {
76             g_testDir + "/" + g_identifier + "/multi_ver/meta_storage.db",
77             g_testDir + "/" + g_identifier + "/multi_ver/meta_storage.db-shm",
78             g_testDir + "/" + g_identifier + "/multi_ver/meta_storage.db-wal"};
79         g_multiVerDataFileNames = {
80             g_testDir + "/" + g_identifier + "/multi_ver/multi_ver_data.db",
81             g_testDir + "/" + g_identifier + "/multi_ver/multi_ver_data.db-shm",
82             g_testDir + "/" + g_identifier + "/multi_ver/multi_ver_data.db-wal"};
83         g_ValueStorageFileNames = {
84             g_testDir + "/" + g_identifier + "/multi_ver/value_storage.db",
85             g_testDir + "/" + g_identifier + "/multi_ver/value_storage.db-shm",
86             g_testDir + "/" + g_identifier + "/multi_ver/value_storage.db-wal"};
87     }
88 
GetMultiVerFilelist()89     vector<string> GetMultiVerFilelist()
90     {
91         vector<string> multiFileNames;
92         for (const auto &iter : g_commitLogFileNames) {
93             multiFileNames.push_back(iter);
94         }
95         for (const auto &iter : g_metaStorageFileNames) {
96             multiFileNames.push_back(iter);
97         }
98         for (const auto &iter : g_multiVerDataFileNames) {
99             multiFileNames.push_back(iter);
100         }
101         for (const auto &iter : g_ValueStorageFileNames) {
102             multiFileNames.push_back(iter);
103         }
104         return multiFileNames;
105     }
106 }
107 
108 class DistributedDBInterfacesSpaceManagementTest : public testing::Test {
109 public:
110     static void SetUpTestCase(void);
111     static void TearDownTestCase(void);
112     void SetUp();
113     void TearDown();
114 };
115 
SetUpTestCase(void)116 void DistributedDBInterfacesSpaceManagementTest::SetUpTestCase(void)
117 {
118     DistributedDBToolsUnitTest::TestDirInit(g_testDir);
119     g_config.dataDir = g_testDir;
120     g_mgr.SetKvStoreConfig(g_config);
121 }
122 
TearDownTestCase(void)123 void DistributedDBInterfacesSpaceManagementTest::TearDownTestCase(void)
124 {
125     if (DistributedDBToolsUnitTest::RemoveTestDbFiles(g_testDir) != 0) {
126         LOGE("rm test db files error!");
127     }
128 }
129 
SetUp(void)130 void DistributedDBInterfacesSpaceManagementTest::SetUp(void)
131 {
132     DistributedDBToolsUnitTest::PrintTestCaseInfo();
133     g_kvDelegateStatus = INVALID_ARGS;
134     g_kvNbDelegatePtr = nullptr;
135 #ifndef OMIT_MULTI_VER
136     g_kvDelegatePtr = nullptr;
137 #endif // OMIT_MULTI_VER
138 }
139 
TearDown(void)140 void DistributedDBInterfacesSpaceManagementTest::TearDown(void) {}
141 
142 // use another way calculate small file size(2G)
CheckRealFileSize(const vector<string> & fileNames)143 static uint64_t CheckRealFileSize(const vector<string> &fileNames)
144 {
145     uint64_t size = 0;
146     for (const auto &file : fileNames) {
147         FILE *fileHandle = nullptr;
148         fileHandle = fopen(file.c_str(), "rb");
149         if (fileHandle == nullptr) {
150             LOGE("Open file[%s] fail[%d]", file.c_str(), errno);
151             continue;
152         }
153         (void)fseek(fileHandle, 0, SEEK_END);
154         long fileSize = ftell(fileHandle);
155         LOGD("CheckRealFileSize:FileName[%s],size[%ld]", file.c_str(), fileSize);
156         size += static_cast<uint64_t>(fileSize); // file is less than 16M.
157         (void)fclose(fileHandle);
158     }
159     return size;
160 }
161 
162 /**
163   * @tc.name: GetKvStoreDiskSize001
164   * @tc.desc: ROM space occupied by applications in the distributed database can be calculated.
165   * @tc.type: FUNC
166   * @tc.require: AR000CQDTD
167   * @tc.author: sunpeng
168   */
169 HWTEST_F(DistributedDBInterfacesSpaceManagementTest, GetKvStoreDiskSize001, TestSize.Level1)
170 {
171     g_storeId = "distributed_GetKvStoreDiskSize_001";
172     GetRealFileUrl();
173 
174     g_mgr.GetKvStore(g_storeId, g_nbOption, g_kvNbDelegateCallback);
175     ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
176     EXPECT_TRUE(g_kvDelegateStatus == OK);
177 
178     EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
179 
180     /**
181      * @tc.steps: step1/2. Get Db size by GetKvStoreDiskSize.
182      * @tc.expected: step1/2. Return right size and ok.
183      */
184     uint64_t localDbSize = 0;
185     EXPECT_EQ(g_mgr.GetKvStoreDiskSize(g_storeId, localDbSize), OK);
186     EXPECT_EQ(CheckRealFileSize(g_singleVerFileNames), localDbSize);
187 
188     /**
189      * @tc.steps: step3. Reopen Db.
190      */
191     g_mgr.GetKvStore(g_storeId, g_nbOption, g_kvNbDelegateCallback);
192     ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
193     EXPECT_TRUE(g_kvDelegateStatus == OK);
194 
195     /**
196      * @tc.steps: step4. Put some Key Value to change Db size.
197      */
198     Key key;
199     Value value;
200     DistributedDBToolsUnitTest::GetRandomKeyValue(key, DBConstant::MAX_KEY_SIZE);
201     DistributedDBToolsUnitTest::GetRandomKeyValue(value, DBConstant::MAX_VALUE_SIZE);
202     EXPECT_EQ(g_kvNbDelegatePtr->Put(key, value), OK);
203 
204     /**
205      * @tc.steps: step5/6. Get Db size by GetKvStoreDiskSize.
206      * @tc.expected: step5/6. Return right size and ok.
207      */
208     localDbSize = 0;
209     EXPECT_EQ(g_mgr.GetKvStoreDiskSize(g_storeId, localDbSize), OK);
210     EXPECT_EQ(CheckRealFileSize(g_singleVerFileNames), localDbSize);
211 
212     /**
213      * @tc.steps: step7. Close and Delete Db.
214      * @tc.expected: step7. Successfully.
215      */
216     EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
217     EXPECT_EQ(g_mgr.DeleteKvStore(g_storeId), OK);
218 }
219 
220 /**
221   * @tc.name: GetKvStoreDiskSize002
222   * @tc.desc: Obtain the size of the opened database.
223   * @tc.type: FUNC
224   * @tc.require: AR000CQDTD
225   * @tc.author: sunpeng
226   */
227 HWTEST_F(DistributedDBInterfacesSpaceManagementTest, GetKvStoreDiskSize002, TestSize.Level2)
228 {
229     g_storeId = "distributed_GetKvStoreDiskSize_002";
230     GetRealFileUrl();
231 #ifndef OMIT_MULTI_VER
232     KvStoreDelegate::Option option;
233     g_mgr.GetKvStore(g_storeId, option, g_kvDelegateCallback);
234     ASSERT_TRUE(g_kvDelegatePtr != nullptr);
235     EXPECT_TRUE(g_kvDelegateStatus == OK);
236     EXPECT_EQ(g_mgr.CloseKvStore(g_kvDelegatePtr), OK);
237 #endif // OMIT_MULTI_VER
238 
239     g_mgr.GetKvStore(g_storeId, g_nbOption, g_kvNbDelegateCallback);
240     ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
241     EXPECT_TRUE(g_kvDelegateStatus == OK);
242 
243     /**
244      * @tc.steps: step1/2. Get Db size by GetKvStoreDiskSize.
245      * @tc.expected: step1/2. Return right size and ok.
246      */
247     uint64_t singleAndMultiDbSize = 0;
248     EXPECT_EQ(g_mgr.GetKvStoreDiskSize(g_storeId, singleAndMultiDbSize), OK);
249     uint64_t dbSizeForCheck = CheckRealFileSize(g_singleVerFileNames) + CheckRealFileSize(GetMultiVerFilelist());
250     EXPECT_EQ(dbSizeForCheck, singleAndMultiDbSize);
251 
252     Key key;
253     Value value;
254     DistributedDBToolsUnitTest::GetRandomKeyValue(key, DBConstant::MAX_KEY_SIZE);
255     DistributedDBToolsUnitTest::GetRandomKeyValue(value, DBConstant::MAX_VALUE_SIZE);
256 
257     EXPECT_EQ(g_kvNbDelegatePtr->Put(key, value), OK);
258     EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
259 
260 #ifndef OMIT_MULTI_VER
261     /**
262      * @tc.steps: step3/4. Reopen Db and Put some Key Value to change Db size.
263      */
264     g_mgr.GetKvStore(g_storeId, option, g_kvDelegateCallback);
265     ASSERT_TRUE(g_kvDelegatePtr != nullptr);
266     EXPECT_TRUE(g_kvDelegateStatus == OK);
267     EXPECT_EQ(g_kvDelegatePtr->Put(key, value), OK);
268 #endif // OMIT_MULTI_VER
269 
270     /**
271      * @tc.steps: step5/6. Get Db size by GetKvStoreDiskSize.
272      * @tc.expected: step5/6. Return right size and ok.
273      */
274     std::this_thread::sleep_for(std::chrono::milliseconds(100)); // for vacuum
275     singleAndMultiDbSize = 0;
276     EXPECT_EQ(g_mgr.GetKvStoreDiskSize(g_storeId, singleAndMultiDbSize), OK);
277     ASSERT_TRUE(dbSizeForCheck != singleAndMultiDbSize);
278     dbSizeForCheck = CheckRealFileSize(g_singleVerFileNames) + CheckRealFileSize(GetMultiVerFilelist());
279     EXPECT_EQ(dbSizeForCheck, singleAndMultiDbSize);
280     LOGE("single:%" PRIu64 ",mul:%" PRIu64, CheckRealFileSize(g_singleVerFileNames),
281         CheckRealFileSize(GetMultiVerFilelist()));
282 
283     /**
284      * @tc.steps: step7. Close and Delete Db.
285      * @tc.expected: step7. Successfully.
286      */
287 #ifndef OMIT_MULTI_VER
288     EXPECT_EQ(g_mgr.CloseKvStore(g_kvDelegatePtr), OK);
289 #endif // OMIT_MULTI_VER
290     EXPECT_EQ(g_mgr.DeleteKvStore(g_storeId), OK);
291 }
292 
293 // The file will be deleted after the test, it only for test, no security impact on permissions
CreateFile(const std::string & fileUrl,uint64_t fileSize)294 static void CreateFile(const std::string &fileUrl, uint64_t fileSize)
295 {
296     ofstream mcfile;
297     mcfile.open(fileUrl);
298     if (!mcfile.is_open()) {
299         return;
300     }
301     std::string fileContext;
302     fileContext.resize(fileSize, 'X');
303     mcfile << fileContext;
304     mcfile.close();
305     return;
306 }
307 
DeleteFile(const std::string & fileUrl)308 static void DeleteFile(const std::string &fileUrl)
309 {
310     std::ifstream walFile(fileUrl);
311     if (walFile.good()) {
312         int result = remove(fileUrl.c_str());
313         if (result < 0) {
314             LOGE("failed to delete the file[%s]:%d", fileUrl.c_str(), errno);
315         }
316     }
317     return;
318 }
319 
320 /**
321   * @tc.name: GetKvStoreDiskSize003
322   * @tc.desc: Verification exception parameters
323   * @tc.type: FUNC
324   * @tc.require: AR000CQDTD
325   * @tc.author: sunpeng
326   */
327 HWTEST_F(DistributedDBInterfacesSpaceManagementTest, GetKvStoreDiskSize003, TestSize.Level1)
328 {
329     g_storeId = "distributed_GetKvStoreDiskSize_003";
330     GetRealFileUrl();
331     KvStoreNbDelegate::Option nbOption;
332     g_mgr.GetKvStore(g_storeId, nbOption, g_kvNbDelegateCallback);
333     ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
334     EXPECT_TRUE(g_kvDelegateStatus == OK);
335     EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
336 #ifndef OMIT_MULTI_VER
337     KvStoreDelegate::Option option;
338     g_mgr.GetKvStore(g_storeId, option, g_kvDelegateCallback);
339     ASSERT_TRUE(g_kvDelegatePtr != nullptr);
340     EXPECT_TRUE(g_kvDelegateStatus == OK);
341 #endif // OMIT_MULTI_VER
342 
343     /**
344      * @tc.steps: step1. Use an anomalous length of storeId by GetKvStoreDiskSize to get size.
345      * @tc.expected: step1. Return 0 size and INVALID_ARGS.
346      */
347     uint64_t dbSize = 0;
348     std::string exceptStoreId;
349     exceptStoreId.clear();
350     EXPECT_EQ(g_mgr.GetKvStoreDiskSize(exceptStoreId, dbSize), INVALID_ARGS);
351     EXPECT_EQ(dbSize, 0uLL);
352 
353     exceptStoreId.resize(129, 'X');
354     EXPECT_EQ(g_mgr.GetKvStoreDiskSize(exceptStoreId, dbSize), INVALID_ARGS);
355     EXPECT_EQ(dbSize, 0uLL);
356 
357     /**
358      * @tc.steps: step2. Use a valid but not exist storeId to GetKvStoreDiskSize.
359      * @tc.expected: step2. Return 0 size and NOT_FOUND.
360      */
361     exceptStoreId.resize(128, 'X');
362     EXPECT_EQ(g_mgr.GetKvStoreDiskSize(exceptStoreId, dbSize), NOT_FOUND);
363     EXPECT_EQ(dbSize, 0uLL);
364 
365     /**
366      * @tc.steps: step3/4. Use right storeId to GetKvStoreDiskSize.
367      * @tc.expected: step3/4. Return right size and OK.
368      */
369     uint64_t singleAndMultiDbSize = 0;
370     EXPECT_EQ(g_mgr.GetKvStoreDiskSize(g_storeId, singleAndMultiDbSize), OK);
371     uint64_t dbSizeForCheck = CheckRealFileSize(g_singleVerFileNames) + CheckRealFileSize(GetMultiVerFilelist());
372     EXPECT_EQ(dbSizeForCheck, singleAndMultiDbSize);
373 
374     /**
375      * @tc.steps: step5. Create irrelevant files.
376      */
377     CreateFile(g_testDir + "/" + g_storeId + "/" + DBConstant::MULTI_SUB_DIR + "/test.txt", 1024 * 1024);
378 
379     /**
380      * @tc.steps: step6/7/8. Get Db size by GetKvStoreDiskSize.
381      * @tc.expected: step6/7/8. Return right size and ok.
382      */
383     singleAndMultiDbSize = 0;
384     EXPECT_EQ(g_mgr.GetKvStoreDiskSize(g_storeId, singleAndMultiDbSize), OK);
385     EXPECT_EQ(dbSizeForCheck, singleAndMultiDbSize);
386 
387     DeleteFile(g_testDir + "/" + g_storeId + "/" + DBConstant::MULTI_SUB_DIR + "/test.txt");
388 #ifndef OMIT_MULTI_VER
389     EXPECT_EQ(g_mgr.CloseKvStore(g_kvDelegatePtr), OK);
390 #endif // OMIT_MULTI_VER
391     EXPECT_EQ(g_mgr.DeleteKvStore(g_storeId), OK);
392 }
393 
394 /**
395   * @tc.name: GetKvStoreDiskSize004
396   * @tc.desc: Calculate memory database size
397   * @tc.type: FUNC
398   * @tc.require: AR000CQDTD
399   * @tc.author: sunpeng
400   */
401 HWTEST_F(DistributedDBInterfacesSpaceManagementTest, GetKvStoreDiskSize004, TestSize.Level1)
402 {
403     g_storeId = "distributed_GetKvStoreDiskSize_004";
404     GetRealFileUrl();
405 
406     KvStoreNbDelegate::Option nbOption;
407     g_mgr.GetKvStore(g_storeId, nbOption, g_kvNbDelegateCallback);
408     ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
409     EXPECT_TRUE(g_kvDelegateStatus == OK);
410     EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
411     uint64_t singleVerRealSize = CheckRealFileSize(g_singleVerFileNames);
412 
413     /**
414      * @tc.steps: step1/2. Get Db size by GetKvStoreDiskSize.
415      * @tc.expected: step1/2. Return right size and ok.
416      */
417     uint64_t singleVerDbSize = 0;
418     EXPECT_EQ(g_mgr.GetKvStoreDiskSize(g_storeId, singleVerDbSize), OK);
419     EXPECT_EQ(singleVerDbSize, singleVerRealSize);
420 
421     /**
422      * @tc.steps: step3. Use the same storeId create memoryDb.
423      */
424     nbOption = {true, true};
425     g_mgr.GetKvStore(g_storeId, nbOption, g_kvNbDelegateCallback);
426     ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
427     EXPECT_TRUE(g_kvDelegateStatus == OK);
428 
429     /**
430      * @tc.steps: step4/5. Get Db size by GetKvStoreDiskSize.
431      * @tc.expected: step4/5. Return 0 size and ok.
432      */
433     singleVerDbSize = 0;
434     EXPECT_EQ(g_mgr.GetKvStoreDiskSize(g_storeId, singleVerDbSize), OK);
435     EXPECT_EQ(singleVerDbSize, 0uLL);
436 
437     /**
438      * @tc.steps: step6. Close memoryDb.
439      */
440     EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
441 
442     /**
443      * @tc.steps: step7. Get Db size by GetKvStoreDiskSize.
444      * @tc.expected: step7. Return right size and ok.
445      */
446     EXPECT_EQ(g_mgr.GetKvStoreDiskSize(g_storeId, singleVerDbSize), OK);
447     EXPECT_EQ(singleVerDbSize, singleVerRealSize);
448 
449     EXPECT_EQ(g_mgr.DeleteKvStore(g_storeId), OK);
450 }
451 
452 /**
453   * @tc.name: DeleteDbByStoreId001
454   * @tc.desc: Delete database by storeId.
455   * @tc.type: FUNC
456   * @tc.require: AR000CQDTD
457   * @tc.author: sunpeng
458   */
459 HWTEST_F(DistributedDBInterfacesSpaceManagementTest, DeleteDbByStoreId001, TestSize.Level1)
460 {
461     std::string storeId1 = "distributed_DeleteDbByStoreId001";
462     KvStoreNbDelegate::Option nbOption;
463     g_mgr.GetKvStore(storeId1, nbOption, g_kvNbDelegateCallback);
464     ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
465     EXPECT_TRUE(g_kvDelegateStatus == OK);
466     EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
467 #ifndef OMIT_MULTI_VER
468     KvStoreDelegate::Option option;
469     g_mgr.GetKvStore(storeId1, option, g_kvDelegateCallback);
470     ASSERT_TRUE(g_kvDelegatePtr != nullptr);
471     EXPECT_TRUE(g_kvDelegateStatus == OK);
472     EXPECT_EQ(g_mgr.CloseKvStore(g_kvDelegatePtr), OK);
473     option.localOnly = true;
474     g_mgr.GetKvStore(storeId1, option, g_kvDelegateCallback);
475     ASSERT_TRUE(g_kvDelegatePtr != nullptr);
476     EXPECT_TRUE(g_kvDelegateStatus == OK);
477     EXPECT_EQ(g_mgr.CloseKvStore(g_kvDelegatePtr), OK);
478 #endif // OMIT_MULTI_VER
479 
480     std::string storeId2 = "distributed_DeleteDbByStoreId002";
481     g_mgr.GetKvStore(storeId2, nbOption, g_kvNbDelegateCallback);
482     ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
483     EXPECT_TRUE(g_kvDelegateStatus == OK);
484     EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
485 #ifndef OMIT_MULTI_VER
486     option.localOnly = false;
487     g_mgr.GetKvStore(storeId2, option, g_kvDelegateCallback);
488     ASSERT_TRUE(g_kvDelegatePtr != nullptr);
489     EXPECT_TRUE(g_kvDelegateStatus == OK);
490     EXPECT_EQ(g_mgr.CloseKvStore(g_kvDelegatePtr), OK);
491     option.localOnly = true;
492     g_mgr.GetKvStore(storeId2, option, g_kvDelegateCallback);
493     ASSERT_TRUE(g_kvDelegatePtr != nullptr);
494     EXPECT_TRUE(g_kvDelegateStatus == OK);
495     EXPECT_EQ(g_mgr.CloseKvStore(g_kvDelegatePtr), OK);
496 #endif // OMIT_MULTI_VER
497 
498     uint64_t store1DbSize = 0;
499     EXPECT_EQ(g_mgr.GetKvStoreDiskSize(storeId1, store1DbSize), OK);
500     EXPECT_NE(store1DbSize, 0uLL);
501     EXPECT_EQ(g_mgr.GetKvStoreDiskSize(storeId2, store1DbSize), OK);
502     EXPECT_NE(store1DbSize, 0uLL);
503 
504     /**
505      * @tc.steps: step1. Delete database by storeId 1.
506      */
507     EXPECT_EQ(g_mgr.DeleteKvStore(storeId1), OK);
508 
509     /**
510      * @tc.steps: step2. Use storeId 1 to get Db size by GetKvStoreDiskSize.
511      * @tc.expected: step2. Return 0 size and ok.
512      */
513     store1DbSize = 0;
514     EXPECT_EQ(g_mgr.GetKvStoreDiskSize(storeId1, store1DbSize), NOT_FOUND);
515     EXPECT_EQ(store1DbSize, 0uLL);
516 
517     /**
518      * @tc.steps: step3. Use storeId 2 to get Db size by GetKvStoreDiskSize.
519      * @tc.expected: step3. Return right size and ok.
520      */
521     EXPECT_EQ(g_mgr.GetKvStoreDiskSize(storeId2, store1DbSize), OK);
522     EXPECT_NE(store1DbSize, 0uLL);
523 }
524 
525 /**
526   * @tc.name: DeleteDbByStoreId002
527   * @tc.desc: Delete database by not exist storeId.
528   * @tc.type: FUNC
529   * @tc.require: AR000CQDTD
530   * @tc.author: sunpeng
531   */
532 HWTEST_F(DistributedDBInterfacesSpaceManagementTest, DeleteDbByStoreId002, TestSize.Level1)
533 {
534     std::string storeId1 = "distributed_DeleteDbByStoreId001";
535 
536     uint64_t store1DbSize = 0;
537     EXPECT_EQ(g_mgr.GetKvStoreDiskSize(storeId1, store1DbSize), NOT_FOUND);
538     EXPECT_EQ(store1DbSize, 0uLL);
539 
540     /**
541      * @tc.steps: step1. Delete database by not exist storeId 1.
542      * @tc.expected: step3. Return NOT_FOUND.
543      */
544     EXPECT_EQ(g_mgr.DeleteKvStore(storeId1), NOT_FOUND);
545 }
546