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
16 #include <gtest/gtest.h>
17
18 #include "distributeddb_data_generate_unit_test.h"
19 #include "distributeddb_tools_unit_test.h"
20
21 using namespace testing::ext;
22 using namespace DistributedDB;
23 using namespace DistributedDBUnitTest;
24 using namespace std;
25
26 namespace {
27 string g_testDir;
28 const bool LOCAL_ONLY = true;
29 const string STORE_ID = STORE_ID_LOCAL;
30
31 KvStoreDelegateManager g_mgr(APP_ID, USER_ID);
32 KvStoreConfig g_config;
33 // define the g_kvDelegateCallback, used to get some information when open a kv store.
34 DBStatus g_kvDelegateStatusForQuery = INVALID_ARGS;
35 KvStoreDelegate *g_kvDelegatePtrForQuery = nullptr;
36 // the type of g_kvDelegateCallback is function<void(DBStatus, KvStoreDelegate*)>
37 auto g_kvDelegateCallbackForQuery = bind(&DistributedDBToolsUnitTest::KvStoreDelegateCallback, placeholders::_1,
38 placeholders::_2, std::ref(g_kvDelegateStatusForQuery), std::ref(g_kvDelegatePtrForQuery));
39 KvStoreNbDelegate *g_kvNbDelegatePtrForQuery = nullptr;
40 auto g_kvNbDelegateCallbackForQuery = bind(&DistributedDBToolsUnitTest::KvStoreNbDelegateCallback,
41 placeholders::_1, placeholders::_2, std::ref(g_kvDelegateStatusForQuery), std::ref(g_kvNbDelegatePtrForQuery));
42
43 // define the g_kvDelegateCallback, used to get some information when open a kv store.
44 DBStatus g_kvDelegateStatus = INVALID_ARGS;
45 KvStoreDelegate *g_kvDelegatePtr = nullptr;
46 // the type of g_kvDelegateCallback is function<void(DBStatus, KvStoreDelegate*)>
47 auto g_kvDelegateCallback = bind(&DistributedDBToolsUnitTest::KvStoreDelegateCallback, placeholders::_1,
48 placeholders::_2, std::ref(g_kvDelegateStatus), std::ref(g_kvDelegatePtr));
49
50 // define the g_snapshotDelegateCallback, used to get some information when open a kv snapshot.
51 DBStatus g_snapshotDelegateStatus = INVALID_ARGS;
52 KvStoreSnapshotDelegate *g_snapshotDelegatePtr = nullptr;
53 // the type of g_snapshotDelegateCallback is function<void(DBStatus, KvStoreSnapshotDelegate*)>
54 auto g_snapshotDelegateCallback = bind(&DistributedDBToolsUnitTest::SnapshotDelegateCallback,
55 placeholders::_1, placeholders::_2, std::ref(g_snapshotDelegateStatus), std::ref(g_snapshotDelegatePtr));
56
57 // define the g_valueCallback, used to query a value object data from the kvdb.
58 DBStatus g_valueStatus = INVALID_ARGS;
59 Value g_value;
60 // the type of g_valueCallback is function<void(DBStatus, Value)>
61 auto g_valueCallback = bind(&DistributedDBToolsUnitTest::ValueCallback,
62 placeholders::_1, placeholders::_2, std::ref(g_valueStatus), std::ref(g_value));
63
64 // define the g_entryVectorCallback, used to query a vector<Entry> object data from the kvdb.
65 DBStatus g_entryVectorStatus = INVALID_ARGS;
66 unsigned long g_matchSize = 0;
67 std::vector<Entry> g_entriesVector;
68 // the type of g_entryVectorCallback is function<void(DBStatus, vector<Entry>)>
69 auto g_entryVectorCallback = bind(&DistributedDBToolsUnitTest::EntryVectorCallback, placeholders::_1,
70 placeholders::_2, std::ref(g_entryVectorStatus), std::ref(g_matchSize), std::ref(g_entriesVector));
71
72 const string SCHEMA_STRING = "{\"SCHEMA_VERSION\":\"1.0\","
73 "\"SCHEMA_MODE\":\"STRICT\","
74 "\"SCHEMA_DEFINE\":{"
75 "\"field_name1\":\"BOOL\","
76 "\"field_name2\":\"BOOL\","
77 "\"field_name3\":\"INTEGER, NOT NULL\","
78 "\"field_name4\":\"LONG, DEFAULT 100\","
79 "\"field_name5\":\"DOUBLE, NOT NULL, DEFAULT 3.14\","
80 "\"field_name6\":\"STRING, NOT NULL, DEFAULT '3.1415'\","
81 "\"field_name7\":\"LONG, DEFAULT 100\","
82 "\"field_name8\":\"LONG, DEFAULT 100\","
83 "\"field_name9\":\"LONG, DEFAULT 100\","
84 "\"field_name10\":\"LONG, DEFAULT 100\""
85 "},"
86 "\"SCHEMA_INDEXES\":[\"$.field_name1\", \"$.field_name2\"]}";
87
GetSnapshotUnitTest()88 void GetSnapshotUnitTest()
89 {
90 g_kvDelegatePtr->GetKvStoreSnapshot(nullptr, g_snapshotDelegateCallback);
91 EXPECT_TRUE(g_snapshotDelegateStatus == OK);
92 ASSERT_TRUE(g_snapshotDelegatePtr != nullptr);
93 }
94 #ifndef OMIT_JSON
95 const int CIRCLE_COUNT = 3;
PutValidEntries1()96 void PutValidEntries1()
97 {
98 std::string validData = "{\"field_name1\":true,";
99 validData += "\"field_name2\":true,";
100 validData += "\"field_name3\":10,";
101 validData += "\"field_name4\":20,";
102 validData += "\"field_name5\":3.14,";
103 validData += "\"field_name6\":\"3.1415\",";
104 validData += "\"field_name7\":100,";
105 validData += "\"field_name8\":100,";
106 validData += "\"field_name9\":100,";
107 validData += "\"field_name10\":100}";
108
109 Value value(validData.begin(), validData.end());
110 Key key;
111 DistributedDBToolsUnitTest::GetRandomKeyValue(key);
112 EXPECT_EQ(g_kvNbDelegatePtrForQuery->Put(key, value), OK);
113 }
PutValidEntries2()114 void PutValidEntries2()
115 {
116 std::string validData = "{\"field_name1\":true,"
117 "\"field_name2\":false,"
118 "\"field_name3\":10,"
119 "\"field_name4\":20,"
120 "\"field_name5\":3.14,"
121 "\"field_name6\":\"3.1415\","
122 "\"field_name7\":100,"
123 "\"field_name8\":100,"
124 "\"field_name9\":100,"
125 "\"field_name10\":100}";
126 Value value(validData.begin(), validData.end());
127 Key key;
128 DistributedDBToolsUnitTest::GetRandomKeyValue(key);
129 EXPECT_EQ(g_kvNbDelegatePtrForQuery->Put(key, value), OK);
130 }
PutValidEntries3()131 void PutValidEntries3()
132 {
133 std::string validData = "{\"field_name1\":true,"
134 "\"field_name2\":true,"
135 "\"field_name3\":20,"
136 "\"field_name4\":20,"
137 "\"field_name5\":3.14,"
138 "\"field_name6\":\"3.1415\","
139 "\"field_name7\":100,"
140 "\"field_name8\":100,"
141 "\"field_name9\":100,"
142 "\"field_name10\":100}";
143 Value value(validData.begin(), validData.end());
144 Key key;
145 DistributedDBToolsUnitTest::GetRandomKeyValue(key);
146 EXPECT_EQ(g_kvNbDelegatePtrForQuery->Put(key, value), OK);
147 }
PutValidEntries4()148 void PutValidEntries4()
149 {
150 std::string validData = "{\"field_name1\":true,"
151 "\"field_name2\":true,"
152 "\"field_name3\":20,"
153 "\"field_name4\":2,"
154 "\"field_name5\":3.14,"
155 "\"field_name6\":\"3.1415\","
156 "\"field_name7\":100,"
157 "\"field_name8\":100,"
158 "\"field_name9\":100,"
159 "\"field_name10\":100}";
160 Value value(validData.begin(), validData.end());
161 Key key;
162 DistributedDBToolsUnitTest::GetRandomKeyValue(key);
163 EXPECT_EQ(g_kvNbDelegatePtrForQuery->Put(key, value), OK);
164 }
PutValidEntries5()165 void PutValidEntries5()
166 {
167 std::string validData = "{\"field_name1\":true,"
168 "\"field_name2\":true,"
169 "\"field_name3\":20,"
170 "\"field_name4\":2,"
171 "\"field_name5\":3.15,"
172 "\"field_name6\":\"3.1415\","
173 "\"field_name7\":1001,"
174 "\"field_name8\":100,"
175 "\"field_name9\":100,"
176 "\"field_name10\":100}";
177 Value value(validData.begin(), validData.end());
178 Key key;
179 DistributedDBToolsUnitTest::GetRandomKeyValue(key);
180 EXPECT_EQ(g_kvNbDelegatePtrForQuery->Put(key, value), OK);
181 }
PutValidEntries6()182 void PutValidEntries6()
183 {
184 std::string validData = "{\"field_name1\":true,"
185 "\"field_name2\":true,"
186 "\"field_name3\":20,"
187 "\"field_name4\":2,"
188 "\"field_name5\":3.15,"
189 "\"field_name6\":\"4.141\","
190 "\"field_name7\":1002,"
191 "\"field_name8\":100,"
192 "\"field_name9\":100,"
193 "\"field_name10\":100}";
194 Value value(validData.begin(), validData.end());
195 Key key;
196 DistributedDBToolsUnitTest::GetRandomKeyValue(key);
197 EXPECT_EQ(g_kvNbDelegatePtrForQuery->Put(key, value), OK);
198 }
PutValidEntries7()199 void PutValidEntries7()
200 {
201 std::string validData = "{\"field_name1\":true,"
202 "\"field_name2\":true,"
203 "\"field_name3\":20,"
204 "\"field_name4\":2,"
205 "\"field_name5\":3.15,"
206 "\"field_name6\":\"4.141\","
207 "\"field_name7\":100,"
208 "\"field_name8\":200,"
209 "\"field_name9\":100,"
210 "\"field_name10\":100}";
211 Value value(validData.begin(), validData.end());
212 Key key;
213 DistributedDBToolsUnitTest::GetRandomKeyValue(key);
214 EXPECT_EQ(g_kvNbDelegatePtrForQuery->Put(key, value), OK);
215 }
PutValidEntries8()216 void PutValidEntries8()
217 {
218 std::string validData = "{\"field_name1\":true,"
219 "\"field_name2\":true,"
220 "\"field_name3\":20,"
221 "\"field_name4\":2,"
222 "\"field_name5\":3.15,"
223 "\"field_name6\":\"4.141\","
224 "\"field_name7\":1009,"
225 "\"field_name8\":200,"
226 "\"field_name9\":100,"
227 "\"field_name10\":500}";
228 Value value(validData.begin(), validData.end());
229 Key key;
230 DistributedDBToolsUnitTest::GetRandomKeyValue(key);
231 EXPECT_EQ(g_kvNbDelegatePtrForQuery->Put(key, value), OK);
232 }
233
PutValidEntries()234 void PutValidEntries()
235 {
236 for (int i = 0; i < CIRCLE_COUNT; i++) {
237 PutValidEntries1();
238 PutValidEntries2();
239 PutValidEntries3();
240 PutValidEntries4();
241 PutValidEntries5();
242 PutValidEntries6();
243 PutValidEntries7();
244 PutValidEntries8();
245 }
246 }
247
248 const std::string SCHEMA_DEFINE2 = "{\"SCHEMA_VERSION\":\"1.0\","
249 "\"SCHEMA_MODE\":\"STRICT\","
250 "\"SCHEMA_DEFINE\":{"
251 "\"field_name1\":\"INTEGER\","
252 "\"field_name2\":\"DOUBLE\""
253 "},"
254 "\"SCHEMA_INDEXES\":[\"$.field_name1\", \"$.field_name2\"]}";
255
PresetDataForPreifxAndOrderBy001()256 void PresetDataForPreifxAndOrderBy001()
257 {
258 std::string validData = "{\"field_name1\":1, \"field_name2\":1}";
259 Value value(validData.begin(), validData.end());
260 EXPECT_EQ(g_kvNbDelegatePtrForQuery->Put(KEY_1, value), OK);
261 validData = "{\"field_name1\":1, \"field_name2\":2}";
262 Value value2(validData.begin(), validData.end());
263 EXPECT_EQ(g_kvNbDelegatePtrForQuery->Put(KEY_2, value2), OK);
264 validData = "{\"field_name1\":2, \"field_name2\":3}";
265 Value value3(validData.begin(), validData.end());
266 EXPECT_EQ(g_kvNbDelegatePtrForQuery->Put(KEY_3, value3), OK);
267 validData = "{\"field_name1\":2, \"field_name2\":4}";
268 Value value4(validData.begin(), validData.end());
269 EXPECT_EQ(g_kvNbDelegatePtrForQuery->Put(KEY_4, value4), OK);
270 validData = "{\"field_name1\":3, \"field_name2\":5}";
271 Value value5(validData.begin(), validData.end());
272 EXPECT_EQ(g_kvNbDelegatePtrForQuery->Put(KEY_5, value5), OK);
273 }
274 #endif
TestSnapshotCreateAndRelease()275 void TestSnapshotCreateAndRelease()
276 {
277 DBStatus status;
278 KvStoreSnapshotDelegate *snapshot = nullptr;
279 KvStoreObserver *observer = nullptr;
280 auto snapshotDelegateCallback = bind(&DistributedDBToolsUnitTest::SnapshotDelegateCallback,
281 placeholders::_1, placeholders::_2, std::ref(status), std::ref(snapshot));
282
283 /**
284 * @tc.steps: step1. Obtain the snapshot object snapshot through
285 * the GetKvStoreSnapshot interface of the delegate.
286 * @tc.expected: step1. Returns a non-empty snapshot.
287 */
288 g_kvDelegatePtr->GetKvStoreSnapshot(observer, snapshotDelegateCallback);
289
290 EXPECT_TRUE(status == OK);
291 EXPECT_NE(snapshot, nullptr);
292
293 /**
294 * @tc.steps: step2. Release the obtained snapshot through
295 * the ReleaseKvStoreSnapshot interface of the delegate.
296 * @tc.expected: step2. Release successfully.
297 */
298 EXPECT_EQ(g_kvDelegatePtr->ReleaseKvStoreSnapshot(snapshot), OK);
299 }
300 #ifndef OMIT_JSON
PreDataForQueryByPreFixKey()301 vector<Entry> PreDataForQueryByPreFixKey()
302 {
303 vector<Entry> res;
304 for (int i = 0; i < 5; i++) { // rand num 5 for test
305 Key key = DistributedDBToolsUnitTest::GetRandPrefixKey({'a', 'b'}, 1024); // rand num 1024 for test
306 std::string validData = "{\"field_name1\":null, \"field_name2\":" + std::to_string(rand()) + "}";
307 Value value(validData.begin(), validData.end());
308 res.push_back({key, value});
309 }
310
311 for (int i = 0; i < 5; i++) { // rand num 5 for test
312 Key key = DistributedDBToolsUnitTest::GetRandPrefixKey({'a', 'c'}, 1024); // rand num 1024 for test
313 std::string validData = "{\"field_name1\":null, \"field_name2\":" + std::to_string(rand()) + "}";
314 Value value(validData.begin(), validData.end());
315 res.push_back({key, value});
316 }
317 return res;
318 }
319
PreDataForGroupTest()320 static void PreDataForGroupTest()
321 {
322 std::string validData = "{\"field_name1\":1, \"field_name2\":1}";
323 Value value(validData.begin(), validData.end());
324 EXPECT_EQ(g_kvNbDelegatePtrForQuery->Put(KEY_1, value), OK);
325 validData = "{\"field_name1\":2, \"field_name2\":2}";
326 Value value2(validData.begin(), validData.end());
327 EXPECT_EQ(g_kvNbDelegatePtrForQuery->Put(KEY_2, value2), OK);
328 validData = "{\"field_name1\":3, \"field_name2\":3}";
329 Value value3(validData.begin(), validData.end());
330 EXPECT_EQ(g_kvNbDelegatePtrForQuery->Put(KEY_3, value3), OK);
331 validData = "{\"field_name1\":4, \"field_name2\":4}";
332 Value value4(validData.begin(), validData.end());
333 EXPECT_EQ(g_kvNbDelegatePtrForQuery->Put(KEY_4, value4), OK);
334 validData = "{\"field_name1\":5, \"field_name2\":5}";
335 Value value5(validData.begin(), validData.end());
336 EXPECT_EQ(g_kvNbDelegatePtrForQuery->Put(KEY_5, value5), OK);
337 }
338 #endif
339 }
340
341 class DistributedDBInterfacesDataOperationTest : public testing::Test {
342 public:
343 static void SetUpTestCase(void);
344 static void TearDownTestCase(void);
345 void SetUp();
346 void TearDown();
347 };
348
SetUpTestCase(void)349 void DistributedDBInterfacesDataOperationTest::SetUpTestCase(void)
350 {
351 DistributedDBToolsUnitTest::TestDirInit(g_testDir);
352 g_config.dataDir = g_testDir;
353 g_mgr.SetKvStoreConfig(g_config);
354 }
355
TearDownTestCase(void)356 void DistributedDBInterfacesDataOperationTest::TearDownTestCase(void)
357 {
358 if (DistributedDBToolsUnitTest::RemoveTestDbFiles(g_testDir) != 0) {
359 LOGE("rm test db files error!");
360 }
361 }
362
SetUp(void)363 void DistributedDBInterfacesDataOperationTest::SetUp(void)
364 {
365 DistributedDBToolsUnitTest::PrintTestCaseInfo();
366 // init values.
367 g_valueStatus = INVALID_ARGS;
368 g_value.clear();
369 g_entryVectorStatus = INVALID_ARGS;
370 g_matchSize = 0;
371
372 /*
373 * Here, we create STORE_ID.db before test,
374 * and it will be closed in TearDown().
375 */
376 CipherPassword passwd;
377 KvStoreDelegate::Option option = {true, LOCAL_ONLY, false, CipherType::DEFAULT, passwd};
378 g_mgr.GetKvStore(STORE_ID, option, g_kvDelegateCallback);
379 EXPECT_TRUE(g_kvDelegateStatus == OK);
380 ASSERT_TRUE(g_kvDelegatePtr != nullptr);
381 }
382
TearDown(void)383 void DistributedDBInterfacesDataOperationTest::TearDown(void)
384 {
385 if (g_kvDelegatePtr != nullptr && g_snapshotDelegatePtr != nullptr) {
386 EXPECT_TRUE(g_kvDelegatePtr->ReleaseKvStoreSnapshot(g_snapshotDelegatePtr) == OK);
387 g_snapshotDelegatePtr = nullptr;
388 }
389
390 if (g_kvDelegatePtr != nullptr) {
391 EXPECT_EQ(g_mgr.CloseKvStore(g_kvDelegatePtr), OK);
392 g_kvDelegatePtr = nullptr;
393 }
394 }
395
396 /**
397 * @tc.name: Put001
398 * @tc.desc: Put a data(non-empty key, non-empty value) into an exist distributed db
399 * @tc.type: FUNC
400 * @tc.require: AR000CQDTM AR000CQS3Q
401 * @tc.author: huangnaigu
402 */
403 HWTEST_F(DistributedDBInterfacesDataOperationTest, Put001, TestSize.Level1)
404 {
405 /**
406 * @tc.steps: step1. Put the data(non-empty key and non-empty value) into the database.
407 * @tc.expected: step1. Put returns OK.
408 */
409 Key keyTmp;
410 keyTmp.push_back(1);
411 Value valueTmp;
412 valueTmp.push_back('7');
413 EXPECT_TRUE(g_kvDelegatePtr->Put(keyTmp, valueTmp) == OK);
414
415 /**
416 * @tc.steps: step2. Get the value according the key through the snapshot.
417 * @tc.expected: step2. Get returns OK.
418 */
419 GetSnapshotUnitTest();
420 g_snapshotDelegatePtr->Get(keyTmp, g_valueCallback);
421 EXPECT_TRUE(g_valueStatus == OK);
422 }
423
424 /**
425 * @tc.name: Put002
426 * @tc.desc: Put a data(empty key) into an exist distributed db
427 * @tc.type: FUNC
428 * @tc.require: AR000C6TRV AR000CQDTM
429 * @tc.author: huangnaigu
430 */
431 HWTEST_F(DistributedDBInterfacesDataOperationTest, Put002, TestSize.Level1)
432 {
433 /**
434 * @tc.steps: step1. Put the data(empty key) into the database.
435 * @tc.expected: step1. Put returns INVALID_ARGS.
436 */
437 Key keyTmp;
438 Value valueTmp;
439 valueTmp.push_back('7');
440 EXPECT_TRUE(g_kvDelegatePtr->Put(keyTmp, valueTmp) == INVALID_ARGS);
441 }
442
443 /**
444 * @tc.name: Put003
445 * @tc.desc: Put a data(non-empty key, empty value) into an exist distributed db
446 * @tc.type: FUNC
447 * @tc.require: AR000CQDTM AR000CQS3Q
448 * @tc.author: huangnaigu
449 */
450 HWTEST_F(DistributedDBInterfacesDataOperationTest, Put003, TestSize.Level1)
451 {
452 /**
453 * @tc.steps: step1. Put the data(empty value) into the database.
454 * @tc.expected: step1. Put returns OK.
455 */
456 Key keyTmp;
457 keyTmp.push_back(1);
458 Value valueTmp;
459
460 EXPECT_TRUE(g_kvDelegatePtr->Put(keyTmp, valueTmp) == OK);
461 }
462
463 /**
464 * @tc.name: Put004
465 * @tc.desc: Put data into the local database
466 * @tc.type: FUNC
467 * @tc.require: AR000CQDVD AR000CQS3Q
468 * @tc.author: huangnaigu
469 */
470 HWTEST_F(DistributedDBInterfacesDataOperationTest, Put004, TestSize.Level1)
471 {
472 /**
473 * @tc.steps: step1. clear the database.
474 */
475 EXPECT_TRUE(g_kvDelegatePtr->Clear() == OK);
476
477 Key keyTmp;
478 keyTmp.push_back(1);
479
480 Value valueTmp;
481 valueTmp.push_back('7');
482
483 /**
484 * @tc.steps: step2. Put one data into the database.
485 * @tc.expected: step2. Put returns OK.
486 */
487 Value valueTest;
488 valueTest.push_back('9');
489 EXPECT_TRUE(g_kvDelegatePtr->Put(keyTmp, valueTmp) == OK);
490
491 /**
492 * @tc.steps: step3. Get the data from the database.
493 * @tc.expected: step3. Get returns OK and the read value is equal to the value put before.
494 */
495 GetSnapshotUnitTest();
496 g_snapshotDelegatePtr->Get(keyTmp, g_valueCallback);
497 EXPECT_TRUE(g_valueStatus == OK);
498 EXPECT_TRUE(g_value.size() > 0);
499 if (g_value.size() > 0) {
500 EXPECT_TRUE(g_value.front() == '7');
501 }
502
503 /**
504 * @tc.steps: step4. Change the value, and Put the data into the database.
505 * @tc.expected: step4. Put returns OK.
506 */
507 EXPECT_TRUE(g_kvDelegatePtr->Put(keyTmp, valueTest) == OK);
508
509 if (g_kvDelegatePtr != nullptr && g_snapshotDelegatePtr != nullptr) {
510 EXPECT_TRUE(g_kvDelegatePtr->ReleaseKvStoreSnapshot(g_snapshotDelegatePtr) == OK);
511 g_snapshotDelegatePtr = nullptr;
512 }
513 GetSnapshotUnitTest();
514 /**
515 * @tc.steps: step5. Get the data from the database.
516 * @tc.expected: step5. Get returns OK and the read value is equal to the new put value.
517 */
518 g_snapshotDelegatePtr->Get(keyTmp, g_valueCallback);
519 EXPECT_TRUE(g_valueStatus == OK);
520 EXPECT_TRUE(g_value.size() > 0);
521 if (g_value.size() > 0) {
522 EXPECT_TRUE(g_value.front() == '9');
523 }
524 }
525
526 /**
527 * @tc.name: Clear001
528 * @tc.desc: Clear the data from an exist distributed db
529 * @tc.type: FUNC
530 * @tc.require: AR000C6TRV AR000CQDTM
531 * @tc.author: huangnaigu
532 */
533 HWTEST_F(DistributedDBInterfacesDataOperationTest, Clear001, TestSize.Level1)
534 {
535 /**
536 * @tc.steps: step1. Put the valid data into the database.
537 */
538 Key keyTmp;
539 DistributedDBToolsUnitTest::GetRandomKeyValue(keyTmp);
540 Value valueTmp;
541 DistributedDBToolsUnitTest::GetRandomKeyValue(valueTmp);
542 EXPECT_TRUE(g_kvDelegatePtr->Put(keyTmp, valueTmp) == OK);
543
544 /**
545 * @tc.steps: step2. Clear the database.
546 * @tc.expected: step2. Clear returns OK.
547 */
548 EXPECT_TRUE(g_kvDelegatePtr->Clear() == OK);
549
550 /**
551 * @tc.steps: step3. Get the data from the database according the inserted key before clear.
552 * @tc.expected: step3. Get returns NOT_FOUND.
553 */
554 GetSnapshotUnitTest();
555 g_snapshotDelegatePtr->Get(keyTmp, g_valueCallback);
556 EXPECT_EQ(g_valueStatus, NOT_FOUND);
557 }
558
559 /**
560 * @tc.name: PutBatch001
561 * @tc.desc: Putbatch data into the local database
562 * @tc.type: FUNC
563 * @tc.require: AR000BVDFE AR000CQDVC
564 * @tc.author: huangnaigu
565 */
566 HWTEST_F(DistributedDBInterfacesDataOperationTest, PutBatch001, TestSize.Level1)
567 {
568 /**
569 * @tc.steps: step1. Put the prepared data.
570 */
571 vector<Entry> entries;
572 for (int i = 1; i < 10; i++) {
573 Entry entry;
574 entry.key.push_back(i);
575 entry.value.push_back('8');
576 entries.push_back(entry);
577 }
578 /**
579 * @tc.steps: step2. PutBatch the prepared data.
580 * @tc.expected: step2. PutBatch returns OK.
581 */
582 EXPECT_TRUE(g_kvDelegatePtr->PutBatch(entries) == OK);
583
584 /**
585 * @tc.steps: step3. Get the data from the database.
586 * @tc.expected: step3. Get returns OK and the get value is equal to the inserted value before.
587 */
588 GetSnapshotUnitTest();
589 for (int i = 1; i < 10; i++) {
590 Key keyTmp;
591 keyTmp.push_back(i);
592
593 g_snapshotDelegatePtr->Get(keyTmp, g_valueCallback);
594 EXPECT_TRUE(g_valueStatus == OK);
595 EXPECT_TRUE(g_value.size() > 0);
596 if (g_value.size() > 0) {
597 EXPECT_TRUE(g_value.front() == '8');
598 }
599 }
600 }
601
602 /**
603 * @tc.name: PutBatch002
604 * @tc.desc: PutBatch modified data into the local database
605 * @tc.type: FUNC
606 * @tc.require: AR000BVDFE AR000CQDVC
607 * @tc.author: huangnaigu
608 */
609 HWTEST_F(DistributedDBInterfacesDataOperationTest, PutBatch002, TestSize.Level1)
610 {
611 /**
612 * @tc.steps: step1. prepare the batch data.
613 */
614 vector<Entry> entries;
615 for (int i = 1; i < 10; i++) {
616 Entry entry;
617 entry.key.push_back(i);
618 entry.value.push_back('2');
619 entries.push_back(entry);
620 }
621 /**
622 * @tc.steps: step2. PutBatch the prepared batch data.
623 * @tc.expected: step2. PutBatch returns OK.
624 */
625 EXPECT_TRUE(g_kvDelegatePtr->PutBatch(entries) == OK);
626 /**
627 * @tc.steps: step3. Get data from the database according the inserted keys.
628 * @tc.expected: step3. Get returns OK and the read value is equal to the inserted value.
629 */
630 GetSnapshotUnitTest();
631 for (int i = 1; i < 10; i++) {
632 Key keyTmp;
633 keyTmp.push_back(i);
634
635 g_snapshotDelegatePtr->Get(keyTmp, g_valueCallback);
636 EXPECT_TRUE(g_valueStatus == OK);
637 EXPECT_TRUE(g_value.size() > 0);
638 if (g_value.size() > 0) {
639 EXPECT_TRUE(g_value.front() == '2');
640 }
641 }
642 }
643
644 /**
645 * @tc.name: Delete001
646 * @tc.desc: Delete existed data from the local database
647 * @tc.type: FUNC
648 * @tc.require: AR000C6TRV AR000CQDTM
649 * @tc.author: huangnaigu
650 */
651 HWTEST_F(DistributedDBInterfacesDataOperationTest, Delete001, TestSize.Level1)
652 {
653 /**
654 * @tc.steps: step1. Put the prepared data.
655 */
656 Key keyTmp;
657 keyTmp.push_back(1);
658 Value valueTmp;
659 valueTmp.push_back(3);
660 EXPECT_EQ(g_kvDelegatePtr->Put(keyTmp, valueTmp), OK);
661 /**
662 * @tc.steps: step2. Delete the existed data from the database.
663 * @tc.expected: step2. Delete returns OK.
664 */
665 EXPECT_EQ(g_kvDelegatePtr->Delete(keyTmp), OK);
666 /**
667 * @tc.steps: step3. Get the deleted data from the database.
668 * @tc.expected: step3. Get returns NOT_FOUND.
669 */
670 GetSnapshotUnitTest();
671 g_snapshotDelegatePtr->Get(keyTmp, g_valueCallback);
672 EXPECT_TRUE(g_valueStatus == NOT_FOUND);
673 }
674
675 /**
676 * @tc.name: Delete002
677 * @tc.desc: Delete non-existed data from the local database
678 * @tc.type: FUNC
679 * @tc.require: AR000C6TRV AR000CQDTM
680 * @tc.author: huangnaigu
681 */
682 HWTEST_F(DistributedDBInterfacesDataOperationTest, Delete002, TestSize.Level1)
683 {
684 /**
685 * @tc.steps: step1. Clear the database.
686 */
687 EXPECT_TRUE(g_kvDelegatePtr->Clear() == OK);
688
689 /**
690 * @tc.steps: step2. Delete the non-existed data from the database.
691 * @tc.expected: step2. Delete returns OK.
692 */
693 Key keyTmp;
694 keyTmp.push_back(1);
695 EXPECT_TRUE(g_kvDelegatePtr->Delete(keyTmp) == OK);
696 }
697
698 /**
699 * @tc.name: DeleteBatch001
700 * @tc.desc: Delete the existed batch data from the local database
701 * @tc.type: FUNC
702 * @tc.require: AR000C6TRV AR000CQDTM
703 * @tc.author: huangnaigu
704 */
705 HWTEST_F(DistributedDBInterfacesDataOperationTest, DeleteBatch001, TestSize.Level1)
706 {
707 /**
708 * @tc.steps: step1. Put the batch data into the database.
709 */
710 vector<Entry> entries;
711 for (int i = 1; i < 4; i++) {
712 Entry entry;
713 entry.key.push_back(i);
714 entry.value.push_back('2');
715 entries.push_back(entry);
716 }
717 EXPECT_TRUE(g_kvDelegatePtr->PutBatch(entries) == OK);
718
719 /**
720 * @tc.steps: step2. Delete the batch data from the database.
721 * @tc.steps: step2. DeleteBatch returns OK.
722 */
723 vector<Key> keys;
724 for (int i = 1; i < 4; i++) {
725 Key key;
726 key.push_back(i);
727 keys.push_back(key);
728 }
729 EXPECT_TRUE(g_kvDelegatePtr->DeleteBatch(keys) == OK);
730
731 /**
732 * @tc.steps: step3. Get all the data from the database.
733 * @tc.steps: step3. GetEntries result NOT_FOUND.
734 */
735 Key keyTmp;
736 GetSnapshotUnitTest();
737 g_snapshotDelegatePtr->Get(keyTmp, g_valueCallback);
738 EXPECT_TRUE(g_valueStatus == INVALID_ARGS);
739 }
740
741 /**
742 * @tc.name: DeleteBatch002
743 * @tc.desc: Delete the non-existed batch data from the local database
744 * @tc.type: FUNC
745 * @tc.require: AR000C6TRV AR000CQDTM
746 * @tc.author: huangnaigu
747 */
748 HWTEST_F(DistributedDBInterfacesDataOperationTest, DeleteBatch002, TestSize.Level1)
749 {
750 /**
751 * @tc.steps: step1. clear the database.
752 */
753 EXPECT_TRUE(g_kvDelegatePtr->Clear() == OK);
754 /**
755 * @tc.steps: step2. Delete the batch non-existed data from the database.
756 * @tc.expected: step2. DeleteBatch returns OK
757 */
758 vector<Key> keys;
759 for (int i = 1; i < 10; i++) {
760 Key key;
761 key.push_back(i);
762 keys.push_back(key);
763 }
764 EXPECT_TRUE(g_kvDelegatePtr->DeleteBatch(keys) == OK);
765 }
766
767 /**
768 * @tc.name: GetEntries001
769 * @tc.desc: Get the batch data from the non-empty database by the prefix key.
770 * @tc.type: FUNC
771 * @tc.require: AR000C6TUQ AR000CQDV3
772 * @tc.author: huangnaigu
773 */
774 HWTEST_F(DistributedDBInterfacesDataOperationTest, GetEntries001, TestSize.Level1)
775 {
776 /**
777 * @tc.steps: step1. insert batch data into the database.
778 */
779 vector<Entry> entries;
780 for (int i = 1; i <= 10; i++) {
781 Entry entry;
782 for (int j = 1; j <= i; j++) {
783 entry.key.push_back(j);
784 }
785 entry.value.push_back(i);
786 entries.push_back(entry);
787 }
788
789 EXPECT_TRUE(g_kvDelegatePtr->PutBatch(entries) == OK);
790
791 Key keyPrefix;
792 for (int j = 1; j <= 5; j++) {
793 keyPrefix.push_back(j);
794 }
795 /**
796 * @tc.steps: step2. Get batch data from the database using the prefix key.
797 * @tc.expected: step2. GetEntries results OK and the result entries size is the match size.
798 */
799 unsigned long matchSize = 6;
800 GetSnapshotUnitTest();
801 g_snapshotDelegatePtr->GetEntries(keyPrefix, g_entryVectorCallback);
802 ASSERT_TRUE(g_matchSize == matchSize);
803 EXPECT_TRUE(g_entryVectorStatus == OK);
804 }
805
806 /**
807 * @tc.name: GetEntries002
808 * @tc.desc: Get all the data(empty prefixkey) from the empty database.
809 * @tc.type: FUNC
810 * @tc.require: AR000C6TUQ AR000CQDV3
811 * @tc.author: huangnaigu
812 */
813 HWTEST_F(DistributedDBInterfacesDataOperationTest, GetEntries002, TestSize.Level1)
814 {
815 /**
816 * @tc.steps: step1. Get all the data from the empty database.
817 * @tc.expected: step1. GetEntries results NOT_FOUND.
818 */
819 Key keyPrefix;
820 for (int j = 1; j <= 5; j++) {
821 keyPrefix.push_back('a');
822 }
823
824 unsigned long matchSize = 0;
825 GetSnapshotUnitTest();
826 g_snapshotDelegatePtr->GetEntries(keyPrefix, g_entryVectorCallback);
827 ASSERT_TRUE(g_matchSize == matchSize);
828 EXPECT_TRUE(g_entryVectorStatus == NOT_FOUND);
829 }
830
831 /**
832 * @tc.name: GetEntries003
833 * @tc.desc: Get all the data(empty prefixkey) from the database.
834 * @tc.type: FUNC
835 * @tc.require: AR000C6TUQ AR000CQDV3
836 * @tc.author: huangnaigu
837 */
838 HWTEST_F(DistributedDBInterfacesDataOperationTest, GetEntries003, TestSize.Level1)
839 {
840 /**
841 * @tc.steps: step1. Put batch data into the database.
842 */
843 vector<Entry> entries;
844 for (int i = 1; i <= 10; i++) {
845 Entry entry;
846 for (int j = 1; j <= i; j++) {
847 entry.key.push_back(j);
848 }
849 entry.value.push_back(i);
850 entries.push_back(entry);
851 }
852
853 EXPECT_TRUE(g_kvDelegatePtr->PutBatch(entries) == OK);
854
855 /**
856 * @tc.steps: step2. Get all the data from the database using the empty prefix key.
857 * @tc.expected: step2. GetEntries results OK and the entries size is the put batch data size.
858 */
859 Key keyPrefix;
860 unsigned long matchSize = 10;
861 GetSnapshotUnitTest();
862 g_snapshotDelegatePtr->GetEntries(keyPrefix, g_entryVectorCallback);
863 ASSERT_TRUE(g_matchSize == matchSize);
864 EXPECT_TRUE(g_entryVectorStatus == OK);
865 }
866
867 /**
868 * @tc.name: GetSnapshot001
869 * @tc.desc: Get observer is empty, whether you get the snapshot.
870 * @tc.type: FUNC
871 * @tc.require: AR000BVRNF AR000CQDTI
872 * @tc.author: wangbingquan
873 */
874 HWTEST_F(DistributedDBInterfacesDataOperationTest, GetSnapshot001, TestSize.Level1)
875 {
876 /**
877 * @tc.steps: step1.Obtain the snapshot object whose observer is null
878 * by using the GetKvStoreSnapshot interface of the delegate.
879 * @tc.expected: step1. The obtained snapshot is not empty.
880 */
881 TestSnapshotCreateAndRelease();
882 }
883
884 /**
885 * @tc.name: GetSnapshot002
886 * @tc.desc: Get observer is not empty, whether you get the snapshot.
887 * @tc.type: FUNC
888 * @tc.require: AR000BVRNF AR000CQDTI
889 * @tc.author: wangbingquan
890 */
891 HWTEST_F(DistributedDBInterfacesDataOperationTest, GetSnapshot002, TestSize.Level1)
892 {
893 /**
894 * @tc.steps: step1.Obtain the snapshot object whose observer is null
895 * by using the GetKvStoreSnapshot interface of the delegate.
896 * @tc.expected: step1. The obtained snapshot is not empty.
897 */
898 DBStatus status;
899 KvStoreSnapshotDelegate *snapshot = nullptr;
900 KvStoreObserverUnitTest *observer = new (std::nothrow) KvStoreObserverUnitTest;
901 ASSERT_NE(observer, nullptr);
902 auto snapshotDelegateCallback = bind(&DistributedDBToolsUnitTest::SnapshotDelegateCallback,
903 placeholders::_1, placeholders::_2, std::ref(status), std::ref(snapshot));
904 g_kvDelegatePtr->GetKvStoreSnapshot(observer, snapshotDelegateCallback);
905
906 EXPECT_TRUE(status == OK);
907 EXPECT_NE(snapshot, nullptr);
908
909 /**
910 * @tc.steps: step2. Release the snapshot get before.
911 * @tc.expected: step2. ReleaseKvStoreSnapshot returns OK.
912 */
913 EXPECT_EQ(g_kvDelegatePtr->ReleaseKvStoreSnapshot(snapshot), OK);
914 delete observer;
915 observer = nullptr;
916 }
917
918 /**
919 * @tc.name: ReleaseSnapshot001
920 * @tc.desc: To test the function of releasing an empty snapshot.
921 * @tc.type: FUNC
922 * @tc.require: AR000BVRNF AR000CQDTI
923 * @tc.author: wangbingquan
924 */
925 HWTEST_F(DistributedDBInterfacesDataOperationTest, ReleaseSnapshot001, TestSize.Level1)
926 {
927 /**
928 * @tc.steps: step1.Release the null pointer snapshot through
929 * the ReleaseKvStoreSnapshot interface of the delegate.
930 * @tc.expected: step1. Return ERROR.
931 */
932 KvStoreSnapshotDelegate *snapshot = nullptr;
933 EXPECT_EQ(g_kvDelegatePtr->ReleaseKvStoreSnapshot(snapshot), DB_ERROR);
934 }
935
936 /**
937 * @tc.name: ReleaseSnapshot002
938 * @tc.desc: Release the obtained snapshot object that is not empty.
939 * @tc.type: FUNC
940 * @tc.require: AR000BVRNF AR000CQDTI
941 * @tc.author: wangbingquan
942 */
943 HWTEST_F(DistributedDBInterfacesDataOperationTest, ReleaseSnapshot002, TestSize.Level1)
944 {
945 TestSnapshotCreateAndRelease();
946 }
947
948 /**
949 * @tc.name: SetConflictResolutionPolicySuccessTest001
950 * @tc.desc: Verify SetConflictResolutionPolicy() return OK with valid input.
951 * @tc.type: FUNC
952 * @tc.require: AR000CQE12
953 * @tc.author: wumin
954 */
955 HWTEST_F(DistributedDBInterfacesDataOperationTest, SetConflictResolutionPolicySuccessTest001, TestSize.Level1)
956 {
957 /**
958 * @tc.steps: step1. get g_kvDelegatePtr pointer
959 * @tc.expected: step1. g_kvDelegatePtr is not nullptr
960 */
961 ASSERT_TRUE(g_kvDelegatePtr != nullptr);
962
963 /**
964 * @tc.steps: step2. invoke SetConflictResolutionPolicy() method by g_kvDelegatePtr
965 * @tc.expected: step2. SetConflictResolutionPolicy() return OK
966 */
967 EXPECT_EQ(g_kvDelegatePtr->SetConflictResolutionPolicy(AUTO_LAST_WIN, nullptr), OK);
968 }
969
970 /**
971 * @tc.name: SetConflictResolutionPolicyFailedTest001
972 * @tc.desc: Verify SetConflictResolutionPolicy() return INVALID_ARGS with invalid input.
973 * @tc.type: FUNC
974 * @tc.require: AR000CQE12
975 * @tc.author: wumin
976 */
977 HWTEST_F(DistributedDBInterfacesDataOperationTest, SetConflictResolutionPolicyFailedTest001, TestSize.Level1)
978 {
979 /**
980 * @tc.steps: step1. get g_kvDelegatePtr pointer
981 * @tc.expected: step1. g_kvDelegatePtr is not nullptr
982 */
983 ASSERT_TRUE(g_kvDelegatePtr != nullptr);
984
985 /**
986 * @tc.steps: step2. invoke SetConflictResolutionPolicy() method by g_kvDelegatePtr
987 * @tc.expected: step2. SetConflictResolutionPolicy() return not OK
988 */
989 EXPECT_NE(g_kvDelegatePtr->SetConflictResolutionPolicy(CUSTOMER_RESOLUTION, nullptr), OK);
990 }
991 #ifndef OMIT_JSON
992 /**
993 * @tc.name: GetEntriesWithQuery001
994 * @tc.desc: check query_format.
995 * @tc.type: FUNC
996 * @tc.require: AR000DR9K7
997 * @tc.author: weifeng
998 */
999 HWTEST_F(DistributedDBInterfacesDataOperationTest, GetEntriesWithQuery001, TestSize.Level1)
1000 {
1001 /**
1002 * @tc.steps: step1. get a non-schema store, Getentries with query
1003 * @tc.expected: step1. get store ok, Getentries return OK
1004 */
1005 KvStoreNbDelegate::Option option = {true, false, false};
1006 g_mgr.GetKvStore("GetEntriesWithQuery001_001", option, g_kvNbDelegateCallbackForQuery);
1007 ASSERT_TRUE(g_kvNbDelegatePtrForQuery != nullptr);
1008 EXPECT_TRUE(g_kvDelegateStatusForQuery == OK);
1009 Query query = Query::Select();
1010 std::vector<Entry> entries;
1011 DBStatus ret = g_kvNbDelegatePtrForQuery->GetEntries(query, entries);
1012 EXPECT_EQ(ret, NOT_FOUND);
1013 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
1014 EXPECT_TRUE(g_mgr.DeleteKvStore("GetEntriesWithQuery001_001") == OK);
1015 /**
1016 * @tc.steps: step2. get a schema store, Getentries with empty query
1017 * @tc.expected: step2. get store ok, Getentries return OK
1018 */
1019 option.schema = SCHEMA_STRING;
1020 g_mgr.GetKvStore("GetEntriesWithQuery001_002", option, g_kvNbDelegateCallbackForQuery);
1021 ASSERT_TRUE(g_kvNbDelegatePtrForQuery != nullptr);
1022 EXPECT_TRUE(g_kvDelegateStatusForQuery == OK);
1023 ret = g_kvNbDelegatePtrForQuery->GetEntries(query, entries);
1024 EXPECT_TRUE(ret == NOT_FOUND);
1025 /**
1026 * @tc.steps: step3. Getentries by query, query undefined field
1027 * @tc.expected: step3. Getentries return INVALID_QUERY_FIELD
1028 */
1029 query = query.EqualTo("$.field_name200", 10);
1030 ret = g_kvNbDelegatePtrForQuery->GetEntries(query, entries);
1031 EXPECT_EQ(ret, INVALID_QUERY_FIELD);
1032 /**
1033 * @tc.steps: step4. Getentries by query, query has invalid linker;
1034 * @tc.expected: step4. Getentries return INVALID_QUERY_FORMAT
1035 */
1036 Query invalidQuery1 = Query::Select().EqualTo("$.field_name1", true).And().Or();
1037 ret = g_kvNbDelegatePtrForQuery->GetEntries(invalidQuery1, entries);
1038 EXPECT_TRUE(ret == INVALID_QUERY_FORMAT);
1039 /**
1040 * @tc.steps: step5. Getentries by query, query has invalid linker;
1041 * @tc.expected: step5. Getentries return INVALID_QUERY_FORMAT
1042 */
1043 Query invalidQuery2 = Query::Select().And();
1044 ret = g_kvNbDelegatePtrForQuery->GetEntries(invalidQuery2, entries);
1045 EXPECT_TRUE(ret == INVALID_QUERY_FORMAT);
1046 /**
1047 * @tc.steps: step6. Getentries by query, query has invalid limit;
1048 * @tc.expected: step6. Getentries return INVALID_QUERY_FORMAT
1049 */
1050 Query invalidQuery3 = Query::Select().Limit(10, 0).EqualTo("$.field_name1", true);
1051 ret = g_kvNbDelegatePtrForQuery->GetEntries(invalidQuery3, entries);
1052 EXPECT_TRUE(ret == INVALID_QUERY_FORMAT);
1053 /**
1054 * @tc.steps: step7. Getentries by query, query has invalid orderby;
1055 * @tc.expected: step7. Getentries return INVALID_QUERY_FORMAT
1056 */
1057 Query invalidQuery4 = Query::Select().OrderBy("$.field_name1", true).EqualTo("field_name1", true);
1058 ret = g_kvNbDelegatePtrForQuery->GetEntries(invalidQuery4, entries);
1059 EXPECT_TRUE(ret == INVALID_QUERY_FORMAT);
1060 /**
1061 * @tc.steps: step8. Getentries by query, query has invalid orderby and limit;
1062 * @tc.expected: step8. Getentries return INVALID_QUERY_FORMAT
1063 */
1064 Query invalidQuery5 = Query::Select().Limit(10, 0).OrderBy("$.field_name1", true);
1065 ret = g_kvNbDelegatePtrForQuery->GetEntries(invalidQuery5, entries);
1066 EXPECT_TRUE(ret == INVALID_QUERY_FORMAT);
1067 /**
1068 * @tc.steps: step9. Getentries by query, query has invalid field type;
1069 * @tc.expected: step9. Getentries return OK
1070 */
1071 std::string queryType = "true";
1072 Query invalidQuery6 = Query::Select().EqualTo("$.field_name1", queryType);
1073 ret = g_kvNbDelegatePtrForQuery->GetEntries(invalidQuery6, entries);
1074 EXPECT_TRUE(ret == NOT_FOUND);
1075
1076 Query invalidQuery7 = Query::Select().EqualTo("$.field_name1", queryType).IsNull("$.field_name1");
1077 ret = g_kvNbDelegatePtrForQuery->GetEntries(invalidQuery7, entries);
1078 EXPECT_TRUE(ret == INVALID_QUERY_FORMAT);
1079
1080 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
1081 EXPECT_TRUE(g_mgr.DeleteKvStore("GetEntriesWithQuery001_002") == OK);
1082 }
1083
1084 /**
1085 * @tc.name: GetEntriesWithQuery002
1086 * @tc.desc: GetEntries(const Query &query, std::vector<Entry> &entries) interface test.
1087 * @tc.type: FUNC
1088 * @tc.require: AR000DR9K7
1089 * @tc.author: weifeng
1090 */
1091 HWTEST_F(DistributedDBInterfacesDataOperationTest, GetEntriesWithQuery002, TestSize.Level1)
1092 {
1093 KvStoreNbDelegate::Option option = {true, false, false};
1094 option.schema = SCHEMA_STRING;
1095 g_mgr.GetKvStore("GetEntriesWithQuery002_002", option, g_kvNbDelegateCallbackForQuery);
1096 ASSERT_TRUE(g_kvNbDelegatePtrForQuery != nullptr);
1097 EXPECT_TRUE(g_kvDelegateStatusForQuery == OK);
1098 PutValidEntries();
1099 /**
1100 * @tc.steps: step1. Getentries by query, query is empty;
1101 * @tc.expected: step1. Getentries return OK, entries size == totalSize;
1102 */
1103 Query query = Query::Select();
1104 std::vector<Entry> entries;
1105 int ret = g_kvNbDelegatePtrForQuery->GetEntries(query, entries);
1106 EXPECT_EQ(ret, OK);
1107 EXPECT_EQ(entries.size(), 24ul);
1108 /**
1109 * @tc.steps: step2. Getentries by query, query is full-set;
1110 * @tc.expected: step2. Getentries return OK, ;
1111 */
1112 std::vector<int> inCondition = {1, 10, 100, 200};
1113 Query fullQuery = Query::Select().EqualTo("$.field_name1", true).And().NotEqualTo("$.field_name2", false).
1114 And().GreaterThanOrEqualTo("$.field_name3", 10).And().LessThan("$.field_name4", 10).And().
1115 Like("$.field_name6", "4%").And().In("$.field_name7", inCondition).OrderBy("$.field_name9").Limit(20);
1116 ret = g_kvNbDelegatePtrForQuery->GetEntries(fullQuery, entries);
1117 EXPECT_EQ(ret, OK);
1118 EXPECT_EQ(entries.size(), 3ul);
1119 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
1120 EXPECT_TRUE(g_mgr.DeleteKvStore("GetEntriesWithQuery002_002") == OK);
1121 }
1122
1123 /**
1124 * @tc.name: GetEntriesWithQuery003
1125 * @tc.desc: GetEntries(const Query &query, std::vector<Entry> &entries) interface test.
1126 * @tc.type: FUNC
1127 * @tc.require: AR000DR9K7
1128 * @tc.author: weifeng
1129 */
1130 HWTEST_F(DistributedDBInterfacesDataOperationTest, GetEntriesWithQuery003, TestSize.Level1)
1131 {
1132 KvStoreNbDelegate::Option option = {true, false, false};
1133 option.schema = SCHEMA_STRING;
1134 g_mgr.GetKvStore("GetEntriesWithQuery003", option, g_kvNbDelegateCallbackForQuery);
1135 ASSERT_TRUE(g_kvNbDelegatePtrForQuery != nullptr);
1136 EXPECT_TRUE(g_kvDelegateStatusForQuery == OK);
1137 PutValidEntries();
1138 /**
1139 * @tc.steps: step1. Getentries by query, query is empty;
1140 * @tc.expected: step1. Getentries return OK, entries size == totalSize;
1141 */
1142 Query query = Query::Select();
1143 int count = 0;
1144 int ret = g_kvNbDelegatePtrForQuery->GetCount(query, count);
1145 EXPECT_TRUE(ret == OK);
1146 EXPECT_TRUE(count == 24);
1147 /**
1148 * @tc.steps: step2. Getentries by query, query is full-set;
1149 * @tc.expected: step2. Getentries return OK, ;
1150 */
1151 std::vector<int> inCondition = {1, 10, 100, 200};
1152 Query fullQuery = Query::Select().EqualTo("$.field_name1", true).And().NotEqualTo("$.field_name2", false).
1153 And().GreaterThan("$.field_name3", 10).And().LessThan("$.field_name4", 10).And().Like("$.field_name6", "4%").
1154 And().In("$.field_name7", inCondition);
1155 ret = g_kvNbDelegatePtrForQuery->GetCount(fullQuery, count);
1156 EXPECT_TRUE(ret == OK);
1157 EXPECT_TRUE(count == 3);
1158 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
1159 EXPECT_TRUE(g_mgr.DeleteKvStore("GetEntriesWithQuery003") == OK);
1160 }
1161
1162 /**
1163 * @tc.name: GetEntriesWithQuery004
1164 * @tc.desc: GetEntries(const Query &query, std::vector<Entry> &entries) interface test.
1165 * @tc.type: FUNC
1166 * @tc.require: AR000DR9K7
1167 * @tc.author: weifeng
1168 */
1169 HWTEST_F(DistributedDBInterfacesDataOperationTest, GetEntriesWithQuery004, TestSize.Level1)
1170 {
1171 KvStoreNbDelegate::Option option = {true, false, false};
1172 option.schema = SCHEMA_STRING;
1173 g_mgr.GetKvStore("GetEntriesWithQuery004", option, g_kvNbDelegateCallbackForQuery);
1174 ASSERT_TRUE(g_kvNbDelegatePtrForQuery != nullptr);
1175 EXPECT_TRUE(g_kvDelegateStatusForQuery == OK);
1176 PutValidEntries();
1177 /**
1178 * @tc.steps: step1. Getentries by query, query is empty;
1179 * @tc.expected: step1. Getentries return OK, entries size == totalSize;
1180 */
1181 Query query = Query::Select();
1182 KvStoreResultSet *resultSet = nullptr;
1183 int ret = g_kvNbDelegatePtrForQuery->GetEntries(query, resultSet);
1184 ASSERT_TRUE(resultSet != nullptr);
1185 EXPECT_TRUE(ret == OK);
1186 EXPECT_EQ(resultSet->GetCount(), 24);
1187 EXPECT_EQ(resultSet->GetPosition(), -1);
1188 EXPECT_TRUE(!resultSet->IsFirst());
1189 EXPECT_TRUE(resultSet->MoveToFirst());
1190 EXPECT_TRUE(resultSet->IsFirst());
1191 EXPECT_EQ(g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet), OK);
1192 EXPECT_TRUE(resultSet == nullptr);
1193 /**
1194 * @tc.steps: step2. Getentries by query, query is full-set;
1195 * @tc.expected: step2. Getentries return OK, ;
1196 */
1197 std::vector<int> inCondition = {1, 10, 100, 200};
1198 Query fullQuery = Query::Select().EqualTo("$.field_name1", true).And().NotEqualTo("$.field_name2", false).
1199 And().GreaterThan("$.field_name3", 10).And().LessThan("$.field_name4", 10).And().Like("$.field_name6", "4%").
1200 And().In("$.field_name7", inCondition).OrderBy("$.field_name9").Limit(20, 1);
1201 ret = g_kvNbDelegatePtrForQuery->GetEntries(fullQuery, resultSet);
1202 ASSERT_TRUE(resultSet != nullptr);
1203 EXPECT_EQ(ret, OK);
1204 EXPECT_EQ(resultSet->GetCount(), 2);
1205 EXPECT_EQ(g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet), OK);
1206 EXPECT_TRUE(resultSet == nullptr);
1207 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
1208 EXPECT_TRUE(g_mgr.DeleteKvStore("GetEntriesWithQuery004") == OK);
1209 }
1210
1211 /**
1212 * @tc.name: QueryIsNotNull001
1213 * @tc.desc: IsNotNull interface normal function
1214 * @tc.type: FUNC
1215 * @tc.require: AR000EPARK
1216 * @tc.author: sunpeng
1217 */
1218 HWTEST_F(DistributedDBInterfacesDataOperationTest, QueryIsNotNull001, TestSize.Level1)
1219 {
1220 KvStoreNbDelegate::Option option = {true, false, false};
1221 option.schema = SCHEMA_DEFINE2;
1222 g_mgr.GetKvStore("QueryIsNotNull001", option, g_kvNbDelegateCallbackForQuery);
1223 ASSERT_TRUE(g_kvNbDelegatePtrForQuery != nullptr);
1224 EXPECT_TRUE(g_kvDelegateStatusForQuery == OK);
1225 std::string validData = "{\"field_name1\":null, \"field_name2\":1}";
1226 Value value(validData.begin(), validData.end());
1227 EXPECT_EQ(g_kvNbDelegatePtrForQuery->Put(KEY_1, value), OK);
1228 validData = "{\"field_name1\":2, \"field_name2\":2}";
1229 Value value2(validData.begin(), validData.end());
1230 EXPECT_EQ(g_kvNbDelegatePtrForQuery->Put(KEY_2, value2), OK);
1231 /**
1232 * @tc.steps: step1. Get Query object by IsNotNull
1233 */
1234 Query query = Query::Select().IsNotNull("$.field_name1");
1235 /**
1236 * @tc.steps: step2. Use GetEntries get KV
1237 * @tc.expected: step2. Getentries return OK, Get K1V1;
1238 */
1239 std::vector<Entry> entries;
1240 int errCode = g_kvNbDelegatePtrForQuery->GetEntries(query, entries);
1241 EXPECT_EQ(errCode, OK);
1242 EXPECT_EQ(entries.size(), 1ul);
1243 EXPECT_EQ(entries[0].key, KEY_2);
1244 EXPECT_EQ(entries[0].value, value2);
1245 /**
1246 * @tc.steps: step3. Use GetCount to get number of item
1247 * @tc.expected: step3. Get count = 1;
1248 */
1249 int count = -1;
1250 g_kvNbDelegatePtrForQuery->GetCount(query, count);
1251 EXPECT_EQ(count, 1);
1252 /**
1253 * @tc.steps: step4. Use GetEntries to get resultSet
1254 * @tc.expected: step4. Getentries return OK, Get K1V1;
1255 */
1256 KvStoreResultSet *resultSet = nullptr;
1257 errCode = g_kvNbDelegatePtrForQuery->GetEntries(query, resultSet);
1258 ASSERT_TRUE(resultSet != nullptr);
1259 EXPECT_EQ(errCode, OK);
1260 EXPECT_EQ(resultSet->GetCount(), 1);
1261 EXPECT_EQ(g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet), OK);
1262 EXPECT_TRUE(resultSet == nullptr);
1263 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
1264 EXPECT_TRUE(g_mgr.DeleteKvStore("QueryIsNotNull001") == OK);
1265 }
1266
1267 /**
1268 * @tc.name: QueryPreFixKey001
1269 * @tc.desc: Normal function of query by prefix key
1270 * @tc.type: FUNC
1271 * @tc.require: AR000EPARK
1272 * @tc.author: sunpeng
1273 */
1274 HWTEST_F(DistributedDBInterfacesDataOperationTest, QueryPreFixKey001, TestSize.Level1)
1275 {
1276 KvStoreNbDelegate::Option option = {true, false, false};
1277 option.schema = SCHEMA_DEFINE2;
1278 g_mgr.GetKvStore("QueryPreFixKey001", option, g_kvNbDelegateCallbackForQuery);
1279 ASSERT_TRUE(g_kvNbDelegatePtrForQuery != nullptr);
1280 EXPECT_TRUE(g_kvDelegateStatusForQuery == OK);
1281
1282 vector<Entry> entries = PreDataForQueryByPreFixKey();
1283 EXPECT_EQ(g_kvNbDelegatePtrForQuery->PutBatch(entries), OK);
1284
1285 /**
1286 * @tc.steps: step1. Get Query object by PrefixKey ac
1287 */
1288 Query query = Query::Select().PrefixKey({'a', 'c'});
1289
1290 /**
1291 * @tc.steps: step2. Use GetEnties to get same key prefix ac
1292 * @tc.expected: step2. Get count = 5, Key6~10
1293 */
1294 std::vector<Entry> entriesRes;
1295 int errCode = g_kvNbDelegatePtrForQuery->GetEntries(query, entriesRes);
1296 EXPECT_EQ(errCode, OK);
1297 EXPECT_EQ(entriesRes.size(), 5ul);
1298 for (size_t i = 0; i < entriesRes.size(); i++) {
1299 EXPECT_EQ(entriesRes[i].key.front(), 'a');
1300 EXPECT_EQ(entriesRes[i].key[1], 'c');
1301 }
1302 /**
1303 * @tc.steps: step3. Use GetCount to get number of item of this query object
1304 * @tc.expected: step3. Get count = 5
1305 */
1306 int count = -1;
1307 g_kvNbDelegatePtrForQuery->GetCount(query, count);
1308 EXPECT_EQ(count, 5);
1309 /**
1310 * @tc.steps: step4. Use GetEnties to get same key prefix ac of resultSet
1311 * @tc.expected: step4. Get resultSet of key6~10
1312 */
1313 KvStoreResultSet *resultSet = nullptr;
1314 errCode = g_kvNbDelegatePtrForQuery->GetEntries(query, resultSet);
1315 ASSERT_TRUE(resultSet != nullptr);
1316 EXPECT_EQ(errCode, OK);
1317 EXPECT_EQ(resultSet->GetCount(), 5);
1318 EXPECT_EQ(g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet), OK);
1319 EXPECT_TRUE(resultSet == nullptr);
1320
1321 /**
1322 * @tc.steps: step5. Get Query object by null PrefixKey
1323 */
1324 Query query1 = Query::Select().PrefixKey({});
1325 errCode = g_kvNbDelegatePtrForQuery->GetEntries(query1, entriesRes);
1326 /**
1327 * @tc.steps: step6. Use GetEnties and GetCount to null key prefix query object
1328 * @tc.expected: step6. Get all KV from database
1329 */
1330 EXPECT_EQ(errCode, OK);
1331 EXPECT_EQ(entriesRes.size(), 10ul);
1332 EXPECT_TRUE(DistributedDBToolsUnitTest::IsEntriesEqual(entries, entriesRes, true));
1333
1334 errCode = g_kvNbDelegatePtrForQuery->GetEntries(query1, resultSet);
1335 ASSERT_TRUE(resultSet != nullptr);
1336 EXPECT_EQ(errCode, OK);
1337 EXPECT_EQ(resultSet->GetCount(), 10);
1338 EXPECT_EQ(g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet), OK);
1339 EXPECT_TRUE(resultSet == nullptr);
1340
1341 Query query2 = Query::Select().PrefixKey(Key(1025, 'a')); // 1025 over max key length 1 byte
1342 errCode = g_kvNbDelegatePtrForQuery->GetEntries(query2, entriesRes);
1343 EXPECT_EQ(errCode, INVALID_ARGS);
1344
1345 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
1346 EXPECT_TRUE(g_mgr.DeleteKvStore("QueryPreFixKey001") == OK);
1347 }
1348
1349 /**
1350 * @tc.name: QueryPreFixKey003
1351 * @tc.desc: For special key prefix combination condition of query
1352 * @tc.type: FUNC
1353 * @tc.require: AR000EPARK
1354 * @tc.author: sunpeng
1355 */
1356 HWTEST_F(DistributedDBInterfacesDataOperationTest, QueryPreFixKey003, TestSize.Level1)
1357 {
1358 KvStoreNbDelegate::Option option = {true, false, false};
1359 option.schema = SCHEMA_DEFINE2;
1360 g_mgr.GetKvStore("QueryPreFixKey003", option, g_kvNbDelegateCallbackForQuery);
1361 ASSERT_TRUE(g_kvNbDelegatePtrForQuery != nullptr);
1362 EXPECT_TRUE(g_kvDelegateStatusForQuery == OK);
1363
1364 vector<Entry> entries = PreDataForQueryByPreFixKey();
1365 EXPECT_EQ(g_kvNbDelegatePtrForQuery->PutBatch(entries), OK);
1366
1367 /**
1368 * @tc.steps: step1. Get Query object by double PrefixKey
1369 */
1370 Query query = Query::Select().PrefixKey({'a', 'c'}).PrefixKey({});
1371 std::vector<Entry> entriesRes;
1372 /**
1373 * @tc.steps: step2. Use GetEnties for double prefixkey query object
1374 * @tc.expected: step2. return INVALID_QUERY_FORMAT
1375 */
1376 int errCode = g_kvNbDelegatePtrForQuery->GetEntries(query, entriesRes);
1377 EXPECT_EQ(errCode, INVALID_QUERY_FORMAT);
1378 /**
1379 * @tc.steps: step3. Use GetEnties for double prefixkey query object to get resultSet
1380 * @tc.expected: step3. return INVALID_QUERY_FORMAT
1381 */
1382 KvStoreResultSet *resultSet = nullptr;
1383 errCode = g_kvNbDelegatePtrForQuery->GetEntries(query, resultSet);
1384 EXPECT_EQ(errCode, INVALID_QUERY_FORMAT);
1385 EXPECT_TRUE(resultSet == nullptr);
1386 /**
1387 * @tc.steps: step4. Get Query object by PrefixKey and orderBy
1388 */
1389 Query query1 = Query::Select().PrefixKey({'a', 'b'}).OrderBy("$.field_name1");
1390 /**
1391 * @tc.steps: step3. Use GetEnties and GetCount for this query object
1392 * @tc.expected: step3. Can get content by GetEntries, but GetCount can not use for query object include orderBy
1393 */
1394 errCode = g_kvNbDelegatePtrForQuery->GetEntries(query1, entriesRes);
1395 EXPECT_EQ(entriesRes.size(), 5ul);
1396 EXPECT_EQ(errCode, OK);
1397 int count = -1;
1398 errCode = g_kvNbDelegatePtrForQuery->GetCount(query1, count);
1399 EXPECT_EQ(errCode, INVALID_QUERY_FORMAT);
1400
1401 errCode = g_kvNbDelegatePtrForQuery->GetEntries(query1, resultSet);
1402 ASSERT_TRUE(resultSet != nullptr);
1403 EXPECT_EQ(errCode, OK);
1404 EXPECT_EQ(resultSet->GetCount(), 5);
1405 EXPECT_EQ(g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet), OK);
1406 EXPECT_TRUE(resultSet == nullptr);
1407
1408 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
1409 EXPECT_TRUE(g_mgr.DeleteKvStore("QueryPreFixKey003") == OK);
1410 }
1411
1412 /**
1413 * @tc.name: QueryPreFixKey004
1414 * @tc.desc: Query a prefix that does not exist
1415 * @tc.type: FUNC
1416 * @tc.require: AR000EPARK
1417 * @tc.author: sunpeng
1418 */
1419 HWTEST_F(DistributedDBInterfacesDataOperationTest, QueryPreFixKey004, TestSize.Level1)
1420 {
1421 KvStoreNbDelegate::Option option = {true, false, false};
1422 option.schema = SCHEMA_DEFINE2;
1423 g_mgr.GetKvStore("QueryPreFixKey004", option, g_kvNbDelegateCallbackForQuery);
1424 ASSERT_TRUE(g_kvNbDelegatePtrForQuery != nullptr);
1425 EXPECT_TRUE(g_kvDelegateStatusForQuery == OK);
1426
1427 vector<Entry> entries = PreDataForQueryByPreFixKey();
1428 EXPECT_EQ(g_kvNbDelegatePtrForQuery->PutBatch(entries), OK);
1429 /**
1430 * @tc.steps: step1. Get Query object by PrefixKey that does not exist
1431 */
1432 Query query = Query::Select().PrefixKey({'c'});
1433 /**
1434 * @tc.steps: step2. Use GetEnties and GetCount to get result
1435 * @tc.expected: step2. Return NOT_FOUND, get result OK, number of KV is 0
1436 */
1437 std::vector<Entry> entriesRes;
1438 int errCode = g_kvNbDelegatePtrForQuery->GetEntries(query, entriesRes);
1439 EXPECT_EQ(errCode, NOT_FOUND);
1440
1441 int count = -1;
1442 g_kvNbDelegatePtrForQuery->GetCount(query, count);
1443 EXPECT_EQ(count, 0);
1444
1445 KvStoreResultSet *resultSet = nullptr;
1446 errCode = g_kvNbDelegatePtrForQuery->GetEntries(query, resultSet);
1447 ASSERT_TRUE(resultSet != nullptr);
1448 EXPECT_EQ(errCode, OK);
1449 EXPECT_EQ(resultSet->GetCount(), 0);
1450 EXPECT_EQ(g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet), OK);
1451 EXPECT_TRUE(resultSet == nullptr);
1452
1453 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
1454 EXPECT_TRUE(g_mgr.DeleteKvStore("QueryPreFixKey004") == OK);
1455 }
1456
1457 /**
1458 * @tc.name: QueryGroup001
1459 * @tc.desc: Query group nomal ability to change operation priority
1460 * @tc.type: FUNC
1461 * @tc.require: AR000EPARK
1462 * @tc.author: sunpeng
1463 */
1464 HWTEST_F(DistributedDBInterfacesDataOperationTest, QueryGroup001, TestSize.Level1)
1465 {
1466 KvStoreNbDelegate::Option option = {true, false, false};
1467 option.schema = SCHEMA_DEFINE2;
1468 g_mgr.GetKvStore("QueryGroup001", option, g_kvNbDelegateCallbackForQuery);
1469 ASSERT_TRUE(g_kvNbDelegatePtrForQuery != nullptr);
1470 EXPECT_TRUE(g_kvDelegateStatusForQuery == OK);
1471
1472 PreDataForGroupTest();
1473
1474 /**
1475 * @tc.steps: step1. Get Query object:
1476 * query: <4 and =4 or >1
1477 * query1: (<4 and =4) or >1
1478 * query2: <4 and (=4 or >1)
1479 */
1480 Query query = Query::Select().LessThan("$.field_name1", 4).And().EqualTo("$.field_name1", 4).
1481 Or().GreaterThan("$.field_name1", 1);
1482 Query query1 = Query::Select().BeginGroup().LessThan("$.field_name1", 4).And().
1483 EqualTo("$.field_name1", 4).EndGroup().Or().GreaterThan("$.field_name1", 1);
1484 Query query2 = Query::Select().LessThan("$.field_name1", 4).And().BeginGroup().
1485 EqualTo("$.field_name1", 4).Or().GreaterThan("$.field_name1", 1).EndGroup();
1486
1487 /**
1488 * @tc.steps: step2. Use GetEnties to get different result
1489 * @tc.expected: step2. Result:
1490 * query: count = 4
1491 * query1: count = 4
1492 * query2: count = 2
1493 */
1494 std::vector<Entry> entries;
1495 int errCode = g_kvNbDelegatePtrForQuery->GetEntries(query, entries);
1496 EXPECT_EQ(errCode, OK);
1497 EXPECT_EQ(entries.size(), 4ul);
1498 int count = -1;
1499 g_kvNbDelegatePtrForQuery->GetCount(query, count);
1500 EXPECT_EQ(count, 4);
1501
1502 errCode = g_kvNbDelegatePtrForQuery->GetEntries(query2, entries);
1503 EXPECT_EQ(errCode, OK);
1504
1505 EXPECT_EQ(entries.size(), 2ul);
1506 g_kvNbDelegatePtrForQuery->GetCount(query2, count);
1507 EXPECT_EQ(count, 2);
1508 KvStoreResultSet *resultSet = nullptr;
1509 errCode = g_kvNbDelegatePtrForQuery->GetEntries(query2, resultSet);
1510 ASSERT_TRUE(resultSet != nullptr);
1511 EXPECT_EQ(errCode, OK);
1512 EXPECT_EQ(resultSet->GetCount(), 2);
1513 EXPECT_EQ(g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet), OK);
1514 EXPECT_TRUE(resultSet == nullptr);
1515
1516 errCode = g_kvNbDelegatePtrForQuery->GetEntries(query1, entries);
1517 EXPECT_EQ(errCode, OK);
1518 EXPECT_EQ(entries.size(), 4ul);
1519 g_kvNbDelegatePtrForQuery->GetCount(query1, count);
1520 EXPECT_EQ(count, 4);
1521
1522 errCode = g_kvNbDelegatePtrForQuery->GetEntries(query1, resultSet);
1523 ASSERT_TRUE(resultSet != nullptr);
1524 EXPECT_EQ(errCode, OK);
1525 EXPECT_EQ(resultSet->GetCount(), 4);
1526 EXPECT_EQ(g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet), OK);
1527 EXPECT_TRUE(resultSet == nullptr);
1528
1529 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
1530 EXPECT_TRUE(g_mgr.DeleteKvStore("QueryGroup001") == OK);
1531 }
1532
1533 /**
1534 * @tc.name: QueryGroup002
1535 * @tc.desc: Test for illegal Group query object
1536 * @tc.type: FUNC
1537 * @tc.require: AR000EPARK
1538 * @tc.author: sunpeng
1539 */
1540 HWTEST_F(DistributedDBInterfacesDataOperationTest, QueryGroup002, TestSize.Level1)
1541 {
1542 KvStoreNbDelegate::Option option = {true, false, false};
1543 option.schema = SCHEMA_DEFINE2;
1544 g_mgr.GetKvStore("QueryGroup002", option, g_kvNbDelegateCallbackForQuery);
1545 ASSERT_TRUE(g_kvNbDelegatePtrForQuery != nullptr);
1546 EXPECT_TRUE(g_kvDelegateStatusForQuery == OK);
1547
1548 PreDataForGroupTest();
1549
1550 /**
1551 * @tc.steps: step1. Get Query object:
1552 * query: (<4 and (=4 or) >1)
1553 * query1: (<4 and =4 or >1
1554 * query2: <4 and =4) or >1
1555 * query3: )<4 and =4( or >1
1556 * query4: <4 (and = 4 or >1)
1557 */
1558 Query query = Query::Select().BeginGroup().LessThan("$.field_name1", 4).And().BeginGroup().
1559 EqualTo("$.field_name1", 4).Or().EndGroup().GreaterThan("$.field_name1", 1).EndGroup();
1560 Query query1 = Query::Select().BeginGroup().LessThan("$.field_name1", 4).And().
1561 EqualTo("$.field_name1", 4).Or().GreaterThan("$.field_name1", 1);
1562 Query query2 = Query::Select().LessThan("$.field_name1", 4).And().
1563 EqualTo("$.field_name1", 4).EndGroup().Or().GreaterThan("$.field_name1", 1);
1564 Query query3 = Query::Select().EndGroup().LessThan("$.field_name1", 4).And().
1565 EqualTo("$.field_name1", 4).BeginGroup().Or().GreaterThan("$.field_name1", 1);
1566 Query query4 = Query::Select().LessThan("$.field_name1", 4).BeginGroup().And().
1567 EqualTo("$.field_name1", 4).Or().GreaterThan("$.field_name1", 1).EndGroup();
1568
1569 /**
1570 * @tc.steps: step2. Use GetEnties and GetCount to get result
1571 * @tc.expected: step2. All query object is illegal, reeturn INVALID_QUERY_FORMAT
1572 */
1573 std::vector<Entry> entries;
1574 int errCode = g_kvNbDelegatePtrForQuery->GetEntries(query, entries);
1575 EXPECT_EQ(errCode, INVALID_QUERY_FORMAT);
1576
1577 errCode = g_kvNbDelegatePtrForQuery->GetEntries(query1, entries);
1578 EXPECT_EQ(errCode, INVALID_QUERY_FORMAT);
1579 errCode = g_kvNbDelegatePtrForQuery->GetEntries(query2, entries);
1580 EXPECT_EQ(errCode, INVALID_QUERY_FORMAT);
1581 errCode = g_kvNbDelegatePtrForQuery->GetEntries(query3, entries);
1582 EXPECT_EQ(errCode, INVALID_QUERY_FORMAT);
1583 errCode = g_kvNbDelegatePtrForQuery->GetEntries(query4, entries);
1584 EXPECT_EQ(errCode, INVALID_QUERY_FORMAT);
1585
1586 KvStoreResultSet *resultSet = nullptr;
1587 errCode = g_kvNbDelegatePtrForQuery->GetEntries(query, resultSet);
1588 EXPECT_EQ(errCode, INVALID_QUERY_FORMAT);
1589 EXPECT_TRUE(resultSet == nullptr);
1590
1591 errCode = g_kvNbDelegatePtrForQuery->GetEntries(query1, resultSet);
1592 EXPECT_EQ(errCode, INVALID_QUERY_FORMAT);
1593 EXPECT_TRUE(resultSet == nullptr);
1594
1595 errCode = g_kvNbDelegatePtrForQuery->GetEntries(query2, resultSet);
1596 EXPECT_EQ(errCode, INVALID_QUERY_FORMAT);
1597 EXPECT_TRUE(resultSet == nullptr);
1598
1599 errCode = g_kvNbDelegatePtrForQuery->GetEntries(query3, resultSet);
1600 EXPECT_EQ(errCode, INVALID_QUERY_FORMAT);
1601 EXPECT_TRUE(resultSet == nullptr);
1602
1603 errCode = g_kvNbDelegatePtrForQuery->GetEntries(query4, resultSet);
1604 EXPECT_EQ(errCode, INVALID_QUERY_FORMAT);
1605 EXPECT_TRUE(resultSet == nullptr);
1606
1607 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
1608 EXPECT_TRUE(g_mgr.DeleteKvStore("QueryGroup002") == OK);
1609 }
1610
1611 /**
1612 * @tc.name: QueryGroup003
1613 * @tc.desc: Query expressions containing nested parentheses
1614 * @tc.type: FUNC
1615 * @tc.require: AR000EPARK
1616 * @tc.author: sunpeng
1617 */
1618 HWTEST_F(DistributedDBInterfacesDataOperationTest, QueryGroup003, TestSize.Level1)
1619 {
1620 KvStoreNbDelegate::Option option = {true, false, false};
1621 option.schema = SCHEMA_DEFINE2;
1622 g_mgr.GetKvStore("QueryGroup003", option, g_kvNbDelegateCallbackForQuery);
1623 ASSERT_TRUE(g_kvNbDelegatePtrForQuery != nullptr);
1624 EXPECT_TRUE(g_kvDelegateStatusForQuery == OK);
1625
1626 PreDataForGroupTest();
1627
1628 /**
1629 * @tc.steps: step1. Get Query object for (<=5 and (=4 or >1) and <3)
1630 */
1631 Query query = Query::Select().BeginGroup().LessThan("$.field_name1", 5).And().BeginGroup().
1632 EqualTo("$.field_name1", 4).Or().GreaterThan("$.field_name1", 1).EndGroup().And().
1633 LessThan("$.field_name1", 3).EndGroup();
1634
1635 /**
1636 * @tc.steps: step2. Use GetEnties and GetCount to get result
1637 * @tc.expected: step2. reeturn OK, count = 1
1638 */
1639 std::vector<Entry> entries;
1640 int errCode = g_kvNbDelegatePtrForQuery->GetEntries(query, entries);
1641 EXPECT_EQ(errCode, OK);
1642 EXPECT_EQ(entries.size(), 1ul);
1643 int count = -1;
1644 g_kvNbDelegatePtrForQuery->GetCount(query, count);
1645 EXPECT_EQ(count, 1);
1646
1647 KvStoreResultSet *resultSet = nullptr;
1648 errCode = g_kvNbDelegatePtrForQuery->GetEntries(query, resultSet);
1649 ASSERT_TRUE(resultSet != nullptr);
1650 EXPECT_EQ(errCode, OK);
1651 EXPECT_EQ(resultSet->GetCount(), 1);
1652 EXPECT_EQ(g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet), OK);
1653 EXPECT_TRUE(resultSet == nullptr);
1654
1655 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
1656 EXPECT_TRUE(g_mgr.DeleteKvStore("QueryGroup003") == OK);
1657 }
1658
1659 /**
1660 * @tc.name: multiOrderBy001
1661 * @tc.desc: Test multiple orderby conditions together to query
1662 * @tc.type: FUNC
1663 * @tc.require: AR000DR9K7
1664 * @tc.author: sunpeng
1665 */
1666 HWTEST_F(DistributedDBInterfacesDataOperationTest, multiOrderBy001, TestSize.Level1)
1667 {
1668 KvStoreNbDelegate::Option option = {true, false, false};
1669 option.schema = SCHEMA_DEFINE2;
1670 g_mgr.GetKvStore("multiOrderBy001", option, g_kvNbDelegateCallbackForQuery);
1671 ASSERT_TRUE(g_kvNbDelegatePtrForQuery != nullptr);
1672 EXPECT_TRUE(g_kvDelegateStatusForQuery == OK);
1673
1674 PreDataForGroupTest();
1675
1676 Query query = Query::Select().PrefixKey({}).OrderBy("$.field_name1").OrderBy("$.field_name1");
1677 std::vector<Entry> entries;
1678 int errCode = g_kvNbDelegatePtrForQuery->GetEntries(query, entries);
1679 EXPECT_EQ(errCode, OK);
1680
1681 errCode = g_kvNbDelegatePtrForQuery->GetEntries(query.Limit(2, 2), entries);
1682 EXPECT_EQ(errCode, OK);
1683
1684 Query query1 = Query::Select().PrefixKey({}).Limit(2, 2).OrderBy("$.field_name1").OrderBy("$.field_name1");
1685 errCode = g_kvNbDelegatePtrForQuery->GetEntries(query1, entries);
1686 EXPECT_EQ(errCode, INVALID_QUERY_FORMAT);
1687
1688 Query query2 = Query::Select().PrefixKey({}).OrderBy("$.field_name1").Limit(2, 2).OrderBy("$.field_name1");
1689 KvStoreResultSet *resultSet = nullptr;
1690 errCode = g_kvNbDelegatePtrForQuery->GetEntries(query2, resultSet);
1691 EXPECT_EQ(errCode, INVALID_QUERY_FORMAT);
1692
1693 Query query3 = Query::Select().PrefixKey({}).OrderBy("$.field_name1").
1694 OrderBy("$.field_name1").OrderBy("$.field_name1");
1695 errCode = g_kvNbDelegatePtrForQuery->GetEntries(query3, resultSet);
1696 EXPECT_EQ(errCode, OK);
1697 EXPECT_EQ(g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet), OK);
1698 EXPECT_TRUE(resultSet == nullptr);
1699
1700 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
1701 EXPECT_TRUE(g_mgr.DeleteKvStore("multiOrderBy001") == OK);
1702 }
1703
1704 /**
1705 * @tc.name: multiOrderBy001
1706 * @tc.desc: For multiple order query.
1707 * @tc.type: FUNC
1708 * @tc.require: AR000EPARK
1709 * @tc.author: sunpeng
1710 */
1711 HWTEST_F(DistributedDBInterfacesDataOperationTest, PreifxAndOrderBy001, TestSize.Level1)
1712 {
1713 KvStoreNbDelegate::Option option = {true, false, false};
1714 option.schema = SCHEMA_DEFINE2;
1715 g_mgr.GetKvStore("PreifxAndOrderBy001", option, g_kvNbDelegateCallbackForQuery);
1716 ASSERT_TRUE(g_kvNbDelegatePtrForQuery != nullptr);
1717 EXPECT_TRUE(g_kvDelegateStatusForQuery == OK);
1718
1719 PresetDataForPreifxAndOrderBy001();
1720
1721 Query query = Query::Select().PrefixKey({}).OrderBy("$.field_name1", false);
1722 std::vector<Entry> entriesRes;
1723 int errCode = g_kvNbDelegatePtrForQuery->GetEntries(query, entriesRes);
1724 EXPECT_EQ(errCode, OK);
1725 ASSERT_EQ(entriesRes.size(), 5ul);
1726 EXPECT_EQ(entriesRes[0].key, KEY_5);
1727 EXPECT_EQ(entriesRes[1].key, KEY_3);
1728 EXPECT_EQ(entriesRes[2].key, KEY_4);
1729 EXPECT_EQ(entriesRes[3].key, KEY_1);
1730 EXPECT_EQ(entriesRes[4].key, KEY_2);
1731
1732 Query query1 = Query::Select().OrderBy("$.field_name1", false);
1733 errCode = g_kvNbDelegatePtrForQuery->GetEntries(query1, entriesRes);
1734 EXPECT_EQ(errCode, OK);
1735 ASSERT_EQ(entriesRes.size(), 5ul);
1736 EXPECT_EQ(entriesRes[0].key, KEY_5);
1737 EXPECT_EQ(entriesRes[1].key, KEY_4);
1738 EXPECT_EQ(entriesRes[2].key, KEY_3);
1739 EXPECT_EQ(entriesRes[3].key, KEY_2);
1740 EXPECT_EQ(entriesRes[4].key, KEY_1);
1741
1742 Query query2 = Query::Select().PrefixKey({}).OrderBy("$.field_name1", false).OrderBy("$.field_name2", false);
1743 (void) g_kvNbDelegatePtrForQuery->GetEntries(query2, entriesRes);
1744 ASSERT_EQ(entriesRes.size(), 5ul);
1745 EXPECT_EQ(entriesRes[0].key, KEY_5);
1746 EXPECT_EQ(entriesRes[1].key, KEY_4);
1747 EXPECT_EQ(entriesRes[2].key, KEY_3);
1748 EXPECT_EQ(entriesRes[3].key, KEY_2);
1749 EXPECT_EQ(entriesRes[4].key, KEY_1);
1750
1751 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
1752 EXPECT_TRUE(g_mgr.DeleteKvStore("PreifxAndOrderBy001") == OK);
1753 }
1754
1755 /**
1756 * @tc.name: PrefixAndOther001
1757 * @tc.desc: Combination of prefix query and logical filtering
1758 * @tc.type: FUNC
1759 * @tc.require: AR000EPARK
1760 * @tc.author: sunpeng
1761 */
1762 HWTEST_F(DistributedDBInterfacesDataOperationTest, PrefixAndOther001, TestSize.Level1)
1763 {
1764 KvStoreNbDelegate::Option option = {true, false, false};
1765 option.schema = SCHEMA_DEFINE2;
1766 g_mgr.GetKvStore("PrefixAndOther001", option, g_kvNbDelegateCallbackForQuery);
1767 ASSERT_TRUE(g_kvNbDelegatePtrForQuery != nullptr);
1768 EXPECT_TRUE(g_kvDelegateStatusForQuery == OK);
1769
1770 PresetDataForPreifxAndOrderBy001();
1771
1772 std::vector<Entry> entriesRes;
1773 Query query1 = Query::Select().EqualTo("$.field_name1", 1).PrefixKey({});
1774 int errCode = g_kvNbDelegatePtrForQuery->GetEntries(query1, entriesRes);
1775 EXPECT_EQ(errCode, OK);
1776 query1 = Query::Select().PrefixKey({}).EqualTo("$.field_name1", 1);
1777 errCode = g_kvNbDelegatePtrForQuery->GetEntries(query1, entriesRes);
1778 EXPECT_EQ(errCode, OK);
1779
1780 query1 = Query::Select().EqualTo("$.field_name1", 1).PrefixKey({}).And().EqualTo("$.field_name1", 1);
1781 errCode = g_kvNbDelegatePtrForQuery->GetEntries(query1, entriesRes);
1782 EXPECT_EQ(errCode, OK);
1783
1784 query1 = Query::Select().EqualTo("$.field_name1", 1).PrefixKey({}).And().EqualTo("$.field_name1", 2);
1785 errCode = g_kvNbDelegatePtrForQuery->GetEntries(query1, entriesRes);
1786 EXPECT_EQ(errCode, NOT_FOUND);
1787
1788 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
1789 EXPECT_TRUE(g_mgr.DeleteKvStore("PrefixAndOther001") == OK);
1790 }
1791
1792 /**
1793 * @tc.name: InKeys001
1794 * @tc.desc: InKeys query base function
1795 * @tc.type: FUNC
1796 * @tc.require: AR000GOH06
1797 * @tc.author: xushaohua
1798 */
1799 HWTEST_F(DistributedDBInterfacesDataOperationTest, InKeys001, TestSize.Level1)
1800 {
1801 /**
1802 * @tc.steps: step1. Create a database And Preset Data
1803 */
1804 KvStoreNbDelegate::Option option = {true, false, false};
1805 g_mgr.GetKvStore("InKeys001", option, g_kvNbDelegateCallbackForQuery);
1806 ASSERT_NE(g_kvNbDelegatePtrForQuery, nullptr);
1807 EXPECT_EQ(g_kvDelegateStatusForQuery, OK);
1808
1809 Key key = {'1'};
1810 DBStatus status = g_kvNbDelegatePtrForQuery->Put(key, VALUE_1);
1811 ASSERT_EQ(status, OK);
1812 const int dataSize = 10; // 10 data for test
1813 std::set<Key> keys;
1814 for (uint8_t i = 0; i < dataSize; i++) {
1815 key.push_back(i);
1816 status = g_kvNbDelegatePtrForQuery->Put(key, VALUE_1);
1817 ASSERT_EQ(status, OK);
1818 keys.emplace(key);
1819 key.pop_back();
1820 }
1821
1822 /**
1823 * @tc.steps: step2. Call GetEntries With Query, set all keys at Inkeys.
1824 * @tc.expected: step2. Returns KvStoreResultSet, the count is dataSize,
1825 * all data are equals the preset data
1826 */
1827 KvStoreResultSet *resultSet = nullptr;
1828 g_kvNbDelegatePtrForQuery->GetEntries(Query::Select().InKeys(keys), resultSet);
1829 ASSERT_NE(resultSet, nullptr);
1830 ASSERT_EQ(resultSet->GetCount(), dataSize);
1831 for (int i = 0; i < dataSize; i++) {
1832 resultSet->MoveToPosition(i);
1833 Entry entry;
1834 resultSet->GetEntry(entry);
1835 key.push_back(i);
1836 EXPECT_EQ(key, entry.key);
1837 EXPECT_EQ(entry.value, VALUE_1);
1838 key.pop_back();
1839 }
1840 g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet);
1841
1842 /**
1843 * @tc.steps: step3. Call GetEntries With Query, set one other key at Inkeys.
1844 * @tc.expected: step3. Returns KvStoreResultSet, the count is 0,
1845 */
1846 g_kvNbDelegatePtrForQuery->GetEntries(Query::Select().InKeys({KEY_7}), resultSet);
1847 ASSERT_NE(resultSet, nullptr);
1848 ASSERT_EQ(resultSet->GetCount(), 0);
1849 g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet);
1850 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
1851 EXPECT_EQ(g_mgr.DeleteKvStore("InKeys001"), OK);
1852 }
1853
1854 /**
1855 * @tc.name: InKeysLimit001
1856 * @tc.desc: InKeys query limit verification
1857 * @tc.type: FUNC
1858 * @tc.require: AR000GOH06
1859 * @tc.author: xushaohua
1860 */
1861 HWTEST_F(DistributedDBInterfacesDataOperationTest, InKeysLimit001, TestSize.Level1)
1862 {
1863 /**
1864 * @tc.steps: step1. Create a database
1865 */
1866 KvStoreNbDelegate::Option option = {true, false, false};
1867 g_mgr.GetKvStore("InKeysLimit001", option, g_kvNbDelegateCallbackForQuery);
1868 ASSERT_NE(g_kvNbDelegatePtrForQuery, nullptr);
1869 EXPECT_EQ(g_kvDelegateStatusForQuery, OK);
1870
1871 /**
1872 * @tc.steps: step2. Construct a key set, and the key size over MAX_BATCH_SIZE
1873 */
1874 std::set<Key> keys;
1875 for (uint8_t i = 0; i < DBConstant::MAX_BATCH_SIZE + 1; i++) {
1876 Key key = { i };
1877 keys.emplace(key);
1878 }
1879
1880 /**
1881 * @tc.steps: step3. Call GetEntries With Query, set keys at Inkeys.
1882 * @tc.expected: step3. Returns OVER_MAX_LIMITS, the resultSet is nullptr,
1883 */
1884 KvStoreResultSet *resultSet = nullptr;
1885 DBStatus status = g_kvNbDelegatePtrForQuery->GetEntries(Query::Select().InKeys(keys), resultSet);
1886 EXPECT_EQ(status, OVER_MAX_LIMITS);
1887 EXPECT_EQ(resultSet, nullptr);
1888
1889 /**
1890 * @tc.steps: step4. Call GetEntries With Query, set keys empty.
1891 * @tc.expected: step4. Returns INVALID_ARGS, the resultSet is nullptr,
1892 */
1893 status = g_kvNbDelegatePtrForQuery->GetEntries(Query::Select().InKeys({}), resultSet);
1894 EXPECT_EQ(status, INVALID_ARGS);
1895 EXPECT_EQ(resultSet, nullptr);
1896
1897 /**
1898 * @tc.steps: step4. Call GetEntries With Query, set a invalid key.
1899 * @tc.expected: step4. Returns INVALID_ARGS, the resultSet is nullptr,
1900 */
1901 status = g_kvNbDelegatePtrForQuery->GetEntries(Query::Select().InKeys({{}}), resultSet);
1902 EXPECT_EQ(status, INVALID_ARGS);
1903 EXPECT_EQ(resultSet, nullptr);
1904
1905 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
1906 EXPECT_EQ(g_mgr.DeleteKvStore("InKeysLimit001"), OK);
1907 }
1908
1909 /**
1910 * @tc.name: InKeysAndOther001
1911 * @tc.desc: Combination of InKeys query and logical filtering
1912 * @tc.type: FUNC
1913 * @tc.require: AR000GOH06
1914 * @tc.author: xushaohua
1915 */
1916 HWTEST_F(DistributedDBInterfacesDataOperationTest, InKeysAndOther001, TestSize.Level1)
1917 {
1918 /**
1919 * @tc.steps: step1. Create a database And Preset Data
1920 */
1921 KvStoreNbDelegate::Option option = {true, false, false};
1922 option.schema = SCHEMA_DEFINE2;
1923 g_mgr.GetKvStore("InKeysAndOther001", option, g_kvNbDelegateCallbackForQuery);
1924 ASSERT_NE(g_kvNbDelegatePtrForQuery, nullptr);
1925 EXPECT_EQ(g_kvDelegateStatusForQuery, OK);
1926
1927 PresetDataForPreifxAndOrderBy001();
1928
1929 std::set<Key> keys = { KEY_1, KEY_2, KEY_4 };
1930 std::vector<Entry> entriesRes;
1931
1932 /**
1933 * @tc.steps: step2. Call GetEntries With Query, use EqualTo and InKeys
1934 * @tc.expected: step2. Returns OK
1935 */
1936 Query query1 = Query::Select().EqualTo("$.field_name1", 1).InKeys(keys);
1937 int errCode = g_kvNbDelegatePtrForQuery->GetEntries(query1, entriesRes);
1938 EXPECT_EQ(errCode, OK);
1939
1940 /**
1941 * @tc.steps: step3. Call GetEntries With Query, use InKeys and EqualTo
1942 * @tc.expected: step3. Returns OK
1943 */
1944 query1 = Query::Select().InKeys(keys).EqualTo("$.field_name1", 1);
1945 errCode = g_kvNbDelegatePtrForQuery->GetEntries(query1, entriesRes);
1946 EXPECT_EQ(errCode, OK);
1947
1948 /**
1949 * @tc.steps: step4. Call GetEntries With Query, use EqualTo, InKeys and EqualTo, all valid
1950 * @tc.expected: step4. Returns OK
1951 */
1952 query1 = Query::Select().EqualTo("$.field_name1", 1).InKeys(keys).And().EqualTo("$.field_name2", 2);
1953 errCode = g_kvNbDelegatePtrForQuery->GetEntries(query1, entriesRes);
1954 EXPECT_EQ(errCode, OK);
1955
1956 /**
1957 * @tc.steps: step4. Call GetEntries With Query, use EqualTo, InKeys and EqualTo, has invalid
1958 * @tc.expected: step4. Returns NOT_FOUND
1959 */
1960 query1 = Query::Select().EqualTo("$.field_name1", 1).InKeys(keys).And().EqualTo("$.field_name1", 2);
1961 errCode = g_kvNbDelegatePtrForQuery->GetEntries(query1, entriesRes);
1962 EXPECT_EQ(errCode, NOT_FOUND);
1963
1964 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
1965 EXPECT_EQ(g_mgr.DeleteKvStore("InKeysAndOther001"), OK);
1966 }
1967
1968 /**
1969 * @tc.name: InKeysAndOther002
1970 * @tc.desc: Combination of InKeys query and logical filtering
1971 * @tc.type: FUNC
1972 * @tc.require: AR000GOH06
1973 * @tc.author: lianhuix
1974 */
1975 HWTEST_F(DistributedDBInterfacesDataOperationTest, InKeysAndOther002, TestSize.Level1)
1976 {
1977 KvStoreNbDelegate::Option option = {true, false, false};
1978 option.schema = SCHEMA_DEFINE2;
1979 g_mgr.GetKvStore("InKeysAndOther001", option, g_kvNbDelegateCallbackForQuery);
1980 ASSERT_NE(g_kvNbDelegatePtrForQuery, nullptr);
1981 EXPECT_EQ(g_kvDelegateStatusForQuery, OK);
1982
1983 std::set<Key> keys = { KEY_1, KEY_2, KEY_4 };
1984 std::vector<Query> queries = {
1985 Query::Select().PrefixKey({}).InKeys(keys).Or().EqualTo("$.field_name1", 2),
1986 Query::Select().PrefixKey({}).InKeys(keys).And().EqualTo("$.field_name1", 2),
1987 Query::Select().InKeys(keys).Or().EqualTo("$.field_name1", 2),
1988 Query::Select().InKeys(keys).And().EqualTo("$.field_name1", 2),
1989 Query::Select().PrefixKey({}).Or().EqualTo("$.field_name1", 2),
1990 Query::Select().PrefixKey({}).And().EqualTo("$.field_name1", 2),
1991 Query::Select().PrefixKey({}).And().InKeys(keys).EqualTo("$.field_name1", 2),
1992 Query::Select().And().InKeys(keys).EqualTo("$.field_name1", 2),
1993 Query::Select().Or().PrefixKey({}).EqualTo("$.field_name1", 2),
1994 Query::Select().BeginGroup().PrefixKey({}).Or().EqualTo("$.field_name1", 2).EndGroup(),
1995 Query::Select().EqualTo("$.field_name1", 2).Or().InKeys(keys),
1996 Query::Select().EqualTo("$.field_name1", 2).Or().PrefixKey({}),
1997 };
1998
1999 for (const auto &query : queries) {
2000 std::vector<Entry> entriesRes;
2001 int errCode = g_kvNbDelegatePtrForQuery->GetEntries(query, entriesRes);
2002 EXPECT_EQ(errCode, INVALID_QUERY_FORMAT);
2003 }
2004
2005 EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
2006 EXPECT_EQ(g_mgr.DeleteKvStore("InKeysAndOther001"), OK);
2007 }
2008
2009 /**
2010 * @tc.name: WriteTimeSort001
2011 * @tc.desc: For prefixKey query with orderBy writeTime asc
2012 * @tc.type: FUNC
2013 * @tc.require: SR000H5U55
2014 * @tc.author: zhuwentao
2015 */
2016 HWTEST_F(DistributedDBInterfacesDataOperationTest, WriteTimeSort001, TestSize.Level0)
2017 {
2018 /**
2019 * @tc.steps: step1. Create a database And Preset Data
2020 */
2021 KvStoreNbDelegate::Option option = {true, false, false};
2022 g_mgr.GetKvStore("WriteTimeSort001", option, g_kvNbDelegateCallbackForQuery);
2023 ASSERT_NE(g_kvNbDelegatePtrForQuery, nullptr);
2024 EXPECT_EQ(g_kvDelegateStatusForQuery, OK);
2025 /**
2026 * @tc.steps: step2. put some data
2027 * @tc.expected: step2. Returns OK
2028 */
2029 Key key = {'x'};
2030 Key key2 = {'y'};
2031 const int dataSize = 100; // 100 data for test
2032 std::vector<Key> expectedKeys;
2033 std::vector<uint8_t> keySuffix;
2034 for (uint8_t i = 0; i < dataSize; i++) {
2035 keySuffix.push_back(rand () % 100);
2036 }
2037 for (uint8_t i = 0; i < dataSize; i++) {
2038 Key tmpKey = {key[0], keySuffix[i], i};
2039 ASSERT_EQ(g_kvNbDelegatePtrForQuery->Put(tmpKey, VALUE_1), OK);
2040 expectedKeys.push_back(tmpKey);
2041 }
2042 ASSERT_EQ(g_kvNbDelegatePtrForQuery->Put(key2, VALUE_1), OK);
2043
2044 /**
2045 * @tc.steps: step2. Call GetEntries With prefix Query
2046 * @tc.expected: step2. Returns KvStoreResultSet, the count is dataSize,
2047 * all data are equals the preset data
2048 */
2049 KvStoreResultSet *resultSet = nullptr;
2050 EXPECT_EQ(g_kvNbDelegatePtrForQuery->GetEntries(Query::Select().PrefixKey(key).OrderByWriteTime(true), resultSet),
2051 OK);
2052 ASSERT_NE(resultSet, nullptr);
2053 ASSERT_EQ(resultSet->GetCount(), dataSize);
2054 for (int i = 0; i < dataSize; i++) {
2055 resultSet->MoveToPosition(i);
2056 Entry entry;
2057 resultSet->GetEntry(entry);
2058 EXPECT_EQ(expectedKeys[i], entry.key);
2059 EXPECT_EQ(entry.value, VALUE_1);
2060 }
2061 g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet);
2062 /**
2063 * @tc.steps: step3. Call GetEntries With prefix Query limit
2064 * @tc.expected: step3. Returns KvStoreResultSet, the count is dataSize,
2065 * all data are equals the preset data
2066 */
2067 KvStoreResultSet *resultSet2 = nullptr;
2068 EXPECT_EQ(g_kvNbDelegatePtrForQuery->GetEntries(
2069 Query::Select().PrefixKey(key).OrderByWriteTime(true).Limit(dataSize / 2, 0), resultSet2), OK);
2070 ASSERT_NE(resultSet2, nullptr);
2071 ASSERT_EQ(resultSet2->GetCount(), dataSize / 2);
2072 for (int i = 0; i < dataSize / 2; i++) {
2073 resultSet2->MoveToPosition(i);
2074 Entry entry;
2075 resultSet2->GetEntry(entry);
2076 EXPECT_EQ(expectedKeys[i], entry.key);
2077 EXPECT_EQ(entry.value, VALUE_1);
2078 }
2079 g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet2);
2080 }
2081
2082 /**
2083 * @tc.name: WriteTimeSort002
2084 * @tc.desc: For prefixKey query with orderBy writeTime asc
2085 * @tc.type: FUNC
2086 * @tc.require: SR000H5U55
2087 * @tc.author: zhuwentao
2088 */
2089 HWTEST_F(DistributedDBInterfacesDataOperationTest, WriteTimeSort002, TestSize.Level0)
2090 {
2091 /**
2092 * @tc.steps: step1. Create a database And Preset Data
2093 */
2094 KvStoreNbDelegate::Option option = {true, false, false};
2095 g_mgr.GetKvStore("WriteTimeSort002", option, g_kvNbDelegateCallbackForQuery);
2096 ASSERT_NE(g_kvNbDelegatePtrForQuery, nullptr);
2097 EXPECT_EQ(g_kvDelegateStatusForQuery, OK);
2098 /**
2099 * @tc.steps: step2. put some data
2100 * @tc.expected: step2. Returns OK
2101 */
2102 Key key = {'x'};
2103 Key key2 = {'y'};
2104 const int dataSize = 100; // 100 data for test
2105 std::vector<Key> expectedKeys;
2106 std::vector<uint8_t> keySuffix;
2107 for (uint8_t i = 0; i < dataSize; i++) {
2108 keySuffix.push_back(rand () % 100);
2109 }
2110 for (uint8_t i = 0; i < dataSize; i++) {
2111 Key tmpKey = {key[0], keySuffix[i], i};
2112 ASSERT_EQ(g_kvNbDelegatePtrForQuery->Put(tmpKey, VALUE_1), OK);
2113 expectedKeys.push_back(tmpKey);
2114 }
2115 ASSERT_EQ(g_kvNbDelegatePtrForQuery->Put(key2, VALUE_1), OK);
2116
2117 /**
2118 * @tc.steps: step2. Call GetEntries With prefix Query
2119 * @tc.expected: step2. Returns entries
2120 * all data are equals the preset data
2121 */
2122 std::vector<Entry> entries;
2123 EXPECT_EQ(g_kvNbDelegatePtrForQuery->GetEntries(Query::Select().PrefixKey(key).OrderByWriteTime(true), entries),
2124 OK);
2125 ASSERT_EQ(entries.size(), static_cast<long unsigned int>(dataSize));
2126 for (int i = 0; i < dataSize; i++) {
2127 EXPECT_EQ(expectedKeys[i], entries[i].key);
2128 EXPECT_EQ(entries[i].value, VALUE_1);
2129 }
2130 /**
2131 * @tc.steps: step3. Call GetEntries With prefix Query limit
2132 * @tc.expected: step3. Returns entries
2133 * all data are equals the preset data
2134 */
2135 std::vector<Entry> entries2;
2136 EXPECT_EQ(g_kvNbDelegatePtrForQuery->GetEntries(
2137 Query::Select().PrefixKey(key).OrderByWriteTime(true).Limit(dataSize / 2, 0), entries2), OK);
2138 ASSERT_EQ(entries2.size(), static_cast<long unsigned int>(dataSize / 2));
2139 for (int i = 0; i < dataSize / 2; i++) {
2140 EXPECT_EQ(expectedKeys[i], entries2[i].key);
2141 EXPECT_EQ(entries2[i].value, VALUE_1);
2142 }
2143 }
2144
2145 /**
2146 * @tc.name: WriteTimeSort003
2147 * @tc.desc: For prefixKey query with orderBy writeTime desc
2148 * @tc.type: FUNC
2149 * @tc.require: SR000H5U55
2150 * @tc.author: zhuwentao
2151 */
2152 HWTEST_F(DistributedDBInterfacesDataOperationTest, WriteTimeSort003, TestSize.Level0)
2153 {
2154 /**
2155 * @tc.steps: step1. Create a database And Preset Data
2156 */
2157 KvStoreNbDelegate::Option option = {true, false, false};
2158 g_mgr.GetKvStore("WriteTimeSort003", option, g_kvNbDelegateCallbackForQuery);
2159 ASSERT_NE(g_kvNbDelegatePtrForQuery, nullptr);
2160 EXPECT_EQ(g_kvDelegateStatusForQuery, OK);
2161 /**
2162 * @tc.steps: step2. put some data
2163 * @tc.expected: step2. Returns OK
2164 */
2165 Key key = {'x'};
2166 Key key2 = {'y'};
2167 const int dataSize = 100; // 100 data for test
2168 std::vector<Key> expectedKeys;
2169 std::vector<uint8_t> keySuffix;
2170 for (uint8_t i = 0; i < dataSize; i++) {
2171 keySuffix.push_back(rand () % 100);
2172 }
2173 for (uint8_t i = 0; i < dataSize; i++) {
2174 Key tmpKey = {key[0], keySuffix[i], i};
2175 ASSERT_EQ(g_kvNbDelegatePtrForQuery->Put(tmpKey, VALUE_1), OK);
2176 expectedKeys.push_back(tmpKey);
2177 }
2178 ASSERT_EQ(g_kvNbDelegatePtrForQuery->Put(key2, VALUE_1), OK);
2179
2180 /**
2181 * @tc.steps: step2. Call GetEntries With prefix Query
2182 * @tc.expected: step2. Returns KvStoreResultSet, the count is dataSize,
2183 * all data are equals the preset data
2184 */
2185 KvStoreResultSet *resultSet = nullptr;
2186 EXPECT_EQ(g_kvNbDelegatePtrForQuery->GetEntries(Query::Select().PrefixKey(key).OrderByWriteTime(false), resultSet),
2187 OK);
2188 ASSERT_NE(resultSet, nullptr);
2189 ASSERT_EQ(resultSet->GetCount(), dataSize);
2190 for (int i = 0; i < dataSize; i++) {
2191 resultSet->MoveToPosition(i);
2192 Entry entry;
2193 resultSet->GetEntry(entry);
2194 EXPECT_EQ(expectedKeys[dataSize - i - 1], entry.key);
2195 EXPECT_EQ(entry.value, VALUE_1);
2196 }
2197 g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet);
2198 /**
2199 * @tc.steps: step3. Call GetEntries With prefix Query limit
2200 * @tc.expected: step3. Returns KvStoreResultSet, the count is dataSize,
2201 * all data are equals the preset data
2202 */
2203 KvStoreResultSet *resultSet2 = nullptr;
2204 EXPECT_EQ(g_kvNbDelegatePtrForQuery->GetEntries(
2205 Query::Select().PrefixKey(key).OrderByWriteTime(false).Limit(dataSize / 2, 0), resultSet2), OK);
2206 ASSERT_NE(resultSet2, nullptr);
2207 ASSERT_EQ(resultSet2->GetCount(), dataSize / 2);
2208 for (int i = 0; i < dataSize / 2; i++) {
2209 resultSet2->MoveToPosition(i);
2210 Entry entry;
2211 resultSet2->GetEntry(entry);
2212 EXPECT_EQ(expectedKeys[dataSize - i - 1], entry.key);
2213 EXPECT_EQ(entry.value, VALUE_1);
2214 }
2215 g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet2);
2216 }
2217
2218 /**
2219 * @tc.name: WriteTimeSort004
2220 * @tc.desc: For prefixKey query with orderBy writeTime asc
2221 * @tc.type: FUNC
2222 * @tc.require: SR000H5U55
2223 * @tc.author: zhuwentao
2224 */
2225 HWTEST_F(DistributedDBInterfacesDataOperationTest, WriteTimeSort004, TestSize.Level0)
2226 {
2227 /**
2228 * @tc.steps: step1. Create a database And Preset Data
2229 */
2230 KvStoreNbDelegate::Option option = {true, false, false};
2231 g_mgr.GetKvStore("WriteTimeSort004", option, g_kvNbDelegateCallbackForQuery);
2232 ASSERT_NE(g_kvNbDelegatePtrForQuery, nullptr);
2233 EXPECT_EQ(g_kvDelegateStatusForQuery, OK);
2234 /**
2235 * @tc.steps: step2. put some data
2236 * @tc.expected: step2. Returns OK
2237 */
2238 Key key = {'x'};
2239 Key key2 = {'y'};
2240 const int dataSize = 100; // 100 data for test
2241 std::vector<Key> expectedKeys;
2242 std::vector<uint8_t> keySuffix;
2243 for (uint8_t i = 0; i < dataSize; i++) {
2244 keySuffix.push_back(rand () % 100);
2245 }
2246 for (uint8_t i = 0; i < dataSize; i++) {
2247 Key tmpKey = {key[0], keySuffix[i], i};
2248 ASSERT_EQ(g_kvNbDelegatePtrForQuery->Put(tmpKey, VALUE_1), OK);
2249 expectedKeys.push_back(tmpKey);
2250 }
2251 ASSERT_EQ(g_kvNbDelegatePtrForQuery->Put(key2, VALUE_1), OK);
2252
2253 /**
2254 * @tc.steps: step2. Call GetEntries With prefix Query
2255 * @tc.expected: step2. Returns entries
2256 * all data are equals the preset data
2257 */
2258 std::vector<Entry> entries;
2259 EXPECT_EQ(g_kvNbDelegatePtrForQuery->GetEntries(Query::Select().PrefixKey(key).OrderByWriteTime(false), entries),
2260 OK);
2261 ASSERT_EQ(entries.size(), static_cast<long unsigned int>(dataSize));
2262 for (int i = 0; i < dataSize; i++) {
2263 EXPECT_EQ(expectedKeys[dataSize - i - 1], entries[i].key);
2264 EXPECT_EQ(entries[i].value, VALUE_1);
2265 }
2266 /**
2267 * @tc.steps: step3. Call GetEntries With prefix Query limit
2268 * @tc.expected: step3. Returns entries
2269 * all data are equals the preset data
2270 */
2271 std::vector<Entry> entries2;
2272 EXPECT_EQ(g_kvNbDelegatePtrForQuery->GetEntries(
2273 Query::Select().PrefixKey(key).OrderByWriteTime(false).Limit(dataSize / 2, 0), entries2), OK);
2274 ASSERT_EQ(entries2.size(), static_cast<long unsigned int>(dataSize / 2));
2275 for (int i = 0; i < dataSize / 2; i++) {
2276 EXPECT_EQ(expectedKeys[dataSize - i - 1], entries2[i].key);
2277 EXPECT_EQ(entries2[i].value, VALUE_1);
2278 }
2279 }
2280
2281 /**
2282 * @tc.name: WriteTimeSort005
2283 * @tc.desc: For inkeys query with orderBy writeTime asc
2284 * @tc.type: FUNC
2285 * @tc.require: SR000H5U55
2286 * @tc.author: zhuwentao
2287 */
2288 HWTEST_F(DistributedDBInterfacesDataOperationTest, WriteTimeSort005, TestSize.Level0)
2289 {
2290 /**
2291 * @tc.steps: step1. Create a database And Preset Data
2292 */
2293 KvStoreNbDelegate::Option option = {true, false, false};
2294 g_mgr.GetKvStore("WriteTimeSort005", option, g_kvNbDelegateCallbackForQuery);
2295 ASSERT_NE(g_kvNbDelegatePtrForQuery, nullptr);
2296 EXPECT_EQ(g_kvDelegateStatusForQuery, OK);
2297 /**
2298 * @tc.steps: step2. put some data
2299 * @tc.expected: step2. Returns OK
2300 */
2301 Key key = {'x'};
2302 Key key2 = {'y'};
2303 const int dataSize = 100; // 100 data for test
2304 std::vector<Key> expectedKeys;
2305 std::vector<uint8_t> keySuffix;
2306 for (uint8_t i = 0; i < dataSize; i++) {
2307 keySuffix.push_back(rand () % 100);
2308 }
2309 for (uint8_t i = 0; i < dataSize; i++) {
2310 Key tmpKey = {key[0], keySuffix[i], i};
2311 ASSERT_EQ(g_kvNbDelegatePtrForQuery->Put(tmpKey, VALUE_1), OK);
2312 if (rand() % 2) {
2313 expectedKeys.push_back(tmpKey);
2314 }
2315 }
2316 ASSERT_EQ(g_kvNbDelegatePtrForQuery->Put(key2, VALUE_1), OK);
2317 /**
2318 * @tc.steps: step2. Call GetEntries With prefix Query
2319 * @tc.expected: step2. Returns KvStoreResultSet, the count is dataSize,
2320 * all data are equals the preset data
2321 */
2322 KvStoreResultSet *resultSet = nullptr;
2323 std::set<Key> keys(expectedKeys.begin(), expectedKeys.end());
2324 EXPECT_EQ(g_kvNbDelegatePtrForQuery->GetEntries(Query::Select().InKeys(keys).OrderByWriteTime(true), resultSet),
2325 OK);
2326 ASSERT_NE(resultSet, nullptr);
2327 ASSERT_EQ(resultSet->GetCount(), static_cast<int>(keys.size()));
2328 for (uint32_t i = 0; i < keys.size(); i++) {
2329 resultSet->MoveToPosition(i);
2330 Entry entry;
2331 resultSet->GetEntry(entry);
2332 EXPECT_EQ(expectedKeys[i], entry.key);
2333 EXPECT_EQ(entry.value, VALUE_1);
2334 }
2335 g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet);
2336 /**
2337 * @tc.steps: step3. Call GetEntries With prefix Query limit
2338 * @tc.expected: step3. Returns KvStoreResultSet, the count is dataSize,
2339 * all data are equals the preset data
2340 */
2341 KvStoreResultSet *resultSet2 = nullptr;
2342 long unsigned int limitNum = 40;
2343 EXPECT_EQ(g_kvNbDelegatePtrForQuery->GetEntries(
2344 Query::Select().InKeys(keys).OrderByWriteTime(true).Limit(limitNum, 0), resultSet2), OK);
2345 ASSERT_NE(resultSet2, nullptr);
2346 int expectedSize = (keys.size() >= limitNum) ? limitNum : keys.size();
2347 ASSERT_EQ(resultSet2->GetCount(), static_cast<int>(expectedSize));
2348 for (int i = 0; i < expectedSize; i++) {
2349 resultSet2->MoveToPosition(i);
2350 Entry entry;
2351 resultSet2->GetEntry(entry);
2352 EXPECT_EQ(expectedKeys[i], entry.key);
2353 }
2354 g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet2);
2355 }
2356
2357 /**
2358 * @tc.name: WriteTimeSort006
2359 * @tc.desc: For inkeys query with orderBy writeTime desc
2360 * @tc.type: FUNC
2361 * @tc.require: SR000H5U55
2362 * @tc.author: zhuwentao
2363 */
2364 HWTEST_F(DistributedDBInterfacesDataOperationTest, WriteTimeSort006, TestSize.Level0)
2365 {
2366 /**
2367 * @tc.steps: step1. Create a database And Preset Data
2368 */
2369 KvStoreNbDelegate::Option option = {true, false, false};
2370 g_mgr.GetKvStore("WriteTimeSort006", option, g_kvNbDelegateCallbackForQuery);
2371 ASSERT_NE(g_kvNbDelegatePtrForQuery, nullptr);
2372 EXPECT_EQ(g_kvDelegateStatusForQuery, OK);
2373 /**
2374 * @tc.steps: step2. put some data
2375 * @tc.expected: step2. Returns OK
2376 */
2377 Key key = {'x'};
2378 Key key2 = {'y'};
2379 const int dataSize = 100; // 100 data for test
2380 std::vector<Key> expectedKeys;
2381 std::vector<uint8_t> keySuffix;
2382 for (uint8_t i = 0; i < dataSize; i++) {
2383 keySuffix.push_back(rand () % 100);
2384 }
2385 for (uint8_t i = 0; i < dataSize; i++) {
2386 Key tmpKey = {key[0], keySuffix[i], i};
2387 ASSERT_EQ(g_kvNbDelegatePtrForQuery->Put(tmpKey, VALUE_1), OK);
2388 if (rand() % 2) {
2389 expectedKeys.push_back(tmpKey);
2390 }
2391 }
2392 ASSERT_EQ(g_kvNbDelegatePtrForQuery->Put(key2, VALUE_1), OK);
2393 /**
2394 * @tc.steps: step2. Call GetEntries With prefix Query
2395 * @tc.expected: step2. Returns KvStoreResultSet, the count is dataSize,
2396 * all data are equals the preset data
2397 */
2398 KvStoreResultSet *resultSet = nullptr;
2399 std::set<Key> keys(expectedKeys.begin(), expectedKeys.end());
2400 EXPECT_EQ(g_kvNbDelegatePtrForQuery->GetEntries(Query::Select().InKeys(keys).OrderByWriteTime(false), resultSet),
2401 OK);
2402 ASSERT_NE(resultSet, nullptr);
2403 ASSERT_EQ(resultSet->GetCount(), static_cast<int>(keys.size()));
2404 for (uint32_t i = 0; i < keys.size(); i++) {
2405 resultSet->MoveToPosition(i);
2406 Entry entry;
2407 resultSet->GetEntry(entry);
2408 EXPECT_EQ(expectedKeys[keys.size() - i - 1], entry.key);
2409 EXPECT_EQ(entry.value, VALUE_1);
2410 }
2411 g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet);
2412 /**
2413 * @tc.steps: step3. Call GetEntries With prefix Query limit
2414 * @tc.expected: step3. Returns entries
2415 * all data are equals the preset data
2416 */
2417
2418 std::vector<Entry> entries2;
2419 EXPECT_EQ(g_kvNbDelegatePtrForQuery->GetEntries(
2420 Query::Select().InKeys(keys).OrderByWriteTime(false).Limit(keys.size() / 2, 0), entries2), OK);
2421 ASSERT_EQ(entries2.size(), static_cast<long unsigned int>(expectedKeys.size() / 2));
2422 for (uint32_t i = 0; i < keys.size() / 2; i++) {
2423 EXPECT_EQ(expectedKeys[keys.size() - i - 1], entries2[i].key);
2424 EXPECT_EQ(entries2[i].value, VALUE_1);
2425 }
2426 }
2427
2428 /**
2429 * @tc.name: WriteTimeSort007
2430 * @tc.desc: For unsupport query when getEntries
2431 * @tc.type: FUNC
2432 * @tc.require: SR000H5U55
2433 * @tc.author: zhuwentao
2434 */
2435 HWTEST_F(DistributedDBInterfacesDataOperationTest, WriteTimeSort007, TestSize.Level0)
2436 {
2437 /**
2438 * @tc.steps: step1. Create a database And Preset Data
2439 */
2440 KvStoreNbDelegate::Option option = {true, false, false};
2441 g_mgr.GetKvStore("WriteTimeSort007", option, g_kvNbDelegateCallbackForQuery);
2442 ASSERT_NE(g_kvNbDelegatePtrForQuery, nullptr);
2443 EXPECT_EQ(g_kvDelegateStatusForQuery, OK);
2444 /**
2445 * @tc.steps: step2. Call GetEntries With unsupport Query
2446 * @tc.expected: step2. Returns NOT_SUPPORT
2447 */
2448 Query query = Query::Select().BeginGroup().LessThan("$.field_name1", 5).OrderByWriteTime(false);
2449 KvStoreResultSet *resultSet = nullptr;
2450 EXPECT_EQ(g_kvNbDelegatePtrForQuery->GetEntries(query, resultSet), NOT_SUPPORT);
2451 std::vector<Entry> entries2;
2452 EXPECT_EQ(g_kvNbDelegatePtrForQuery->GetEntries(query, entries2), NOT_SUPPORT);
2453 int count = 0;
2454 EXPECT_EQ(g_kvNbDelegatePtrForQuery->GetCount(query, count), NOT_SUPPORT);
2455 Key key = {'x'};
2456 ASSERT_EQ(g_kvNbDelegatePtrForQuery->Put(key, VALUE_1), OK);
2457 Query query1 = Query::Select().PrefixKey(key).OrderByWriteTime(false);
2458 EXPECT_EQ(g_kvNbDelegatePtrForQuery->GetCount(query1, count), OK);
2459 EXPECT_EQ(count, 1);
2460 }
2461 #endif // OMIT_JSON