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 }