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