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 ¬ification) 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