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