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 #ifndef OMIT_ENCRYPT
16 #include <gtest/gtest.h>
17
18 #include "distributeddb_data_generate_unit_test.h"
19 #include "distributeddb_tools_unit_test.h"
20 #include "kv_store_nb_conflict_data.h"
21 #include "log_print.h"
22 #include "sqlite_single_ver_natural_store.h"
23 #include "sqlite_utils.h"
24
25 using namespace testing::ext;
26 using namespace DistributedDB;
27 using namespace DistributedDBUnitTest;
28 using namespace std;
29
30 namespace {
31 const string STORE_ID1 = "store1_singleVersionDB";
32 const string STORE_ID2 = "store2_localDB";
33 const string STORE_ID3 = "store3_multiVersionDB";
34 CipherPassword g_passwd1; // 5 '1'
35 CipherPassword g_passwd2; // 5 '2'
36 CipherPassword g_passwd3; // 5 '3'
37 const CipherPassword PASSWD_EMPTY;
38 const int CONFLICT_ALL = 15;
39 KvStoreDelegateManager g_mgr(APP_ID, USER_ID);
40 string g_testDir;
41 KvStoreConfig g_config;
42 DBStatus g_errCode = INVALID_ARGS;
43 KvStoreNbDelegate *g_kvNbDelegatePtr = nullptr;
44 auto g_kvNbDelegateCallback = bind(&DistributedDBToolsUnitTest::KvStoreNbDelegateCallback, placeholders::_1,
45 placeholders::_2, std::ref(g_errCode), std::ref(g_kvNbDelegatePtr));
46
47 #ifndef OMIT_MULTI_VER
48 KvStoreDelegate *g_kvDelegatePtr = nullptr;
49 DBStatus g_valueStatus = INVALID_ARGS;
50 Value g_value;
51
52 // define the delegate call back
53 auto g_kvDelegateCallback = bind(&DistributedDBToolsUnitTest::KvStoreDelegateCallback, placeholders::_1,
54 placeholders::_2, std::ref(g_errCode), std::ref(g_kvDelegatePtr));
55
56 DBStatus g_snapshotDelegateStatus = INVALID_ARGS;
57 KvStoreSnapshotDelegate *g_snapshotDelegatePtr = nullptr;
58
59 auto g_snapshotDelegateCallback = bind(&DistributedDBToolsUnitTest::SnapshotDelegateCallback,
60 placeholders::_1, placeholders::_2, std::ref(g_snapshotDelegateStatus), std::ref(g_snapshotDelegatePtr));
61
62 auto g_valueCallback = bind(&DistributedDBToolsUnitTest::ValueCallback,
63 placeholders::_1, placeholders::_2, std::ref(g_valueStatus), std::ref(g_value));
64
GetSnapshotAndValueCheck(const Key & testKey,const Value & testValue,DBStatus errCode)65 void GetSnapshotAndValueCheck(const Key &testKey, const Value &testValue, DBStatus errCode)
66 {
67 g_kvDelegatePtr->GetKvStoreSnapshot(nullptr, g_snapshotDelegateCallback);
68 EXPECT_TRUE(g_snapshotDelegateStatus == OK);
69 ASSERT_TRUE(g_snapshotDelegatePtr != nullptr);
70 // check value and errCode
71 g_snapshotDelegatePtr->Get(testKey, g_valueCallback);
72 EXPECT_EQ(g_valueStatus, errCode);
73
74 if (errCode == OK) {
75 EXPECT_TRUE(g_value.size() > 0);
76 if (g_value.size() > 0) {
77 EXPECT_EQ(g_value.front(), testValue[0]);
78 }
79 }
80 }
81 #endif // OMIT_MULTI_VER
GetNbKvStoreAndCheckFun(const std::string & storeId,const KvStoreNbDelegate::Option & option,const Key & testKey,const Value & testValue)82 void GetNbKvStoreAndCheckFun(const std::string &storeId, const KvStoreNbDelegate::Option &option,
83 const Key &testKey, const Value &testValue)
84 {
85 g_mgr.GetKvStore(storeId, option, g_kvNbDelegateCallback);
86 ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
87 EXPECT_EQ(g_errCode, OK);
88 EXPECT_EQ(g_kvNbDelegatePtr->Put(testKey, testValue), OK);
89 Value valueRead;
90 EXPECT_EQ(g_kvNbDelegatePtr->Get(testKey, valueRead), OK);
91 EXPECT_EQ(valueRead, testValue);
92 }
93
NotifierConnectTestCallback(const KvStoreNbConflictData & data)94 void NotifierConnectTestCallback(const KvStoreNbConflictData &data)
95 {
96 g_errCode = INVALID_ARGS;
97 }
98 }
99
100 class DistributedDBInterfacesEncryptDelegateTest : public testing::Test {
101 public:
102 static void SetUpTestCase(void);
103 static void TearDownTestCase(void);
104 void SetUp();
105 void TearDown();
106 };
107
SetUpTestCase(void)108 void DistributedDBInterfacesEncryptDelegateTest::SetUpTestCase(void)
109 {
110 DistributedDBToolsUnitTest::TestDirInit(g_testDir);
111 g_config.dataDir = g_testDir;
112 g_mgr.SetKvStoreConfig(g_config);
113 vector<uint8_t> passwdBuffer1(5, 1); // 5 and 1 as random password.
114 int errCode = g_passwd1.SetValue(passwdBuffer1.data(), passwdBuffer1.size());
115 ASSERT_EQ(errCode, CipherPassword::ErrorCode::OK);
116 vector<uint8_t> passwdBuffer2(5, 2); // 5 and 2 as random password.
117 errCode = g_passwd2.SetValue(passwdBuffer2.data(), passwdBuffer2.size());
118 ASSERT_EQ(errCode, CipherPassword::ErrorCode::OK);
119 vector<uint8_t> passwdBuffer3(5, 3); // 5 and 3 as random password.
120 errCode = g_passwd3.SetValue(passwdBuffer3.data(), passwdBuffer3.size());
121 ASSERT_EQ(errCode, CipherPassword::ErrorCode::OK);
122 }
123
TearDownTestCase(void)124 void DistributedDBInterfacesEncryptDelegateTest::TearDownTestCase(void)
125 {
126 if (DistributedDBToolsUnitTest::RemoveTestDbFiles(g_testDir) != 0) {
127 LOGE("rm test db files error!");
128 }
129 }
130
SetUp(void)131 void DistributedDBInterfacesEncryptDelegateTest::SetUp(void)
132 {
133 DistributedDBToolsUnitTest::PrintTestCaseInfo();
134 g_errCode = INVALID_ARGS;
135 g_kvNbDelegatePtr = nullptr;
136 #ifndef OMIT_MULTI_VER
137 g_kvDelegatePtr = nullptr;
138 #endif // OMIT_MULTI_VER
139 }
140
TearDown(void)141 void DistributedDBInterfacesEncryptDelegateTest::TearDown(void) {}
142
143 /**
144 * @tc.name: EncryptedDbOperation001
145 * @tc.desc: Test the single version db encrypted function.
146 * @tc.type: FUNC
147 * @tc.require: AR000CQDT5 AR000CQDT6
148 * @tc.author: wumin
149 */
150 HWTEST_F(DistributedDBInterfacesEncryptDelegateTest, EncryptedDbOperation001, TestSize.Level1)
151 {
152 KvStoreNbDelegate::Option option = {true, false, true, CipherType::DEFAULT, g_passwd1};
153 g_mgr.GetKvStore(STORE_ID1, option, g_kvNbDelegateCallback);
154 ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
155 ASSERT_TRUE(g_errCode == OK);
156 /**
157 * @tc.steps: step1. Put [KEY_1, V1]
158 * @tc.expected: step1. Get result OK.
159 */
160 EXPECT_EQ(g_kvNbDelegatePtr->Put(KEY_1, VALUE_1), OK);
161 /**
162 * @tc.steps: step2. Close db and open it again ,then get the value of K1
163 * @tc.expected: step2. Close and open db successfully, value of K1 is V1
164 */
165 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
166 g_kvNbDelegatePtr = nullptr;
167 g_errCode = INVALID_ARGS;
168
169 GetNbKvStoreAndCheckFun(STORE_ID1, option, KEY_1, VALUE_1);
170 /**
171 * @tc.steps: step3. Put [KEY_1, V2]
172 * @tc.expected: step3. Get result OK.
173 */
174 EXPECT_EQ(g_kvNbDelegatePtr->Put(KEY_1, VALUE_2), OK);
175 /**
176 * @tc.steps: step4. Close db and open it again ,then get the value of K1
177 * @tc.expected: step4. Close and open db successfully, value of K1 is V2
178 */
179 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
180 g_kvNbDelegatePtr = nullptr;
181 g_errCode = INVALID_ARGS;
182 g_mgr.GetKvStore(STORE_ID1, option, g_kvNbDelegateCallback);
183 ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
184 EXPECT_TRUE(g_errCode == OK);
185 Value valueRead2;
186 EXPECT_EQ(g_kvNbDelegatePtr->Get(KEY_1, valueRead2), OK);
187 EXPECT_EQ(valueRead2, VALUE_2);
188 /**
189 * @tc.steps: step5. Delete record K1
190 * @tc.expected: step5. Get result OK.
191 */
192 EXPECT_EQ(g_kvNbDelegatePtr->Delete(KEY_1), OK);
193 /**
194 * @tc.steps: step6. Close db and open it again ,then get the value of K1
195 * @tc.expected: step6. Close and open db successfully, get value of K1 NOT_FOUND
196 */
197 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
198 g_kvNbDelegatePtr = nullptr;
199 g_errCode = INVALID_ARGS;
200 g_mgr.GetKvStore(STORE_ID1, option, g_kvNbDelegateCallback);
201 ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
202 EXPECT_TRUE(g_errCode == OK);
203 EXPECT_EQ(g_kvNbDelegatePtr->Get(KEY_1, valueRead2), NOT_FOUND);
204
205 // additional test
206 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
207 g_kvNbDelegatePtr = nullptr;
208 g_errCode = INVALID_ARGS;
209 option.passwd = g_passwd2;
210 g_mgr.GetKvStore(STORE_ID1, option, g_kvNbDelegateCallback);
211 EXPECT_EQ(g_kvNbDelegatePtr, nullptr);
212 EXPECT_EQ(g_errCode, INVALID_PASSWD_OR_CORRUPTED_DB);
213
214 // finilize logic
215 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), INVALID_ARGS);
216 EXPECT_EQ(g_mgr.DeleteKvStore(STORE_ID1), OK);
217 g_kvNbDelegatePtr = nullptr;
218 }
219
220 #ifndef OMIT_MULTI_VER
221 /**
222 * @tc.name: EncryptedDbOperation002
223 * @tc.desc: Test the local db encrypted function.
224 * @tc.type: FUNC
225 * @tc.require: AR000CQDT5 AR000CQDT6
226 * @tc.author: wumin
227 */
228 HWTEST_F(DistributedDBInterfacesEncryptDelegateTest, EncryptedDbOperation002, TestSize.Level1)
229 {
230 KvStoreDelegate::Option option = {true, true, true, CipherType::DEFAULT, g_passwd1};
231 g_mgr.GetKvStore(STORE_ID2, option, g_kvDelegateCallback);
232 ASSERT_TRUE(g_kvDelegatePtr != nullptr);
233 EXPECT_EQ(g_errCode, OK);
234 /**
235 * @tc.steps: step1. Put [KEY_1, V1]
236 * @tc.expected: step1. Get result OK.
237 */
238 EXPECT_EQ(g_kvDelegatePtr->Put(KEY_1, VALUE_1), OK);
239 /**
240 * @tc.steps: step2. Close db and open it again ,then get the value of K1
241 * @tc.expected: step2. Close and open db successfully, value of K1 is V1
242 */
243 EXPECT_EQ(g_mgr.CloseKvStore(g_kvDelegatePtr), OK);
244 g_kvDelegatePtr = nullptr;
245 g_errCode = INVALID_ARGS;
246 g_mgr.GetKvStore(STORE_ID2, option, g_kvDelegateCallback);
247 ASSERT_TRUE(g_kvDelegatePtr != nullptr);
248 EXPECT_TRUE(g_errCode == OK);
249
250 GetSnapshotAndValueCheck(KEY_1, VALUE_1, OK);
251
252 /**
253 * @tc.steps: step3. Put [KEY_1, V2]
254 * @tc.expected: step3. Get result OK.
255 */
256 EXPECT_EQ(g_kvDelegatePtr->Put(KEY_1, VALUE_2), OK);
257 /**
258 * @tc.steps: step4. Close db and open it again ,then get the value of K1
259 * @tc.expected: step4. Close and open db successfully, value of K1 is V2
260 */
261 EXPECT_EQ(g_kvDelegatePtr->ReleaseKvStoreSnapshot(g_snapshotDelegatePtr), OK);
262 EXPECT_EQ(g_mgr.CloseKvStore(g_kvDelegatePtr), OK);
263 g_kvDelegatePtr = nullptr;
264 g_errCode = INVALID_ARGS;
265 g_mgr.GetKvStore(STORE_ID2, option, g_kvDelegateCallback);
266 ASSERT_TRUE(g_kvDelegatePtr != nullptr);
267 EXPECT_TRUE(g_errCode == OK);
268
269 GetSnapshotAndValueCheck(KEY_1, VALUE_2, OK);
270 /**
271 * @tc.steps: step5. Delete record K1
272 * @tc.expected: step5. Get result OK.
273 */
274 EXPECT_EQ(g_kvDelegatePtr->Delete(KEY_1), OK);
275 /**
276 * @tc.steps: step6. Close db and open it again ,then get the value of K1
277 * @tc.expected: step6. Close and open db successfully, get value of K1 NOT_FOUND
278 */
279 EXPECT_EQ(g_kvDelegatePtr->ReleaseKvStoreSnapshot(g_snapshotDelegatePtr), OK);
280 EXPECT_EQ(g_mgr.CloseKvStore(g_kvDelegatePtr), OK);
281 g_kvDelegatePtr = nullptr;
282 g_errCode = INVALID_ARGS;
283 g_mgr.GetKvStore(STORE_ID2, option, g_kvDelegateCallback);
284 ASSERT_TRUE(g_kvDelegatePtr != nullptr);
285 EXPECT_TRUE(g_errCode == OK);
286 GetSnapshotAndValueCheck(KEY_1, VALUE_2, NOT_FOUND);
287
288 // additional test
289 EXPECT_EQ(g_kvDelegatePtr->ReleaseKvStoreSnapshot(g_snapshotDelegatePtr), OK);
290 EXPECT_EQ(g_mgr.CloseKvStore(g_kvDelegatePtr), OK);
291 g_kvDelegatePtr = nullptr;
292 g_errCode = INVALID_ARGS;
293 option.passwd = g_passwd2;
294 g_mgr.GetKvStore(STORE_ID2, option, g_kvDelegateCallback);
295 EXPECT_TRUE(g_kvDelegatePtr == nullptr);
296 EXPECT_EQ(g_errCode, INVALID_PASSWD_OR_CORRUPTED_DB);
297
298 // finilize logic
299 EXPECT_EQ(g_mgr.DeleteKvStore(STORE_ID2), OK);
300 }
301
302 /**
303 * @tc.name: EncryptedDbOperation003
304 * @tc.desc: Test the multi version db encrypted function.
305 * @tc.type: FUNC
306 * @tc.require: AR000CQDT5 AR000CQDT6
307 * @tc.author: wumin
308 */
309 HWTEST_F(DistributedDBInterfacesEncryptDelegateTest, EncryptedDbOperation003, TestSize.Level1)
310 {
311 KvStoreDelegate::Option option = {true, false, true, CipherType::DEFAULT, g_passwd1};
312 g_mgr.GetKvStore(STORE_ID3, option, g_kvDelegateCallback);
313 ASSERT_TRUE(g_kvDelegatePtr != nullptr);
314 EXPECT_EQ(g_errCode, OK);
315 /**
316 * @tc.steps: step1. Put [KEY_1, V1]
317 * @tc.expected: step1. Get result OK.
318 */
319 EXPECT_EQ(g_kvDelegatePtr->Put(KEY_1, VALUE_1), OK);
320 /**
321 * @tc.steps: step2. Close db and open it again ,then get the value of K1
322 * @tc.expected: step2. Close and open db successfully, value of K1 is V1
323 */
324 EXPECT_EQ(g_mgr.CloseKvStore(g_kvDelegatePtr), OK);
325 g_kvDelegatePtr = nullptr;
326 g_errCode = INVALID_ARGS;
327 g_mgr.GetKvStore(STORE_ID3, option, g_kvDelegateCallback);
328 ASSERT_TRUE(g_kvDelegatePtr != nullptr);
329 EXPECT_TRUE(g_errCode == OK);
330
331 GetSnapshotAndValueCheck(KEY_1, VALUE_1, OK);
332 /**
333 * @tc.steps: step3. Put [KEY_1, V2]
334 * @tc.expected: step3. Get result OK.
335 */
336 EXPECT_EQ(g_kvDelegatePtr->Put(KEY_1, VALUE_2), OK);
337 /**
338 * @tc.steps: step4. Close db and open it again ,then get the value of K1
339 * @tc.expected: step4. Close and open db successfully, value of K1 is V2
340 */
341 EXPECT_EQ(g_kvDelegatePtr->ReleaseKvStoreSnapshot(g_snapshotDelegatePtr), OK);
342 EXPECT_EQ(g_mgr.CloseKvStore(g_kvDelegatePtr), OK);
343 g_kvDelegatePtr = nullptr;
344 g_errCode = INVALID_ARGS;
345 g_mgr.GetKvStore(STORE_ID3, option, g_kvDelegateCallback);
346 ASSERT_TRUE(g_kvDelegatePtr != nullptr);
347 EXPECT_TRUE(g_errCode == OK);
348
349 GetSnapshotAndValueCheck(KEY_1, VALUE_2, OK);
350 /**
351 * @tc.steps: step5. Delete record K1
352 * @tc.expected: step5. Get result OK.
353 */
354 EXPECT_EQ(g_kvDelegatePtr->Delete(KEY_1), OK);
355 /**
356 * @tc.steps: step6. Close db and open it again ,then get the value of K1
357 * @tc.expected: step6. Close and open db successfully, get value of K1 NOT_FOUND
358 */
359 EXPECT_EQ(g_kvDelegatePtr->ReleaseKvStoreSnapshot(g_snapshotDelegatePtr), OK);
360 EXPECT_EQ(g_mgr.CloseKvStore(g_kvDelegatePtr), OK);
361 g_kvDelegatePtr = nullptr;
362 g_errCode = INVALID_ARGS;
363 g_mgr.GetKvStore(STORE_ID3, option, g_kvDelegateCallback);
364 ASSERT_TRUE(g_kvDelegatePtr != nullptr);
365 EXPECT_TRUE(g_errCode == OK);
366
367 GetSnapshotAndValueCheck(KEY_1, VALUE_2, NOT_FOUND);
368
369 // additional test
370 EXPECT_EQ(g_kvDelegatePtr->ReleaseKvStoreSnapshot(g_snapshotDelegatePtr), OK);
371 EXPECT_EQ(g_mgr.CloseKvStore(g_kvDelegatePtr), OK);
372 g_kvDelegatePtr = nullptr;
373 g_errCode = INVALID_ARGS;
374 option.passwd = g_passwd2;
375 g_mgr.GetKvStore(STORE_ID3, option, g_kvDelegateCallback);
376 EXPECT_TRUE(g_kvDelegatePtr == nullptr);
377 EXPECT_EQ(g_errCode, INVALID_PASSWD_OR_CORRUPTED_DB);
378
379 // finilize logic
380 EXPECT_EQ(g_mgr.DeleteKvStore(STORE_ID3), OK);
381 }
382 #endif // OMIT_MULTI_VER
383
384 /**
385 * @tc.name: EncryptedDbSwitch001
386 * @tc.desc: Test the single version db for Rekey function.
387 * @tc.type: FUNC
388 * @tc.require: AR000CQDT7
389 * @tc.author: wumin
390 */
391 HWTEST_F(DistributedDBInterfacesEncryptDelegateTest, EncryptedDbSwitch001, TestSize.Level1)
392 {
393 /**
394 * @tc.steps: step1/step2. Put and get [KEY_1, V1]
395 * @tc.expected: step1/step2. Get value of KEY_1, value of K1 is V1.
396 */
397 KvStoreNbDelegate::Option option = {true, false, true, CipherType::DEFAULT, g_passwd1};
398 GetNbKvStoreAndCheckFun(STORE_ID1, option, KEY_1, VALUE_1);
399 /**
400 * @tc.steps: step3. Rekey passwd to passwd2
401 * @tc.expected: step3. result is OK
402 */
403 EXPECT_EQ(g_kvNbDelegatePtr->Rekey(g_passwd2), OK);
404 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
405 g_kvNbDelegatePtr = nullptr;
406 g_errCode = INVALID_ARGS;
407 /**
408 * @tc.steps: step4/step5. Put and get [KEY_1, V2]
409 * @tc.expected: step4/step5. Get value of KEY_1, value of K1 is V2.
410 */
411 option.passwd = g_passwd2;
412 GetNbKvStoreAndCheckFun(STORE_ID1, option, KEY_1, VALUE_2);
413
414 /**
415 * @tc.steps: step6. Rekey passwd to empty
416 * @tc.expected: step6. result is OK
417 */
418 EXPECT_EQ(g_kvNbDelegatePtr->Rekey(PASSWD_EMPTY), OK);
419 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
420 g_kvNbDelegatePtr = nullptr;
421 g_errCode = INVALID_ARGS;
422 /**
423 * @tc.steps: step7/step8. Put and get [KEY_1, V3]
424 * @tc.expected: step7/step8. Get value of KEY_1, value of K1 is V3.
425 */
426 option.isEncryptedDb = false;
427 GetNbKvStoreAndCheckFun(STORE_ID1, option, KEY_1, VALUE_3);
428 /**
429 * @tc.steps: step9. Rekey passwd to passwd3
430 * @tc.expected: step3. result is OK
431 */
432 EXPECT_EQ(g_kvNbDelegatePtr->Rekey(g_passwd3), OK);
433 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
434 g_kvNbDelegatePtr = nullptr;
435 g_errCode = INVALID_ARGS;
436 /**
437 * @tc.steps: step10/step11. Put and get [KEY_1, V4]
438 * @tc.expected: step10/step11. Get value of KEY_1, value of K1 is V4.
439 */
440 option.isEncryptedDb = true;
441 option.passwd = g_passwd3;
442 GetNbKvStoreAndCheckFun(STORE_ID1, option, KEY_1, VALUE_4);
443
444 // finilize logic
445 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
446 EXPECT_EQ(g_mgr.DeleteKvStore(STORE_ID1), OK);
447 g_kvNbDelegatePtr = nullptr;
448 }
449
450 /**
451 * @tc.name: EncryptedDbSwitch002
452 * @tc.desc: Test the single version db Rekey function return BUSY because of multiple instances.
453 * @tc.type: FUNC
454 * @tc.require: AR000CQDT7
455 * @tc.author: wumin
456 */
457 HWTEST_F(DistributedDBInterfacesEncryptDelegateTest, EncryptedDbSwitch002, TestSize.Level1)
458 {
459 KvStoreNbDelegate::Option option = {true, false, true, CipherType::DEFAULT, g_passwd1};
460 g_mgr.GetKvStore(STORE_ID1, option, g_kvNbDelegateCallback);
461 ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
462 EXPECT_TRUE(g_errCode == OK);
463 /**
464 * @tc.steps: step1. open same database again
465 * @tc.expected: step1. Get result OK
466 */
467 DBStatus errCode = INVALID_ARGS;
468 KvStoreNbDelegate *kvNbDelegatePtr = nullptr;
469 auto kvNbDelegateCallback = bind(&DistributedDBToolsUnitTest::KvStoreNbDelegateCallback, placeholders::_1,
470 placeholders::_2, std::ref(errCode), std::ref(kvNbDelegatePtr));
471 g_mgr.GetKvStore(STORE_ID1, option, kvNbDelegateCallback);
472 ASSERT_TRUE(kvNbDelegatePtr != nullptr);
473 EXPECT_TRUE(errCode == OK);
474 /**
475 * @tc.steps: step2. invoke rekey logic
476 * @tc.expected: step2. Get result BUSY
477 */
478 EXPECT_EQ(g_kvNbDelegatePtr->Rekey(g_passwd2), BUSY);
479 // finilize logic
480 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
481 EXPECT_EQ(g_mgr.CloseKvStore(kvNbDelegatePtr), OK);
482 EXPECT_EQ(g_mgr.DeleteKvStore(STORE_ID1), OK);
483 }
484
485 /**
486 * @tc.name: EncryptedDbSwitch003
487 * @tc.desc: Test the single version db Rekey function return BUSY because of observer.
488 * @tc.type: FUNC
489 * @tc.require: AR000CQDT7
490 * @tc.author: wumin
491 */
492 HWTEST_F(DistributedDBInterfacesEncryptDelegateTest, EncryptedDbSwitch003, TestSize.Level1)
493 {
494 KvStoreNbDelegate::Option option = {true, false, true, CipherType::DEFAULT, g_passwd1};
495 g_mgr.GetKvStore(STORE_ID1, option, g_kvNbDelegateCallback);
496 ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
497 EXPECT_TRUE(g_errCode == OK);
498 /**
499 * @tc.steps: step1. register observer
500 * @tc.expected: step1. Get result OK
501 */
502 KvStoreObserverUnitTest *observer = new (std::nothrow) KvStoreObserverUnitTest;
503 ASSERT_NE(observer, nullptr);
504 EXPECT_EQ(g_kvNbDelegatePtr->RegisterObserver(KEY_1, OBSERVER_CHANGES_NATIVE, observer), OK);
505 /**
506 * @tc.steps: step2. invoke rekey logic
507 * @tc.expected: step2. Get result BUSY
508 */
509 EXPECT_EQ(g_kvNbDelegatePtr->Rekey(g_passwd2), BUSY);
510 // finilize logic
511 delete observer;
512 observer = nullptr;
513 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
514 EXPECT_EQ(g_mgr.DeleteKvStore(STORE_ID1), OK);
515 }
516
517 /**
518 * @tc.name: EncryptedDbSwitch004
519 * @tc.desc: Test the single version db Rekey function return BUSY because of conflict notifier.
520 * @tc.type: FUNC
521 * @tc.require: AR000CQDT7
522 * @tc.author: wumin
523 */
524 HWTEST_F(DistributedDBInterfacesEncryptDelegateTest, EncryptedDbSwitch004, TestSize.Level1)
525 {
526 KvStoreNbDelegate::Option option = {true, false, true, CipherType::DEFAULT, g_passwd1};
527 g_mgr.GetKvStore(STORE_ID1, option, g_kvNbDelegateCallback);
528 ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
529 EXPECT_TRUE(g_errCode == OK);
530 /**
531 * @tc.steps: step1. register observer
532 * @tc.expected: step1. Get result OK
533 */
534 EXPECT_EQ(g_kvNbDelegatePtr->SetConflictNotifier(CONFLICT_ALL, NotifierConnectTestCallback), OK);
535 /**
536 * @tc.steps: step2. invoke rekey logic
537 * @tc.expected: step2. Get result BUSY
538 */
539 EXPECT_EQ(g_kvNbDelegatePtr->Rekey(g_passwd2), BUSY);
540 // finilize logic
541 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
542 EXPECT_EQ(g_mgr.DeleteKvStore(STORE_ID1), OK);
543 }
544
545 /**
546 * @tc.name: EncryptedDbSwitch009
547 * @tc.desc: Test the single version db Rekey function from password1 to password2.
548 * @tc.type: FUNC
549 * @tc.require: AR000CQDT7
550 * @tc.author: wumin
551 */
552 HWTEST_F(DistributedDBInterfacesEncryptDelegateTest, EncryptedDbSwitch009, TestSize.Level1)
553 {
554 /**
555 * @tc.steps: step1/step2. Put and get [KEY_1, V1]
556 * @tc.expected: step1/step2. Get value of KEY_1, value of K1 is V1.
557 */
558 KvStoreNbDelegate::Option option = {true, false, true, CipherType::DEFAULT, g_passwd1};
559 GetNbKvStoreAndCheckFun(STORE_ID1, option, KEY_1, VALUE_1);
560 /**
561 * @tc.steps: step3. Rekey passwd to passwd2
562 * @tc.expected: step3. result is OK
563 */
564 EXPECT_EQ(g_kvNbDelegatePtr->Rekey(g_passwd2), OK);
565 Value valueRead1;
566 EXPECT_EQ(g_kvNbDelegatePtr->Get(KEY_1, valueRead1), OK);
567 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
568 g_kvNbDelegatePtr = nullptr;
569 g_errCode = INVALID_ARGS;
570 /**
571 * @tc.steps: step4/step5. Put and get [KEY_1, V2]
572 * @tc.expected: step4/step5. Get value of KEY_1, value of K1 is V2.
573 */
574 option.passwd = g_passwd2;
575 GetNbKvStoreAndCheckFun(STORE_ID1, option, KEY_1, VALUE_2);
576 // finilize logic
577 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
578 EXPECT_EQ(g_mgr.DeleteKvStore(STORE_ID1), OK);
579 g_kvNbDelegatePtr = nullptr;
580 }
581
582 /**
583 * @tc.name: EncryptedDbSwitch010
584 * @tc.desc: Test the single version db Rekey function from encrypted db unencrypted db .
585 * @tc.type: FUNC
586 * @tc.require: AR000CQDT7
587 * @tc.author: wumin
588 */
589 HWTEST_F(DistributedDBInterfacesEncryptDelegateTest, EncryptedDbSwitch010, TestSize.Level1)
590 {
591 /**
592 * @tc.steps: step1/step2. Put and get [KEY_1, V1]
593 * @tc.expected: step1/step2. Get value of KEY_1, value of K1 is V1.
594 */
595 KvStoreNbDelegate::Option option = {true, false, true, CipherType::DEFAULT, g_passwd1};
596 GetNbKvStoreAndCheckFun(STORE_ID1, option, KEY_1, VALUE_1);
597 /**
598 * @tc.steps: step6. Rekey passwd to empty
599 * @tc.expected: step6. result is OK
600 */
601 EXPECT_EQ(g_kvNbDelegatePtr->Rekey(PASSWD_EMPTY), OK);
602 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
603 g_kvNbDelegatePtr = nullptr;
604 g_errCode = INVALID_ARGS;
605 /**
606 * @tc.steps: step7/step8. Put and get [KEY_1, V3]
607 * @tc.expected: step7/step8. Get value of KEY_1, value of K1 is V3.
608 */
609 option.isEncryptedDb = false;
610 GetNbKvStoreAndCheckFun(STORE_ID1, option, KEY_1, VALUE_3);
611 // finilize logic
612 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
613 EXPECT_EQ(g_mgr.DeleteKvStore(STORE_ID1), OK);
614 g_kvNbDelegatePtr = nullptr;
615 }
616
617 /**
618 * @tc.name: EncryptedDbSwitch011
619 * @tc.desc: Test the single version db Rekey function from unencrypted db to encrypted db.
620 * @tc.type: FUNC
621 * @tc.require: AR000CQDT7
622 * @tc.author: wumin
623 */
624 HWTEST_F(DistributedDBInterfacesEncryptDelegateTest, EncryptedDbSwitch011, TestSize.Level1)
625 {
626 /**
627 * @tc.steps: step1/step2. Put and get [KEY_1, V1]
628 * @tc.expected: step1/step2. Get value of KEY_1, value of K1 is V1.
629 */
630 KvStoreNbDelegate::Option option = {true, false, false, CipherType::DEFAULT, PASSWD_EMPTY};
631 GetNbKvStoreAndCheckFun(STORE_ID1, option, KEY_1, VALUE_1);
632 /**
633 * @tc.steps: step3. Rekey passwd to passwd2
634 * @tc.expected: step3. result is OK
635 */
636 EXPECT_EQ(g_kvNbDelegatePtr->Rekey(g_passwd2), OK);
637 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
638 g_kvNbDelegatePtr = nullptr;
639 g_errCode = INVALID_ARGS;
640 /**
641 * @tc.steps: step4/step5. Put and get [KEY_1, V2]
642 * @tc.expected: step4/step5. Get value of KEY_1, value of K1 is V2.
643 */
644 option.passwd = g_passwd2;
645 option.isEncryptedDb = true;
646 GetNbKvStoreAndCheckFun(STORE_ID1, option, KEY_1, VALUE_2);
647 // finilize logic
648 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
649 EXPECT_EQ(g_mgr.DeleteKvStore(STORE_ID1), OK);
650 g_kvNbDelegatePtr = nullptr;
651 }
652
653 #ifndef OMIT_MULTI_VER
654 /**
655 * @tc.name: EncryptedDbSwitch012
656 * @tc.desc: Test the local db Rekey function from password1 to password2.
657 * @tc.type: FUNC
658 * @tc.require: AR000CQDT7
659 * @tc.author: wumin
660 */
661 HWTEST_F(DistributedDBInterfacesEncryptDelegateTest, EncryptedDbSwitch012, TestSize.Level1)
662 {
663 KvStoreDelegate::Option option = {true, true, true, CipherType::DEFAULT, g_passwd1};
664 g_mgr.GetKvStore(STORE_ID2, option, g_kvDelegateCallback);
665 ASSERT_TRUE(g_kvDelegatePtr != nullptr);
666 EXPECT_EQ(g_errCode, OK);
667 /**
668 * @tc.steps: step1/step2. Put and get [KEY_1, V1]
669 * @tc.expected: step1/step2. Get value of KEY_1, value of K1 is V1.
670 */
671 EXPECT_EQ(g_kvDelegatePtr->Put(KEY_1, VALUE_1), OK);
672
673 GetSnapshotAndValueCheck(KEY_1, VALUE_1, OK);
674
675 /**
676 * @tc.steps: step3. Rekey passwd to passwd2
677 * @tc.expected: step3. result is OK
678 */
679 EXPECT_EQ(g_kvDelegatePtr->ReleaseKvStoreSnapshot(g_snapshotDelegatePtr), OK);
680 EXPECT_EQ(g_kvDelegatePtr->Rekey(g_passwd2), OK);
681 EXPECT_EQ(g_kvDelegatePtr->Put(KEY_1, VALUE_3), OK);
682 EXPECT_EQ(g_mgr.CloseKvStore(g_kvDelegatePtr), OK);
683 g_kvDelegatePtr = nullptr;
684 g_errCode = INVALID_ARGS;
685 /**
686 * @tc.steps: step4/step5. Put and get [KEY_1, V2]
687 * @tc.expected: step4/step5. Get value of KEY_1, value of K1 is V2.
688 */
689 option.passwd = g_passwd2;
690 g_mgr.GetKvStore(STORE_ID2, option, g_kvDelegateCallback);
691 ASSERT_TRUE(g_kvDelegatePtr != nullptr);
692 EXPECT_EQ(g_errCode, OK);
693 EXPECT_EQ(g_kvDelegatePtr->Put(KEY_1, VALUE_2), OK);
694
695 GetSnapshotAndValueCheck(KEY_1, VALUE_2, OK);
696 // finilize logic
697 EXPECT_EQ(g_kvDelegatePtr->ReleaseKvStoreSnapshot(g_snapshotDelegatePtr), OK);
698 EXPECT_EQ(g_mgr.CloseKvStore(g_kvDelegatePtr), OK);
699 EXPECT_EQ(g_mgr.DeleteKvStore(STORE_ID2), OK);
700 g_kvDelegatePtr = nullptr;
701 }
702
703 /**
704 * @tc.name: EncryptedDbSwitch013
705 * @tc.desc: Test the local db Rekey function from encrypted db unencrypted db .
706 * @tc.type: FUNC
707 * @tc.require: AR000CQDT7
708 * @tc.author: wumin
709 */
710 HWTEST_F(DistributedDBInterfacesEncryptDelegateTest, EncryptedDbSwitch013, TestSize.Level1)
711 {
712 KvStoreDelegate::Option option = {true, true, true, CipherType::DEFAULT, g_passwd1};
713 g_mgr.GetKvStore(STORE_ID2, option, g_kvDelegateCallback);
714 ASSERT_TRUE(g_kvDelegatePtr != nullptr);
715 EXPECT_EQ(g_errCode, OK);
716 /**
717 * @tc.steps: step1/step2. Put and get [KEY_1, V1]
718 * @tc.expected: step1/step2. Get value of KEY_1, value of K1 is V1.
719 */
720 EXPECT_EQ(g_kvDelegatePtr->Put(KEY_1, VALUE_1), OK);
721
722 GetSnapshotAndValueCheck(KEY_1, VALUE_1, OK);
723 /**
724 * @tc.steps: step3. Rekey passwd to empty
725 * @tc.expected: step3. result is OK
726 */
727 EXPECT_EQ(g_kvDelegatePtr->ReleaseKvStoreSnapshot(g_snapshotDelegatePtr), OK);
728 EXPECT_EQ(g_kvDelegatePtr->Rekey(PASSWD_EMPTY), OK);
729 EXPECT_EQ(g_mgr.CloseKvStore(g_kvDelegatePtr), OK);
730 g_kvDelegatePtr = nullptr;
731 g_errCode = INVALID_ARGS;
732 /**
733 * @tc.steps: step4/step5. Put and get [KEY_1, V2]
734 * @tc.expected: step4/step5. Get value of KEY_1, value of K1 is V2.
735 */
736 option.isEncryptedDb = false;
737 g_mgr.GetKvStore(STORE_ID2, option, g_kvDelegateCallback);
738 ASSERT_TRUE(g_kvDelegatePtr != nullptr);
739 EXPECT_EQ(g_errCode, OK);
740 EXPECT_EQ(g_kvDelegatePtr->Put(KEY_1, VALUE_2), OK);
741
742 GetSnapshotAndValueCheck(KEY_1, VALUE_2, OK);
743 // finilize logic
744 EXPECT_EQ(g_kvDelegatePtr->ReleaseKvStoreSnapshot(g_snapshotDelegatePtr), OK);
745 EXPECT_EQ(g_mgr.CloseKvStore(g_kvDelegatePtr), OK);
746 EXPECT_EQ(g_mgr.DeleteKvStore(STORE_ID2), OK);
747 g_kvDelegatePtr = nullptr;
748 }
749
750 /**
751 * @tc.name: EncryptedDbSwitch014
752 * @tc.desc: Test the local db Rekey function from unencrypted db to encrypted db.
753 * @tc.type: FUNC
754 * @tc.require: AR000CQDT7
755 * @tc.author: wumin
756 */
757 HWTEST_F(DistributedDBInterfacesEncryptDelegateTest, EncryptedDbSwitch014, TestSize.Level1)
758 {
759 KvStoreDelegate::Option option = {true, true, false, CipherType::DEFAULT, PASSWD_EMPTY};
760 g_mgr.GetKvStore(STORE_ID2, option, g_kvDelegateCallback);
761 ASSERT_TRUE(g_kvDelegatePtr != nullptr);
762 EXPECT_EQ(g_errCode, OK);
763 /**
764 * @tc.steps: step1/step2. Put and get [KEY_1, V1]
765 * @tc.expected: step1/step2. Get value of KEY_1, value of K1 is V1.
766 */
767 EXPECT_EQ(g_kvDelegatePtr->Put(KEY_1, VALUE_1), OK);
768
769 GetSnapshotAndValueCheck(KEY_1, VALUE_1, OK);
770 /**
771 * @tc.steps: step3. Rekey passwd to passwd2
772 * @tc.expected: step3. result is OK
773 */
774 EXPECT_EQ(g_kvDelegatePtr->ReleaseKvStoreSnapshot(g_snapshotDelegatePtr), OK);
775 EXPECT_EQ(g_kvDelegatePtr->Rekey(g_passwd2), OK);
776 EXPECT_EQ(g_mgr.CloseKvStore(g_kvDelegatePtr), OK);
777 g_kvDelegatePtr = nullptr;
778 g_errCode = INVALID_ARGS;
779 /**
780 * @tc.steps: step4/step5. Put and get [KEY_1, V2]
781 * @tc.expected: step4/step5. Get value of KEY_1, value of K1 is V2.
782 */
783 option.passwd = g_passwd2;
784 option.isEncryptedDb = true;
785 g_mgr.GetKvStore(STORE_ID2, option, g_kvDelegateCallback);
786 ASSERT_TRUE(g_kvDelegatePtr != nullptr);
787 EXPECT_EQ(g_errCode, OK);
788 EXPECT_EQ(g_kvDelegatePtr->Put(KEY_1, VALUE_2), OK);
789
790 GetSnapshotAndValueCheck(KEY_1, VALUE_2, OK);
791 // finilize logic
792 EXPECT_EQ(g_kvDelegatePtr->ReleaseKvStoreSnapshot(g_snapshotDelegatePtr), OK);
793 EXPECT_EQ(g_mgr.CloseKvStore(g_kvDelegatePtr), OK);
794 EXPECT_EQ(g_mgr.DeleteKvStore(STORE_ID2), OK);
795 g_kvDelegatePtr = nullptr;
796 }
797
798 /**
799 * @tc.name: EncryptedDbSwitch015
800 * @tc.desc: Test the multi version db Rekey function from password1 to password2.
801 * @tc.type: FUNC
802 * @tc.require: AR000CQDT7
803 * @tc.author: wumin
804 */
805 HWTEST_F(DistributedDBInterfacesEncryptDelegateTest, EncryptedDbSwitch015, TestSize.Level1)
806 {
807 KvStoreDelegate::Option option = {true, false, true, CipherType::DEFAULT, g_passwd1};
808 g_mgr.GetKvStore(STORE_ID3, option, g_kvDelegateCallback);
809 ASSERT_TRUE(g_kvDelegatePtr != nullptr);
810 EXPECT_EQ(g_errCode, OK);
811 /**
812 * @tc.steps: step1/step2. Put and get [KEY_1, V1]
813 * @tc.expected: step1/step2. Get value of KEY_1, value of K1 is V1.
814 */
815 EXPECT_EQ(g_kvDelegatePtr->Put(KEY_1, VALUE_1), OK);
816
817 GetSnapshotAndValueCheck(KEY_1, VALUE_1, OK);
818 /**
819 * @tc.steps: step3. Rekey passwd to passwd2
820 * @tc.expected: step3. result is OK
821 */
822 EXPECT_EQ(g_kvDelegatePtr->ReleaseKvStoreSnapshot(g_snapshotDelegatePtr), OK);
823 EXPECT_EQ(g_kvDelegatePtr->Rekey(g_passwd2), OK);
824 EXPECT_EQ(g_kvDelegatePtr->Put(KEY_1, VALUE_3), OK);
825
826 GetSnapshotAndValueCheck(KEY_1, VALUE_3, OK);
827 EXPECT_EQ(g_kvDelegatePtr->ReleaseKvStoreSnapshot(g_snapshotDelegatePtr), OK);
828 EXPECT_EQ(g_mgr.CloseKvStore(g_kvDelegatePtr), OK);
829
830 g_kvDelegatePtr = nullptr;
831 g_errCode = INVALID_ARGS;
832 /**
833 * @tc.steps: step4/step5. Put and get [KEY_1, V2]
834 * @tc.expected: step4/step5. Get value of KEY_1, value of K1 is V2.
835 */
836 option.passwd = g_passwd2;
837 g_mgr.GetKvStore(STORE_ID3, option, g_kvDelegateCallback);
838 ASSERT_TRUE(g_kvDelegatePtr != nullptr);
839 EXPECT_EQ(g_errCode, OK);
840 EXPECT_EQ(g_kvDelegatePtr->Put(KEY_1, VALUE_2), OK);
841
842 GetSnapshotAndValueCheck(KEY_1, VALUE_2, OK);
843 // finilize logic
844 EXPECT_EQ(g_kvDelegatePtr->ReleaseKvStoreSnapshot(g_snapshotDelegatePtr), OK);
845 EXPECT_EQ(g_mgr.CloseKvStore(g_kvDelegatePtr), OK);
846 EXPECT_EQ(g_mgr.DeleteKvStore(STORE_ID3), OK);
847 g_kvDelegatePtr = nullptr;
848 }
849
850 /**
851 * @tc.name: EncryptedDbSwitch016
852 * @tc.desc: Test the multi version db Rekey function from encrypted db unencrypted db .
853 * @tc.type: FUNC
854 * @tc.require: AR000CQDT7
855 * @tc.author: wumin
856 */
857 HWTEST_F(DistributedDBInterfacesEncryptDelegateTest, EncryptedDbSwitch016, TestSize.Level1)
858 {
859 KvStoreDelegate::Option option = {true, false, true, CipherType::DEFAULT, g_passwd1};
860 g_mgr.GetKvStore(STORE_ID3, option, g_kvDelegateCallback);
861 ASSERT_TRUE(g_kvDelegatePtr != nullptr);
862 EXPECT_EQ(g_errCode, OK);
863 /**
864 * @tc.steps: step1/step2. Put and get [KEY_1, V1]
865 * @tc.expected: step1/step2. Get value of KEY_1, value of K1 is V1.
866 */
867 EXPECT_EQ(g_kvDelegatePtr->Put(KEY_1, VALUE_1), OK);
868
869 GetSnapshotAndValueCheck(KEY_1, VALUE_1, OK);
870 /**
871 * @tc.steps: step3. Rekey passwd to empty
872 * @tc.expected: step3. result is OK
873 */
874 EXPECT_EQ(g_kvDelegatePtr->ReleaseKvStoreSnapshot(g_snapshotDelegatePtr), OK);
875 EXPECT_EQ(g_kvDelegatePtr->Rekey(PASSWD_EMPTY), OK);
876 EXPECT_EQ(g_mgr.CloseKvStore(g_kvDelegatePtr), OK);
877 g_kvDelegatePtr = nullptr;
878 g_errCode = INVALID_ARGS;
879 /**
880 * @tc.steps: step4/step5. Put and get [KEY_1, V2]
881 * @tc.expected: step4/step5. Get value of KEY_1, value of K1 is V2.
882 */
883 option.isEncryptedDb = false;
884 g_mgr.GetKvStore(STORE_ID3, option, g_kvDelegateCallback);
885 ASSERT_TRUE(g_kvDelegatePtr != nullptr);
886 EXPECT_EQ(g_errCode, OK);
887 EXPECT_EQ(g_kvDelegatePtr->Put(KEY_1, VALUE_2), OK);
888
889 GetSnapshotAndValueCheck(KEY_1, VALUE_2, OK);
890 // finilize logic
891 EXPECT_EQ(g_kvDelegatePtr->ReleaseKvStoreSnapshot(g_snapshotDelegatePtr), OK);
892 EXPECT_EQ(g_mgr.CloseKvStore(g_kvDelegatePtr), OK);
893 EXPECT_EQ(g_mgr.DeleteKvStore(STORE_ID3), OK);
894 g_kvDelegatePtr = nullptr;
895 }
896
897 /**
898 * @tc.name: EncryptedDbSwitch017
899 * @tc.desc: Test the multi version db Rekey function from unencrypted db to encrypted db.
900 * @tc.type: FUNC
901 * @tc.require: AR000CQDT7
902 * @tc.author: wumin
903 */
904 HWTEST_F(DistributedDBInterfacesEncryptDelegateTest, EncryptedDbSwitch017, TestSize.Level1)
905 {
906 KvStoreDelegate::Option option = {true, false, false, CipherType::DEFAULT, PASSWD_EMPTY};
907 g_mgr.GetKvStore(STORE_ID3, option, g_kvDelegateCallback);
908 ASSERT_TRUE(g_kvDelegatePtr != nullptr);
909 EXPECT_EQ(g_errCode, OK);
910 /**
911 * @tc.steps: step1/step2. Put and get [KEY_1, V1]
912 * @tc.expected: step1/step2. Get value of KEY_1, value of K1 is V1.
913 */
914 EXPECT_EQ(g_kvDelegatePtr->Put(KEY_1, VALUE_1), OK);
915
916 GetSnapshotAndValueCheck(KEY_1, VALUE_1, OK);
917 /**
918 * @tc.steps: step3. Rekey passwd to passwd2
919 * @tc.expected: step3. result is OK
920 */
921 EXPECT_EQ(g_kvDelegatePtr->ReleaseKvStoreSnapshot(g_snapshotDelegatePtr), OK);
922 EXPECT_EQ(g_kvDelegatePtr->Rekey(g_passwd2), OK);
923 EXPECT_EQ(g_mgr.CloseKvStore(g_kvDelegatePtr), OK);
924 g_kvDelegatePtr = nullptr;
925 g_errCode = INVALID_ARGS;
926 /**
927 * @tc.steps: step4/step5. Put and get [KEY_1, V2]
928 * @tc.expected: step4/step5. Get value of KEY_1, value of K1 is V2.
929 */
930 option.passwd = g_passwd2;
931 option.isEncryptedDb = true;
932 g_mgr.GetKvStore(STORE_ID3, option, g_kvDelegateCallback);
933 ASSERT_TRUE(g_kvDelegatePtr != nullptr);
934 EXPECT_EQ(g_errCode, OK);
935 EXPECT_EQ(g_kvDelegatePtr->Put(KEY_1, VALUE_2), OK);
936
937 GetSnapshotAndValueCheck(KEY_1, VALUE_2, OK);
938 // finilize logic
939 EXPECT_EQ(g_kvDelegatePtr->ReleaseKvStoreSnapshot(g_snapshotDelegatePtr), OK);
940 EXPECT_EQ(g_mgr.CloseKvStore(g_kvDelegatePtr), OK);
941 EXPECT_EQ(g_mgr.DeleteKvStore(STORE_ID3), OK);
942 g_kvDelegatePtr = nullptr;
943 }
944 #endif // OMIT_MULTI_VER
945
946 /**
947 * @tc.name: OpenEncryptedDb001
948 * @tc.desc: Test create an encrypted database successfully.
949 * @tc.type: FUNC
950 * @tc.require: AR000CQDT5 AR000CQDT6
951 * @tc.author: wumin
952 */
953 HWTEST_F(DistributedDBInterfacesEncryptDelegateTest, OpenEncryptedDb001, TestSize.Level1)
954 {
955 /**
956 * @tc.steps: step1. create single version encrypted database
957 * @tc.expected: step1. Get result OK.
958 */
959 KvStoreNbDelegate::Option option1 = {true, false, true, CipherType::DEFAULT, g_passwd1};
960 g_mgr.GetKvStore(STORE_ID1, option1, g_kvNbDelegateCallback);
961 ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
962 EXPECT_TRUE(g_errCode == OK);
963 #ifndef OMIT_MULTI_VER
964 /**
965 * @tc.steps: step2. create multi version encrypted database
966 * @tc.expected: step2. Get result OK.
967 */
968 KvStoreDelegate::Option option2 = {true, false, true, CipherType::DEFAULT, g_passwd1};
969 g_mgr.GetKvStore(STORE_ID3, option2, g_kvDelegateCallback);
970 ASSERT_TRUE(g_kvDelegatePtr != nullptr);
971 EXPECT_EQ(g_errCode, OK);
972
973 EXPECT_EQ(g_mgr.CloseKvStore(g_kvDelegatePtr), OK);
974 EXPECT_EQ(g_mgr.DeleteKvStore(STORE_ID3), OK);
975 #endif // OMIT_MULTI_VER
976 /**
977 * @tc.steps: step3. Close db.
978 * @tc.expected: step3. Get result ok.
979 */
980 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
981 EXPECT_EQ(g_mgr.DeleteKvStore(STORE_ID1), OK);
982 }
983
984 /**
985 * @tc.name: OpenEncryptedDb002
986 * @tc.desc: Test create an encrypted database failed.
987 * @tc.type: FUNC
988 * @tc.require: AR000CQDT8
989 * @tc.author: wumin
990 */
991 HWTEST_F(DistributedDBInterfacesEncryptDelegateTest, OpenEncryptedDb002, TestSize.Level1)
992 {
993 /**
994 * @tc.steps: step1. create single version encrypted database
995 * @tc.expected: step1. Get result INVALID_ARGS.
996 */
997 KvStoreNbDelegate::Option option1 = {true, false, true, CipherType::DEFAULT, PASSWD_EMPTY};
998 g_mgr.GetKvStore(STORE_ID1, option1, g_kvNbDelegateCallback);
999 EXPECT_TRUE(g_kvNbDelegatePtr == nullptr);
1000 EXPECT_EQ(g_errCode, INVALID_ARGS);
1001
1002 #ifndef OMIT_MULTI_VER
1003 /**
1004 * @tc.steps: step2. create multi version encrypted database
1005 * @tc.expected: step2. Get result INVALID_ARGS.
1006 */
1007 KvStoreDelegate::Option option2 = {true, false, true, CipherType::DEFAULT, PASSWD_EMPTY};
1008 g_mgr.GetKvStore(STORE_ID3, option2, g_kvDelegateCallback);
1009 EXPECT_TRUE(g_kvDelegatePtr == nullptr);
1010 EXPECT_EQ(g_errCode, INVALID_ARGS);
1011
1012 EXPECT_EQ(g_mgr.CloseKvStore(g_kvDelegatePtr), INVALID_ARGS);
1013 EXPECT_EQ(g_mgr.DeleteKvStore(STORE_ID3), NOT_FOUND);
1014 #endif // OMIT_MULTI_VER
1015
1016 /**
1017 * @tc.steps: step3. Close db.
1018 * @tc.expected: step3. Get result ok.
1019 */
1020 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), INVALID_ARGS);
1021 EXPECT_EQ(g_mgr.DeleteKvStore(STORE_ID1), NOT_FOUND);
1022 }
1023
1024 /**
1025 * @tc.name: OpenEncryptedDb003
1026 * @tc.desc: Test reopen an encrypted database successfully.
1027 * @tc.type: FUNC
1028 * @tc.require: AR000CQDT8
1029 * @tc.author: wumin
1030 */
1031 HWTEST_F(DistributedDBInterfacesEncryptDelegateTest, OpenEncryptedDb003, TestSize.Level1)
1032 {
1033 KvStoreNbDelegate::Option option1 = {true, false, true, CipherType::DEFAULT, g_passwd1};
1034 g_mgr.GetKvStore(STORE_ID1, option1, g_kvNbDelegateCallback);
1035 ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
1036 EXPECT_EQ(g_errCode, OK);
1037 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
1038
1039 #ifndef OMIT_MULTI_VER
1040 KvStoreDelegate::Option option2 = {true, false, true, CipherType::DEFAULT, g_passwd3};
1041 g_mgr.GetKvStore(STORE_ID3, option2, g_kvDelegateCallback);
1042 ASSERT_TRUE(g_kvDelegatePtr != nullptr);
1043 EXPECT_EQ(g_errCode, OK);
1044 EXPECT_EQ(g_mgr.CloseKvStore(g_kvDelegatePtr), OK);
1045 #endif // OMIT_MULTI_VER
1046
1047 /**
1048 * @tc.steps: step1. create single version encrypted database
1049 * @tc.expected: step1. Get result INVALID_ARGS.
1050 */
1051 KvStoreNbDelegate::Option option3 = {true, false, true, CipherType::DEFAULT, g_passwd1};
1052 g_mgr.GetKvStore(STORE_ID1, option3, g_kvNbDelegateCallback);
1053 ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
1054 EXPECT_EQ(g_errCode, OK);
1055 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
1056
1057 #ifndef OMIT_MULTI_VER
1058 /**
1059 * @tc.steps: step2. create multi version encrypted database
1060 * @tc.expected: step2. Get result INVALID_ARGS.
1061 */
1062 KvStoreDelegate::Option option4 = {true, false, true, CipherType::DEFAULT, g_passwd3};
1063 g_mgr.GetKvStore(STORE_ID3, option4, g_kvDelegateCallback);
1064 ASSERT_TRUE(g_kvDelegatePtr != nullptr);
1065 EXPECT_EQ(g_errCode, OK);
1066 EXPECT_EQ(g_mgr.CloseKvStore(g_kvDelegatePtr), OK);
1067 EXPECT_EQ(g_mgr.DeleteKvStore(STORE_ID3), OK);
1068 #endif // OMIT_MULTI_VER
1069 /**
1070 * @tc.steps: step3. Close db.
1071 * @tc.expected: step3. Get result ok.
1072 */
1073 EXPECT_EQ(g_mgr.DeleteKvStore(STORE_ID1), OK);
1074 }
1075
1076 /**
1077 * @tc.name: OpenEncryptedDb004
1078 * @tc.desc: Test reopen an encrypted database failed.
1079 * @tc.type: FUNC
1080 * @tc.require: AR000CQDT8
1081 * @tc.author: wumin
1082 */
1083 HWTEST_F(DistributedDBInterfacesEncryptDelegateTest, OpenEncryptedDb004, TestSize.Level1)
1084 {
1085 KvStoreNbDelegate::Option option1 = {true, false, true, CipherType::DEFAULT, g_passwd1};
1086 g_mgr.GetKvStore(STORE_ID1, option1, g_kvNbDelegateCallback);
1087 ASSERT_TRUE(g_kvNbDelegatePtr != nullptr);
1088 EXPECT_EQ(g_errCode, OK);
1089 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK);
1090
1091 #ifndef OMIT_MULTI_VER
1092 KvStoreDelegate::Option option2 = {true, false, true, CipherType::DEFAULT, g_passwd3};
1093 g_mgr.GetKvStore(STORE_ID3, option2, g_kvDelegateCallback);
1094 ASSERT_TRUE(g_kvDelegatePtr != nullptr);
1095 EXPECT_EQ(g_errCode, OK);
1096 EXPECT_EQ(g_mgr.CloseKvStore(g_kvDelegatePtr), OK);
1097 #endif // OMIT_MULTI_VER
1098
1099 /**
1100 * @tc.steps: step1. create single version encrypted database
1101 * @tc.expected: step1. Get result INVALID_ARGS.
1102 */
1103 KvStoreNbDelegate::Option option3 = {true, false, true, CipherType::DEFAULT, g_passwd2};
1104 g_mgr.GetKvStore(STORE_ID1, option3, g_kvNbDelegateCallback);
1105 EXPECT_TRUE(g_kvNbDelegatePtr == nullptr);
1106 EXPECT_EQ(g_errCode, INVALID_PASSWD_OR_CORRUPTED_DB);
1107 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), INVALID_ARGS);
1108
1109 #ifndef OMIT_MULTI_VER
1110 /**
1111 * @tc.steps: step2. create multi version encrypted database
1112 * @tc.expected: step2. Get result INVALID_ARGS.
1113 */
1114 KvStoreDelegate::Option option4 = {true, false, true, CipherType::DEFAULT, g_passwd2};
1115 g_mgr.GetKvStore(STORE_ID3, option4, g_kvDelegateCallback);
1116 EXPECT_TRUE(g_kvDelegatePtr == nullptr);
1117 EXPECT_EQ(g_errCode, INVALID_PASSWD_OR_CORRUPTED_DB);
1118 EXPECT_EQ(g_mgr.CloseKvStore(g_kvDelegatePtr), INVALID_ARGS);
1119 EXPECT_EQ(g_mgr.DeleteKvStore(STORE_ID3), OK);
1120 #endif // OMIT_MULTI_VER
1121
1122 /**
1123 * @tc.steps: step3. Close db.
1124 * @tc.expected: step3. Get result ok.
1125 */
1126 EXPECT_EQ(g_mgr.DeleteKvStore(STORE_ID1), OK);
1127 }
1128 #endif