1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <gtest/gtest.h>
17
18 #include "db_common.h"
19 #include "distributeddb_data_generate_unit_test.h"
20 #include "distributeddb_tools_unit_test.h"
21 #include "log_print.h"
22 #include "platform_specific.h"
23
24 using namespace testing::ext;
25 using namespace DistributedDB;
26 using namespace DistributedDBUnitTest;
27 using namespace std;
28
29 namespace {
30 const int BATCH_BASE_SIZE = 60;
31 const Key NULL_KEY;
32 const Key NULL_VALUE;
33 const int CONFLICT_ALL = 15;
34 const auto OLD_VALUE_TYPE = KvStoreNbConflictData::ValueType::OLD_VALUE;
35 const auto NEW_VALUE_TYPE = KvStoreNbConflictData::ValueType::NEW_VALUE;
36
37 const int OBSERVER_SLEEP_TIME = 30;
38
39 // define some variables to init a KvStoreDelegateManager object.
40 KvStoreDelegateManager g_mgr(APP_ID, USER_ID);
41 string g_testDir;
42 KvStoreConfig g_config;
43
44 // define the g_kvNbDelegateCallback, used to get some information when open a kv store.
45 DBStatus g_kvDelegateStatus = INVALID_ARGS;
46 KvStoreNbDelegate *g_kvNbDelegatePtr = nullptr;
47
48 struct SingleVerConflictData {
49 KvStoreNbConflictType type = CONFLICT_NATIVE_ALL;
50 Key key;
51 Value oldValue;
52 Value newValue;
53 bool oldIsDeleted = false;
54 bool newIsDeleted = false;
55 bool oldIsNative = false;
56 bool newIsNative = false;
57 int getoldValueErrCode = 0;
58 int getNewValueErrCode = 0;
operator ==__anona6a1c8f80111::SingleVerConflictData59 bool operator==(const SingleVerConflictData &comparedData) const
60 {
61 if (this->type == comparedData.type &&
62 this->key == comparedData.key &&
63 this->oldValue == comparedData.oldValue &&
64 this->newValue == comparedData.newValue &&
65 this->oldIsDeleted == comparedData.oldIsDeleted &&
66 this->newIsDeleted == comparedData.newIsDeleted &&
67 this->oldIsNative == comparedData.oldIsNative &&
68 this->newIsNative == comparedData.newIsNative &&
69 this->getoldValueErrCode == comparedData.getoldValueErrCode &&
70 this->getNewValueErrCode == comparedData.getNewValueErrCode) {
71 return true;
72 }
73 LOGD("type = %d, ctype = %d", this->type, comparedData.type);
74 DBCommon::PrintHexVector(this->key, __LINE__, "key");
75 DBCommon::PrintHexVector(comparedData.key, __LINE__, "ckey");
76 DBCommon::PrintHexVector(this->oldValue, __LINE__, "oldValue");
77 DBCommon::PrintHexVector(comparedData.oldValue, __LINE__, "coldValue");
78 DBCommon::PrintHexVector(this->newValue, __LINE__, "newValue");
79 DBCommon::PrintHexVector(comparedData.newValue, __LINE__, "cnewValue");
80
81 LOGD("oldIsDeleted = %d, coldIsDeleted = %d", this->oldIsDeleted, comparedData.oldIsDeleted);
82 LOGD("newIsDeleted = %d, cnewIsDeleted = %d", this->newIsDeleted, comparedData.newIsDeleted);
83 LOGD("oldIsNative = %d, coldIsNative = %d", this->oldIsNative, comparedData.oldIsNative);
84 LOGD("newIsNative = %d, cnewIsNative = %d", this->newIsNative, comparedData.newIsNative);
85 LOGD("getoldValueErrCode = %d, cgetoldValueErrCode = %d", this->getoldValueErrCode,
86 comparedData.getoldValueErrCode);
87 LOGD("getNewValueErrCode = %d, cgetNewValueErrCode = %d", this->getNewValueErrCode,
88 comparedData.getNewValueErrCode);
89
90 return false;
91 }
92 };
93 std::vector<SingleVerConflictData> g_conflictData;
94
KvStoreNbDelegateCallback(DBStatus statusSrc,KvStoreNbDelegate * kvStoreSrc,DBStatus * statusDst,KvStoreNbDelegate ** kvStoreDst)95 void KvStoreNbDelegateCallback(DBStatus statusSrc, KvStoreNbDelegate *kvStoreSrc,
96 DBStatus *statusDst, KvStoreNbDelegate **kvStoreDst)
97 {
98 *statusDst = statusSrc;
99 *kvStoreDst = kvStoreSrc;
100 }
101
102 // the type of g_kvNbDelegateCallback is function<void(DBStatus, KvStoreDelegate*)>
103 auto g_kvNbDelegateCallback = bind(&KvStoreNbDelegateCallback, placeholders::_1,
104 placeholders::_2, &g_kvDelegateStatus, &g_kvNbDelegatePtr);
105
NotifierCallback(const KvStoreNbConflictData & data)106 void NotifierCallback(const KvStoreNbConflictData &data)
107 {
108 Key key;
109 Value oldValue;
110 Value newValue;
111 data.GetKey(key);
112 data.GetValue(OLD_VALUE_TYPE, oldValue);
113 LOGD("Get new value status:%d", data.GetValue(NEW_VALUE_TYPE, newValue));
114 LOGD("Type:%d", data.GetType());
115 DBCommon::PrintHexVector(oldValue, __LINE__);
116 DBCommon::PrintHexVector(newValue, __LINE__);
117 LOGD("Type:IsDeleted %d vs %d, IsNative %d vs %d", data.IsDeleted(OLD_VALUE_TYPE),
118 data.IsDeleted(NEW_VALUE_TYPE), data.IsNative(OLD_VALUE_TYPE), data.IsNative(NEW_VALUE_TYPE));
119 g_conflictData.push_back({data.GetType(), key, oldValue, newValue, data.IsDeleted(OLD_VALUE_TYPE),
120 data.IsDeleted(NEW_VALUE_TYPE), data.IsNative(OLD_VALUE_TYPE), data.IsNative(NEW_VALUE_TYPE),
121 data.GetValue(OLD_VALUE_TYPE, oldValue), data.GetValue(NEW_VALUE_TYPE, newValue)});
122 }
123 }
124
125 class DistributedDBInterfacesNBTransactionTest : public testing::Test {
126 public:
127 static void SetUpTestCase(void);
128 static void TearDownTestCase(void);
129 void SetUp();
130 void TearDown();
131 };
132
SetUpTestCase(void)133 void DistributedDBInterfacesNBTransactionTest::SetUpTestCase(void)
134 {
135 DistributedDBToolsUnitTest::TestDirInit(g_testDir);
136 g_config.dataDir = g_testDir;
137 g_mgr.SetKvStoreConfig(g_config);
138 g_mgr.SetProcessLabel("DistributedDBInterfacesNBTransactionTest", "test");
139 }
140
TearDownTestCase(void)141 void DistributedDBInterfacesNBTransactionTest::TearDownTestCase(void)
142 {
143 if (DistributedDBToolsUnitTest::RemoveTestDbFiles(g_testDir) != 0) {
144 LOGE("rm test db files error!");
145 }
146 }
147
SetUp(void)148 void DistributedDBInterfacesNBTransactionTest::SetUp(void)
149 {
150 DistributedDBToolsUnitTest::PrintTestCaseInfo();
151 g_kvDelegateStatus = INVALID_ARGS;
152 g_kvNbDelegatePtr = nullptr;
153 }
154
TearDown(void)155 void DistributedDBInterfacesNBTransactionTest::TearDown(void) {}
156
157 /**
158 * @tc.name: start001
159 * @tc.desc: Test the nb transaction start twice.
160 * @tc.type: FUNC
161 * @tc.require: AR000DPTQ9
162 * @tc.author: wumin
163 */
164 HWTEST_F(DistributedDBInterfacesNBTransactionTest, start001, TestSize.Level1)
165 {
166 const KvStoreNbDelegate::Option option = {true, false};
167 g_mgr.GetKvStore("distributed_nb_transaction_start001", option, g_kvNbDelegateCallback);
168 ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
169 EXPECT_TRUE(g_kvDelegateStatus == OK);
170
171 /**
172 * @tc.steps:step1. Start transaction.
173 * @tc.expected: step1. return OK.
174 */
175 EXPECT_EQ(g_kvNbDelegatePtr->StartTransaction(), OK);
176
177 /**
178 * @tc.steps:step2. Start transaction again.
179 * @tc.expected: step2. return DB_ERROR.
180 */
181 EXPECT_EQ(g_kvNbDelegatePtr->StartTransaction(), DB_ERROR);
182
183 // finilize
184 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
185 EXPECT_EQ(g_mgr.DeleteKvStore("distributed_nb_transaction_start001"), OK);
186 g_kvNbDelegatePtr = nullptr;
187 }
188
189 /**
190 * @tc.name: start002
191 * @tc.desc: Test the nb transaction begin and end not match.
192 * @tc.type: FUNC
193 * @tc.require: AR000DPTQ9
194 * @tc.author: wumin
195 */
196 HWTEST_F(DistributedDBInterfacesNBTransactionTest, start002, TestSize.Level1)
197 {
198 const KvStoreNbDelegate::Option option = {true, false};
199 g_mgr.GetKvStore("distributed_nb_transaction_start002", option, g_kvNbDelegateCallback);
200 ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
201 EXPECT_TRUE(g_kvDelegateStatus == OK);
202 /**
203 * @tc.steps:step1. Start transaction.
204 * @tc.expected: step1. return OK.
205 */
206 EXPECT_EQ(g_kvNbDelegatePtr->StartTransaction(), OK);
207 /**
208 * @tc.steps:step2. Rollback transaction.
209 * @tc.expected: step2. return OK.
210 */
211 EXPECT_EQ(g_kvNbDelegatePtr->Rollback(), OK);
212 /**
213 * @tc.steps:step3. Commit transaction.
214 * @tc.expected: step3. return DB_ERROR.
215 */
216 EXPECT_EQ(g_kvNbDelegatePtr->Commit(), DB_ERROR);
217 /**
218 * @tc.steps:step4. Start transaction.
219 * @tc.expected: step4. return OK.
220 */
221 EXPECT_EQ(g_kvNbDelegatePtr->StartTransaction(), OK);
222 /**
223 * @tc.steps:step5. Commit transaction.
224 * @tc.expected: step5. return DB_ERROR.
225 */
226 EXPECT_EQ(g_kvNbDelegatePtr->Commit(), OK);
227 /**
228 * @tc.steps:step6. Rollback transaction.
229 * @tc.expected: step6. return OK.
230 */
231 EXPECT_EQ(g_kvNbDelegatePtr->Rollback(), DB_ERROR);
232
233 // finilize
234 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
235 EXPECT_EQ(g_mgr.DeleteKvStore("distributed_nb_transaction_start002"), OK);
236 g_kvNbDelegatePtr = nullptr;
237 }
238
239 /**
240 * @tc.name: start003
241 * @tc.desc: Test the nb transaction rollback automatically when db close.
242 * @tc.type: FUNC
243 * @tc.require: AR000DPTQ9
244 * @tc.author: wumin
245 */
246 HWTEST_F(DistributedDBInterfacesNBTransactionTest, start003, TestSize.Level1)
247 {
248 const KvStoreNbDelegate::Option option = {true, false};
249 g_mgr.GetKvStore("distributed_nb_transaction_start003", option, g_kvNbDelegateCallback);
250 ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
251 EXPECT_TRUE(g_kvDelegateStatus == OK);
252 EXPECT_EQ(g_kvNbDelegatePtr->Put(KEY_1, VALUE_1), OK);
253 /**
254 * @tc.steps:step1. Start transaction.
255 * @tc.expected: step1. return OK.
256 */
257 EXPECT_EQ(g_kvNbDelegatePtr->StartTransaction(), OK);
258
259 /**
260 * @tc.steps:step2. Put (key1,value2)
261 * @tc.expected: step2. return OK.
262 */
263 EXPECT_EQ(g_kvNbDelegatePtr->Put(KEY_1, VALUE_2), OK);
264 /**
265 * @tc.steps:step3. Close db
266 * @tc.expected: step3. return OK.
267 */
268 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
269 g_kvNbDelegatePtr = nullptr;
270 /**
271 * @tc.steps:step4. Open db again
272 * @tc.expected: step4. return OK.
273 */
274 g_mgr.GetKvStore("distributed_nb_transaction_start003", option, g_kvNbDelegateCallback);
275 EXPECT_TRUE(g_kvDelegateStatus == OK);
276 ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
277 /**
278 * @tc.steps:step5. Get key1
279 * @tc.expected: step5. return OK, value of key1 is value1.
280 */
281 Value value;
282 EXPECT_EQ(g_kvNbDelegatePtr->Get(KEY_1, value), OK);
283 EXPECT_EQ(value, VALUE_1);
284
285 // finilize
286 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
287 EXPECT_EQ(g_mgr.DeleteKvStore("distributed_nb_transaction_start003"), OK);
288 g_kvNbDelegatePtr = nullptr;
289 }
290
291 /**
292 * @tc.name: start004
293 * @tc.desc: Test the nb operations return BUSY after transaction started.
294 * @tc.type: FUNC
295 * @tc.require: AR000DPTQ9
296 * @tc.author: wumin
297 */
298 HWTEST_F(DistributedDBInterfacesNBTransactionTest, start004, TestSize.Level4)
299 {
300 const KvStoreNbDelegate::Option option = {true, false};
301 g_mgr.GetKvStore("distributed_nb_transaction_start004", option, g_kvNbDelegateCallback);
302 ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
303 EXPECT_TRUE(g_kvDelegateStatus == OK);
304 EXPECT_EQ(g_kvNbDelegatePtr->Put(KEY_1, VALUE_1), OK);
305 /**
306 * @tc.steps:step1. Start transaction.
307 * @tc.expected: step1. return OK.
308 */
309 EXPECT_EQ(g_kvNbDelegatePtr->StartTransaction(), OK);
310 /**
311 * @tc.steps:step2. Local data and sync data can be simultaneously operated in transactions.
312 * @tc.expected: step2. From September 2020 return OK.
313 */
314 EXPECT_EQ(g_kvNbDelegatePtr->PutLocal(KEY_3, VALUE_3), OK);
315 EXPECT_EQ(g_kvNbDelegatePtr->DeleteLocal(KEY_1), OK);
316
317 CipherPassword password;
318 EXPECT_EQ(g_kvNbDelegatePtr->Rekey(password), BUSY);
319
320 KvStoreObserverUnitTest *observer = new (std::nothrow) KvStoreObserverUnitTest;
321 ASSERT_TRUE(observer != nullptr);
322 EXPECT_EQ(g_kvNbDelegatePtr->RegisterObserver(KEY_3, OBSERVER_CHANGES_NATIVE, observer), BUSY);
323 EXPECT_EQ(g_kvNbDelegatePtr->UnRegisterObserver(observer), NOT_FOUND);
324 delete observer;
325 observer = nullptr;
326
327 std::string filePath = g_testDir + "/test.txt";
328 OS::RemoveFile(filePath);
329 EXPECT_EQ(g_kvNbDelegatePtr->Export(filePath, password), BUSY);
330
331 OS::CreateFileByFileName(filePath);
332 EXPECT_EQ(g_kvNbDelegatePtr->Import(filePath, password), BUSY);
333
334 KvStoreResultSet *readResultSet = nullptr;
335 EXPECT_EQ(g_kvNbDelegatePtr->GetEntries(KEY_4, readResultSet), BUSY);
336 EXPECT_EQ(g_kvNbDelegatePtr->CloseResultSet(readResultSet), INVALID_ARGS);
337 /**
338 * @tc.steps:step1. Commit transaction.
339 * @tc.expected: step1. return OK.
340 */
341 EXPECT_EQ(g_kvNbDelegatePtr->Commit(), OK);
342
343 // finilize
344 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
345 EXPECT_EQ(g_mgr.DeleteKvStore("distributed_nb_transaction_start004"), OK);
346 g_kvNbDelegatePtr = nullptr;
347 }
348
349 /**
350 * @tc.name: commit001
351 * @tc.desc: Test the nb transaction commit without start.
352 * @tc.type: FUNC
353 * @tc.require: AR000DPTQ9
354 * @tc.author: wumin
355 */
356 HWTEST_F(DistributedDBInterfacesNBTransactionTest, commit001, TestSize.Level1)
357 {
358 const KvStoreNbDelegate::Option option = {true, false};
359 g_mgr.GetKvStore("distributed_nb_transaction_commit001", option, g_kvNbDelegateCallback);
360 ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
361 EXPECT_TRUE(g_kvDelegateStatus == OK);
362 /**
363 * @tc.steps:step1. Commit transaction.
364 * @tc.expected: step1. return DB_ERROR.
365 */
366 EXPECT_EQ(g_kvNbDelegatePtr->Commit(), DB_ERROR);
367
368 // finilize
369 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
370 EXPECT_EQ(g_mgr.DeleteKvStore("distributed_nb_transaction_commit001"), OK);
371 g_kvNbDelegatePtr = nullptr;
372 }
373
374 /**
375 * @tc.name: commit002
376 * @tc.desc: Test the nb transaction commit twice.
377 * @tc.type: FUNC
378 * @tc.require: AR000DPTQ9
379 * @tc.author: wumin
380 */
381 HWTEST_F(DistributedDBInterfacesNBTransactionTest, commit002, TestSize.Level1)
382 {
383 const KvStoreNbDelegate::Option option = {true, false};
384 g_mgr.GetKvStore("distributed_nb_transaction_commit002", option, g_kvNbDelegateCallback);
385 ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
386 EXPECT_TRUE(g_kvDelegateStatus == OK);
387 EXPECT_EQ(g_kvNbDelegatePtr->Put(KEY_1, VALUE_1), OK);
388 /**
389 * @tc.steps:step1. Start transaction.
390 * @tc.expected: step1. return OK.
391 */
392 EXPECT_EQ(g_kvNbDelegatePtr->StartTransaction(), OK);
393 /**
394 * @tc.steps:step2. Get key1
395 * @tc.expected: step2. return OK, value of key1 is value1.
396 */
397 Value value1;
398 EXPECT_EQ(g_kvNbDelegatePtr->Get(KEY_1, value1), OK);
399 EXPECT_EQ(value1, VALUE_1);
400 /**
401 * @tc.steps:step3. Put (key2,value2)
402 * @tc.expected: step3. return OK.
403 */
404 EXPECT_EQ(g_kvNbDelegatePtr->Put(KEY_2, VALUE_2), OK);
405 /**
406 * @tc.steps:step4. Get key2
407 * @tc.expected: step4. return OK, value of key2 is value2.
408 */
409 Value value2;
410 EXPECT_EQ(g_kvNbDelegatePtr->Get(KEY_2, value2), OK);
411 EXPECT_EQ(value2, VALUE_2);
412 /**
413 * @tc.steps:step5. Commit transaction.
414 * @tc.expected: step5. return OK.
415 */
416 EXPECT_EQ(g_kvNbDelegatePtr->Commit(), OK);
417 /**
418 * @tc.steps:step6. Commit transaction again.
419 * @tc.expected: step6. return DB_ERROR.
420 */
421 EXPECT_EQ(g_kvNbDelegatePtr->Commit(), DB_ERROR);
422
423 // finilize
424 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
425 EXPECT_EQ(g_mgr.DeleteKvStore("distributed_nb_transaction_commit002"), OK);
426 g_kvNbDelegatePtr = nullptr;
427 }
428
429 /**
430 * @tc.name: commit003
431 * @tc.desc: Test the entry size exceed the maximum limit in one transaction
432 * @tc.type: FUNC
433 * @tc.require: AR000DPTQ9
434 * @tc.author: wumin
435 */
436 HWTEST_F(DistributedDBInterfacesNBTransactionTest, commit003, TestSize.Level1)
437 {
438 const KvStoreNbDelegate::Option option = {true, false};
439 g_mgr.GetKvStore("distributed_nb_transaction_commit003", option, g_kvNbDelegateCallback);
440 ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
441 EXPECT_TRUE(g_kvDelegateStatus == OK);
442 /**
443 * @tc.steps:step1. Start transaction.
444 * @tc.expected: step1. return OK.
445 */
446 EXPECT_EQ(g_kvNbDelegatePtr->StartTransaction(), OK);
447 /**
448 * @tc.steps:step2. Put (key1,value1)
449 * @tc.expected: step2. return OK.
450 */
451 EXPECT_EQ(g_kvNbDelegatePtr->Put(KEY_1, VALUE_1), OK);
452 /**
453 * @tc.steps:step3. Delete key1
454 * @tc.expected: step3. return OK.
455 */
456 EXPECT_EQ(g_kvNbDelegatePtr->Delete(KEY_1), OK);
457 /**
458 * @tc.steps:step4. PutBatch 64 records (from key2 to key65)
459 * @tc.expected: step4. return OK.
460 */
461 vector<Entry> entrysBase;
462 vector<Key> keysBase;
463 DistributedDBUnitTest::GenerateRecords(BATCH_BASE_SIZE + 5, entrysBase, keysBase);
464
465 vector<Entry> entrys1(entrysBase.begin() + 1, entrysBase.end());
466 EXPECT_EQ(entrys1.size(), 64UL);
467 EXPECT_EQ(g_kvNbDelegatePtr->PutBatch(entrys1), OK);
468 /**
469 * @tc.steps:step5. DeleteBatch 63 records (from key2 to key64)
470 * @tc.expected: step5. return OK.
471 */
472 vector<Key> keys1(keysBase.begin() + 1, keysBase.end() - 1);
473 EXPECT_EQ(keys1.size(), 63UL);
474 EXPECT_EQ(g_kvNbDelegatePtr->DeleteBatch(keys1), OVER_MAX_LIMITS);
475 /**
476 * @tc.steps:step6. DeleteBatch 60 records (from key1 to key60)
477 * @tc.expected: step6. return OK.
478 */
479 vector<Key> keys2(keysBase.begin(), keysBase.begin() + 60);
480 EXPECT_EQ(keys2.size(), 60UL);
481 EXPECT_EQ(g_kvNbDelegatePtr->DeleteBatch(keys2), OK);
482 /**
483 * @tc.steps:step6. Commit.
484 * @tc.expected: step6. return OK.
485 */
486 EXPECT_EQ(g_kvNbDelegatePtr->Commit(), OK);
487 /**
488 * @tc.steps:step7. GetEntries.
489 * @tc.expected: step7. return OK.
490 */
491 vector<Entry> entriesExpect(entrysBase.begin() + 60, entrysBase.end());
492 EXPECT_EQ(entriesExpect.size(), 5UL);
493 const Key prefix;
494 vector<Entry> entriesRet;
495 EXPECT_EQ(g_kvNbDelegatePtr->GetEntries(prefix, entriesRet), OK);
496 EXPECT_TRUE(DistributedDBToolsUnitTest::IsEntriesEqual(entriesExpect, entriesRet));
497
498 // finilize
499 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
500 EXPECT_EQ(g_mgr.DeleteKvStore("distributed_nb_transaction_commit003"), OK);
501 g_kvNbDelegatePtr = nullptr;
502 }
503
504 /**
505 * @tc.name: commit004
506 * @tc.desc: Test the nb normal operations in one transaction
507 * @tc.type: FUNC
508 * @tc.require: AR000DPTQ9
509 * @tc.author: wumin
510 */
511 HWTEST_F(DistributedDBInterfacesNBTransactionTest, commit004, TestSize.Level1)
512 {
513 const KvStoreNbDelegate::Option option = {true, false};
514 g_mgr.GetKvStore("distributed_nb_transaction_commit004", option, g_kvNbDelegateCallback);
515 ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
516 EXPECT_TRUE(g_kvDelegateStatus == OK);
517 KvStoreObserverUnitTest *observer = new (std::nothrow) KvStoreObserverUnitTest;
518 ASSERT_TRUE(observer != nullptr);
519 EXPECT_EQ(g_kvNbDelegatePtr->RegisterObserver(NULL_KEY, OBSERVER_CHANGES_NATIVE, observer), OK);
520 /**
521 * @tc.steps:step1. Start transaction.
522 * @tc.expected: step1. return OK.
523 */
524 EXPECT_EQ(g_kvNbDelegatePtr->StartTransaction(), OK);
525 /**
526 * @tc.steps:step2. Put (key1,value1) and (key2,value2)
527 * @tc.expected: step2. put OK.
528 */
529 EXPECT_EQ(g_kvNbDelegatePtr->Put(KEY_1, VALUE_1), OK);
530 EXPECT_EQ(g_kvNbDelegatePtr->Put(KEY_2, VALUE_2), OK);
531 /**
532 * @tc.steps:step3. Delete key2
533 * @tc.expected: step3. return OK.
534 */
535 EXPECT_EQ(g_kvNbDelegatePtr->Delete(KEY_2), OK);
536 /**
537 * @tc.steps:step4. PutBatch 65 records (from key3 to key67)
538 * @tc.expected: step4. return OK.
539 */
540 vector<Entry> entrysBase;
541 vector<Key> keysBase;
542 DistributedDBUnitTest::GenerateRecords(BATCH_BASE_SIZE + 7, entrysBase, keysBase);
543
544 vector<Entry> entrys1(entrysBase.begin() + 2, entrysBase.end());
545 EXPECT_EQ(entrys1.size(), 65UL);
546 EXPECT_EQ(g_kvNbDelegatePtr->PutBatch(entrys1), OK);
547 /**
548 * @tc.steps:step5. DeleteBatch 60 records (from key8 to key67)
549 * @tc.expected: step5. return OK.
550 */
551 vector<Key> keys(keysBase.begin() + 7, keysBase.end());
552 EXPECT_EQ(keys.size(), 60UL);
553 EXPECT_EQ(g_kvNbDelegatePtr->DeleteBatch(keys), OK);
554 /**
555 * @tc.steps:step6. Commit.
556 * @tc.expected: step6. return OK.
557 */
558 EXPECT_EQ(g_kvNbDelegatePtr->Commit(), OK);
559 /**
560 * @tc.steps:step7. Check observer data.
561 * @tc.expected: step6. return OK.
562 */
563 vector<Entry> entriesRet;
564 Entry entry1 = {KEY_1, VALUE_1};
565 entriesRet.push_back(entry1);
566 entriesRet.insert(entriesRet.end(), entrysBase.begin() + 2, entrysBase.begin() + 7);
567 EXPECT_EQ(entriesRet.size(), 6UL);
568
569 std::this_thread::sleep_for(std::chrono::milliseconds(OBSERVER_SLEEP_TIME));
570 EXPECT_TRUE(DistributedDBToolsUnitTest::CheckObserverResult(entriesRet, observer->GetEntriesInserted()));
571 /**
572 * @tc.steps:step8. GetEntries.
573 * @tc.expected: step8. return OK.
574 */
575 const Key prefix;
576 vector<Entry> entries;
577 EXPECT_EQ(g_kvNbDelegatePtr->GetEntries(prefix, entries), OK);
578 EXPECT_TRUE(DistributedDBToolsUnitTest::IsEntriesEqual(entriesRet, entries, true));
579
580 // finilize
581 EXPECT_EQ(g_kvNbDelegatePtr->UnRegisterObserver(observer), OK);
582 delete observer;
583 observer = nullptr;
584
585 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
586 EXPECT_EQ(g_mgr.DeleteKvStore("distributed_nb_transaction_commit004"), OK);
587 g_kvNbDelegatePtr = nullptr;
588 }
589
590 /**
591 * @tc.name: commit005
592 * @tc.desc: Test the conflict data report normally in one transaction
593 * @tc.type: FUNC
594 * @tc.require: AR000DPTQ9
595 * @tc.author: wumin
596 */
597 HWTEST_F(DistributedDBInterfacesNBTransactionTest, commit005, TestSize.Level1)
598 {
599 const KvStoreNbDelegate::Option option = {true, false};
600 g_mgr.GetKvStore("distributed_nb_transaction_commit005", option, g_kvNbDelegateCallback);
601 ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
602 EXPECT_TRUE(g_kvDelegateStatus == OK);
603 EXPECT_TRUE(g_kvNbDelegatePtr->SetConflictNotifier(CONFLICT_ALL, NotifierCallback) == OK);
604
605 EXPECT_EQ(g_kvNbDelegatePtr->Put(KEY_1, VALUE_1), OK);
606 EXPECT_EQ(g_kvNbDelegatePtr->Put(KEY_2, VALUE_2), OK);
607 /**
608 * @tc.steps:step1. Start transaction.
609 * @tc.expected: step1. return OK.
610 */
611 EXPECT_EQ(g_kvNbDelegatePtr->StartTransaction(), OK);
612 /**
613 * @tc.steps:step2. Put (key1,value3) and (key2,value4)
614 * @tc.expected: step2. put OK.
615 */
616 EXPECT_EQ(g_kvNbDelegatePtr->Put(KEY_1, VALUE_3), OK);
617 EXPECT_EQ(g_kvNbDelegatePtr->Put(KEY_2, VALUE_4), OK);
618 /**
619 * @tc.steps:step3. Delete key2
620 * @tc.expected: step3. return OK.
621 */
622 EXPECT_EQ(g_kvNbDelegatePtr->Delete(KEY_2), OK);
623 /**
624 * @tc.steps:step4. put (key3 ,value5) (key3 ,value6)
625 * @tc.expected: step4. return OK.
626 */
627 EXPECT_EQ(g_kvNbDelegatePtr->Put(KEY_3, VALUE_5), OK);
628 EXPECT_EQ(g_kvNbDelegatePtr->Put(KEY_3, VALUE_6), OK);
629 /**
630 * @tc.steps:step5. Commit.
631 * @tc.expected: step5. return OK.
632 */
633 EXPECT_EQ(g_kvNbDelegatePtr->Commit(), OK);
634 /**
635 * @tc.steps:step6. Check conflict report data.
636 * @tc.expected: step6. return OK.
637 */
638 std::this_thread::sleep_for(std::chrono::milliseconds(OBSERVER_SLEEP_TIME));
639 EXPECT_EQ(g_conflictData.size(), 2UL);
640 if (g_conflictData.size() == 2) {
641 SingleVerConflictData expectNotifyData1 = {KvStoreNbConflictType::CONFLICT_NATIVE_ALL,
642 KEY_1, VALUE_1, VALUE_3, false, false, true, true, OK, OK};
643 EXPECT_EQ(g_conflictData[0], expectNotifyData1);
644
645 SingleVerConflictData expectNotifyData2 = {KvStoreNbConflictType::CONFLICT_NATIVE_ALL,
646 KEY_2, VALUE_2, NULL_VALUE, false, true, true, true, OK, DB_ERROR};
647 EXPECT_EQ(g_conflictData[1], expectNotifyData2);
648 }
649
650 // finilize
651 g_conflictData.clear();
652 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
653 EXPECT_EQ(g_mgr.DeleteKvStore("distributed_nb_transaction_commit005"), OK);
654 g_kvNbDelegatePtr = nullptr;
655 }
656
657 /**
658 * @tc.name: commit006
659 * @tc.desc: Test the conflict data report and observer function both be normal in one transaction
660 * @tc.type: FUNC
661 * @tc.require: AR000DPTQ9
662 * @tc.author: wumin
663 */
664 HWTEST_F(DistributedDBInterfacesNBTransactionTest, commit006, TestSize.Level1)
665 {
666 const KvStoreNbDelegate::Option option = {true, false};
667 g_mgr.GetKvStore("distributed_nb_transaction_commit006", option, g_kvNbDelegateCallback);
668 ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
669 EXPECT_TRUE(g_kvDelegateStatus == OK);
670
671 EXPECT_EQ(g_kvNbDelegatePtr->Put(KEY_1, VALUE_1), OK);
672 EXPECT_EQ(g_kvNbDelegatePtr->Delete(KEY_1), OK);
673
674 EXPECT_TRUE(g_kvNbDelegatePtr->SetConflictNotifier(CONFLICT_ALL, NotifierCallback) == OK);
675
676 KvStoreObserverUnitTest *observer = new (std::nothrow) KvStoreObserverUnitTest;
677 ASSERT_TRUE(observer != nullptr);
678 EXPECT_EQ(g_kvNbDelegatePtr->RegisterObserver(NULL_KEY, OBSERVER_CHANGES_NATIVE, observer), OK);
679 /**
680 * @tc.steps:step1. Start transaction.
681 * @tc.expected: step1. return OK.
682 */
683 EXPECT_EQ(g_kvNbDelegatePtr->StartTransaction(), OK);
684 /**
685 * @tc.steps:step2. Put (key1,value2)
686 * @tc.expected: step2. put OK.
687 */
688 EXPECT_EQ(g_kvNbDelegatePtr->Put(KEY_1, VALUE_2), OK);
689 /**
690 * @tc.steps:step3. Commit.
691 * @tc.expected: step3. return OK.
692 */
693 EXPECT_EQ(g_kvNbDelegatePtr->Commit(), OK);
694 std::this_thread::sleep_for(std::chrono::milliseconds(OBSERVER_SLEEP_TIME));
695 /**
696 * @tc.steps:step4. Get value of key1.
697 * @tc.expected: step4. return OK, value of key1 is value2.
698 */
699 Value readValue;
700 EXPECT_EQ(g_kvNbDelegatePtr->Get(KEY_1, readValue), OK);
701 EXPECT_TRUE(readValue == VALUE_2);
702 /**
703 * @tc.steps:step5. Check observer data.
704 * @tc.expected: step5. return OK.
705 */
706 vector<Entry> entriesRet = {{KEY_1, VALUE_2}};
707 EXPECT_TRUE(DistributedDBToolsUnitTest::CheckObserverResult(entriesRet, observer->GetEntriesInserted()));
708 /**
709 * @tc.steps:step6. Check conflict report data.
710 * @tc.expected: step6. return OK.
711 */
712 std::this_thread::sleep_for(std::chrono::milliseconds(OBSERVER_SLEEP_TIME));
713 EXPECT_EQ(g_conflictData.size(), 1UL);
714 if (g_conflictData.size() == 1) {
715 SingleVerConflictData expectNotifyData = {KvStoreNbConflictType::CONFLICT_NATIVE_ALL,
716 KEY_1, {}, VALUE_2, true, false, true, true, DB_ERROR, OK};
717 EXPECT_EQ(g_conflictData[0], expectNotifyData);
718 }
719
720 // finilize
721 g_conflictData.clear();
722 EXPECT_EQ(g_kvNbDelegatePtr->UnRegisterObserver(observer), OK);
723 delete observer;
724 observer = nullptr;
725
726 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
727 EXPECT_EQ(g_mgr.DeleteKvStore("distributed_nb_transaction_commit006"), OK);
728 g_kvNbDelegatePtr = nullptr;
729 }
730
731 /**
732 * @tc.name: rollback001
733 * @tc.desc: Test the transaction rollback without start.
734 * @tc.type: FUNC
735 * @tc.require: AR000DPTQ9
736 * @tc.author: wumin
737 */
738 HWTEST_F(DistributedDBInterfacesNBTransactionTest, rollback001, TestSize.Level1)
739 {
740 const KvStoreNbDelegate::Option option = {true, false};
741 g_mgr.GetKvStore("distributed_nb_transaction_rollback001", option, g_kvNbDelegateCallback);
742 ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
743 EXPECT_TRUE(g_kvDelegateStatus == OK);
744 /**
745 * @tc.steps:step1. Transaction rollback without start.
746 * @tc.expected: step1. return DB_ERROR.
747 */
748 EXPECT_EQ(g_kvNbDelegatePtr->Rollback(), DB_ERROR);
749
750 // finilize
751 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
752 EXPECT_EQ(g_mgr.DeleteKvStore("distributed_nb_transaction_rollback001"), OK);
753 g_kvNbDelegatePtr = nullptr;
754 }
755
756 /**
757 * @tc.name: rollback002
758 * @tc.desc: Test the transaction rollback twice
759 * @tc.type: FUNC
760 * @tc.require: AR000DPTQ9
761 * @tc.author: wumin
762 */
763 HWTEST_F(DistributedDBInterfacesNBTransactionTest, rollback002, TestSize.Level1)
764 {
765 const KvStoreNbDelegate::Option option = {true, false};
766 g_mgr.GetKvStore("distributed_nb_transaction_rollback002", option, g_kvNbDelegateCallback);
767 ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
768 EXPECT_TRUE(g_kvDelegateStatus == OK);
769 /**
770 * @tc.steps:step1. Start transaction.
771 * @tc.expected: step1. return OK.
772 */
773 EXPECT_EQ(g_kvNbDelegatePtr->StartTransaction(), OK);
774 /**
775 * @tc.steps:step1. Rollback.
776 * @tc.expected: step1. return OK.
777 */
778 EXPECT_EQ(g_kvNbDelegatePtr->Rollback(), OK);
779 /**
780 * @tc.steps:step1. Transaction rollback without start.
781 * @tc.expected: step1. return DB_ERROR.
782 */
783 EXPECT_EQ(g_kvNbDelegatePtr->Rollback(), DB_ERROR);
784
785 // finilize
786 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
787 EXPECT_EQ(g_mgr.DeleteKvStore("distributed_nb_transaction_rollback002"), OK);
788 g_kvNbDelegatePtr = nullptr;
789 }
790
791 /**
792 * @tc.name: rollback003
793 * @tc.desc: Test the Put operation rollback
794 * @tc.type: FUNC
795 * @tc.require: AR000DPTQ9
796 * @tc.author: wumin
797 */
798 HWTEST_F(DistributedDBInterfacesNBTransactionTest, rollback003, TestSize.Level1)
799 {
800 const KvStoreNbDelegate::Option option = {true, false};
801 g_mgr.GetKvStore("distributed_nb_transaction_rollback003", option, g_kvNbDelegateCallback);
802 ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
803 EXPECT_TRUE(g_kvDelegateStatus == OK);
804 EXPECT_EQ(g_kvNbDelegatePtr->Put(KEY_1, VALUE_1), OK);
805 /**
806 * @tc.steps:step1. Start transaction.
807 * @tc.expected: step1. return OK.
808 */
809 EXPECT_EQ(g_kvNbDelegatePtr->StartTransaction(), OK);
810 /**
811 * @tc.steps:step2. Put (key2,value2)
812 * @tc.expected: step2. return OK.
813 */
814 EXPECT_EQ(g_kvNbDelegatePtr->Put(KEY_2, VALUE_2), OK);
815 /**
816 * @tc.steps:step3. Rollback.
817 * @tc.expected: step3. return OK.
818 */
819 EXPECT_EQ(g_kvNbDelegatePtr->Rollback(), OK);
820 /**
821 * @tc.steps:step4. GetEntries.
822 * @tc.expected: step4. return OK.
823 */
824 const Key prefix;
825 vector<Entry> entries;
826 EXPECT_EQ(g_kvNbDelegatePtr->GetEntries(prefix, entries), OK);
827 EXPECT_EQ(entries.size(), 1UL);
828 if (entries.size() > 0) {
829 EXPECT_EQ(entries[0].key, KEY_1);
830 EXPECT_EQ(entries[0].value, VALUE_1);
831 }
832
833 // finilize
834 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
835 EXPECT_EQ(g_mgr.DeleteKvStore("distributed_nb_transaction_rollback003"), OK);
836 g_kvNbDelegatePtr = nullptr;
837 }
838
839 /**
840 * @tc.name: rollback004
841 * @tc.desc: Test the PutBatch operation rollback
842 * @tc.type: FUNC
843 * @tc.require: AR000DPTQ9
844 * @tc.author: wumin
845 */
846 HWTEST_F(DistributedDBInterfacesNBTransactionTest, rollback004, TestSize.Level1)
847 {
848 const KvStoreNbDelegate::Option option = {true, false};
849 g_mgr.GetKvStore("distributed_nb_transaction_rollback004", option, g_kvNbDelegateCallback);
850 ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
851 EXPECT_TRUE(g_kvDelegateStatus == OK);
852 EXPECT_EQ(g_kvNbDelegatePtr->Put(KEY_1, VALUE_1), OK);
853 /**
854 * @tc.steps:step1. Start transaction.
855 * @tc.expected: step1. return OK.
856 */
857 EXPECT_EQ(g_kvNbDelegatePtr->StartTransaction(), OK);
858 /**
859 * @tc.steps:step2. PutBatch 10 records
860 * @tc.expected: step2. return OK.
861 */
862 vector<Entry> entrysBase;
863 vector<Key> keysBase;
864 DistributedDBUnitTest::GenerateRecords(10, entrysBase, keysBase);
865
866 EXPECT_EQ(g_kvNbDelegatePtr->PutBatch(entrysBase), OK);
867 /**
868 * @tc.steps:step3. Rollback.
869 * @tc.expected: step3. return OK.
870 */
871 EXPECT_EQ(g_kvNbDelegatePtr->Rollback(), OK);
872 /**
873 * @tc.steps:step4. GetEntries.
874 * @tc.expected: step4. return OK.
875 */
876 const Key prefix;
877 vector<Entry> entries;
878 EXPECT_EQ(g_kvNbDelegatePtr->GetEntries(prefix, entries), OK);
879 EXPECT_EQ(entries.size(), 1UL);
880 if (entries.size() > 0) {
881 EXPECT_EQ(entries[0].key, KEY_1);
882 EXPECT_EQ(entries[0].value, VALUE_1);
883 }
884
885 // finilize
886 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
887 EXPECT_EQ(g_mgr.DeleteKvStore("distributed_nb_transaction_rollback004"), OK);
888 g_kvNbDelegatePtr = nullptr;
889 }
890
891 /**
892 * @tc.name: rollback005
893 * @tc.desc: Test the modify operation rollback
894 * @tc.type: FUNC
895 * @tc.require: AR000DPTQ9
896 * @tc.author: wumin
897 */
898 HWTEST_F(DistributedDBInterfacesNBTransactionTest, rollback005, TestSize.Level1)
899 {
900 const KvStoreNbDelegate::Option option = {true, false};
901 g_mgr.GetKvStore("distributed_nb_transaction_rollback005", option, g_kvNbDelegateCallback);
902 ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
903 EXPECT_TRUE(g_kvDelegateStatus == OK);
904 EXPECT_EQ(g_kvNbDelegatePtr->Put(KEY_1, VALUE_1), OK);
905 /**
906 * @tc.steps:step1. Start transaction.
907 * @tc.expected: step1. return OK.
908 */
909 EXPECT_EQ(g_kvNbDelegatePtr->StartTransaction(), OK);
910 /**
911 * @tc.steps:step2. Put (key1,value2)
912 * @tc.expected: step2. return OK.
913 */
914 EXPECT_EQ(g_kvNbDelegatePtr->Put(KEY_1, VALUE_2), OK);
915 /**
916 * @tc.steps:step3. Rollback.
917 * @tc.expected: step3. return OK.
918 */
919 EXPECT_EQ(g_kvNbDelegatePtr->Rollback(), OK);
920 /**
921 * @tc.steps:step4. GetEntries.
922 * @tc.expected: step4. return OK.
923 */
924 const Key prefix;
925 vector<Entry> entries;
926 EXPECT_EQ(g_kvNbDelegatePtr->GetEntries(prefix, entries), OK);
927 EXPECT_EQ(entries.size(), 1UL);
928 if (entries.size() > 0) {
929 EXPECT_EQ(entries[0].key, KEY_1);
930 EXPECT_EQ(entries[0].value, VALUE_1);
931 }
932
933 // finilize
934 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
935 EXPECT_EQ(g_mgr.DeleteKvStore("distributed_nb_transaction_rollback005"), OK);
936 g_kvNbDelegatePtr = nullptr;
937 }
938
939 /**
940 * @tc.name: rollback006
941 * @tc.desc: Test the Delete operation rollback
942 * @tc.type: FUNC
943 * @tc.require: AR000DPTQ9
944 * @tc.author: wumin
945 */
946 HWTEST_F(DistributedDBInterfacesNBTransactionTest, rollback006, TestSize.Level1)
947 {
948 const KvStoreNbDelegate::Option option = {true, false};
949 g_mgr.GetKvStore("distributed_nb_transaction_rollback006", option, g_kvNbDelegateCallback);
950 ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
951 EXPECT_TRUE(g_kvDelegateStatus == OK);
952 EXPECT_EQ(g_kvNbDelegatePtr->Put(KEY_1, VALUE_1), OK);
953 /**
954 * @tc.steps:step1. Start transaction.
955 * @tc.expected: step1. return OK.
956 */
957 EXPECT_EQ(g_kvNbDelegatePtr->StartTransaction(), OK);
958 /**
959 * @tc.steps:step2. Delete key1
960 * @tc.expected: step2. return OK.
961 */
962 EXPECT_EQ(g_kvNbDelegatePtr->Delete(KEY_1), OK);
963 /**
964 * @tc.steps:step3. Rollback.
965 * @tc.expected: step3. return OK.
966 */
967 EXPECT_EQ(g_kvNbDelegatePtr->Rollback(), OK);
968 /**
969 * @tc.steps:step4. GetEntries.
970 * @tc.expected: step4. return OK.
971 */
972 const Key prefix;
973 vector<Entry> entries;
974 EXPECT_EQ(g_kvNbDelegatePtr->GetEntries(prefix, entries), OK);
975 EXPECT_EQ(entries.size(), 1UL);
976 if (entries.size() > 0) {
977 EXPECT_EQ(entries[0].key, KEY_1);
978 EXPECT_EQ(entries[0].value, VALUE_1);
979 }
980
981 // finilize
982 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
983 EXPECT_EQ(g_mgr.DeleteKvStore("distributed_nb_transaction_rollback006"), OK);
984 g_kvNbDelegatePtr = nullptr;
985 }
986
987 /**
988 * @tc.name: rollback007
989 * @tc.desc: Test the DeleteBatch operation rollback
990 * @tc.type: FUNC
991 * @tc.require: AR000DPTQ9
992 * @tc.author: wumin
993 */
994 HWTEST_F(DistributedDBInterfacesNBTransactionTest, rollback007, TestSize.Level1)
995 {
996 const KvStoreNbDelegate::Option option = {true, false};
997 g_mgr.GetKvStore("distributed_nb_transaction_rollback007", option, g_kvNbDelegateCallback);
998 ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
999 EXPECT_TRUE(g_kvDelegateStatus == OK);
1000
1001 vector<Entry> entries;
1002 vector<Key> keys;
1003 DistributedDBUnitTest::GenerateRecords(10, entries, keys);
1004
1005 EXPECT_EQ(g_kvNbDelegatePtr->PutBatch(entries), OK);
1006 /**
1007 * @tc.steps:step1. Start transaction.
1008 * @tc.expected: step1. return OK.
1009 */
1010 EXPECT_EQ(g_kvNbDelegatePtr->StartTransaction(), OK);
1011 /**
1012 * @tc.steps:step2. DeleteBatch from key1 to key10
1013 * @tc.expected: step2. return OK.
1014 */
1015 EXPECT_EQ(g_kvNbDelegatePtr->DeleteBatch(keys), OK);
1016 /**
1017 * @tc.steps:step3. Rollback.
1018 * @tc.expected: step3. return OK.
1019 */
1020 EXPECT_EQ(g_kvNbDelegatePtr->Rollback(), OK);
1021 /**
1022 * @tc.steps:step4. GetEntries.
1023 * @tc.expected: step4. return OK.
1024 */
1025 const Key prefix;
1026 vector<Entry> entriesRet;
1027 EXPECT_EQ(g_kvNbDelegatePtr->GetEntries(prefix, entriesRet), OK);
1028 EXPECT_TRUE(DistributedDBToolsUnitTest::IsEntriesEqual(entries, entriesRet));
1029
1030 // finilize
1031 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
1032 EXPECT_EQ(g_mgr.DeleteKvStore("distributed_nb_transaction_rollback007"), OK);
1033 g_kvNbDelegatePtr = nullptr;
1034 }
1035
1036 /**
1037 * @tc.name: rollback008
1038 * @tc.desc: Test the multiple operations rollback
1039 * @tc.type: FUNC
1040 * @tc.require: AR000DPTQ9
1041 * @tc.author: wumin
1042 */
1043 HWTEST_F(DistributedDBInterfacesNBTransactionTest, rollback008, TestSize.Level1)
1044 {
1045 const KvStoreNbDelegate::Option option = {true, false};
1046 g_mgr.GetKvStore("distributed_nb_transaction_rollback008", option, g_kvNbDelegateCallback);
1047 ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
1048 EXPECT_TRUE(g_kvDelegateStatus == OK);
1049 EXPECT_EQ(g_kvNbDelegatePtr->Put(KEY_1, VALUE_1), OK);
1050 EXPECT_EQ(g_kvNbDelegatePtr->Put(KEY_2, VALUE_2), OK);
1051 /**
1052 * @tc.steps:step1. Start transaction.
1053 * @tc.expected: step1. return OK.
1054 */
1055 EXPECT_EQ(g_kvNbDelegatePtr->StartTransaction(), OK);
1056 /**
1057 * @tc.steps:step2. Put (key3,value3) (key1,value4)
1058 * @tc.expected: step2. return OK.
1059 */
1060 EXPECT_EQ(g_kvNbDelegatePtr->Put(KEY_3, VALUE_3), OK);
1061 EXPECT_EQ(g_kvNbDelegatePtr->Put(KEY_1, VALUE_4), OK);
1062 /**
1063 * @tc.steps:step3. Delete key2
1064 * @tc.expected: step3. return OK.
1065 */
1066 EXPECT_EQ(g_kvNbDelegatePtr->Delete(KEY_2), OK);
1067 /**
1068 * @tc.steps:step4. PutBatch 10 records (from key3 to key12)
1069 * @tc.expected: step4. return OK.
1070 */
1071 vector<Entry> entrysBase;
1072 vector<Key> keysBase;
1073 DistributedDBUnitTest::GenerateRecords(12, entrysBase, keysBase);
1074
1075 vector<Entry> entrys1(entrysBase.begin() + 2, entrysBase.end());
1076 EXPECT_EQ(entrys1.size(), 10UL);
1077 EXPECT_EQ(g_kvNbDelegatePtr->PutBatch(entrys1), OK);
1078 /**
1079 * @tc.steps:step5. DeleteBatch 5 records (from key3 to key7)
1080 * @tc.expected: step5. return OK.
1081 */
1082 vector<Key> keys(keysBase.begin() + 2, keysBase.begin() + 7);
1083 EXPECT_EQ(keys.size(), 5UL);
1084 EXPECT_EQ(g_kvNbDelegatePtr->DeleteBatch(keys), OK);
1085 /**
1086 * @tc.steps:step6. Commit.
1087 * @tc.expected: step6. return OK.
1088 */
1089 EXPECT_EQ(g_kvNbDelegatePtr->Rollback(), OK);
1090 /**
1091 * @tc.steps:step7. GetEntries.
1092 * @tc.expected: step7. return OK.
1093 */
1094 const Key prefix;
1095 vector<Entry> entries;
1096 EXPECT_EQ(g_kvNbDelegatePtr->GetEntries(prefix, entries), OK);
1097 EXPECT_EQ(entries.size(), 2UL);
1098 if (entries.size() > 1) {
1099 EXPECT_EQ(entries[0].key, KEY_1);
1100 EXPECT_EQ(entries[0].value, VALUE_1);
1101 EXPECT_EQ(entries[1].key, KEY_2);
1102 EXPECT_EQ(entries[1].value, VALUE_2);
1103 }
1104
1105 // finilize
1106 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
1107 EXPECT_EQ(g_mgr.DeleteKvStore("distributed_nb_transaction_rollback008"), OK);
1108 g_kvNbDelegatePtr = nullptr;
1109 }