• 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 #include <gtest/gtest.h>
16 #include <ctime>
17 #include <cmath>
18 #include <random>
19 #include <chrono>
20 #include <string>
21 
22 #include "distributeddb_data_generator.h"
23 #include "distributed_test_tools.h"
24 #include "kv_store_delegate.h"
25 #include "kv_store_delegate_manager.h"
26 
27 using namespace std;
28 using namespace chrono;
29 using namespace testing;
30 #if defined TESTCASES_USING_GTEST_EXT
31 using namespace testing::ext;
32 #endif
33 using namespace DistributedDB;
34 using namespace DistributedDBDataGenerator;
35 
36 namespace DistributeddbKvCrud {
37 class DistributeddbKvCrudTest : public testing::Test {
38 public:
39     static void SetUpTestCase(void);
40     static void TearDownTestCase(void);
41     void SetUp();
42     void TearDown();
43 private:
44 };
45 
46 const bool IS_LOCAL = GetRandBool();
47 KvStoreDelegate *g_kvStoreDelegate = nullptr; // the delegate used in this suit.
48 KvStoreDelegateManager *g_manager = nullptr;
SetUpTestCase(void)49 void DistributeddbKvCrudTest::SetUpTestCase(void)
50 {
51 }
52 
TearDownTestCase(void)53 void DistributeddbKvCrudTest::TearDownTestCase(void)
54 {
55 }
56 
SetUp(void)57 void DistributeddbKvCrudTest::SetUp(void)
58 {
59     MST_LOG("SetUp TestCase before every case local[%d].", IS_LOCAL);
60     RemoveDir(DIRECTOR);
61 
62     UnitTest *test = UnitTest::GetInstance();
63     ASSERT_NE(test, nullptr);
64     const TestInfo *testinfo = test->current_test_info();
65     ASSERT_NE(testinfo, nullptr);
66     string testCaseName = string(testinfo->name());
67     MST_LOG("[SetUp] test case %s is start to run", testCaseName.c_str());
68 
69     KvOption option = g_kvOption;
70     option.localOnly = IS_LOCAL;
71     g_kvStoreDelegate = DistributedTestTools::GetDelegateSuccess(g_manager, g_kvdbParameter1, option);
72     ASSERT_TRUE(g_manager != nullptr && g_kvStoreDelegate != nullptr);
73 }
74 
TearDown(void)75 void DistributeddbKvCrudTest::TearDown(void)
76 {
77     MST_LOG("TearDownTestCase after all cases.");
78     EXPECT_TRUE(g_manager->CloseKvStore(g_kvStoreDelegate) == OK);
79     g_kvStoreDelegate = nullptr;
80     DBStatus status = g_manager->DeleteKvStore(STORE_ID_1);
81     EXPECT_TRUE(status == DistributedDB::DBStatus::OK) << "fail to delete exist kvdb";
82     delete g_manager;
83     g_manager = nullptr;
84     RemoveDir(DIRECTOR);
85 }
86 
87 /*
88  * @tc.name: SimpleDataTest 001
89  * @tc.desc: Verify that can put value to db and get successfully.
90  * @tc.type: FUNC
91  * @tc.require: SR000BUH3J
92  * @tc.author: luqianfu
93  */
94 HWTEST_F(DistributeddbKvCrudTest, SimpleDataTest001, TestSize.Level1)
95 {
96     /**
97      * @tc.steps: step1. create kv db and put (k1,v1) then get the value of k1 from db.
98      * @tc.expected: step1. put successfully and get the value of k1 is v1.
99      */
100     DBStatus status = DistributedTestTools::Put(*g_kvStoreDelegate, KEY_1, VALUE_1);
101     ASSERT_TRUE(status == DBStatus::OK);
102     Value valueResult = DistributedTestTools::Get(*g_kvStoreDelegate, KEY_1);
103     EXPECT_TRUE(valueResult.size() != 0);
104     EXPECT_TRUE(DistributedTestTools::IsValueEquals(valueResult, VALUE_1));
105 
106     /**
107      * @tc.steps: step2. create kv db and put (k2,v2) then get the value of k2 from db.
108      * @tc.expected: step2. put successfully and get the value of k2 is v2.
109      */
110     status = DistributedTestTools::Put(*g_kvStoreDelegate, KEY_2, VALUE_2);
111     ASSERT_TRUE(status == DBStatus::OK);
112     Value valueResult2 = DistributedTestTools::Get(*g_kvStoreDelegate, KEY_2);
113     EXPECT_TRUE(DistributedTestTools::IsValueEquals(valueResult2, VALUE_2));
114 }
115 
116 /*
117  * @tc.name: SimpleDataTest 002
118  * @tc.desc: Verify that can delete value and get successfully.
119  * @tc.type: FUNC
120  * @tc.require: SR000BUH3J
121  * @tc.author: luqianfu
122  */
123 HWTEST_F(DistributeddbKvCrudTest, SimpleDataTest002, TestSize.Level1)
124 {
125     /**
126      * @tc.steps: step1. create kv db and put (k1,v1) then get the value of k1 from db.
127      * @tc.expected: step1. put successfully and get the value of k1 is v1.
128      */
129     DBStatus status = DistributedTestTools::Put(*g_kvStoreDelegate, KEY_1, VALUE_1);
130     ASSERT_TRUE(status == DBStatus::OK);
131     Value valueResult = DistributedTestTools::Get(*g_kvStoreDelegate, KEY_1);
132     EXPECT_TRUE(valueResult.size() != 0);
133 
134     /**
135      * @tc.steps: step2. delete k1 from db.
136      * @tc.expected: step2. delete successfully.
137      */
138     status = DistributedTestTools::Delete(*g_kvStoreDelegate, KEY_1);
139     ASSERT_TRUE(status == DBStatus::OK);
140 
141     /**
142      * @tc.steps: step3. get k1 from db.
143      * @tc.expected: step3. get successfully but value is null.
144      */
145     Value valueResult2 = DistributedTestTools::Get(*g_kvStoreDelegate, KEY_1);
146     EXPECT_TRUE(valueResult2.size() == 0);
147 }
148 
149 /*
150  * @tc.name: SimpleDataTest 003
151  * @tc.desc: Verify that can put the same key with different value and get successfully.
152  * @tc.type: FUNC
153  * @tc.require: SR000BUH3J
154  * @tc.author: luqianfu
155  */
156 HWTEST_F(DistributeddbKvCrudTest, SimpleDataTest003, TestSize.Level1)
157 {
158     /**
159      * @tc.steps: step1. create kv db and put (k1,v1) then get the value of k1 from db.
160      * @tc.expected: step1. put successfully and get the value of k1 is v1.
161      */
162     DBStatus status = DistributedTestTools::Put(*g_kvStoreDelegate, KEY_1, VALUE_1);
163     ASSERT_TRUE(status == DBStatus::OK);
164     Value valueResult = DistributedTestTools::Get(*g_kvStoreDelegate, KEY_1);
165     EXPECT_TRUE(valueResult.size() != 0);
166     EXPECT_TRUE(DistributedTestTools::IsValueEquals(valueResult, VALUE_1));
167 
168     /**
169      * @tc.steps: step2. create kv db and put (k1,v2) then get the value of k1 from db.
170      * @tc.expected: step2. put successfully and get the value of k1 is v2.
171      */
172     status = DistributedTestTools::Put(*g_kvStoreDelegate, KEY_1, VALUE_2);
173     ASSERT_TRUE(status == DBStatus::OK);
174     valueResult = DistributedTestTools::Get(*g_kvStoreDelegate, KEY_1);
175     EXPECT_TRUE(valueResult.size() != 0);
176     EXPECT_TRUE(DistributedTestTools::IsValueEquals(valueResult, VALUE_2));
177 
178     /**
179      * @tc.steps: step3. create kv db and put (k1,v1) then get the value of k1 from db.
180      * @tc.expected: step3. put successfully and get the value of k1 is v1.
181      */
182     status = DistributedTestTools::Put(*g_kvStoreDelegate, KEY_1, VALUE_1);
183     ASSERT_TRUE(status == DBStatus::OK);
184     valueResult = DistributedTestTools::Get(*g_kvStoreDelegate, KEY_1);
185     EXPECT_TRUE(valueResult.size() != 0);
186     EXPECT_TRUE(DistributedTestTools::IsValueEquals(valueResult, VALUE_1));
187 }
188 
189 /*
190  * @tc.name: SimpleDataTest 004
191  * @tc.desc: Verify that put a null value to db will get nothing.
192  * @tc.type: FUNC
193  * @tc.require: SR000BUH3J
194  * @tc.author: luqianfu
195  */
196 HWTEST_F(DistributeddbKvCrudTest, SimpleDataTest004, TestSize.Level1)
197 {
198     DBStatus status = DistributedTestTools::Delete(*g_kvStoreDelegate, KEY_1);
199     ASSERT_EQ(status, DBStatus::OK);
200 
201     /**
202      * @tc.steps: step1. create kv db and put (k1,null).
203      * @tc.expected: step1. put ok.
204      */
205     status = DistributedTestTools::Put(*g_kvStoreDelegate, KEY_1, VALUE_EMPTY);
206     ASSERT_EQ(status, DBStatus::OK);
207     /**
208      * @tc.steps: step2. get the value of k1 from db.
209      * @tc.expected: step2. get successfully and get the value of k1 is null.
210      */
211     Value valueResult = DistributedTestTools::Get(*g_kvStoreDelegate, KEY_1);
212     EXPECT_TRUE(valueResult.size() == 0);
213 }
214 
215 /*
216  * @tc.name: SimpleDataTest 005
217  * @tc.desc: Verify that can not put a null key to db.
218  * @tc.type: FUNC
219  * @tc.require: SR000BUH3J
220  * @tc.author: luqianfu
221  */
222 HWTEST_F(DistributeddbKvCrudTest, SimpleDataTest005, TestSize.Level1)
223 {
224     /**
225      * @tc.steps: step1. create kv db and put (null,v1).
226      * @tc.expected: step1. put failed.
227      */
228     DBStatus status = DistributedTestTools::Put(*g_kvStoreDelegate, KEY_EMPTY, VALUE_1);
229     ASSERT_TRUE(status == DBStatus::INVALID_ARGS);
230     /**
231      * @tc.steps: step2. get k=null from db.
232      * @tc.expected: step2. get value of k is null.
233      */
234     Value valueResult = DistributedTestTools::Get(*g_kvStoreDelegate, KEY_EMPTY);
235     EXPECT_TRUE(valueResult.size() == 0);
236 }
237 
238 /*
239  * @tc.name: SimpleDataTest 006
240  * @tc.desc: Verify that can delete the entry that not exist.
241  * @tc.type: FUNC
242  * @tc.require: SR000BUH3J
243  * @tc.author: luqianfu
244  */
245 HWTEST_F(DistributeddbKvCrudTest, SimpleDataTest006, TestSize.Level1)
246 {
247     /**
248      * @tc.steps: step1. delete k1 from db.
249      * @tc.expected: step1. Construct that no k1 exist in db.
250      */
251     DBStatus status = DistributedTestTools::Delete(*g_kvStoreDelegate, KEY_1);
252     ASSERT_TRUE(status == DBStatus::OK);
253 
254     /**
255      * @tc.steps: step2. get k1 from db.
256      * @tc.expected: step2. get the value of k1 is null.
257      */
258     Value valueResult = DistributedTestTools::Get(*g_kvStoreDelegate, KEY_1);
259     EXPECT_TRUE(valueResult.size() == 0);
260 }
261 
262 /*
263  * @tc.name: SimpleDataTest 007
264  * @tc.desc: Verify that delete absent key return OK.
265  * @tc.type: FUNC
266  * @tc.require: SR000BUH3J
267  * @tc.author: luqianfu
268  */
269 HWTEST_F(DistributeddbKvCrudTest, SimpleDataTest007, TestSize.Level1)
270 {
271     /**
272      * @tc.steps: step1. delete k1 from db.
273      * @tc.expected: step1. Construct that no k1 exist in db.
274      */
275     DBStatus status = DistributedTestTools::Delete(*g_kvStoreDelegate, KEY_1);
276     ASSERT_TRUE(status == DBStatus::OK);
277 
278     /**
279      * @tc.steps: step2. delete nonexistent k1 from db.
280      * @tc.expected: step2. delete failed but return OK.
281      */
282     status = DistributedTestTools::Delete(*g_kvStoreDelegate, KEY_1);
283     ASSERT_TRUE(status == DBStatus::OK);
284 }
285 
286 /*
287  * @tc.name: SimpleDataTest 008
288  * @tc.desc: Verify that can the Clear interface can delete all the records one time.
289  * @tc.type: FUNC
290  * @tc.require: SR000BUH3J
291  * @tc.author: luqianfu
292  */
293 HWTEST_F(DistributeddbKvCrudTest, SimpleDataTest008, TestSize.Level1)
294 {
295     /**
296      * @tc.steps: step1. create kv db and put (k1,v1)(k1,v2).
297      * @tc.expected: step1. put successfully.cd ..
298      */
299     DBStatus status = DistributedTestTools::Put(*g_kvStoreDelegate, KEY_1, VALUE_1);
300     ASSERT_TRUE(status == DBStatus::OK);
301     status = DistributedTestTools::Put(*g_kvStoreDelegate, KEY_2, VALUE_2);
302     ASSERT_TRUE(status == DBStatus::OK);
303 
304     /**
305      * @tc.steps: step2. delete all k from db then get k1 from db.
306      * @tc.expected: step2. delete successfully and get the value of k1 if null.
307      */
308     status = DistributedTestTools::Clear(*g_kvStoreDelegate);
309     ASSERT_TRUE(status == DBStatus::OK);
310     Value valueResult = DistributedTestTools::Get(*g_kvStoreDelegate, KEY_1);
311     EXPECT_TRUE(valueResult.size() == 0);
312 }
313 
314 /*
315  * @tc.name: SimpleDataTest 009
316  * @tc.desc: Verify that can crud the same key continuously.
317  * @tc.type: FUNC
318  * @tc.require: SR000BUH3J
319  * @tc.author: luqianfu
320  */
321 HWTEST_F(DistributeddbKvCrudTest, SimpleDataTest009, TestSize.Level1)
322 {
323     for (int cnt = 0; cnt < FIVE_TIMES; cnt++) {
324         /**
325          * @tc.steps: step1. create kv db and put (k1,v1) and check the records.
326          * @tc.expected: step1. put successfully and the value of the k1 in db is v1.
327          */
328         DBStatus status = DistributedTestTools::Put(*g_kvStoreDelegate, KEY_1, VALUE_1);
329         ASSERT_TRUE(status == DBStatus::OK);
330         Value valueResult = DistributedTestTools::Get(*g_kvStoreDelegate, KEY_1);
331         EXPECT_TRUE(valueResult.size() != 0);
332         EXPECT_TRUE(DistributedTestTools::IsValueEquals(valueResult, VALUE_1));
333         /**
334          * @tc.steps: step2. put (k1,v2) to db and get.
335          * @tc.expected: step2. put successfully and get the value of k1 is v2.
336          */
337         status = DistributedTestTools::Put(*g_kvStoreDelegate, KEY_1, VALUE_2);
338         ASSERT_TRUE(status == DBStatus::OK);
339         valueResult = DistributedTestTools::Get(*g_kvStoreDelegate, KEY_1);
340         EXPECT_TRUE(valueResult.size() != 0);
341         EXPECT_TRUE(DistributedTestTools::IsValueEquals(valueResult, VALUE_2));
342         /**
343          * @tc.steps: step3. delete k1 from db and get.
344          * @tc.expected: step3. delete successfully and get the value of k1 is null.
345          */
346         status = DistributedTestTools::Delete(*g_kvStoreDelegate, KEY_1);
347         ASSERT_TRUE(status == DBStatus::OK);
348         valueResult = DistributedTestTools::Get(*g_kvStoreDelegate, KEY_1);
349         EXPECT_TRUE(valueResult.size() == 0);
350     }
351 }
352 
353 /*
354  * @tc.name: ComplexDataTest 001
355  * @tc.desc: Verify that can operate a long string key and key's length can not bigger than 1K.
356  * @tc.type: FUNC
357  * @tc.require: SR000BUH3J
358  * @tc.author: luqianfu
359  */
360 HWTEST_F(DistributeddbKvCrudTest, ComplexDataTest001, TestSize.Level1)
361 {
362     DistributedDB::Key longKey1, longKey2;
363     longKey1.assign(ONE_K_LONG_STRING, (uint8_t)'a');
364     longKey2.assign(ONE_K_LONG_STRING + 1, (uint8_t)'b'); // 1 Byte bigger than 1024Byte
365     /**
366      * @tc.steps: step1. create kv db and put (longKey1,null) which the length of longKey1 is 1k and get.
367      * @tc.expected: step1. put successfully and get the value of longKey1 is null.
368      */
369     DBStatus status = DistributedTestTools::Put(*g_kvStoreDelegate, longKey1, VALUE_EMPTY);
370     ASSERT_TRUE(status == DBStatus::OK);
371     Value valueResult = DistributedTestTools::Get(*g_kvStoreDelegate, longKey1);
372     EXPECT_TRUE(valueResult.size() == 0);
373     /**
374      * @tc.steps: step2. create kv db and put (longKey2,null) which the length of longKey2 is 1k+1 and get.
375      * @tc.expected: step2. put successfully and get the value of longKey2 is null.
376      */
377     status = DistributedTestTools::Put(*g_kvStoreDelegate, longKey2, VALUE_EMPTY);
378     ASSERT_TRUE(status != DBStatus::OK);
379     valueResult = DistributedTestTools::Get(*g_kvStoreDelegate, longKey2);
380     EXPECT_TRUE(valueResult.size() == 0);
381 
382     /**
383      * @tc.steps: step3. create kv db and put (longKey1,ok_v1) which the length of longKey1 is 1k and get.
384      * @tc.expected: step3. put successfully and get the size of longKey1.value is 1k.
385      */
386     status = DistributedTestTools::Put(*g_kvStoreDelegate, longKey1, OK_VALUE_1);
387     ASSERT_TRUE(status == DBStatus::OK);
388     valueResult = DistributedTestTools::Get(*g_kvStoreDelegate, longKey1);
389     EXPECT_TRUE(valueResult.size() == OK_VALUE_1.size());
390     /**
391      * @tc.steps: step4. create kv db and put (longKey2,ok_v1) which the length of longKey2 is 1k+1 and get.
392      * @tc.expected: step4. put failed and get the value of longKey2 is null.
393      */
394     status = DistributedTestTools::Put(*g_kvStoreDelegate, longKey2, OK_VALUE_1);
395     ASSERT_TRUE(status != DBStatus::OK);
396     valueResult = DistributedTestTools::Get(*g_kvStoreDelegate, longKey2);
397     EXPECT_TRUE(valueResult.size() == 0);
398 
399     /**
400      * @tc.steps: step5. delete longKey1 from db and get.
401      * @tc.expected: step5. delete successfully and get the value of longKey1 is null.
402      */
403     status = DistributedTestTools::Delete(*g_kvStoreDelegate, longKey1);
404     ASSERT_EQ(status, DBStatus::OK);
405     valueResult = DistributedTestTools::Get(*g_kvStoreDelegate, longKey1);
406     EXPECT_TRUE(valueResult.size() == 0);
407     /**
408      * @tc.steps: step6. delete longKey2 from db and get.
409      * @tc.expected: step6. delete failed and get the value of longKey2 is null.
410      */
411     status = DistributedTestTools::Delete(*g_kvStoreDelegate, longKey2);
412     ASSERT_NE(status, DBStatus::OK);
413     valueResult = DistributedTestTools::Get(*g_kvStoreDelegate, longKey2);
414     EXPECT_TRUE(valueResult.size() == 0);
415 }
416 
417 /*
418  * @tc.name: ComplexDataTest 002
419  * @tc.desc: Verify that can operate a long string value and value's length can not bigger than 4M.
420  * @tc.type: FUNC
421  * @tc.require: SR000BUH3J
422  * @tc.author: luqianfu
423  */
424 HWTEST_F(DistributeddbKvCrudTest, ComplexDataTest002, TestSize.Level1)
425 {
426     DistributedDB::Value longValue1, longValue2;
427     longValue1.assign(FOUR_M_LONG_STRING, (uint8_t)'a');
428     longValue2.assign(FOUR_M_LONG_STRING + 1, (uint8_t)'b');
429 
430     /**
431      * @tc.steps: step1. create kv db and put (OK_K1,longValue1) which the length of longValue1 is 4M and get.
432      * @tc.expected: step1. put successfully and get the value of OK_K1 is longValue1.
433      */
434     DBStatus status = DistributedTestTools::Put(*g_kvStoreDelegate, OK_KEY_1, longValue1);
435     ASSERT_TRUE(status == DBStatus::OK);
436     Value valueResult = DistributedTestTools::Get(*g_kvStoreDelegate, OK_KEY_1);
437     EXPECT_TRUE(valueResult.size() == FOUR_M_LONG_STRING);
438     EXPECT_TRUE(DistributedTestTools::IsValueEquals(valueResult, longValue1));
439 
440     /**
441      * @tc.steps: step2. create kv db and put (OK_K1,longValue2) which the length of longValue2 is 4M+1 and get.
442      * @tc.expected: step2. put failed and get the size of longValue2 is 4M.
443      */
444     status = DistributedTestTools::Put(*g_kvStoreDelegate, OK_KEY_1, longValue2);
445     ASSERT_TRUE(status != DBStatus::OK);
446     valueResult = DistributedTestTools::Get(*g_kvStoreDelegate, OK_KEY_1);
447     EXPECT_TRUE(valueResult.size() == FOUR_M_LONG_STRING);
448 
449     /**
450      * @tc.steps: step3. delete OK_KEY_1 and get.
451      * @tc.expected: step3. delete successfully and get the value of OK_KEY_1 is null.
452      */
453     status = DistributedTestTools::Delete(*g_kvStoreDelegate, OK_KEY_1);
454     ASSERT_TRUE(status == DBStatus::OK);
455     valueResult = DistributedTestTools::Get(*g_kvStoreDelegate, OK_KEY_1);
456     EXPECT_TRUE(valueResult.size() == 0);
457 }
458 
459 /*
460  * @tc.name: ComplexDataTest 003
461  * @tc.desc: Verify that can operate an alphanum string key.
462  * @tc.type: FUNC
463  * @tc.require: SR000BUH3J
464  * @tc.author: luqianfu
465  */
466 HWTEST_F(DistributeddbKvCrudTest, ComplexDataTest003, TestSize.Level1)
467 {
468     DistributedDB::Key alphanumKey1;
469     char chr;
470     for (chr = 'a'; chr <= 'z'; ++chr) {
471         alphanumKey1.push_back(chr);
472     }
473     for (chr = 'A'; chr <= 'Z'; ++chr) {
474         alphanumKey1.push_back(chr);
475     }
476     for (chr = '0'; chr <= '9'; ++chr) {
477         alphanumKey1.push_back(chr);
478     }
479 
480     /**
481      * @tc.steps: step1. create kv db and put (alphanumKey1,null) that alphanumKey1=[a-zA-Z0-9].
482      * @tc.expected: step1. put successfully and get the value of alphanumKey1 is null.
483      */
484     DBStatus status = DistributedTestTools::Put(*g_kvStoreDelegate, alphanumKey1, VALUE_EMPTY);
485     ASSERT_TRUE(status == DBStatus::OK);
486     Value valueResult = DistributedTestTools::Get(*g_kvStoreDelegate, alphanumKey1);
487     EXPECT_TRUE(valueResult.size() == 0);
488     EXPECT_TRUE(DistributedTestTools::IsValueEquals(valueResult, VALUE_EMPTY));
489 
490     /**
491      * @tc.steps: step2. create kv db and put (alphanumKey1,OK_VALUE_1) that alphanumKey1=[a-zA-Z0-9].
492      * @tc.expected: step2. put successfully and get the value of alphanumKey1 is OK_VALUE_1.
493      */
494     status = DistributedTestTools::Put(*g_kvStoreDelegate, alphanumKey1, OK_VALUE_1);
495     ASSERT_TRUE(status == DBStatus::OK);
496     valueResult = DistributedTestTools::Get(*g_kvStoreDelegate, alphanumKey1);
497     EXPECT_TRUE(valueResult.size() == OK_VALUE_1.size());
498     EXPECT_TRUE(DistributedTestTools::IsValueEquals(valueResult, OK_VALUE_1));
499 
500     /**
501      * @tc.steps: step3. delete alphanumKey1 from db and get.
502      * @tc.expected: step3. delete successfully and get the value of alphanumKey1 is null.
503      */
504     status = DistributedTestTools::Delete(*g_kvStoreDelegate, alphanumKey1);
505     ASSERT_TRUE(status == DBStatus::OK);
506     valueResult = DistributedTestTools::Get(*g_kvStoreDelegate, alphanumKey1);
507     EXPECT_TRUE(valueResult.size() == 0);
508 }
509 
510 /*
511  * @tc.name: ComplexDataTest 004
512  * @tc.desc: Verify that can operate a alphanum string value.
513  * @tc.type: FUNC
514  * @tc.require: SR000BUH3J
515  * @tc.author: luqianfu
516  */
517 HWTEST_F(DistributeddbKvCrudTest, ComplexDataTest004, TestSize.Level1)
518 {
519     DistributedDB::Value alphanumValue1, alphanumValue2;
520     int chr;
521     for (chr = 'a'; chr <= 'z'; ++chr) {
522         alphanumValue1.push_back(chr);
523         alphanumValue2.push_back('a' + 'z' - chr);
524     }
525     for (chr = 'A'; chr <= 'Z'; ++chr) {
526         alphanumValue1.push_back(chr);
527         alphanumValue2.push_back('A' + 'Z' - chr);
528     }
529     for (chr = '0'; chr <= '9'; ++chr) {
530         alphanumValue1.push_back(chr);
531         alphanumValue2.push_back('0' + '9' - chr);
532     }
533 
534     /**
535      * @tc.steps: step1. create kv db and put (OK_KEY_1,alphanumValue1) that alphanumValue1=[a-zA-Z0-9].
536      * @tc.expected: step1. put successfully and get the value of OK_KEY_1 is alphanumValue1.
537      */
538     DBStatus status = DistributedTestTools::Put(*g_kvStoreDelegate, OK_KEY_1, alphanumValue1);
539     ASSERT_TRUE(status == DBStatus::OK);
540     Value valueResult = DistributedTestTools::Get(*g_kvStoreDelegate, OK_KEY_1);
541     EXPECT_TRUE(valueResult.size() == alphanumValue1.size());
542     EXPECT_TRUE(DistributedTestTools::IsValueEquals(valueResult, alphanumValue1));
543 
544     /**
545      * @tc.steps: step2. create kv db and put (OK_KEY_1,alphanumValue2) that alphanumValue1=[z-aZ-A9-0].
546      * @tc.expected: step2. put successfully and get the value of OK_KEY_1 is alphanumValue2.
547      */
548     status = DistributedTestTools::Put(*g_kvStoreDelegate, OK_KEY_1, alphanumValue2);
549     ASSERT_TRUE(status == DBStatus::OK);
550     valueResult = DistributedTestTools::Get(*g_kvStoreDelegate, OK_KEY_1);
551     EXPECT_TRUE(valueResult.size() == alphanumValue2.size());
552     EXPECT_TRUE(DistributedTestTools::IsValueEquals(valueResult, alphanumValue2));
553 
554     /**
555      * @tc.steps: step3. delete OK_KEY_1 from db and get.
556      * @tc.expected: step3. delete successfully and get the value of OK_KEY_1 is null.
557      */
558     status = DistributedTestTools::Delete(*g_kvStoreDelegate, OK_KEY_1);
559     ASSERT_TRUE(status == DBStatus::OK);
560     valueResult = DistributedTestTools::Get(*g_kvStoreDelegate, OK_KEY_1);
561     EXPECT_TRUE(valueResult.size() == 0);
562 }
563 
564 /*
565  * @tc.name: ComplexDataTest 005
566  * @tc.desc: Verify that can operate a full ASCII set string key.
567  * @tc.type: FUNC
568  * @tc.require: SR000BUH3J
569  * @tc.author: luqianfu
570  */
571 HWTEST_F(DistributeddbKvCrudTest, ComplexDataTest005, TestSize.Level1)
572 {
573     DistributedDB::Key fullAsciiKey1;
574     for (int cVal = 0; cVal <= 255; ++cVal) {
575         fullAsciiKey1.push_back(cVal);
576     }
577 
578     /**
579      * @tc.steps: step1. create kv db and put (fullAsciiKey1,null) that fullAsciiKey1=[\0-\255].
580      * @tc.expected: step1. put successfully and get the value of fullAsciiKey1 is null.
581      */
582     DBStatus status = DistributedTestTools::Put(*g_kvStoreDelegate, fullAsciiKey1, VALUE_EMPTY);
583     ASSERT_TRUE(status == DBStatus::OK);
584     Value valueResult = DistributedTestTools::Get(*g_kvStoreDelegate, fullAsciiKey1);
585     EXPECT_TRUE(valueResult.size() == 0);
586     EXPECT_TRUE(DistributedTestTools::IsValueEquals(valueResult, VALUE_EMPTY));
587 
588     /**
589      * @tc.steps: step2. create kv db and put (fullAsciiKey1,OK_VALUE_1) that fullAsciiKey1=[\0-\255].
590      * @tc.expected: step2. put successfully and get the value of fullAsciiKey1 is OK_VALUE_1.
591      */
592     status = DistributedTestTools::Put(*g_kvStoreDelegate, fullAsciiKey1, OK_VALUE_1);
593     ASSERT_TRUE(status == DBStatus::OK);
594     valueResult = DistributedTestTools::Get(*g_kvStoreDelegate, fullAsciiKey1);
595     EXPECT_TRUE(valueResult.size() == OK_VALUE_1.size());
596     EXPECT_TRUE(DistributedTestTools::IsValueEquals(valueResult, OK_VALUE_1));
597 
598     /**
599      * @tc.steps: step3. delete fullAsciiKey1 from db and get.
600      * @tc.expected: step3. delete successfully and get the value of fullAsciiKey1 is null.
601      */
602     status = DistributedTestTools::Delete(*g_kvStoreDelegate, fullAsciiKey1);
603     ASSERT_TRUE(status == DBStatus::OK);
604     valueResult = DistributedTestTools::Get(*g_kvStoreDelegate, fullAsciiKey1);
605     EXPECT_TRUE(valueResult.size() == 0);
606 }
607 
608 /*
609  * @tc.name: ComplexDataTest 006
610  * @tc.desc: Verify that can operate a full ASCII set string value.
611  * @tc.type: FUNC
612  * @tc.require: SR000BUH3J
613  * @tc.author: luqianfu
614  */
615 HWTEST_F(DistributeddbKvCrudTest, ComplexDataTest006, TestSize.Level1)
616 {
617     DistributedDB::Value fullAsciiValue1, fullAsciiValue2;
618     for (int cVal = 0; cVal <= 255; ++cVal) {
619         fullAsciiValue1.push_back(cVal);
620         fullAsciiValue2.push_back(255 - cVal);
621     }
622 
623     /**
624      * @tc.steps: step1. create kv db and put (OK_KEY_1,fullAsciiValue1) that fullAsciiValue1=[\0-\255].
625      * @tc.expected: step1. put successfully and get the value of OK_KEY_1 is fullAsciiValue1.
626      */
627     DBStatus status = DistributedTestTools::Put(*g_kvStoreDelegate, OK_KEY_1, fullAsciiValue1);
628     ASSERT_TRUE(status == DBStatus::OK);
629     Value valueResult = DistributedTestTools::Get(*g_kvStoreDelegate, OK_KEY_1);
630     EXPECT_TRUE(valueResult.size() == fullAsciiValue1.size());
631     EXPECT_TRUE(DistributedTestTools::IsValueEquals(valueResult, fullAsciiValue1));
632 
633     /**
634      * @tc.steps: step2. create kv db and put (OK_KEY_1,fullAsciiValue2) that fullAsciiValue2=[\255-\0].
635      * @tc.expected: step2. put successfully and get the value of OK_KEY_1 is fullAsciiValue2.
636      */
637     status = DistributedTestTools::Put(*g_kvStoreDelegate, OK_KEY_1, fullAsciiValue2);
638     ASSERT_TRUE(status == DBStatus::OK);
639     valueResult = DistributedTestTools::Get(*g_kvStoreDelegate, OK_KEY_1);
640     EXPECT_TRUE(valueResult.size() == fullAsciiValue2.size());
641     EXPECT_TRUE(DistributedTestTools::IsValueEquals(valueResult, fullAsciiValue2));
642 
643     /**
644      * @tc.steps: step3. delete OK_KEY_1 from db and get.
645      * @tc.expected: step3. delete successfully and get the value of OK_KEY_1 is null.
646      */
647     status = DistributedTestTools::Delete(*g_kvStoreDelegate, OK_KEY_1);
648     ASSERT_TRUE(status == DBStatus::OK);
649     valueResult = DistributedTestTools::Get(*g_kvStoreDelegate, OK_KEY_1);
650     EXPECT_TRUE(valueResult.size() == 0);
651 }
652 
653 /*
654  * @tc.name: ComplexDataTest 007
655  * @tc.desc: Verify that can operate chinese string key and value.
656  * @tc.type: FUNC
657  * @tc.require: SR000BUH3J
658  * @tc.author: luqianfu
659  */
660 HWTEST_F(DistributeddbKvCrudTest, ComplexDataTest007, TestSize.Level1)
661 {
662     /*
663      * @tc.steps: step1. create kv db and put(k,OK_VALUE_1) that k="中文"and get.
664      * @tc.expected: step1. put successfully and get the value of k is OK_VALUE_1.
665      */
666 }
667 
668 /*
669  * @tc.name: ReadWritePerformance 001
670  * @tc.desc: calculate the time of put-get in 16b-100b/16b-100kb, 1k times' random-put&get.
671  * @tc.type: Performance
672  * @tc.require: SR000BUH3J
673  * @tc.author: luqianfu
674  */
675 HWTEST_F(DistributeddbKvCrudTest, ReadWritePerformance001, TestSize.Level3)
676 {
677     const int PERFORMANCE_SIZE = 6;
678     PerformanceData performanceData[PERFORMANCE_SIZE] = {
679     /**
680      * @tc.steps: step1. put/get 16B key,100B value with random model.
681      * @tc.expected: step1. Performance of put&get is normal.
682      */
683         { 1, 16, 100, false, false, false, false, IS_LOCAL },
684     /**
685      * @tc.steps: step2. put/get 16B key,100KB value with random model.
686      * @tc.expected: step2. Performance of put&get is normal.
687      */
688         { 1, 16, 100 * 1000, false, false, false, false, IS_LOCAL },
689     /**
690      * @tc.steps: step3. put/get 16B key,100B value with random model.
691      * @tc.expected: step3. Performance of put&get is normal.
692      */
693         { 50, 16, 100, false, false, false, false, IS_LOCAL },
694     /**
695      * @tc.steps: step4. put/get 16B key,100KB value with random model.
696      * @tc.expected: step4. Performance of put&get is normal.
697      */
698         { 50, 16, 100 * 1000, false, false, false, false, IS_LOCAL },
699     /**
700      * @tc.steps: step5. put/get 16B key,100B value with random model.
701      * @tc.expected: step5. Performance of put&get is normal.
702      */
703         { 100, 16, 100, false, false, false, false, IS_LOCAL },
704     /**
705      * @tc.steps: step6. put/get 16B key,100B value with random model.
706      * @tc.expected: step6. Performance of put&get is normal.
707      */
708         { 100, 16, 100 * 1000, false, false, false, false, IS_LOCAL }
709     };
710 
711     for (int ps = 0; ps < PERFORMANCE_SIZE; ++ps) {
712         DistributedTestTools::CalculateOpenPerformance(performanceData[ps]);
713         DistributedTestTools::CalculateInsertPerformance(performanceData[ps]);
714         DistributedTestTools::CalculateGetPutPerformance(performanceData[ps]);
715         DistributedTestTools::CalculateUpdatePerformance(performanceData[ps]);
716         DistributedTestTools::CalculateGetUpdatePerformance(performanceData[ps]);
717         DistributedTestTools::CalculateUseClearPerformance(performanceData[ps]);
718     }
719 }
720 }