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