• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 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 #include <condition_variable>
16 #include <gtest/gtest.h>
17 #include <vector>
18 
19 #include "access_token.h"
20 #include "accesstoken_kit.h"
21 #include "block_data.h"
22 #include "dev_manager.h"
23 #include "device_manager.h"
24 #include "distributed_kv_data_manager.h"
25 #include "dm_device_info.h"
26 #include "file_ex.h"
27 #include "kv_store_nb_delegate.h"
28 #include "nativetoken_kit.h"
29 #include "single_store_impl.h"
30 #include "store_factory.h"
31 #include "store_manager.h"
32 #include "sys/stat.h"
33 #include "token_setproc.h"
34 #include "types.h"
35 
36 using namespace testing::ext;
37 using namespace OHOS::DistributedKv;
38 using namespace OHOS::Security::AccessToken;
39 using DBStatus = DistributedDB::DBStatus;
40 using DBStore = DistributedDB::KvStoreNbDelegate;
41 using SyncCallback = KvStoreSyncCallback;
42 using DevInfo = OHOS::DistributedHardware::DmDeviceInfo;
43 namespace OHOS::Test {
44 
Random(int32_t len)45 std::vector<uint8_t> Random(int32_t len)
46 {
47     return std::vector<uint8_t>(len, 'a');
48 }
49 
50 class SingleStoreImplTest : public testing::Test {
51 public:
52     class TestObserver : public KvStoreObserver {
53     public:
TestObserver()54         TestObserver()
55         {
56             // The time interval parameter is 5.
57             data_ = std::make_shared<OHOS::BlockData<bool>>(5, false);
58         }
OnChange(const ChangeNotification & notification)59         void OnChange(const ChangeNotification &notification) override
60         {
61             insert_ = notification.GetInsertEntries();
62             update_ = notification.GetUpdateEntries();
63             delete_ = notification.GetDeleteEntries();
64             deviceId_ = notification.GetDeviceId();
65             bool value = true;
66             data_->SetValue(value);
67         }
68         std::vector<Entry> insert_;
69         std::vector<Entry> update_;
70         std::vector<Entry> delete_;
71         std::string deviceId_;
72 
73         std::shared_ptr<OHOS::BlockData<bool>> data_;
74     };
75 
76     static void SetUpTestCase(void);
77     static void TearDownTestCase(void);
78     void SetUp();
79     void TearDown();
80 
81     void SetNativeTokenId();
82     std::shared_ptr<SingleKvStore> CreateKVStore(std::string storeIdTest, KvStoreType type, bool encrypt, bool backup);
83     std::shared_ptr<SingleStoreImpl> CreateKVStore(bool autosync = false);
84     std::shared_ptr<SingleKvStore> kvStore_;
85     static constexpr int MAX_RESULTSET_SIZE = 8;
86 };
87 
SetUpTestCase(void)88 void SingleStoreImplTest::SetUpTestCase(void)
89 {
90     std::string baseDir = "/data/service/el1/public/database/SingleStoreImplTest";
91     mkdir(baseDir.c_str(), (S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH));
92 }
93 
TearDownTestCase(void)94 void SingleStoreImplTest::TearDownTestCase(void)
95 {
96     std::string baseDir = "/data/service/el1/public/database/SingleStoreImplTest";
97     StoreManager::GetInstance().Delete({ "SingleStoreImplTest" }, { "SingleKVStore" }, baseDir);
98 
99     (void)remove("/data/service/el1/public/database/SingleStoreImplTest/key");
100     (void)remove("/data/service/el1/public/database/SingleStoreImplTest/kvdb");
101     (void)remove("/data/service/el1/public/database/SingleStoreImplTest");
102 }
103 
SetUp(void)104 void SingleStoreImplTest::SetUp(void)
105 {
106     kvStore_ = CreateKVStore("SingleKVStore", SINGLE_VERSION, false, true);
107     if (kvStore_ == nullptr) {
108         kvStore_ = CreateKVStore("SingleKVStore", SINGLE_VERSION, false, true);
109     }
110     ASSERT_NE(kvStore_, nullptr);
111 }
112 
TearDown(void)113 void SingleStoreImplTest::TearDown(void)
114 {
115     AppId appId = { "SingleStoreImplTest" };
116     StoreId storeId = { "SingleKVStore" };
117     kvStore_ = nullptr;
118     auto status = StoreManager::GetInstance().CloseKVStore(appId, storeId);
119     ASSERT_EQ(status, SUCCESS);
120     auto baseDir = "/data/service/el1/public/database/SingleStoreImplTest";
121     status = StoreManager::GetInstance().Delete(appId, storeId, baseDir);
122     ASSERT_EQ(status, SUCCESS);
123 }
124 
CreateKVStore(std::string storeIdTest,KvStoreType type,bool encrypt,bool backup)125 std::shared_ptr<SingleKvStore> SingleStoreImplTest::CreateKVStore(
126     std::string storeIdTest, KvStoreType type, bool encrypt, bool backup)
127 {
128     Options options;
129     options.kvStoreType = type;
130     options.securityLevel = S1;
131     options.encrypt = encrypt;
132     options.area = EL1;
133     options.backup = backup;
134     options.baseDir = "/data/service/el1/public/database/SingleStoreImplTest";
135 
136     AppId appId = { "SingleStoreImplTest" };
137     StoreId storeId = { storeIdTest };
138     Status status = StoreManager::GetInstance().Delete(appId, storeId, options.baseDir);
139     return StoreManager::GetInstance().GetKVStore(appId, storeId, options, status);
140 }
141 
CreateKVStore(bool autosync)142 std::shared_ptr<SingleStoreImpl> SingleStoreImplTest::CreateKVStore(bool autosync)
143 {
144     AppId appId = { "SingleStoreImplTest" };
145     StoreId storeId = { "DestructorTest" };
146     std::shared_ptr<SingleStoreImpl> kvStore;
147     Options options;
148     options.kvStoreType = SINGLE_VERSION;
149     options.securityLevel = S2;
150     options.area = EL1;
151     options.autoSync = autosync;
152     options.baseDir = "/data/service/el1/public/database/SingleStoreImplTest";
153     StoreFactory storeFactory;
154     auto dbManager = storeFactory.GetDBManager(options.baseDir, appId);
155     auto dbPassword = SecurityManager::GetInstance().GetDBPassword(storeId.storeId, options.baseDir, options.encrypt);
156     DBStatus dbStatus = DBStatus::DB_ERROR;
157     dbManager->GetKvStore(storeId, storeFactory.GetDBOption(options, dbPassword),
158         [&dbManager, &kvStore, &appId, &dbStatus, &options, &storeFactory](auto status, auto *store) {
159             dbStatus = status;
160             if (store == nullptr) {
161                 return;
162             }
163             auto release = [dbManager](auto *store) {
164                 dbManager->CloseKvStore(store);
165             };
166             auto dbStore = std::shared_ptr<DBStore>(store, release);
167             storeFactory.SetDbConfig(dbStore);
168             const Convertor &convertor = *(storeFactory.convertors_[options.kvStoreType]);
169             kvStore = std::make_shared<SingleStoreImpl>(dbStore, appId, options, convertor);
170         });
171     return kvStore;
172 }
173 
SetNativeTokenId()174 void SingleStoreImplTest::SetNativeTokenId()
175 {
176     std::string dumpInfo;
177     AtmToolsParamInfo info;
178     info.processName = "distributeddata";
179     AccessTokenKit::DumpTokenInfo(info, dumpInfo);
180     size_t pos = dumpInfo.find("\"tokenID\": ");
181     if (pos == std::string::npos) {
182         return;
183     }
184     pos += std::string("\"tokenID\": ").length();
185     std::string numStr;
186     while (pos < dumpInfo.length() && std::isdigit(dumpInfo[pos])) {
187         numStr += dumpInfo[pos];
188         ++pos;
189     }
190     std::istringstream iss(numStr);
191     AccessTokenID tokenID;
192     iss >> tokenID;
193     SetSelfTokenID(tokenID);
194 }
195 
196 /**
197  * @tc.name: GetStoreId
198  * @tc.desc: get the store id of the kv store
199  * @tc.type: FUNC
200  */
201 HWTEST_F(SingleStoreImplTest, GetStoreId, TestSize.Level0)
202 {
203     ASSERT_NE(kvStore_, nullptr);
204     auto storeId = kvStore_->GetStoreId();
205     ASSERT_EQ(storeId.storeId, "SingleKVStore");
206 }
207 
208 /**
209  * @tc.name: GetSubUser
210  * @tc.desc: get the subUser of the kv store
211  * @tc.type: FUNC
212  */
213 HWTEST_F(SingleStoreImplTest, GetSubUser, TestSize.Level0)
214 {
215     ASSERT_NE(kvStore_, nullptr);
216     auto subUser = kvStore_->GetSubUser();
217     ASSERT_EQ(subUser, 0);
218 }
219 
220 /**
221  * @tc.name: Put
222  * @tc.desc: put key-value data to the kv store
223  * @tc.type: FUNC
224  */
225 HWTEST_F(SingleStoreImplTest, Put, TestSize.Level0)
226 {
227     ASSERT_NE(kvStore_, nullptr);
228     auto status = kvStore_->Put({ "Put Test" }, { "Put Value" });
229     ASSERT_EQ(status, SUCCESS);
230     status = kvStore_->Put({ "   Put Test" }, { "Put2 Value" });
231     ASSERT_EQ(status, SUCCESS);
232     Value value;
233     status = kvStore_->Get({ "Put Test" }, value);
234     ASSERT_EQ(status, SUCCESS);
235     ASSERT_EQ(value.ToString(), "Put2 Value");
236 }
237 
238 /**
239  * @tc.name: Put_Invalid_Key
240  * @tc.desc: put invalid key-value data to the device kv store and single kv store
241  * @tc.type: FUNC
242  */
243 HWTEST_F(SingleStoreImplTest, Put_Invalid_Key, TestSize.Level0)
244 {
245     std::shared_ptr<SingleKvStore> kvStore;
246     AppId appId = { "SingleStoreImplTest" };
247     StoreId storeId = { "DeviceKVStore" };
248     kvStore = CreateKVStore(storeId.storeId, DEVICE_COLLABORATION, false, true);
249     ASSERT_NE(kvStore, nullptr);
250 
251     size_t maxDevKeyLen = 897;
252     std::string str(maxDevKeyLen, 'a');
253     Blob key(str);
254     Blob value("test_value");
255     Status status = kvStore->Put(key, value);
256     EXPECT_EQ(status, INVALID_ARGUMENT);
257 
258     Blob key1("");
259     Blob value1("test_value1");
260     status = kvStore->Put(key1, value1);
261     EXPECT_EQ(status, INVALID_ARGUMENT);
262 
263     kvStore = nullptr;
264     status = StoreManager::GetInstance().CloseKVStore(appId, storeId);
265     ASSERT_EQ(status, SUCCESS);
266     std::string baseDir = "/data/service/el1/public/database/SingleStoreImplTest";
267     status = StoreManager::GetInstance().Delete(appId, storeId, baseDir);
268     ASSERT_EQ(status, SUCCESS);
269 
270     size_t maxSingleKeyLen = 1025;
271     std::string str1(maxSingleKeyLen, 'b');
272     Blob key2(str1);
273     Blob value2("test_value2");
274     status = kvStore_->Put(key2, value2);
275     EXPECT_EQ(status, INVALID_ARGUMENT);
276 
277     status = kvStore_->Put(key1, value1);
278     EXPECT_EQ(status, INVALID_ARGUMENT);
279 }
280 
281 /**
282  * @tc.name: PutBatch
283  * @tc.desc: put some key-value data to the kv store
284  * @tc.type: FUNC
285  */
286 HWTEST_F(SingleStoreImplTest, PutBatch, TestSize.Level0)
287 {
288     ASSERT_NE(kvStore_, nullptr);
289     std::vector<Entry> entries;
290     for (int i = 0; i < 10; ++i) {
291         Entry entry;
292         entry.key = std::to_string(i).append("_k");
293         entry.value = std::to_string(i).append("_v");
294         entries.push_back(entry);
295     }
296     auto status = kvStore_->PutBatch(entries);
297     ASSERT_EQ(status, SUCCESS);
298 }
299 
300 /**
301  * @tc.name: GetStoreId
302  * @tc.desc: test IsRebuild
303  * @tc.type: FUNC
304  */
305 HWTEST_F(SingleStoreImplTest, IsRebuild, TestSize.Level0)
306 {
307     ASSERT_NE(kvStore_, nullptr);
308     auto status = kvStore_->IsRebuild();
309     ASSERT_EQ(status, false);
310 }
311 
312 /**
313  * @tc.name: PutBatch001
314  * @tc.desc: entry.value.Size() > MAX_VALUE_LENGTH
315  * @tc.type: FUNC
316  */
317 HWTEST_F(SingleStoreImplTest, PutBatch001, TestSize.Level1)
318 {
319     ASSERT_NE(kvStore_, nullptr);
320     size_t totalLength = SingleStoreImpl::MAX_VALUE_LENGTH + 1; // create an out-of-limit large number
321     char fillChar = 'a';
322     std::string longString(totalLength, fillChar);
323     std::vector<Entry> entries;
324     Entry entry;
325     entry.key = "PutBatch001_test";
326     entry.value = longString;
327     entries.push_back(entry);
328     auto status = kvStore_->PutBatch(entries);
329     ASSERT_EQ(status, INVALID_ARGUMENT);
330     entries.clear();
331     Entry entrys;
332     entrys.key = "";
333     entrys.value = "PutBatch001_test_value";
334     entries.push_back(entrys);
335     status = kvStore_->PutBatch(entries);
336     ASSERT_EQ(status, INVALID_ARGUMENT);
337 }
338 
339 /**
340  * @tc.name: Delete
341  * @tc.desc: delete the value of the key
342  * @tc.type: FUNC
343  */
344 HWTEST_F(SingleStoreImplTest, Delete, TestSize.Level0)
345 {
346     ASSERT_NE(kvStore_, nullptr);
347     auto status = kvStore_->Put({ "Put Test" }, { "Put Value" });
348     ASSERT_EQ(status, SUCCESS);
349     Value value;
350     status = kvStore_->Get({ "Put Test" }, value);
351     ASSERT_EQ(status, SUCCESS);
352     ASSERT_EQ(std::string("Put Value"), value.ToString());
353     status = kvStore_->Delete({ "Put Test" });
354     ASSERT_EQ(status, SUCCESS);
355     value = {};
356     status = kvStore_->Get({ "Put Test" }, value);
357     ASSERT_EQ(status, KEY_NOT_FOUND);
358     ASSERT_EQ(std::string(""), value.ToString());
359 }
360 
361 /**
362  * @tc.name: DeleteBatch
363  * @tc.desc: delete the values of the keys
364  * @tc.type: FUNC
365  */
366 HWTEST_F(SingleStoreImplTest, DeleteBatch, TestSize.Level0)
367 {
368     ASSERT_NE(kvStore_, nullptr);
369     std::vector<Entry> entries;
370     for (int i = 0; i < 10; ++i) {
371         Entry entry;
372         entry.key = std::to_string(i).append("_k");
373         entry.value = std::to_string(i).append("_v");
374         entries.push_back(entry);
375     }
376     auto status = kvStore_->PutBatch(entries);
377     ASSERT_EQ(status, SUCCESS);
378     std::vector<Key> keys;
379     for (int i = 0; i < 10; ++i) {
380         Key key = std::to_string(i).append("_k");
381         keys.push_back(key);
382     }
383     status = kvStore_->DeleteBatch(keys);
384     ASSERT_EQ(status, SUCCESS);
385     for (int i = 0; i < 10; ++i) {
386         Value value;
387         status = kvStore_->Get(keys[i], value);
388         ASSERT_EQ(status, KEY_NOT_FOUND);
389         ASSERT_EQ(value.ToString(), std::string(""));
390     }
391 }
392 
393 /**
394  * @tc.name: Transaction
395  * @tc.desc: do transaction
396  * @tc.type: FUNC
397  */
398 HWTEST_F(SingleStoreImplTest, Transaction, TestSize.Level0)
399 {
400     ASSERT_NE(kvStore_, nullptr);
401     auto status = kvStore_->StartTransaction();
402     ASSERT_EQ(status, SUCCESS);
403     status = kvStore_->Commit();
404     ASSERT_EQ(status, SUCCESS);
405 
406     status = kvStore_->StartTransaction();
407     ASSERT_EQ(status, SUCCESS);
408     status = kvStore_->Rollback();
409     ASSERT_EQ(status, SUCCESS);
410 }
411 
412 /**
413  * @tc.name: SubscribeKvStore
414  * @tc.desc: subscribe local
415  * @tc.type: FUNC
416  */
417 HWTEST_F(SingleStoreImplTest, SubscribeKvStore, TestSize.Level0)
418 {
419     ASSERT_NE(kvStore_, nullptr);
420     auto observer = std::make_shared<TestObserver>();
421     auto status = kvStore_->SubscribeKvStore(SUBSCRIBE_TYPE_LOCAL, observer);
422     ASSERT_EQ(status, SUCCESS);
423     status = kvStore_->SubscribeKvStore(SUBSCRIBE_TYPE_REMOTE, observer);
424     ASSERT_EQ(status, SUCCESS);
425     status = kvStore_->SubscribeKvStore(SUBSCRIBE_TYPE_CLOUD, observer);
426     ASSERT_EQ(status, SUCCESS);
427     status = kvStore_->SubscribeKvStore(SUBSCRIBE_TYPE_LOCAL, observer);
428     ASSERT_EQ(status, STORE_ALREADY_SUBSCRIBE);
429     status = kvStore_->SubscribeKvStore(SUBSCRIBE_TYPE_REMOTE, observer);
430     ASSERT_EQ(status, STORE_ALREADY_SUBSCRIBE);
431     status = kvStore_->SubscribeKvStore(SUBSCRIBE_TYPE_CLOUD, observer);
432     ASSERT_EQ(status, STORE_ALREADY_SUBSCRIBE);
433     status = kvStore_->SubscribeKvStore(SUBSCRIBE_TYPE_ALL, observer);
434     ASSERT_EQ(status, STORE_ALREADY_SUBSCRIBE);
435     bool invalidValue = false;
436     observer->data_->Clear(invalidValue);
437     status = kvStore_->Put({ "Put Test" }, { "Put Value" });
438     ASSERT_EQ(status, SUCCESS);
439     ASSERT_TRUE(observer->data_->GetValue());
440     ASSERT_EQ(observer->insert_.size(), 1);
441     ASSERT_EQ(observer->update_.size(), 0);
442     ASSERT_EQ(observer->delete_.size(), 0);
443     observer->data_->Clear(invalidValue);
444     status = kvStore_->Put({ "Put Test" }, { "Put Value1" });
445     ASSERT_EQ(status, SUCCESS);
446     ASSERT_TRUE(observer->data_->GetValue());
447     ASSERT_EQ(observer->insert_.size(), 0);
448     ASSERT_EQ(observer->update_.size(), 1);
449     ASSERT_EQ(observer->delete_.size(), 0);
450     observer->data_->Clear(invalidValue);
451     status = kvStore_->Delete({ "Put Test" });
452     ASSERT_EQ(status, SUCCESS);
453     ASSERT_TRUE(observer->data_->GetValue());
454     ASSERT_EQ(observer->insert_.size(), 0);
455     ASSERT_EQ(observer->update_.size(), 0);
456     ASSERT_EQ(observer->delete_.size(), 1);
457 }
458 
459 /**
460  * @tc.name: SubscribeKvStore002
461  * @tc.desc: subscribe local
462  * @tc.type: FUNC
463  */
464 HWTEST_F(SingleStoreImplTest, SubscribeKvStore002, TestSize.Level0)
465 {
466     ASSERT_NE(kvStore_, nullptr);
467     std::shared_ptr<TestObserver> subscribedObserver;
468     std::shared_ptr<TestObserver> unSubscribedObserver;
469     for (int i = 0; i < 15; ++i) {
470         auto observer = std::make_shared<TestObserver>();
471         auto status1 = kvStore_->SubscribeKvStore(SUBSCRIBE_TYPE_LOCAL, observer);
472         auto status2 = kvStore_->SubscribeKvStore(SUBSCRIBE_TYPE_REMOTE, observer);
473         if (i < 8) {
474             ASSERT_EQ(status1, SUCCESS);
475             ASSERT_EQ(status2, SUCCESS);
476             subscribedObserver = observer;
477         } else {
478             ASSERT_EQ(status1, OVER_MAX_LIMITS);
479             ASSERT_EQ(status2, OVER_MAX_LIMITS);
480             unSubscribedObserver = observer;
481         }
482     }
483 
484     auto status = kvStore_->SubscribeKvStore(SUBSCRIBE_TYPE_LOCAL, subscribedObserver);
485     ASSERT_EQ(status, STORE_ALREADY_SUBSCRIBE);
486 
487     status = kvStore_->SubscribeKvStore(SUBSCRIBE_TYPE_LOCAL, {});
488     ASSERT_EQ(status, INVALID_ARGUMENT);
489 
490     status = kvStore_->SubscribeKvStore(SUBSCRIBE_TYPE_REMOTE, subscribedObserver);
491     ASSERT_EQ(status, STORE_ALREADY_SUBSCRIBE);
492 
493     status = kvStore_->SubscribeKvStore(SUBSCRIBE_TYPE_ALL, subscribedObserver);
494     ASSERT_EQ(status, SUCCESS);
495 
496     status = kvStore_->UnSubscribeKvStore(SUBSCRIBE_TYPE_LOCAL, subscribedObserver);
497     ASSERT_EQ(status, SUCCESS);
498     status = kvStore_->SubscribeKvStore(SUBSCRIBE_TYPE_LOCAL, subscribedObserver);
499     ASSERT_EQ(status, SUCCESS);
500 
501     status = kvStore_->UnSubscribeKvStore(SUBSCRIBE_TYPE_ALL, subscribedObserver);
502     ASSERT_EQ(status, SUCCESS);
503     status = kvStore_->SubscribeKvStore(SUBSCRIBE_TYPE_LOCAL, unSubscribedObserver);
504     ASSERT_EQ(status, SUCCESS);
505     subscribedObserver = unSubscribedObserver;
506     status = kvStore_->UnSubscribeKvStore(SUBSCRIBE_TYPE_LOCAL, subscribedObserver);
507     ASSERT_EQ(status, SUCCESS);
508     auto observer = std::make_shared<TestObserver>();
509     status = kvStore_->SubscribeKvStore(SUBSCRIBE_TYPE_LOCAL, observer);
510     ASSERT_EQ(status, SUCCESS);
511     status = kvStore_->SubscribeKvStore(SUBSCRIBE_TYPE_ALL, observer);
512     ASSERT_EQ(status, SUCCESS);
513     observer = std::make_shared<TestObserver>();
514     status = kvStore_->SubscribeKvStore(SUBSCRIBE_TYPE_ALL, observer);
515     ASSERT_EQ(status, OVER_MAX_LIMITS);
516 }
517 
518 /**
519  * @tc.name: SubscribeKvStore003
520  * @tc.desc: isClientSync_
521  * @tc.type: FUNC
522  */
523 HWTEST_F(SingleStoreImplTest, SubscribeKvStore003, TestSize.Level0)
524 {
525     auto observer = std::make_shared<TestObserver>();
526     std::shared_ptr<SingleStoreImpl> kvStore;
527     kvStore = CreateKVStore();
528     ASSERT_NE(kvStore, nullptr);
529     kvStore->isClientSync_ = true;
530     auto status = kvStore->SubscribeKvStore(SUBSCRIBE_TYPE_LOCAL, observer);
531     ASSERT_EQ(status, SUCCESS);
532 }
533 
534 /**
535  * @tc.name: UnsubscribeKvStore
536  * @tc.desc: unsubscribe
537  * @tc.type: FUNC
538  */
539 HWTEST_F(SingleStoreImplTest, UnsubscribeKvStore, TestSize.Level0)
540 {
541     ASSERT_NE(kvStore_, nullptr);
542     auto observer = std::make_shared<TestObserver>();
543     auto status = kvStore_->SubscribeKvStore(SUBSCRIBE_TYPE_ALL, observer);
544     ASSERT_EQ(status, SUCCESS);
545     status = kvStore_->UnSubscribeKvStore(SUBSCRIBE_TYPE_REMOTE, observer);
546     ASSERT_EQ(status, SUCCESS);
547     status = kvStore_->UnSubscribeKvStore(SUBSCRIBE_TYPE_CLOUD, observer);
548     ASSERT_EQ(status, SUCCESS);
549     status = kvStore_->UnSubscribeKvStore(SUBSCRIBE_TYPE_REMOTE, observer);
550     ASSERT_EQ(status, STORE_NOT_SUBSCRIBE);
551     status = kvStore_->UnSubscribeKvStore(SUBSCRIBE_TYPE_LOCAL, observer);
552     ASSERT_EQ(status, SUCCESS);
553     status = kvStore_->UnSubscribeKvStore(SUBSCRIBE_TYPE_LOCAL, observer);
554     ASSERT_EQ(status, STORE_NOT_SUBSCRIBE);
555     status = kvStore_->UnSubscribeKvStore(SUBSCRIBE_TYPE_ALL, observer);
556     ASSERT_EQ(status, STORE_NOT_SUBSCRIBE);
557     status = kvStore_->SubscribeKvStore(SUBSCRIBE_TYPE_LOCAL, observer);
558     ASSERT_EQ(status, SUCCESS);
559     status = kvStore_->UnSubscribeKvStore(SUBSCRIBE_TYPE_ALL, observer);
560     ASSERT_EQ(status, SUCCESS);
561 }
562 
563 /**
564  * @tc.name: GetEntries
565  * @tc.desc: get entries by prefix
566  * @tc.type: FUNC
567  */
568 HWTEST_F(SingleStoreImplTest, GetEntries_Prefix, TestSize.Level0)
569 {
570     ASSERT_NE(kvStore_, nullptr);
571     std::vector<Entry> input;
572     for (int i = 0; i < 10; ++i) {
573         Entry entry;
574         entry.key = std::to_string(i).append("_k");
575         entry.value = std::to_string(i).append("_v");
576         input.push_back(entry);
577     }
578     auto status = kvStore_->PutBatch(input);
579     ASSERT_EQ(status, SUCCESS);
580     std::vector<Entry> output;
581     status = kvStore_->GetEntries({ "" }, output);
582     ASSERT_EQ(status, SUCCESS);
__anon62637bdb0302(const Entry &entry, const Entry &sentry) 583     std::sort(output.begin(), output.end(), [](const Entry &entry, const Entry &sentry) {
584         return entry.key.Data() < sentry.key.Data();
585     });
586     for (int i = 0; i < 10; ++i) {
587         ASSERT_TRUE(input[i].key == output[i].key);
588         ASSERT_TRUE(input[i].value == output[i].value);
589     }
590 }
591 
592 /**
593  * @tc.name: GetEntries_Less_Prefix
594  * @tc.desc: get entries by prefix and the key size less than sizeof(uint32_t)
595  * @tc.type: FUNC
596  */
597 HWTEST_F(SingleStoreImplTest, GetEntries_Less_Prefix, TestSize.Level0)
598 {
599     std::shared_ptr<SingleKvStore> kvStore;
600     AppId appId = { "SingleStoreImplTest" };
601     StoreId storeId = { "DeviceKVStore" };
602     kvStore = CreateKVStore(storeId.storeId, DEVICE_COLLABORATION, false, true);
603     ASSERT_NE(kvStore, nullptr);
604 
605     std::vector<Entry> input;
606     for (int i = 0; i < 10; ++i) {
607         Entry entry;
608         entry.key = std::to_string(i).append("_k");
609         entry.value = std::to_string(i).append("_v");
610         input.push_back(entry);
611     }
612     auto status = kvStore->PutBatch(input);
613     ASSERT_EQ(status, SUCCESS);
614     std::vector<Entry> output;
615     status = kvStore->GetEntries({ "1" }, output);
616     ASSERT_NE(output.empty(), true);
617     ASSERT_EQ(status, SUCCESS);
618 
619     kvStore = nullptr;
620     status = StoreManager::GetInstance().CloseKVStore(appId, storeId);
621     ASSERT_EQ(status, SUCCESS);
622     std::string baseDir = "/data/service/el1/public/database/SingleStoreImplTest";
623     status = StoreManager::GetInstance().Delete(appId, storeId, baseDir);
624     ASSERT_EQ(status, SUCCESS);
625 
626     status = kvStore_->PutBatch(input);
627     ASSERT_EQ(status, SUCCESS);
628     std::vector<Entry> output1;
629     status = kvStore_->GetEntries({ "1" }, output1);
630     ASSERT_NE(output1.empty(), true);
631     ASSERT_EQ(status, SUCCESS);
632 }
633 
634 /**
635  * @tc.name: GetEntries_Greater_Prefix
636  * @tc.desc: get entries by prefix and the key size is greater than  sizeof(uint32_t)
637  * @tc.type: FUNC
638  */
639 HWTEST_F(SingleStoreImplTest, GetEntries_Greater_Prefix, TestSize.Level0)
640 {
641     std::shared_ptr<SingleKvStore> kvStore;
642     AppId appId = { "SingleStoreImplTest" };
643     StoreId storeId = { "DeviceKVStore" };
644     kvStore = CreateKVStore(storeId.storeId, DEVICE_COLLABORATION, false, true);
645     ASSERT_NE(kvStore, nullptr);
646 
647     size_t keyLen = sizeof(uint32_t);
648     std::vector<Entry> input;
649     for (int i = 1; i < 10; ++i) {
650         Entry entry;
651         std::string str(keyLen, i + '0');
652         entry.key = str;
653         entry.value = std::to_string(i).append("_v");
654         input.push_back(entry);
655     }
656     auto status = kvStore->PutBatch(input);
657     ASSERT_EQ(status, SUCCESS);
658     std::vector<Entry> output;
659     std::string str1(keyLen, '1');
660     status = kvStore->GetEntries(str1, output);
661     ASSERT_NE(output.empty(), true);
662     ASSERT_EQ(status, SUCCESS);
663 
664     kvStore = nullptr;
665     status = StoreManager::GetInstance().CloseKVStore(appId, storeId);
666     ASSERT_EQ(status, SUCCESS);
667     std::string baseDir = "/data/service/el1/public/database/SingleStoreImplTest";
668     status = StoreManager::GetInstance().Delete(appId, storeId, baseDir);
669     ASSERT_EQ(status, SUCCESS);
670 
671     status = kvStore_->PutBatch(input);
672     ASSERT_EQ(status, SUCCESS);
673     std::vector<Entry> output1;
674     status = kvStore_->GetEntries(str1, output1);
675     ASSERT_NE(output1.empty(), true);
676     ASSERT_EQ(status, SUCCESS);
677 }
678 
679 /**
680  * @tc.name: GetEntries
681  * @tc.desc: get entries by query
682  * @tc.type: FUNC
683  */
684 HWTEST_F(SingleStoreImplTest, GetEntries_DataQuery, TestSize.Level0)
685 {
686     ASSERT_NE(kvStore_, nullptr);
687     std::vector<Entry> input;
688     for (int i = 0; i < 10; ++i) {
689         Entry entry;
690         entry.key = std::to_string(i).append("_k");
691         entry.value = std::to_string(i).append("_v");
692         input.push_back(entry);
693     }
694     auto status = kvStore_->PutBatch(input);
695     ASSERT_EQ(status, SUCCESS);
696     DataQuery query;
697     query.InKeys({ "0_k", "1_k" });
698     std::vector<Entry> output;
699     status = kvStore_->GetEntries(query, output);
700     ASSERT_EQ(status, SUCCESS);
__anon62637bdb0402(const Entry &entry, const Entry &sentry) 701     std::sort(output.begin(), output.end(), [](const Entry &entry, const Entry &sentry) {
702         return entry.key.Data() < sentry.key.Data();
703     });
704     ASSERT_LE(output.size(), 2);
705     for (size_t i = 0; i < output.size(); ++i) {
706         ASSERT_TRUE(input[i].key == output[i].key);
707         ASSERT_TRUE(input[i].value == output[i].value);
708     }
709 }
710 
711 /**
712  * @tc.name: GetResultSet
713  * @tc.desc: get result set by prefix
714  * @tc.type: FUNC
715  */
716 HWTEST_F(SingleStoreImplTest, GetResultSet_Prefix, TestSize.Level0)
717 {
718     ASSERT_NE(kvStore_, nullptr);
719     std::vector<Entry> input;
__anon62637bdb0502(const Key &entry, const Key &sentry) 720     auto cmp = [](const Key &entry, const Key &sentry) {
721         return entry.Data() < sentry.Data();
722     };
723     std::map<Key, Value, decltype(cmp)> dictionary(cmp);
724     for (int i = 0; i < 10; ++i) {
725         Entry entry;
726         entry.key = std::to_string(i).append("_k");
727         entry.value = std::to_string(i).append("_v");
728         dictionary[entry.key] = entry.value;
729         input.push_back(entry);
730     }
731     auto status = kvStore_->PutBatch(input);
732     ASSERT_EQ(status, SUCCESS);
733     std::shared_ptr<KvStoreResultSet> output;
734     status = kvStore_->GetResultSet({ "" }, output);
735     ASSERT_EQ(status, SUCCESS);
736     ASSERT_NE(output, nullptr);
737     ASSERT_EQ(output->GetCount(), 10);
738     int count = 0;
739     while (output->MoveToNext()) {
740         count++;
741         Entry entry;
742         output->GetEntry(entry);
743         ASSERT_EQ(entry.value.Data(), dictionary[entry.key].Data());
744     }
745     ASSERT_EQ(count, output->GetCount());
746 }
747 
748 /**
749  * @tc.name: GetResultSet
750  * @tc.desc: get result set by query
751  * @tc.type: FUNC
752  */
753 HWTEST_F(SingleStoreImplTest, GetResultSet_Query, TestSize.Level0)
754 {
755     ASSERT_NE(kvStore_, nullptr);
756     std::vector<Entry> input;
__anon62637bdb0602(const Key &entry, const Key &sentry) 757     auto cmp = [](const Key &entry, const Key &sentry) {
758         return entry.Data() < sentry.Data();
759     };
760     std::map<Key, Value, decltype(cmp)> dictionary(cmp);
761     for (int i = 0; i < 10; ++i) {
762         Entry entry;
763         entry.key = std::to_string(i).append("_k");
764         entry.value = std::to_string(i).append("_v");
765         dictionary[entry.key] = entry.value;
766         input.push_back(entry);
767     }
768     auto status = kvStore_->PutBatch(input);
769     ASSERT_EQ(status, SUCCESS);
770     DataQuery query;
771     query.InKeys({ "0_k", "1_k" });
772     std::shared_ptr<KvStoreResultSet> output;
773     status = kvStore_->GetResultSet(query, output);
774     ASSERT_EQ(status, SUCCESS);
775     ASSERT_NE(output, nullptr);
776     ASSERT_LE(output->GetCount(), 2);
777     int count = 0;
778     while (output->MoveToNext()) {
779         count++;
780         Entry entry;
781         output->GetEntry(entry);
782         ASSERT_EQ(entry.value.Data(), dictionary[entry.key].Data());
783     }
784     ASSERT_EQ(count, output->GetCount());
785 }
786 
787 /**
788  * @tc.name: CloseResultSet
789  * @tc.desc: close the result set
790  * @tc.type: FUNC
791  */
792 HWTEST_F(SingleStoreImplTest, CloseResultSet, TestSize.Level0)
793 {
794     ASSERT_NE(kvStore_, nullptr);
795     std::vector<Entry> input;
__anon62637bdb0702(const Key &entry, const Key &sentry) 796     auto cmp = [](const Key &entry, const Key &sentry) {
797         return entry.Data() < sentry.Data();
798     };
799     std::map<Key, Value, decltype(cmp)> dictionary(cmp);
800     for (int i = 0; i < 10; ++i) {
801         Entry entry;
802         entry.key = std::to_string(i).append("_k");
803         entry.value = std::to_string(i).append("_v");
804         dictionary[entry.key] = entry.value;
805         input.push_back(entry);
806     }
807     auto status = kvStore_->PutBatch(input);
808     ASSERT_EQ(status, SUCCESS);
809     DataQuery query;
810     query.InKeys({ "0_k", "1_k" });
811     std::shared_ptr<KvStoreResultSet> output;
812     status = kvStore_->GetResultSet(query, output);
813     ASSERT_EQ(status, SUCCESS);
814     ASSERT_NE(output, nullptr);
815     ASSERT_LE(output->GetCount(), 2);
816     auto outputTmp = output;
817     status = kvStore_->CloseResultSet(output);
818     ASSERT_EQ(status, SUCCESS);
819     ASSERT_EQ(output, nullptr);
820     ASSERT_EQ(outputTmp->GetCount(), KvStoreResultSet::INVALID_COUNT);
821     ASSERT_EQ(outputTmp->GetPosition(), KvStoreResultSet::INVALID_POSITION);
822     ASSERT_EQ(outputTmp->MoveToFirst(), false);
823     ASSERT_EQ(outputTmp->MoveToLast(), false);
824     ASSERT_EQ(outputTmp->MoveToNext(), false);
825     ASSERT_EQ(outputTmp->MoveToPrevious(), false);
826     ASSERT_EQ(outputTmp->Move(1), false);
827     ASSERT_EQ(outputTmp->MoveToPosition(1), false);
828     ASSERT_EQ(outputTmp->IsFirst(), false);
829     ASSERT_EQ(outputTmp->IsLast(), false);
830     ASSERT_EQ(outputTmp->IsBeforeFirst(), false);
831     ASSERT_EQ(outputTmp->IsAfterLast(), false);
832     Entry entry;
833     ASSERT_EQ(outputTmp->GetEntry(entry), ALREADY_CLOSED);
834 }
835 
836 /**
837  * @tc.name: CloseResultSet001
838  * @tc.desc: output = nullptr;
839  * @tc.type: FUNC
840  */
841 HWTEST_F(SingleStoreImplTest, CloseResultSet001, TestSize.Level0)
842 {
843     ASSERT_NE(kvStore_, nullptr);
844     std::shared_ptr<KvStoreResultSet> output;
845     output = nullptr;
846     auto status = kvStore_->CloseResultSet(output);
847     ASSERT_EQ(status, INVALID_ARGUMENT);
848 }
849 
850 /**
851  * @tc.name: ResultSetMaxSizeTest
852  * @tc.desc: test if kv supports 8 resultSets at the same time
853  * @tc.type: FUNC
854  */
855 HWTEST_F(SingleStoreImplTest, ResultSetMaxSizeTest_Query, TestSize.Level0)
856 {
857     ASSERT_NE(kvStore_, nullptr);
858     /**
859      * @tc.steps:step1. Put the entry into the database.
860      * @tc.expected: step1. Returns SUCCESS.
861      */
862     std::vector<Entry> input;
863     for (int i = 0; i < 10; ++i) {
864         Entry entry;
865         entry.key = "k_" + std::to_string(i);
866         entry.value = "v_" + std::to_string(i);
867         input.push_back(entry);
868     }
869     auto status = kvStore_->PutBatch(input);
870     ASSERT_EQ(status, SUCCESS);
871     /**
872      * @tc.steps:step2. Get the resultset.
873      * @tc.expected: step2. Returns SUCCESS.
874      */
875     DataQuery query;
876     query.KeyPrefix("k_");
877     std::vector<std::shared_ptr<KvStoreResultSet>> outputs(MAX_RESULTSET_SIZE + 1);
878     for (int i = 0; i < MAX_RESULTSET_SIZE; i++) {
879         std::shared_ptr<KvStoreResultSet> output;
880         status = kvStore_->GetResultSet(query, outputs[i]);
881         ASSERT_EQ(status, SUCCESS);
882     }
883     /**
884      * @tc.steps:step3. Get the resultset while resultset size is over the limit.
885      * @tc.expected: step3. Returns OVER_MAX_LIMITS.
886      */
887     status = kvStore_->GetResultSet(query, outputs[MAX_RESULTSET_SIZE]);
888     ASSERT_EQ(status, OVER_MAX_LIMITS);
889     /**
890      * @tc.steps:step4. Close the resultset and getting the resultset is retried
891      * @tc.expected: step4. Returns SUCCESS.
892      */
893     status = kvStore_->CloseResultSet(outputs[0]);
894     ASSERT_EQ(status, SUCCESS);
895     status = kvStore_->GetResultSet(query, outputs[MAX_RESULTSET_SIZE]);
896     ASSERT_EQ(status, SUCCESS);
897 
898     for (int i = 1; i <= MAX_RESULTSET_SIZE; i++) {
899         status = kvStore_->CloseResultSet(outputs[i]);
900         ASSERT_EQ(status, SUCCESS);
901     }
902 }
903 
904 /**
905  * @tc.name: ResultSetMaxSizeTest
906  * @tc.desc: test if kv supports 8 resultSets at the same time
907  * @tc.type: FUNC
908  */
909 HWTEST_F(SingleStoreImplTest, ResultSetMaxSizeTest_Prefix, TestSize.Level0)
910 {
911     ASSERT_NE(kvStore_, nullptr);
912     /**
913      * @tc.steps:step1. Put the entry into the database.
914      * @tc.expected: step1. Returns SUCCESS.
915      */
916     std::vector<Entry> input;
917     for (int i = 0; i < 10; ++i) {
918         Entry entry;
919         entry.key = "k_" + std::to_string(i);
920         entry.value = "v_" + std::to_string(i);
921         input.push_back(entry);
922     }
923     auto status = kvStore_->PutBatch(input);
924     ASSERT_EQ(status, SUCCESS);
925     /**
926      * @tc.steps:step2. Get the resultset.
927      * @tc.expected: step2. Returns SUCCESS.
928      */
929     std::vector<std::shared_ptr<KvStoreResultSet>> outputs(MAX_RESULTSET_SIZE + 1);
930     for (int i = 0; i < MAX_RESULTSET_SIZE; i++) {
931         std::shared_ptr<KvStoreResultSet> output;
932         status = kvStore_->GetResultSet({ "k_i" }, outputs[i]);
933         ASSERT_EQ(status, SUCCESS);
934     }
935     /**
936      * @tc.steps:step3. Get the resultset while resultset size is over the limit.
937      * @tc.expected: step3. Returns OVER_MAX_LIMITS.
938      */
939     status = kvStore_->GetResultSet({ "" }, outputs[MAX_RESULTSET_SIZE]);
940     ASSERT_EQ(status, OVER_MAX_LIMITS);
941     /**
942      * @tc.steps:step4. Close the resultset and getting the resultset is retried
943      * @tc.expected: step4. Returns SUCCESS.
944      */
945     status = kvStore_->CloseResultSet(outputs[0]);
946     ASSERT_EQ(status, SUCCESS);
947     status = kvStore_->GetResultSet({ "" }, outputs[MAX_RESULTSET_SIZE]);
948     ASSERT_EQ(status, SUCCESS);
949 
950     for (int i = 1; i <= MAX_RESULTSET_SIZE; i++) {
951         status = kvStore_->CloseResultSet(outputs[i]);
952         ASSERT_EQ(status, SUCCESS);
953     }
954 }
955 
956 /**
957  * @tc.name: MaxLogSizeTest
958  * @tc.desc: test if the default max limit of wal is 200MB
959  * @tc.type: FUNC
960  */
961 HWTEST_F(SingleStoreImplTest, MaxLogSizeTest, TestSize.Level0)
962 {
963     ASSERT_NE(kvStore_, nullptr);
964     /**
965      * @tc.steps:step1. Put the random entry into the database.
966      * @tc.expected: step1. Returns SUCCESS.
967      */
968     std::string key;
969     std::vector<uint8_t> value = Random(4 * 1024 * 1024);
970     key = "test0";
971     EXPECT_EQ(kvStore_->Put(key, value), SUCCESS);
972     key = "test1";
973     EXPECT_EQ(kvStore_->Put(key, value), SUCCESS);
974     key = "test2";
975     EXPECT_EQ(kvStore_->Put(key, value), SUCCESS);
976     /**
977      * @tc.steps:step2. Get the resultset.
978      * @tc.expected: step2. Returns SUCCESS.
979      */
980     std::shared_ptr<KvStoreResultSet> output;
981     auto status = kvStore_->GetResultSet({ "" }, output);
982     ASSERT_EQ(status, SUCCESS);
983     ASSERT_NE(output, nullptr);
984     ASSERT_EQ(output->GetCount(), 3);
985     EXPECT_EQ(output->MoveToFirst(), true);
986     /**
987      * @tc.steps:step3. Put more data into the database.
988      * @tc.expected: step3. Returns SUCCESS.
989      */
990     for (int i = 0; i < 50; i++) {
991         key = "test_" + std::to_string(i);
992         EXPECT_EQ(kvStore_->Put(key, value), SUCCESS);
993     }
994     /**
995      * @tc.steps:step4. Put more data into the database while the log size is over the limit.
996      * @tc.expected: step4. Returns LOG_LIMITS_ERROR.
997      */
998     key = "test3";
999     EXPECT_EQ(kvStore_->Put(key, value), WAL_OVER_LIMITS);
1000     EXPECT_EQ(kvStore_->Delete(key), WAL_OVER_LIMITS);
1001     EXPECT_EQ(kvStore_->StartTransaction(), WAL_OVER_LIMITS);
1002     /**
1003      * @tc.steps:step5. Close the resultset and put again.
1004      * @tc.expected: step4. Return SUCCESS.
1005      */
1006 
1007     status = kvStore_->CloseResultSet(output);
1008     ASSERT_EQ(status, SUCCESS);
1009     EXPECT_EQ(kvStore_->Put(key, value), SUCCESS);
1010 }
1011 
1012 /**
1013  * @tc.name: MaxTest002
1014  * @tc.desc: test if the default max limit of wal is 200MB
1015  * @tc.type: FUNC
1016  */
1017 HWTEST_F(SingleStoreImplTest, MaxLogSizeTest002, TestSize.Level0)
1018 {
1019     ASSERT_NE(kvStore_, nullptr);
1020     /**
1021      * @tc.steps:step1. Put the random entry into the database.
1022      * @tc.expected: step1. Returns SUCCESS.
1023      */
1024     std::string key;
1025     std::vector<uint8_t> value = Random(4 * 1024 * 1024);
1026     key = "test0";
1027     EXPECT_EQ(kvStore_->Put(key, value), SUCCESS);
1028     key = "test1";
1029     EXPECT_EQ(kvStore_->Put(key, value), SUCCESS);
1030     key = "test2";
1031     EXPECT_EQ(kvStore_->Put(key, value), SUCCESS);
1032     /**
1033      * @tc.steps:step2. Get the resultset.
1034      * @tc.expected: step2. Returns SUCCESS.
1035      */
1036     std::shared_ptr<KvStoreResultSet> output;
1037     auto status = kvStore_->GetResultSet({ "" }, output);
1038     ASSERT_EQ(status, SUCCESS);
1039     ASSERT_NE(output, nullptr);
1040     ASSERT_EQ(output->GetCount(), 3);
1041     EXPECT_EQ(output->MoveToFirst(), true);
1042     /**
1043      * @tc.steps:step3. Put more data into the database.
1044      * @tc.expected: step3. Returns SUCCESS.
1045      */
1046     for (int i = 0; i < 50; i++) {
1047         key = "test_" + std::to_string(i);
1048         EXPECT_EQ(kvStore_->Put(key, value), SUCCESS);
1049     }
1050     /**
1051      * @tc.steps:step4. Put more data into the database while the log size is over the limit.
1052      * @tc.expected: step4. Returns LOG_LIMITS_ERROR.
1053      */
1054     key = "test3";
1055     EXPECT_EQ(kvStore_->Put(key, value), WAL_OVER_LIMITS);
1056     EXPECT_EQ(kvStore_->Delete(key), WAL_OVER_LIMITS);
1057     EXPECT_EQ(kvStore_->StartTransaction(), WAL_OVER_LIMITS);
1058     status = kvStore_->CloseResultSet(output);
1059     ASSERT_EQ(status, SUCCESS);
1060     /**
1061      * @tc.steps:step5. Close the database and then open the database,put again.
1062      * @tc.expected: step4. Return SUCCESS.
1063      */
1064     AppId appId = { "SingleStoreImplTest" };
1065     StoreId storeId = { "SingleKVStore" };
1066     Options options;
1067     options.kvStoreType = SINGLE_VERSION;
1068     options.securityLevel = S1;
1069     options.encrypt = false;
1070     options.area = EL1;
1071     options.backup = true;
1072     options.baseDir = "/data/service/el1/public/database/SingleStoreImplTest";
1073 
1074     status = StoreManager::GetInstance().CloseKVStore(appId, storeId);
1075     ASSERT_EQ(status, SUCCESS);
1076     kvStore_ = nullptr;
1077     kvStore_ = StoreManager::GetInstance().GetKVStore(appId, storeId, options, status);
1078     ASSERT_EQ(status, SUCCESS);
1079 
1080     status = kvStore_->GetResultSet({ "" }, output);
1081     ASSERT_EQ(status, SUCCESS);
1082     ASSERT_NE(output, nullptr);
1083     EXPECT_EQ(output->MoveToFirst(), true);
1084 
1085     EXPECT_EQ(kvStore_->Put(key, value), SUCCESS);
1086     status = kvStore_->CloseResultSet(output);
1087     ASSERT_EQ(status, SUCCESS);
1088 }
1089 
1090 /**
1091  * @tc.name: Move_Offset
1092  * @tc.desc: Move the ResultSet Relative Distance
1093  * @tc.type: FUNC
1094  */
1095 HWTEST_F(SingleStoreImplTest, Move_Offset, TestSize.Level0)
1096 {
1097     std::vector<Entry> input;
1098     for (int i = 0; i < 10; ++i) {
1099         Entry entry;
1100         entry.key = std::to_string(i).append("_k");
1101         entry.value = std::to_string(i).append("_v");
1102         input.push_back(entry);
1103     }
1104     auto status = kvStore_->PutBatch(input);
1105     ASSERT_EQ(status, SUCCESS);
1106 
1107     Key prefix = "2";
1108     std::shared_ptr<KvStoreResultSet> output;
1109     status = kvStore_->GetResultSet(prefix, output);
1110     ASSERT_EQ(status, SUCCESS);
1111     ASSERT_NE(output, nullptr);
1112 
1113     auto outputTmp = output;
1114     ASSERT_EQ(outputTmp->Move(1), true);
1115     status = kvStore_->CloseResultSet(output);
1116     ASSERT_EQ(status, SUCCESS);
1117     ASSERT_EQ(output, nullptr);
1118 
1119     std::shared_ptr<SingleKvStore> kvStore;
1120     AppId appId = { "SingleStoreImplTest" };
1121     StoreId storeId = { "DeviceKVStore" };
1122     kvStore = CreateKVStore(storeId.storeId, DEVICE_COLLABORATION, false, true);
1123     ASSERT_NE(kvStore, nullptr);
1124 
1125     status = kvStore->PutBatch(input);
1126     ASSERT_EQ(status, SUCCESS);
1127     std::shared_ptr<KvStoreResultSet> output1;
1128     status = kvStore->GetResultSet(prefix, output1);
1129     ASSERT_EQ(status, SUCCESS);
1130     ASSERT_NE(output1, nullptr);
1131     auto outputTmp1 = output1;
1132     ASSERT_EQ(outputTmp1->Move(1), true);
1133     status = kvStore->CloseResultSet(output1);
1134     ASSERT_EQ(status, SUCCESS);
1135     ASSERT_EQ(output1, nullptr);
1136 
1137     kvStore = nullptr;
1138     status = StoreManager::GetInstance().CloseKVStore(appId, storeId);
1139     ASSERT_EQ(status, SUCCESS);
1140     std::string baseDir = "/data/service/el1/public/database/SingleStoreImplTest";
1141     status = StoreManager::GetInstance().Delete(appId, storeId, baseDir);
1142     ASSERT_EQ(status, SUCCESS);
1143 }
1144 
1145 /**
1146  * @tc.name: GetCount
1147  * @tc.desc: close the result set
1148  * @tc.type: FUNC
1149  */
1150 HWTEST_F(SingleStoreImplTest, GetCount, TestSize.Level0)
1151 {
1152     ASSERT_NE(kvStore_, nullptr);
1153     std::vector<Entry> input;
__anon62637bdb0802(const Key &entry, const Key &sentry) 1154     auto cmp = [](const Key &entry, const Key &sentry) {
1155         return entry.Data() < sentry.Data();
1156     };
1157     std::map<Key, Value, decltype(cmp)> dictionary(cmp);
1158     for (int i = 0; i < 10; ++i) {
1159         Entry entry;
1160         entry.key = std::to_string(i).append("_k");
1161         entry.value = std::to_string(i).append("_v");
1162         dictionary[entry.key] = entry.value;
1163         input.push_back(entry);
1164     }
1165     auto status = kvStore_->PutBatch(input);
1166     ASSERT_EQ(status, SUCCESS);
1167     DataQuery query;
1168     query.InKeys({ "0_k", "1_k" });
1169     int count = 0;
1170     status = kvStore_->GetCount(query, count);
1171     ASSERT_EQ(status, SUCCESS);
1172     ASSERT_EQ(count, 2);
1173     query.Reset();
1174     status = kvStore_->GetCount(query, count);
1175     ASSERT_EQ(status, SUCCESS);
1176     ASSERT_EQ(count, 10);
1177 }
1178 
ChangeOwnerToService(std::string baseDir,std::string hashId)1179 void ChangeOwnerToService(std::string baseDir, std::string hashId)
1180 {
1181     static constexpr int ddmsId = 3012;
1182     std::string path = baseDir;
1183     chown(path.c_str(), ddmsId, ddmsId);
1184     path = path + "/kvdb";
1185     chown(path.c_str(), ddmsId, ddmsId);
1186     path = path + "/" + hashId;
1187     chown(path.c_str(), ddmsId, ddmsId);
1188     path = path + "/single_ver";
1189     chown(path.c_str(), ddmsId, ddmsId);
1190     chown((path + "/meta").c_str(), ddmsId, ddmsId);
1191     chown((path + "/cache").c_str(), ddmsId, ddmsId);
1192     path = path + "/main";
1193     chown(path.c_str(), ddmsId, ddmsId);
1194     chown((path + "/gen_natural_store.db").c_str(), ddmsId, ddmsId);
1195     chown((path + "/gen_natural_store.db-shm").c_str(), ddmsId, ddmsId);
1196     chown((path + "/gen_natural_store.db-wal").c_str(), ddmsId, ddmsId);
1197 }
1198 
1199 /**
1200  * @tc.name: RemoveDeviceData
1201  * @tc.desc: remove local device data
1202  * @tc.type: FUNC
1203  */
1204 HWTEST_F(SingleStoreImplTest, RemoveDeviceData, TestSize.Level0)
1205 {
1206     auto store = CreateKVStore("DeviceKVStore", DEVICE_COLLABORATION, false, true);
1207     ASSERT_NE(store, nullptr);
1208     std::vector<Entry> input;
__anon62637bdb0902(const Key &entry, const Key &sentry) 1209     auto cmp = [](const Key &entry, const Key &sentry) {
1210         return entry.Data() < sentry.Data();
1211     };
1212     std::map<Key, Value, decltype(cmp)> dictionary(cmp);
1213     for (int i = 0; i < 10; ++i) {
1214         Entry entry;
1215         entry.key = std::to_string(i).append("_k");
1216         entry.value = std::to_string(i).append("_v");
1217         dictionary[entry.key] = entry.value;
1218         input.push_back(entry);
1219     }
1220     auto status = store->PutBatch(input);
1221     ASSERT_EQ(status, SUCCESS);
1222     int count = 0;
1223     status = store->GetCount({}, count);
1224     ASSERT_EQ(status, SUCCESS);
1225     ASSERT_EQ(count, 10);
1226     ChangeOwnerToService("/data/service/el1/public/database/SingleStoreImplTest",
1227         "703c6ec99aa7226bb9f6194cdd60e1873ea9ee52faebd55657ade9f5a5cc3cbd");
1228     status = store->RemoveDeviceData(DevManager::GetInstance().GetLocalDevice().networkId);
1229     ASSERT_EQ(status, SUCCESS);
1230     status = store->GetCount({}, count);
1231     ASSERT_EQ(status, SUCCESS);
1232     ASSERT_EQ(count, 10);
1233     std::string baseDir = "/data/service/el1/public/database/SingleStoreImplTest";
1234     status = StoreManager::GetInstance().Delete({ "SingleStoreImplTest" }, { "DeviceKVStore" }, baseDir);
1235     ASSERT_EQ(status, SUCCESS);
1236 }
1237 
1238 /**
1239  * @tc.name: GetSecurityLevel
1240  * @tc.desc: get security level
1241  * @tc.type: FUNC
1242  */
1243 HWTEST_F(SingleStoreImplTest, GetSecurityLevel, TestSize.Level0)
1244 {
1245     ASSERT_NE(kvStore_, nullptr);
1246     SecurityLevel securityLevel = NO_LABEL;
1247     auto status = kvStore_->GetSecurityLevel(securityLevel);
1248     ASSERT_EQ(status, SUCCESS);
1249     ASSERT_EQ(securityLevel, S1);
1250 }
1251 
1252 /**
1253  * @tc.name: RegisterSyncCallback
1254  * @tc.desc: register the data sync callback
1255  * @tc.type: FUNC
1256  */
1257 HWTEST_F(SingleStoreImplTest, RegisterSyncCallback, TestSize.Level0)
1258 {
1259     ASSERT_NE(kvStore_, nullptr);
1260     class TestSyncCallback : public KvStoreSyncCallback {
1261     public:
SyncCompleted(const map<std::string,Status> & results)1262         void SyncCompleted(const map<std::string, Status> &results) override { }
SyncCompleted(const std::map<std::string,Status> & results,uint64_t sequenceId)1263         void SyncCompleted(const std::map<std::string, Status> &results, uint64_t sequenceId) override { }
1264     };
1265     auto callback = std::make_shared<TestSyncCallback>();
1266     auto status = kvStore_->RegisterSyncCallback(callback);
1267     ASSERT_EQ(status, SUCCESS);
1268 }
1269 
1270 /**
1271  * @tc.name: UnRegisterSyncCallback
1272  * @tc.desc: unregister the data sync callback
1273  * @tc.type: FUNC
1274  */
1275 HWTEST_F(SingleStoreImplTest, UnRegisterSyncCallback, TestSize.Level0)
1276 {
1277     ASSERT_NE(kvStore_, nullptr);
1278     class TestSyncCallback : public KvStoreSyncCallback {
1279     public:
SyncCompleted(const map<std::string,Status> & results)1280         void SyncCompleted(const map<std::string, Status> &results) override { }
SyncCompleted(const std::map<std::string,Status> & results,uint64_t sequenceId)1281         void SyncCompleted(const std::map<std::string, Status> &results, uint64_t sequenceId) override { }
1282     };
1283     auto callback = std::make_shared<TestSyncCallback>();
1284     auto status = kvStore_->RegisterSyncCallback(callback);
1285     ASSERT_EQ(status, SUCCESS);
1286     status = kvStore_->UnRegisterSyncCallback();
1287     ASSERT_EQ(status, SUCCESS);
1288 }
1289 
1290 /**
1291  * @tc.name: disableBackup
1292  * @tc.desc: Disable backup
1293  * @tc.type: FUNC
1294  */
1295 HWTEST_F(SingleStoreImplTest, disableBackup, TestSize.Level0)
1296 {
1297     AppId appId = { "SingleStoreImplTest" };
1298     StoreId storeId = { "SingleKVStoreNoBackup" };
1299     std::shared_ptr<SingleKvStore> kvStoreNoBackup;
1300     kvStoreNoBackup = CreateKVStore(storeId, SINGLE_VERSION, true, false);
1301     ASSERT_NE(kvStoreNoBackup, nullptr);
1302     auto baseDir = "/data/service/el1/public/database/SingleStoreImplTest";
1303     auto status = StoreManager::GetInstance().CloseKVStore(appId, storeId);
1304     ASSERT_EQ(status, SUCCESS);
1305     status = StoreManager::GetInstance().Delete(appId, storeId, baseDir);
1306     ASSERT_EQ(status, SUCCESS);
1307 }
1308 
1309 /**
1310  * @tc.name: PutOverMaxValue
1311  * @tc.desc: put key-value data to the kv store and the value size  over the limits
1312  * @tc.type: FUNC
1313  */
1314 HWTEST_F(SingleStoreImplTest, PutOverMaxValue, TestSize.Level0)
1315 {
1316     ASSERT_NE(kvStore_, nullptr);
1317     std::string value;
1318     int maxsize = 1024 * 1024;
1319     for (int i = 0; i <= maxsize; i++) {
1320         value += "test";
1321     }
1322     Value valuePut(value);
1323     auto status = kvStore_->Put({ "Put Test" }, valuePut);
1324     ASSERT_EQ(status, INVALID_ARGUMENT);
1325 }
1326 /**
1327  * @tc.name: DeleteOverMaxKey
1328  * @tc.desc: delete the values of the keys and the key size  over the limits
1329  * @tc.type: FUNC
1330  */
1331 HWTEST_F(SingleStoreImplTest, DeleteOverMaxKey, TestSize.Level0)
1332 {
1333     ASSERT_NE(kvStore_, nullptr);
1334     std::string str;
1335     int maxsize = 1024;
1336     for (int i = 0; i <= maxsize; i++) {
1337         str += "key";
1338     }
1339     Key key(str);
1340     auto status = kvStore_->Put(key, "Put Test");
1341     ASSERT_EQ(status, INVALID_ARGUMENT);
1342     Value value;
1343     status = kvStore_->Get(key, value);
1344     ASSERT_EQ(status, INVALID_ARGUMENT);
1345     status = kvStore_->Delete(key);
1346     ASSERT_EQ(status, INVALID_ARGUMENT);
1347 }
1348 
1349 /**
1350  * @tc.name: GetEntriesOverMaxKey
1351  * @tc.desc: get entries the by prefix and the prefix size  over the limits
1352  * @tc.type: FUNC
1353  */
1354 HWTEST_F(SingleStoreImplTest, GetEntriesOverMaxPrefix, TestSize.Level0)
1355 {
1356     ASSERT_NE(kvStore_, nullptr);
1357     std::string str;
1358     int maxsize = 1024;
1359     for (int i = 0; i <= maxsize; i++) {
1360         str += "key";
1361     }
1362     const Key prefix(str);
1363     std::vector<Entry> output;
1364     auto status = kvStore_->GetEntries(prefix, output);
1365     ASSERT_EQ(status, INVALID_ARGUMENT);
1366 }
1367 
1368 /**
1369  * @tc.name: GetResultSetOverMaxPrefix
1370  * @tc.desc: get result set the by prefix and the prefix size  over the limits
1371  * @tc.type: FUNC
1372  */
1373 HWTEST_F(SingleStoreImplTest, GetResultSetOverMaxPrefix, TestSize.Level0)
1374 {
1375     ASSERT_NE(kvStore_, nullptr);
1376     std::string str;
1377     int maxsize = 1024;
1378     for (int i = 0; i <= maxsize; i++) {
1379         str += "key";
1380     }
1381     const Key prefix(str);
1382     std::shared_ptr<KvStoreResultSet> output;
1383     auto status = kvStore_->GetResultSet(prefix, output);
1384     ASSERT_EQ(status, INVALID_ARGUMENT);
1385 }
1386 
1387 /**
1388  * @tc.name: RemoveNullDeviceData
1389  * @tc.desc: remove local device data and the device is null
1390  * @tc.type: FUNC
1391  */
1392 HWTEST_F(SingleStoreImplTest, RemoveNullDeviceData, TestSize.Level0)
1393 {
1394     auto store = CreateKVStore("DeviceKVStore", DEVICE_COLLABORATION, false, true);
1395     ASSERT_NE(store, nullptr);
1396     std::vector<Entry> input;
__anon62637bdb0a02(const Key &entry, const Key &sentry) 1397     auto cmp = [](const Key &entry, const Key &sentry) {
1398         return entry.Data() < sentry.Data();
1399     };
1400     std::map<Key, Value, decltype(cmp)> dictionary(cmp);
1401     for (int i = 0; i < 10; ++i) {
1402         Entry entry;
1403         entry.key = std::to_string(i).append("_k");
1404         entry.value = std::to_string(i).append("_v");
1405         dictionary[entry.key] = entry.value;
1406         input.push_back(entry);
1407     }
1408     auto status = store->PutBatch(input);
1409     ASSERT_EQ(status, SUCCESS);
1410     int count = 0;
1411     status = store->GetCount({}, count);
1412     ASSERT_EQ(status, SUCCESS);
1413     ASSERT_EQ(count, 10);
1414     const string device = { "" };
1415     ChangeOwnerToService("/data/service/el1/public/database/SingleStoreImplTest",
1416         "703c6ec99aa7226bb9f6194cdd60e1873ea9ee52faebd55657ade9f5a5cc3cbd");
1417     status = store->RemoveDeviceData(device);
1418     ASSERT_EQ(status, SUCCESS);
1419 }
1420 
1421 /**
1422  * @tc.name: CloseKVStoreWithInvalidAppId
1423  * @tc.desc: close the kv store with invalid appid
1424  * @tc.type: FUNC
1425  */
1426 HWTEST_F(SingleStoreImplTest, CloseKVStoreWithInvalidAppId, TestSize.Level0)
1427 {
1428     AppId appId = { "" };
1429     StoreId storeId = { "SingleKVStore" };
1430     Status status = StoreManager::GetInstance().CloseKVStore(appId, storeId);
1431     ASSERT_EQ(status, INVALID_ARGUMENT);
1432 }
1433 
1434 /**
1435  * @tc.name: CloseKVStoreWithInvalidStoreId
1436  * @tc.desc: close the kv store with invalid store id
1437  * @tc.type: FUNC
1438  */
1439 HWTEST_F(SingleStoreImplTest, CloseKVStoreWithInvalidStoreId, TestSize.Level0)
1440 {
1441     AppId appId = { "SingleStoreImplTest" };
1442     StoreId storeId = { "" };
1443     Status status = StoreManager::GetInstance().CloseKVStore(appId, storeId);
1444     ASSERT_EQ(status, INVALID_ARGUMENT);
1445 }
1446 
1447 /**
1448  * @tc.name: CloseAllKVStore
1449  * @tc.desc: close all kv store
1450  * @tc.type: FUNC
1451  */
1452 HWTEST_F(SingleStoreImplTest, CloseAllKVStore, TestSize.Level0)
1453 {
1454     AppId appId = { "SingleStoreImplTestCloseAll" };
1455     std::vector<std::shared_ptr<SingleKvStore>> kvStores;
1456     for (int i = 0; i < 5; i++) {
1457         std::shared_ptr<SingleKvStore> kvStore;
1458         Options options;
1459         options.kvStoreType = SINGLE_VERSION;
1460         options.securityLevel = S1;
1461         options.area = EL1;
1462         options.baseDir = "/data/service/el1/public/database/SingleStoreImplTest";
1463         std::string sId = "SingleStoreImplTestCloseAll" + std::to_string(i);
1464         StoreId storeId = { sId };
1465         Status status;
1466         kvStore = StoreManager::GetInstance().GetKVStore(appId, storeId, options, status);
1467         ASSERT_NE(kvStore, nullptr);
1468         kvStores.push_back(kvStore);
1469         ASSERT_EQ(status, SUCCESS);
1470         kvStore = nullptr;
1471     }
1472     Status status = StoreManager::GetInstance().CloseAllKVStore(appId);
1473     ASSERT_EQ(status, SUCCESS);
1474 }
1475 
1476 /**
1477  * @tc.name: CloseAllKVStoreWithInvalidAppId
1478  * @tc.desc: close the kv store with invalid appid
1479  * @tc.type: FUNC
1480  */
1481 HWTEST_F(SingleStoreImplTest, CloseAllKVStoreWithInvalidAppId, TestSize.Level0)
1482 {
1483     AppId appId = { "" };
1484     Status status = StoreManager::GetInstance().CloseAllKVStore(appId);
1485     ASSERT_EQ(status, INVALID_ARGUMENT);
1486 }
1487 
1488 /**
1489  * @tc.name: DeleteWithInvalidAppId
1490  * @tc.desc: delete the kv store with invalid appid
1491  * @tc.type: FUNC
1492  */
1493 HWTEST_F(SingleStoreImplTest, DeleteWithInvalidAppId, TestSize.Level0)
1494 {
1495     std::string baseDir = "/data/service/el1/public/database/SingleStoreImplTest";
1496     AppId appId = { "" };
1497     StoreId storeId = { "SingleKVStore" };
1498     Status status = StoreManager::GetInstance().Delete(appId, storeId, baseDir);
1499     ASSERT_EQ(status, INVALID_ARGUMENT);
1500 }
1501 
1502 /**
1503  * @tc.name: DeleteWithInvalidStoreId
1504  * @tc.desc: delete the kv store with invalid storeid
1505  * @tc.type: FUNC
1506  */
1507 HWTEST_F(SingleStoreImplTest, DeleteWithInvalidStoreId, TestSize.Level0)
1508 {
1509     std::string baseDir = "/data/service/el1/public/database/SingleStoreImplTest";
1510     AppId appId = { "SingleStoreImplTest" };
1511     StoreId storeId = { "" };
1512     Status status = StoreManager::GetInstance().Delete(appId, storeId, baseDir);
1513     ASSERT_EQ(status, INVALID_ARGUMENT);
1514 }
1515 
1516 /**
1517  * @tc.name: GetKVStoreWithPersistentFalse
1518  * @tc.desc: delete the kv store with the persistent is false
1519  * @tc.type: FUNC
1520  */
1521 HWTEST_F(SingleStoreImplTest, GetKVStoreWithPersistentFalse, TestSize.Level0)
1522 {
1523     std::string baseDir = "/data/service/el1/public/database/SingleStoreImplTest";
1524     AppId appId = { "SingleStoreImplTest" };
1525     StoreId storeId = { "SingleKVStorePersistentFalse" };
1526     std::shared_ptr<SingleKvStore> kvStore;
1527     Options options;
1528     options.kvStoreType = SINGLE_VERSION;
1529     options.securityLevel = S1;
1530     options.area = EL1;
1531     options.persistent = false;
1532     options.baseDir = "/data/service/el1/public/database/SingleStoreImplTest";
1533     Status status;
1534     kvStore = StoreManager::GetInstance().GetKVStore(appId, storeId, options, status);
1535     ASSERT_EQ(kvStore, nullptr);
1536 }
1537 
1538 /**
1539  * @tc.name: GetKVStoreWithInvalidType
1540  * @tc.desc: delete the kv store with the KvStoreType is InvalidType
1541  * @tc.type: FUNC
1542  */
1543 HWTEST_F(SingleStoreImplTest, GetKVStoreWithInvalidType, TestSize.Level0)
1544 {
1545     std::string baseDir = "/data/service/el1/public/database/SingleStoreImpStore";
1546     AppId appId = { "SingleStoreImplTest" };
1547     StoreId storeId = { "SingleKVStoreInvalidType" };
1548     std::shared_ptr<SingleKvStore> kvStore;
1549     Options options;
1550     options.kvStoreType = INVALID_TYPE;
1551     options.securityLevel = S1;
1552     options.area = EL1;
1553     options.baseDir = "/data/service/el1/public/database/SingleStoreImplTest";
1554     Status status;
1555     kvStore = StoreManager::GetInstance().GetKVStore(appId, storeId, options, status);
1556     ASSERT_EQ(kvStore, nullptr);
1557 }
1558 
1559 /**
1560  * @tc.name: GetKVStoreWithCreateIfMissingFalse
1561  * @tc.desc: delete the kv store with the createIfMissing is false
1562  * @tc.type: FUNC
1563  */
1564 HWTEST_F(SingleStoreImplTest, GetKVStoreWithCreateIfMissingFalse, TestSize.Level0)
1565 {
1566     std::string baseDir = "/data/service/el1/public/database/SingleStoreImplTest";
1567     AppId appId = { "SingleStoreImplTest" };
1568     StoreId storeId = { "SingleKVStoreCreateIfMissingFalse" };
1569     std::shared_ptr<SingleKvStore> kvStore;
1570     Options options;
1571     options.kvStoreType = SINGLE_VERSION;
1572     options.securityLevel = S1;
1573     options.area = EL1;
1574     options.createIfMissing = false;
1575     options.baseDir = "/data/service/el1/public/database/SingleStoreImplTest";
1576     Status status;
1577     kvStore = StoreManager::GetInstance().GetKVStore(appId, storeId, options, status);
1578     ASSERT_EQ(kvStore, nullptr);
1579 }
1580 
1581 /**
1582  * @tc.name: GetKVStoreWithAutoSync
1583  * @tc.desc: delete the kv store with the autoSync is false
1584  * @tc.type: FUNC
1585  */
1586 HWTEST_F(SingleStoreImplTest, GetKVStoreWithAutoSync, TestSize.Level0)
1587 {
1588     std::string baseDir = "/data/service/el1/public/database/SingleStoreImplTest";
1589     AppId appId = { "SingleStoreImplTest" };
1590     StoreId storeId = { "SingleKVStoreAutoSync" };
1591     std::shared_ptr<SingleKvStore> kvStore;
1592     Options options;
1593     options.kvStoreType = SINGLE_VERSION;
1594     options.securityLevel = S1;
1595     options.area = EL1;
1596     options.autoSync = false;
1597     options.baseDir = "/data/service/el1/public/database/SingleStoreImplTest";
1598     Status status;
1599     kvStore = StoreManager::GetInstance().GetKVStore(appId, storeId, options, status);
1600     ASSERT_NE(kvStore, nullptr);
1601     status = StoreManager::GetInstance().CloseKVStore(appId, storeId);
1602     ASSERT_EQ(status, SUCCESS);
1603 }
1604 
1605 /**
1606  * @tc.name: GetKVStoreWithAreaEL2
1607  * @tc.desc: delete the kv store with the area is EL2
1608  * @tc.type: FUNC
1609  */
1610 HWTEST_F(SingleStoreImplTest, GetKVStoreWithAreaEL2, TestSize.Level0)
1611 {
1612     std::string baseDir = "/data/service/el2/100/SingleStoreImplTest";
1613     mkdir(baseDir.c_str(), (S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH));
1614 
1615     AppId appId = { "SingleStoreImplTest" };
1616     StoreId storeId = { "SingleKVStoreAreaEL2" };
1617     std::shared_ptr<SingleKvStore> kvStore;
1618     Options options;
1619     options.kvStoreType = SINGLE_VERSION;
1620     options.securityLevel = S2;
1621     options.area = EL2;
1622     options.baseDir = "/data/service/el2/100/SingleStoreImplTest";
1623     Status status;
1624     kvStore = StoreManager::GetInstance().GetKVStore(appId, storeId, options, status);
1625     ASSERT_NE(kvStore, nullptr);
1626     status = StoreManager::GetInstance().CloseKVStore(appId, storeId);
1627     ASSERT_EQ(status, SUCCESS);
1628 }
1629 
1630 /**
1631  * @tc.name: GetKVStoreWithRebuildTrue
1632  * @tc.desc: delete the kv store with the rebuild is true
1633  * @tc.type: FUNC
1634  */
1635 HWTEST_F(SingleStoreImplTest, GetKVStoreWithRebuildTrue, TestSize.Level0)
1636 {
1637     std::string baseDir = "/data/service/el1/public/database/SingleStoreImplTest";
1638     AppId appId = { "SingleStoreImplTest" };
1639     StoreId storeId = { "SingleKVStoreRebuildFalse" };
1640     std::shared_ptr<SingleKvStore> kvStore;
1641     Options options;
1642     options.kvStoreType = SINGLE_VERSION;
1643     options.securityLevel = S1;
1644     options.area = EL1;
1645     options.rebuild = true;
1646     options.baseDir = "/data/service/el1/public/database/SingleStoreImplTest";
1647     Status status;
1648     kvStore = StoreManager::GetInstance().GetKVStore(appId, storeId, options, status);
1649     ASSERT_NE(kvStore, nullptr);
1650     status = StoreManager::GetInstance().CloseKVStore(appId, storeId);
1651     ASSERT_EQ(status, SUCCESS);
1652 }
1653 
1654 /**
1655  * @tc.name: GetStaticStore
1656  * @tc.desc: get static store
1657  * @tc.type: FUNC
1658  */
1659 HWTEST_F(SingleStoreImplTest, GetStaticStore, TestSize.Level0)
1660 {
1661     std::string baseDir = "/data/service/el1/public/database/SingleStoreImplTest";
1662     AppId appId = { "SingleStoreImplTest" };
1663     StoreId storeId = { "StaticStoreTest" };
1664     std::shared_ptr<SingleKvStore> kvStore;
1665     Options options;
1666     options.kvStoreType = SINGLE_VERSION;
1667     options.securityLevel = S1;
1668     options.area = EL1;
1669     options.rebuild = true;
1670     options.baseDir = "/data/service/el1/public/database/SingleStoreImplTest";
1671     options.dataType = DataType::TYPE_STATICS;
1672     Status status;
1673     kvStore = StoreManager::GetInstance().GetKVStore(appId, storeId, options, status);
1674     ASSERT_NE(kvStore, nullptr);
1675     status = StoreManager::GetInstance().CloseKVStore(appId, storeId);
1676     ASSERT_EQ(status, SUCCESS);
1677 }
1678 
1679 /**
1680  * @tc.name: StaticStoreAsyncGet
1681  * @tc.desc: static store async get
1682  * @tc.type: FUNC
1683  */
1684 HWTEST_F(SingleStoreImplTest, StaticStoreAsyncGet, TestSize.Level0)
1685 {
1686     std::string baseDir = "/data/service/el1/public/database/SingleStoreImplTest";
1687     AppId appId = { "SingleStoreImplTest" };
1688     StoreId storeId = { "StaticStoreAsyncGetTest" };
1689     std::shared_ptr<SingleKvStore> kvStore;
1690     Options options;
1691     options.kvStoreType = SINGLE_VERSION;
1692     options.securityLevel = S1;
1693     options.area = EL1;
1694     options.rebuild = true;
1695     options.baseDir = "/data/service/el1/public/database/SingleStoreImplTest";
1696     options.dataType = DataType::TYPE_STATICS;
1697     Status status;
1698     kvStore = StoreManager::GetInstance().GetKVStore(appId, storeId, options, status);
1699     ASSERT_NE(kvStore, nullptr);
1700     BlockData<bool> blockData { 1, false };
__anon62637bdb0b02(Status status, Value &&value) 1701     std::function<void(Status, Value &&)> result = [&blockData](Status status, Value &&value) {
1702         ASSERT_EQ(status, Status::NOT_FOUND);
1703         blockData.SetValue(true);
1704     };
1705     auto networkId = DevManager::GetInstance().GetLocalDevice().networkId;
1706     kvStore->Get({ "key" }, networkId, result);
1707     blockData.GetValue();
1708     status = StoreManager::GetInstance().CloseKVStore(appId, storeId);
1709     ASSERT_EQ(status, SUCCESS);
1710 }
1711 
1712 /**
1713  * @tc.name: StaticStoreAsyncGetEntries
1714  * @tc.desc: static store async get entries
1715  * @tc.type: FUNC
1716  */
1717 HWTEST_F(SingleStoreImplTest, StaticStoreAsyncGetEntries, TestSize.Level0)
1718 {
1719     std::string baseDir = "/data/service/el1/public/database/SingleStoreImplTest";
1720     AppId appId = { "SingleStoreImplTest" };
1721     StoreId storeId = { "StaticStoreAsyncGetEntriesTest" };
1722     std::shared_ptr<SingleKvStore> kvStore;
1723     Options options;
1724     options.kvStoreType = SINGLE_VERSION;
1725     options.securityLevel = S1;
1726     options.area = EL1;
1727     options.rebuild = true;
1728     options.baseDir = "/data/service/el1/public/database/SingleStoreImplTest";
1729     options.dataType = DataType::TYPE_STATICS;
1730     Status status;
1731     kvStore = StoreManager::GetInstance().GetKVStore(appId, storeId, options, status);
1732     ASSERT_NE(kvStore, nullptr);
1733     BlockData<bool> blockData { 1, false };
1734     std::function<void(Status, std::vector<Entry> &&)> result = [&blockData](
__anon62637bdb0c02( Status status, std::vector<Entry> &&value) 1735                                                                     Status status, std::vector<Entry> &&value) {
1736         ASSERT_EQ(status, Status::SUCCESS);
1737         blockData.SetValue(true);
1738     };
1739     auto networkId = DevManager::GetInstance().GetLocalDevice().networkId;
1740     kvStore->GetEntries({ "key" }, networkId, result);
1741     blockData.GetValue();
1742     status = StoreManager::GetInstance().CloseKVStore(appId, storeId);
1743     ASSERT_EQ(status, SUCCESS);
1744 }
1745 
1746 /**
1747  * @tc.name: DynamicStoreAsyncGet
1748  * @tc.desc: dynamic store async get
1749  * @tc.type: FUNC
1750  */
1751 HWTEST_F(SingleStoreImplTest, DynamicStoreAsyncGet, TestSize.Level0)
1752 {
1753     std::string baseDir = "/data/service/el1/public/database/SingleStoreImplTest";
1754     AppId appId = { "SingleStoreImplTest" };
1755     StoreId storeId = { "DynamicStoreAsyncGetTest" };
1756     std::shared_ptr<SingleKvStore> kvStore;
1757     Options options;
1758     options.kvStoreType = SINGLE_VERSION;
1759     options.securityLevel = S1;
1760     options.area = EL1;
1761     options.rebuild = true;
1762     options.baseDir = "/data/service/el1/public/database/SingleStoreImplTest";
1763     options.dataType = DataType::TYPE_DYNAMICAL;
1764     Status status;
1765     kvStore = StoreManager::GetInstance().GetKVStore(appId, storeId, options, status);
1766     ASSERT_NE(kvStore, nullptr);
1767     status = kvStore->Put({ "Put Test" }, { "Put Value" });
1768     auto networkId = DevManager::GetInstance().GetLocalDevice().networkId;
1769     BlockData<bool> blockData { 1, false };
__anon62637bdb0d02(Status status, Value &&value) 1770     std::function<void(Status, Value &&)> result = [&blockData](Status status, Value &&value) {
1771         ASSERT_EQ(status, Status::SUCCESS);
1772         ASSERT_EQ(value.ToString(), "Put Value");
1773         blockData.SetValue(true);
1774     };
1775     kvStore->Get({ "Put Test" }, networkId, result);
1776     blockData.GetValue();
1777     status = StoreManager::GetInstance().CloseKVStore(appId, storeId);
1778     ASSERT_EQ(status, SUCCESS);
1779 }
1780 
1781 /**
1782  * @tc.name: DynamicStoreAsyncGetEntries
1783  * @tc.desc: dynamic store async get entries
1784  * @tc.type: FUNC
1785  */
1786 HWTEST_F(SingleStoreImplTest, DynamicStoreAsyncGetEntries, TestSize.Level0)
1787 {
1788     std::string baseDir = "/data/service/el1/public/database/SingleStoreImplTest";
1789     AppId appId = { "SingleStoreImplTest" };
1790     StoreId storeId = { "DynamicStoreAsyncGetEntriesTest" };
1791     std::shared_ptr<SingleKvStore> kvStore;
1792     Options options;
1793     options.kvStoreType = SINGLE_VERSION;
1794     options.securityLevel = S1;
1795     options.area = EL1;
1796     options.rebuild = true;
1797     options.baseDir = "/data/service/el1/public/database/SingleStoreImplTest";
1798     options.dataType = DataType::TYPE_DYNAMICAL;
1799     Status status;
1800     kvStore = StoreManager::GetInstance().GetKVStore(appId, storeId, options, status);
1801     ASSERT_NE(kvStore, nullptr);
1802     std::vector<Entry> entries;
1803     for (int i = 0; i < 10; ++i) {
1804         Entry entry;
1805         entry.key = "key_" + std::to_string(i);
1806         entry.value = std::to_string(i);
1807         entries.push_back(entry);
1808     }
1809     status = kvStore->PutBatch(entries);
1810     ASSERT_EQ(status, SUCCESS);
1811     auto networkId = DevManager::GetInstance().GetLocalDevice().networkId;
1812     BlockData<bool> blockData { 1, false };
1813     std::function<void(Status, std::vector<Entry> &&)> result = [entries, &blockData](
__anon62637bdb0e02( Status status, std::vector<Entry> &&value) 1814                                                                     Status status, std::vector<Entry> &&value) {
1815         ASSERT_EQ(status, Status::SUCCESS);
1816         ASSERT_EQ(value.size(), entries.size());
1817         blockData.SetValue(true);
1818     };
1819     kvStore->GetEntries({ "key_" }, networkId, result);
1820     blockData.GetValue();
1821     status = StoreManager::GetInstance().CloseKVStore(appId, storeId);
1822     ASSERT_EQ(status, SUCCESS);
1823 }
1824 
1825 /**
1826  * @tc.name: SetConfig
1827  * @tc.desc: SetConfig
1828  * @tc.type: FUNC
1829  */
1830 HWTEST_F(SingleStoreImplTest, SetConfig, TestSize.Level0)
1831 {
1832     std::string baseDir = "/data/service/el1/public/database/SingleStoreImplTest";
1833     AppId appId = { "SingleStoreImplTest" };
1834     StoreId storeId = { "SetConfigTest" };
1835     std::shared_ptr<SingleKvStore> kvStore;
1836     Options options;
1837     options.kvStoreType = SINGLE_VERSION;
1838     options.securityLevel = S1;
1839     options.area = EL1;
1840     options.rebuild = true;
1841     options.baseDir = "/data/service/el1/public/database/SingleStoreImplTest";
1842     options.dataType = DataType::TYPE_DYNAMICAL;
1843     options.cloudConfig.enableCloud = false;
1844     Status status;
1845     kvStore = StoreManager::GetInstance().GetKVStore(appId, storeId, options, status);
1846     ASSERT_NE(kvStore, nullptr);
1847     StoreConfig storeConfig;
1848     storeConfig.cloudConfig.enableCloud = true;
1849     ASSERT_EQ(kvStore->SetConfig(storeConfig), Status::SUCCESS);
1850 }
1851 
1852 /**
1853  * @tc.name: GetDeviceEntries001
1854  * @tc.desc:
1855  * @tc.type: FUNC
1856  */
1857 HWTEST_F(SingleStoreImplTest, GetDeviceEntries001, TestSize.Level1)
1858 {
1859     SetNativeTokenId();
1860     std::string pkgNameEx = "_distributed_data";
1861     std::shared_ptr<SingleStoreImpl> kvStore;
1862     kvStore = CreateKVStore();
1863     ASSERT_NE(kvStore, nullptr);
1864     std::vector<Entry> output;
1865     std::string device = DevManager::GetInstance().GetUnEncryptedUuid();
1866     std::string devices = "GetDeviceEntriestest";
1867     auto status = kvStore->GetDeviceEntries("", output);
1868     ASSERT_EQ(status, INVALID_ARGUMENT);
1869     status = kvStore->GetDeviceEntries(device, output);
1870     ASSERT_EQ(status, SUCCESS);
1871     DevInfo devinfo;
1872     std::string pkgName = std::to_string(getpid()) + pkgNameEx;
1873     DistributedHardware::DeviceManager::GetInstance().GetLocalDeviceInfo(pkgName, devinfo);
1874     ASSERT_NE(std::string(devinfo.deviceId), "");
1875     status = kvStore->GetDeviceEntries(std::string(devinfo.deviceId), output);
1876     ASSERT_EQ(status, SUCCESS);
1877 }
1878 
1879 /**
1880  * @tc.name: DoSync001
1881  * @tc.desc: observer = nullptr
1882  * @tc.type: FUNC
1883  */
1884 HWTEST_F(SingleStoreImplTest, DoSync001, TestSize.Level1)
1885 {
1886     std::shared_ptr<SingleStoreImpl> kvStore;
1887     kvStore = CreateKVStore();
1888     EXPECT_NE(kvStore, nullptr) << "kvStorePtr is null.";
1889     std::string deviceId = "no_exist_device_id";
1890     std::vector<std::string> deviceIds = { deviceId };
1891     uint32_t allowedDelayMs = 200;
1892     kvStore->isClientSync_ = false;
1893     auto syncStatus = kvStore->Sync(deviceIds, SyncMode::PUSH, allowedDelayMs);
1894     EXPECT_EQ(syncStatus, Status::SUCCESS) << "sync device should return success";
1895     kvStore->isClientSync_ = true;
1896     kvStore->syncObserver_ = nullptr;
1897     syncStatus = kvStore->Sync(deviceIds, SyncMode::PUSH, allowedDelayMs);
1898     EXPECT_NE(syncStatus, Status::SUCCESS) << "sync device should return error";
1899 }
1900 
1901 /**
1902  * @tc.name: SetCapabilityEnabled001
1903  * @tc.desc: enabled
1904  * @tc.type: FUNC
1905  */
1906 HWTEST_F(SingleStoreImplTest, SetCapabilityEnabled001, TestSize.Level1)
1907 {
1908     ASSERT_NE(kvStore_, nullptr);
1909     auto status = kvStore_->SetCapabilityEnabled(true);
1910     ASSERT_EQ(status, SUCCESS);
1911     status = kvStore_->SetCapabilityEnabled(false);
1912     ASSERT_EQ(status, SUCCESS);
1913 }
1914 
1915 /**
1916  * @tc.name: DoClientSync001
1917  * @tc.desc: observer = nullptr
1918  * @tc.type: FUNC
1919  */
1920 HWTEST_F(SingleStoreImplTest, DoClientSync001, TestSize.Level1)
1921 {
1922     std::shared_ptr<SingleStoreImpl> kvStore;
1923     kvStore = CreateKVStore();
1924     ASSERT_NE(kvStore, nullptr);
1925     KVDBService::SyncInfo syncInfo;
1926     syncInfo.mode = SyncMode::PULL;
1927     syncInfo.seqId = 10; // syncInfo seqId
1928     syncInfo.devices = { "networkId" };
1929     std::shared_ptr<SyncCallback> observer;
1930     observer = nullptr;
1931     auto status = kvStore->DoClientSync(syncInfo, observer);
1932     ASSERT_EQ(status, ERROR);
1933 }
1934 
1935 /**
1936  * @tc.name: DoNotifyChange001
1937  * @tc.desc: called within timeout
1938  * @tc.type: FUNC
1939  */
1940 HWTEST_F(SingleStoreImplTest, DoNotifyChange001, TestSize.Level1)
1941 {
1942     std::shared_ptr<SingleStoreImpl> kvStore;
1943     kvStore = CreateKVStore();
1944     EXPECT_NE(kvStore, nullptr) << "kvStorePtr is null.";
1945     auto status = kvStore->Put({ "Put Test" }, { "Put Value" });
1946     ASSERT_EQ(kvStore->notifyExpiredTime_, 0);
1947     kvStore->cloudAutoSync_ = true;
1948     status = kvStore->Put({ "Put Test" }, { "Put Value" });
1949     ASSERT_EQ(status, SUCCESS);
1950     auto notifyExpiredTime = kvStore->notifyExpiredTime_;
1951     ASSERT_NE(notifyExpiredTime, 0);
1952     status = kvStore->Put({ "Put Test1" }, { "Put Value1" });
1953     ASSERT_EQ(status, SUCCESS);
1954     ASSERT_EQ(notifyExpiredTime, kvStore->notifyExpiredTime_);
1955     sleep(1);
1956     status = kvStore->Put({ "Put Test2" }, { "Put Value2" });
1957     ASSERT_EQ(status, SUCCESS);
1958     ASSERT_NE(notifyExpiredTime, kvStore->notifyExpiredTime_);
1959 }
1960 
1961 /**
1962  * @tc.name: DoAutoSync001
1963  * @tc.desc: observer = nullptr
1964  * @tc.type: FUNC
1965  */
1966 HWTEST_F(SingleStoreImplTest, DoAutoSync001, TestSize.Level1)
1967 {
1968     std::shared_ptr<SingleStoreImpl> kvStore;
1969     kvStore = CreateKVStore(true);
1970     ASSERT_NE(kvStore, nullptr);
1971     kvStore->isApplication_ = true;
1972     auto status = kvStore->Put({ "Put Test" }, { "Put Value" });
1973     ASSERT_EQ(status, SUCCESS);
1974     ASSERT_EQ(!kvStore->autoSync_ || !kvStore->isApplication_, false);
1975 }
1976 
1977 /**
1978  * @tc.name: IsRemoteChanged
1979  * @tc.desc: is remote changed
1980  * @tc.type: FUNC
1981  */
1982 HWTEST_F(SingleStoreImplTest, IsRemoteChanged, TestSize.Level0)
1983 {
1984     std::shared_ptr<SingleStoreImpl> kvStore;
1985     kvStore = CreateKVStore();
1986     ASSERT_NE(kvStore, nullptr);
1987     bool ret = kvStore->IsRemoteChanged("");
1988     ASSERT_TRUE(ret);
1989 }
1990 } // namespace OHOS::Test