• 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 
1134 /**
1135   * @tc.name: GetEntriesWithQuery003
1136   * @tc.desc: GetEntries(const Query &query, std::vector<Entry> &entries) interface test.
1137   * @tc.type: FUNC
1138   * @tc.require: AR000DR9K7
1139   * @tc.author: weifeng
1140   */
1141 HWTEST_F(DistributedDBInterfacesDataOperationTest, GetEntriesWithQuery003, TestSize.Level1)
1142 {
1143     KvStoreNbDelegate::Option option = {true, false, false};
1144     option.schema = SCHEMA_STRING;
1145     g_mgr.GetKvStore("GetEntriesWithQuery003", option, g_kvNbDelegateCallbackForQuery);
1146     ASSERT_TRUE(g_kvNbDelegatePtrForQuery != nullptr);
1147     EXPECT_TRUE(g_kvDelegateStatusForQuery == OK);
1148     PutValidEntries();
1149     /**
1150      * @tc.steps: step1. Getentries by query, query is empty;
1151      * @tc.expected: step1. Getentries return OK, entries size == totalSize;
1152      */
1153     Query query = Query::Select();
1154     int count = 0;
1155     int ret = g_kvNbDelegatePtrForQuery->GetCount(query, count);
1156     EXPECT_TRUE(ret == OK);
1157     EXPECT_TRUE(count == 24);
1158     /**
1159      * @tc.steps: step2. Getentries by query, query is full-set;
1160      * @tc.expected: step2. Getentries return OK, ;
1161      */
1162     std::vector<int> inCondition = {1, 10, 100, 200};
1163     Query fullQuery = Query::Select().EqualTo("$.field_name1", true).And().NotEqualTo("$.field_name2", false).
1164         And().GreaterThan("$.field_name3", 10).And().LessThan("$.field_name4", 10).And().Like("$.field_name6", "4%").
1165         And().In("$.field_name7", inCondition);
1166     ret = g_kvNbDelegatePtrForQuery->GetCount(fullQuery, count);
1167     EXPECT_TRUE(ret == OK);
1168     EXPECT_TRUE(count == 3);
1169     EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
1170     EXPECT_TRUE(g_mgr.DeleteKvStore("GetEntriesWithQuery003") == OK);
1171 }
1172 
1173 /**
1174   * @tc.name: GetEntriesWithQuery004
1175   * @tc.desc: GetEntries(const Query &query, std::vector<Entry> &entries) interface test.
1176   * @tc.type: FUNC
1177   * @tc.require: AR000DR9K7
1178   * @tc.author: weifeng
1179   */
1180 HWTEST_F(DistributedDBInterfacesDataOperationTest, GetEntriesWithQuery004, TestSize.Level1)
1181 {
1182     KvStoreNbDelegate::Option option = {true, false, false};
1183     option.schema = SCHEMA_STRING;
1184     g_mgr.GetKvStore("GetEntriesWithQuery004", option, g_kvNbDelegateCallbackForQuery);
1185     ASSERT_TRUE(g_kvNbDelegatePtrForQuery != nullptr);
1186     EXPECT_TRUE(g_kvDelegateStatusForQuery == OK);
1187     PutValidEntries();
1188     /**
1189      * @tc.steps: step1. Getentries by query, query is empty;
1190      * @tc.expected: step1. Getentries return OK, entries size == totalSize;
1191      */
1192     Query query = Query::Select();
1193     KvStoreResultSet *resultSet = nullptr;
1194     int ret = g_kvNbDelegatePtrForQuery->GetEntries(query, resultSet);
1195     ASSERT_TRUE(resultSet != nullptr);
1196     EXPECT_TRUE(ret == OK);
1197     EXPECT_EQ(resultSet->GetCount(), 24);
1198     EXPECT_EQ(resultSet->GetPosition(), -1);
1199     EXPECT_TRUE(!resultSet->IsFirst());
1200     EXPECT_TRUE(resultSet->MoveToFirst());
1201     EXPECT_TRUE(resultSet->IsFirst());
1202     EXPECT_EQ(g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet), OK);
1203     EXPECT_TRUE(resultSet == nullptr);
1204     /**
1205      * @tc.steps: step2. Getentries by query, query is full-set;
1206      * @tc.expected: step2. Getentries return OK, ;
1207      */
1208     std::vector<int> inCondition = {1, 10, 100, 200};
1209     Query fullQuery = Query::Select().EqualTo("$.field_name1", true).And().NotEqualTo("$.field_name2", false).
1210         And().GreaterThan("$.field_name3", 10).And().LessThan("$.field_name4", 10).And().Like("$.field_name6", "4%").
1211         And().In("$.field_name7", inCondition).OrderBy("$.field_name9").Limit(20, 1);
1212     ret = g_kvNbDelegatePtrForQuery->GetEntries(fullQuery, resultSet);
1213     ASSERT_TRUE(resultSet != nullptr);
1214     EXPECT_EQ(ret, OK);
1215     EXPECT_EQ(resultSet->GetCount(), 2);
1216     EXPECT_EQ(g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet), OK);
1217     EXPECT_TRUE(resultSet == nullptr);
1218     EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
1219     EXPECT_TRUE(g_mgr.DeleteKvStore("GetEntriesWithQuery004") == OK);
1220 }
1221 
1222 /**
1223   * @tc.name: QueryIsNotNull001
1224   * @tc.desc: IsNotNull interface normal function
1225   * @tc.type: FUNC
1226   * @tc.require: AR000EPARK
1227   * @tc.author: sunpeng
1228   */
1229 HWTEST_F(DistributedDBInterfacesDataOperationTest, QueryIsNotNull001, TestSize.Level1)
1230 {
1231     KvStoreNbDelegate::Option option = {true, false, false};
1232     option.schema = SCHEMA_DEFINE2;
1233     g_mgr.GetKvStore("QueryIsNotNull001", option, g_kvNbDelegateCallbackForQuery);
1234     ASSERT_TRUE(g_kvNbDelegatePtrForQuery != nullptr);
1235     EXPECT_TRUE(g_kvDelegateStatusForQuery == OK);
1236     std::string validData = "{\"field_name1\":null, \"field_name2\":1}";
1237     Value value(validData.begin(), validData.end());
1238     EXPECT_EQ(g_kvNbDelegatePtrForQuery->Put(KEY_1, value), OK);
1239     validData = "{\"field_name1\":2, \"field_name2\":2}";
1240     Value value2(validData.begin(), validData.end());
1241     EXPECT_EQ(g_kvNbDelegatePtrForQuery->Put(KEY_2, value2), OK);
1242     /**
1243      * @tc.steps: step1. Get Query object by IsNotNull
1244      */
1245     Query query = Query::Select().IsNotNull("$.field_name1");
1246     /**
1247      * @tc.steps: step2. Use GetEntries get KV
1248      * @tc.expected: step2. Getentries return OK, Get K1V1;
1249      */
1250     std::vector<Entry> entries;
1251     int errCode = g_kvNbDelegatePtrForQuery->GetEntries(query, entries);
1252     EXPECT_EQ(errCode, OK);
1253     EXPECT_EQ(entries.size(), 1ul);
1254     EXPECT_EQ(entries[0].key, KEY_2);
1255     EXPECT_EQ(entries[0].value, value2);
1256     /**
1257      * @tc.steps: step3. Use GetCount to get number of item
1258      * @tc.expected: step3. Get count = 1;
1259      */
1260     int count = -1;
1261     g_kvNbDelegatePtrForQuery->GetCount(query, count);
1262     EXPECT_EQ(count, 1);
1263     /**
1264      * @tc.steps: step4. Use GetEntries to get resultSet
1265      * @tc.expected: step4. Getentries return OK, Get K1V1;
1266      */
1267     KvStoreResultSet *resultSet = nullptr;
1268     errCode = g_kvNbDelegatePtrForQuery->GetEntries(query, resultSet);
1269     ASSERT_TRUE(resultSet != nullptr);
1270     EXPECT_EQ(errCode, OK);
1271     EXPECT_EQ(resultSet->GetCount(), 1);
1272     EXPECT_EQ(g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet), OK);
1273     EXPECT_TRUE(resultSet == nullptr);
1274     EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
1275     EXPECT_TRUE(g_mgr.DeleteKvStore("QueryIsNotNull001") == OK);
1276 }
1277 
1278 /**
1279   * @tc.name: QueryPreFixKey001
1280   * @tc.desc: Normal function of query by prefix key
1281   * @tc.type: FUNC
1282   * @tc.require: AR000EPARK
1283   * @tc.author: sunpeng
1284   */
1285 HWTEST_F(DistributedDBInterfacesDataOperationTest, QueryPreFixKey001, TestSize.Level1)
1286 {
1287     KvStoreNbDelegate::Option option = {true, false, false};
1288     option.schema = SCHEMA_DEFINE2;
1289     g_mgr.GetKvStore("QueryPreFixKey001", option, g_kvNbDelegateCallbackForQuery);
1290     ASSERT_TRUE(g_kvNbDelegatePtrForQuery != nullptr);
1291     EXPECT_TRUE(g_kvDelegateStatusForQuery == OK);
1292 
1293     vector<Entry> entries = PreDataForQueryByPreFixKey();
1294     EXPECT_EQ(g_kvNbDelegatePtrForQuery->PutBatch(entries), OK);
1295 
1296     /**
1297      * @tc.steps: step1. Get Query object by PrefixKey ac
1298      */
1299     Query query = Query::Select().PrefixKey({'a', 'c'});
1300 
1301     /**
1302      * @tc.steps: step2. Use GetEnties to get same key prefix ac
1303      * @tc.expected: step2. Get count = 5, Key6~10
1304      */
1305     std::vector<Entry> entriesRes;
1306     int errCode = g_kvNbDelegatePtrForQuery->GetEntries(query, entriesRes);
1307     EXPECT_EQ(errCode, OK);
1308     EXPECT_EQ(entriesRes.size(), 5ul);
1309     for (size_t i = 0; i < entriesRes.size(); i++) {
1310         EXPECT_EQ(entriesRes[i].key.front(), 'a');
1311         EXPECT_EQ(entriesRes[i].key[1], 'c');
1312     }
1313     /**
1314      * @tc.steps: step3. Use GetCount to get number of item of this query object
1315      * @tc.expected: step3. Get count = 5
1316      */
1317     int count = -1;
1318     g_kvNbDelegatePtrForQuery->GetCount(query, count);
1319     EXPECT_EQ(count, 5);
1320     /**
1321      * @tc.steps: step4. Use GetEnties to get same key prefix ac of resultSet
1322      * @tc.expected: step4. Get resultSet of key6~10
1323      */
1324     KvStoreResultSet *resultSet = nullptr;
1325     errCode = g_kvNbDelegatePtrForQuery->GetEntries(query, resultSet);
1326     ASSERT_TRUE(resultSet != nullptr);
1327     EXPECT_EQ(errCode, OK);
1328     EXPECT_EQ(resultSet->GetCount(), 5);
1329     EXPECT_EQ(g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet), OK);
1330     EXPECT_TRUE(resultSet == nullptr);
1331 
1332     /**
1333      * @tc.steps: step5. Get Query object by null PrefixKey
1334      */
1335     Query query1 = Query::Select().PrefixKey({});
1336     errCode = g_kvNbDelegatePtrForQuery->GetEntries(query1, entriesRes);
1337     /**
1338      * @tc.steps: step6. Use GetEnties and GetCount to null key prefix query object
1339      * @tc.expected: step6. Get all KV from database
1340      */
1341     EXPECT_EQ(errCode, OK);
1342     EXPECT_EQ(entriesRes.size(), 10ul);
1343     EXPECT_TRUE(DistributedDBToolsUnitTest::IsEntriesEqual(entries, entriesRes, true));
1344 
1345     errCode = g_kvNbDelegatePtrForQuery->GetEntries(query1, resultSet);
1346     ASSERT_TRUE(resultSet != nullptr);
1347     EXPECT_EQ(errCode, OK);
1348     EXPECT_EQ(resultSet->GetCount(), 10);
1349     EXPECT_EQ(g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet), OK);
1350     EXPECT_TRUE(resultSet == nullptr);
1351 
1352     Query query2 = Query::Select().PrefixKey(Key(1025, 'a')); // 1025 over max key length 1 byte
1353     errCode = g_kvNbDelegatePtrForQuery->GetEntries(query2, entriesRes);
1354     EXPECT_EQ(errCode, INVALID_ARGS);
1355 
1356     EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
1357     EXPECT_TRUE(g_mgr.DeleteKvStore("QueryPreFixKey001") == OK);
1358 }
1359 
1360 /**
1361   * @tc.name: QueryPreFixKey003
1362   * @tc.desc: For special key prefix combination condition of query
1363   * @tc.type: FUNC
1364   * @tc.require: AR000EPARK
1365   * @tc.author: sunpeng
1366   */
1367 HWTEST_F(DistributedDBInterfacesDataOperationTest, QueryPreFixKey003, TestSize.Level1)
1368 {
1369     KvStoreNbDelegate::Option option = {true, false, false};
1370     option.schema = SCHEMA_DEFINE2;
1371     g_mgr.GetKvStore("QueryPreFixKey003", option, g_kvNbDelegateCallbackForQuery);
1372     ASSERT_TRUE(g_kvNbDelegatePtrForQuery != nullptr);
1373     EXPECT_TRUE(g_kvDelegateStatusForQuery == OK);
1374 
1375     vector<Entry> entries = PreDataForQueryByPreFixKey();
1376     EXPECT_EQ(g_kvNbDelegatePtrForQuery->PutBatch(entries), OK);
1377 
1378     /**
1379      * @tc.steps: step1. Get Query object by double PrefixKey
1380      */
1381     Query query = Query::Select().PrefixKey({'a', 'c'}).PrefixKey({});
1382     std::vector<Entry> entriesRes;
1383     /**
1384      * @tc.steps: step2. Use GetEnties for double prefixkey query object
1385      * @tc.expected: step2. return INVALID_QUERY_FORMAT
1386      */
1387     int errCode = g_kvNbDelegatePtrForQuery->GetEntries(query, entriesRes);
1388     EXPECT_EQ(errCode, INVALID_QUERY_FORMAT);
1389     /**
1390      * @tc.steps: step3. Use GetEnties for double prefixkey query object to get resultSet
1391      * @tc.expected: step3. return INVALID_QUERY_FORMAT
1392      */
1393     KvStoreResultSet *resultSet = nullptr;
1394     errCode = g_kvNbDelegatePtrForQuery->GetEntries(query, resultSet);
1395     EXPECT_EQ(errCode, INVALID_QUERY_FORMAT);
1396     EXPECT_TRUE(resultSet == nullptr);
1397     /**
1398      * @tc.steps: step4. Get Query object by PrefixKey and orderBy
1399      */
1400     Query query1 = Query::Select().PrefixKey({'a', 'b'}).OrderBy("$.field_name1");
1401     /**
1402      * @tc.steps: step3. Use GetEnties and GetCount for this query object
1403      * @tc.expected: step3. Can get content by GetEntries, but GetCount can not use for query object include orderBy
1404      */
1405     errCode = g_kvNbDelegatePtrForQuery->GetEntries(query1, entriesRes);
1406     EXPECT_EQ(entriesRes.size(), 5ul);
1407     EXPECT_EQ(errCode, OK);
1408     int count = -1;
1409     errCode = g_kvNbDelegatePtrForQuery->GetCount(query1, count);
1410     EXPECT_EQ(errCode, INVALID_QUERY_FORMAT);
1411 
1412     errCode = g_kvNbDelegatePtrForQuery->GetEntries(query1, resultSet);
1413     ASSERT_TRUE(resultSet != nullptr);
1414     EXPECT_EQ(errCode, OK);
1415     EXPECT_EQ(resultSet->GetCount(), 5);
1416     EXPECT_EQ(g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet), OK);
1417     EXPECT_TRUE(resultSet == nullptr);
1418 
1419     EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
1420     EXPECT_TRUE(g_mgr.DeleteKvStore("QueryPreFixKey003") == OK);
1421 }
1422 
1423 /**
1424   * @tc.name: QueryPreFixKey004
1425   * @tc.desc: Query a prefix that does not exist
1426   * @tc.type: FUNC
1427   * @tc.require: AR000EPARK
1428   * @tc.author: sunpeng
1429   */
1430 HWTEST_F(DistributedDBInterfacesDataOperationTest, QueryPreFixKey004, TestSize.Level1)
1431 {
1432     KvStoreNbDelegate::Option option = {true, false, false};
1433     option.schema = SCHEMA_DEFINE2;
1434     g_mgr.GetKvStore("QueryPreFixKey004", option, g_kvNbDelegateCallbackForQuery);
1435     ASSERT_TRUE(g_kvNbDelegatePtrForQuery != nullptr);
1436     EXPECT_TRUE(g_kvDelegateStatusForQuery == OK);
1437 
1438     vector<Entry> entries = PreDataForQueryByPreFixKey();
1439     EXPECT_EQ(g_kvNbDelegatePtrForQuery->PutBatch(entries), OK);
1440     /**
1441      * @tc.steps: step1. Get Query object by PrefixKey that does not exist
1442      */
1443     Query query = Query::Select().PrefixKey({'c'});
1444     /**
1445      * @tc.steps: step2. Use GetEnties and GetCount to get result
1446      * @tc.expected: step2. Return NOT_FOUND, get result OK, number of KV is 0
1447      */
1448     std::vector<Entry> entriesRes;
1449     int errCode = g_kvNbDelegatePtrForQuery->GetEntries(query, entriesRes);
1450     EXPECT_EQ(errCode, NOT_FOUND);
1451 
1452     int count = -1;
1453     g_kvNbDelegatePtrForQuery->GetCount(query, count);
1454     EXPECT_EQ(count, 0);
1455 
1456     KvStoreResultSet *resultSet = nullptr;
1457     errCode = g_kvNbDelegatePtrForQuery->GetEntries(query, resultSet);
1458     ASSERT_TRUE(resultSet != nullptr);
1459     EXPECT_EQ(errCode, OK);
1460     EXPECT_EQ(resultSet->GetCount(), 0);
1461     EXPECT_EQ(g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet), OK);
1462     EXPECT_TRUE(resultSet == nullptr);
1463 
1464     EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
1465     EXPECT_TRUE(g_mgr.DeleteKvStore("QueryPreFixKey004") == OK);
1466 }
1467 
1468 /**
1469   * @tc.name: QueryGroup001
1470   * @tc.desc: Query group nomal ability to change operation priority
1471   * @tc.type: FUNC
1472   * @tc.require: AR000EPARK
1473   * @tc.author: sunpeng
1474   */
1475 HWTEST_F(DistributedDBInterfacesDataOperationTest, QueryGroup001, TestSize.Level1)
1476 {
1477     KvStoreNbDelegate::Option option = {true, false, false};
1478     option.schema = SCHEMA_DEFINE2;
1479     g_mgr.GetKvStore("QueryGroup001", option, g_kvNbDelegateCallbackForQuery);
1480     ASSERT_TRUE(g_kvNbDelegatePtrForQuery != nullptr);
1481     EXPECT_TRUE(g_kvDelegateStatusForQuery == OK);
1482 
1483     PreDataForGroupTest();
1484 
1485     /**
1486      * @tc.steps: step1. Get Query object:
1487      * query:  <4 and =4 or >1
1488      * query1: (<4 and =4) or >1
1489      * query2: <4 and (=4 or >1)
1490      */
1491     Query query = Query::Select().LessThan("$.field_name1", 4).And().EqualTo("$.field_name1", 4).
1492         Or().GreaterThan("$.field_name1", 1);
1493     Query query1 = Query::Select().BeginGroup().LessThan("$.field_name1", 4).And().
1494         EqualTo("$.field_name1", 4).EndGroup().Or().GreaterThan("$.field_name1", 1);
1495     Query query2 = Query::Select().LessThan("$.field_name1", 4).And().BeginGroup().
1496         EqualTo("$.field_name1", 4).Or().GreaterThan("$.field_name1", 1).EndGroup();
1497 
1498     /**
1499      * @tc.steps: step2. Use GetEnties to get different result
1500      * @tc.expected: step2. Result:
1501      * query:  count = 4
1502      * query1: count = 4
1503      * query2: count = 2
1504      */
1505     std::vector<Entry> entries;
1506     int errCode = g_kvNbDelegatePtrForQuery->GetEntries(query, entries);
1507     EXPECT_EQ(errCode, OK);
1508     EXPECT_EQ(entries.size(), 4ul);
1509     int count = -1;
1510     g_kvNbDelegatePtrForQuery->GetCount(query, count);
1511     EXPECT_EQ(count, 4);
1512 
1513     errCode = g_kvNbDelegatePtrForQuery->GetEntries(query2, entries);
1514     EXPECT_EQ(errCode, OK);
1515 
1516     EXPECT_EQ(entries.size(), 2ul);
1517     g_kvNbDelegatePtrForQuery->GetCount(query2, count);
1518     EXPECT_EQ(count, 2);
1519     KvStoreResultSet *resultSet = nullptr;
1520     errCode = g_kvNbDelegatePtrForQuery->GetEntries(query2, resultSet);
1521     ASSERT_TRUE(resultSet != nullptr);
1522     EXPECT_EQ(errCode, OK);
1523     EXPECT_EQ(resultSet->GetCount(), 2);
1524     EXPECT_EQ(g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet), OK);
1525     EXPECT_TRUE(resultSet == nullptr);
1526 
1527     errCode = g_kvNbDelegatePtrForQuery->GetEntries(query1, entries);
1528     EXPECT_EQ(errCode, OK);
1529     EXPECT_EQ(entries.size(), 4ul);
1530     g_kvNbDelegatePtrForQuery->GetCount(query1, count);
1531     EXPECT_EQ(count, 4);
1532 
1533     errCode = g_kvNbDelegatePtrForQuery->GetEntries(query1, resultSet);
1534     ASSERT_TRUE(resultSet != nullptr);
1535     EXPECT_EQ(errCode, OK);
1536     EXPECT_EQ(resultSet->GetCount(), 4);
1537     EXPECT_EQ(g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet), OK);
1538     EXPECT_TRUE(resultSet == nullptr);
1539 
1540     EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
1541     EXPECT_TRUE(g_mgr.DeleteKvStore("QueryGroup001") == OK);
1542 }
1543 
1544 /**
1545   * @tc.name: QueryGroup002
1546   * @tc.desc: Test for illegal Group query object
1547   * @tc.type: FUNC
1548   * @tc.require: AR000EPARK
1549   * @tc.author: sunpeng
1550   */
1551 HWTEST_F(DistributedDBInterfacesDataOperationTest, QueryGroup002, TestSize.Level1)
1552 {
1553     KvStoreNbDelegate::Option option = {true, false, false};
1554     option.schema = SCHEMA_DEFINE2;
1555     g_mgr.GetKvStore("QueryGroup002", option, g_kvNbDelegateCallbackForQuery);
1556     ASSERT_TRUE(g_kvNbDelegatePtrForQuery != nullptr);
1557     EXPECT_TRUE(g_kvDelegateStatusForQuery == OK);
1558 
1559     PreDataForGroupTest();
1560 
1561     /**
1562      * @tc.steps: step1. Get Query object:
1563      * query:  (<4 and (=4 or) >1)
1564      * query1: (<4 and =4 or >1
1565      * query2: <4 and =4) or >1
1566      * query3:  )<4 and =4( or >1
1567      * query4:  <4 (and = 4 or >1)
1568      */
1569     Query query = Query::Select().BeginGroup().LessThan("$.field_name1", 4).And().BeginGroup().
1570         EqualTo("$.field_name1", 4).Or().EndGroup().GreaterThan("$.field_name1", 1).EndGroup();
1571     Query query1 = Query::Select().BeginGroup().LessThan("$.field_name1", 4).And().
1572         EqualTo("$.field_name1", 4).Or().GreaterThan("$.field_name1", 1);
1573     Query query2 = Query::Select().LessThan("$.field_name1", 4).And().
1574         EqualTo("$.field_name1", 4).EndGroup().Or().GreaterThan("$.field_name1", 1);
1575     Query query3 = Query::Select().EndGroup().LessThan("$.field_name1", 4).And().
1576         EqualTo("$.field_name1", 4).BeginGroup().Or().GreaterThan("$.field_name1", 1);
1577     Query query4 = Query::Select().LessThan("$.field_name1", 4).BeginGroup().And().
1578         EqualTo("$.field_name1", 4).Or().GreaterThan("$.field_name1", 1).EndGroup();
1579 
1580     /**
1581      * @tc.steps: step2. Use GetEnties and GetCount to get result
1582      * @tc.expected: step2. All query object is illegal, reeturn INVALID_QUERY_FORMAT
1583      */
1584     std::vector<Entry> entries;
1585     int errCode = g_kvNbDelegatePtrForQuery->GetEntries(query, entries);
1586     EXPECT_EQ(errCode, INVALID_QUERY_FORMAT);
1587 
1588     errCode = g_kvNbDelegatePtrForQuery->GetEntries(query1, entries);
1589     EXPECT_EQ(errCode, INVALID_QUERY_FORMAT);
1590     errCode = g_kvNbDelegatePtrForQuery->GetEntries(query2, entries);
1591     EXPECT_EQ(errCode, INVALID_QUERY_FORMAT);
1592     errCode = g_kvNbDelegatePtrForQuery->GetEntries(query3, entries);
1593     EXPECT_EQ(errCode, INVALID_QUERY_FORMAT);
1594     errCode = g_kvNbDelegatePtrForQuery->GetEntries(query4, entries);
1595     EXPECT_EQ(errCode, INVALID_QUERY_FORMAT);
1596 
1597     KvStoreResultSet *resultSet = nullptr;
1598     errCode = g_kvNbDelegatePtrForQuery->GetEntries(query, resultSet);
1599     EXPECT_EQ(errCode, INVALID_QUERY_FORMAT);
1600     EXPECT_TRUE(resultSet == nullptr);
1601 
1602     errCode = g_kvNbDelegatePtrForQuery->GetEntries(query1, resultSet);
1603     EXPECT_EQ(errCode, INVALID_QUERY_FORMAT);
1604     EXPECT_TRUE(resultSet == nullptr);
1605 
1606     errCode = g_kvNbDelegatePtrForQuery->GetEntries(query2, resultSet);
1607     EXPECT_EQ(errCode, INVALID_QUERY_FORMAT);
1608     EXPECT_TRUE(resultSet == nullptr);
1609 
1610     errCode = g_kvNbDelegatePtrForQuery->GetEntries(query3, resultSet);
1611     EXPECT_EQ(errCode, INVALID_QUERY_FORMAT);
1612     EXPECT_TRUE(resultSet == nullptr);
1613 
1614     errCode = g_kvNbDelegatePtrForQuery->GetEntries(query4, resultSet);
1615     EXPECT_EQ(errCode, INVALID_QUERY_FORMAT);
1616     EXPECT_TRUE(resultSet == nullptr);
1617 
1618     EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
1619     EXPECT_TRUE(g_mgr.DeleteKvStore("QueryGroup002") == OK);
1620 }
1621 
1622 /**
1623   * @tc.name: QueryGroup003
1624   * @tc.desc: Query expressions containing nested parentheses
1625   * @tc.type: FUNC
1626   * @tc.require: AR000EPARK
1627   * @tc.author: sunpeng
1628   */
1629 HWTEST_F(DistributedDBInterfacesDataOperationTest, QueryGroup003, TestSize.Level1)
1630 {
1631     KvStoreNbDelegate::Option option = {true, false, false};
1632     option.schema = SCHEMA_DEFINE2;
1633     g_mgr.GetKvStore("QueryGroup003", option, g_kvNbDelegateCallbackForQuery);
1634     ASSERT_TRUE(g_kvNbDelegatePtrForQuery != nullptr);
1635     EXPECT_TRUE(g_kvDelegateStatusForQuery == OK);
1636 
1637     PreDataForGroupTest();
1638 
1639     /**
1640      * @tc.steps: step1. Get Query object for  (<=5 and (=4 or >1) and <3)
1641      */
1642     Query query = Query::Select().BeginGroup().LessThan("$.field_name1", 5).And().BeginGroup().
1643         EqualTo("$.field_name1", 4).Or().GreaterThan("$.field_name1", 1).EndGroup().And().
1644         LessThan("$.field_name1", 3).EndGroup();
1645 
1646     /**
1647      * @tc.steps: step2. Use GetEnties and GetCount to get result
1648      * @tc.expected: step2. reeturn OK, count = 1
1649      */
1650     std::vector<Entry> entries;
1651     int errCode = g_kvNbDelegatePtrForQuery->GetEntries(query, entries);
1652     EXPECT_EQ(errCode, OK);
1653     EXPECT_EQ(entries.size(), 1ul);
1654     int count = -1;
1655     g_kvNbDelegatePtrForQuery->GetCount(query, count);
1656     EXPECT_EQ(count, 1);
1657 
1658     KvStoreResultSet *resultSet = nullptr;
1659     errCode = g_kvNbDelegatePtrForQuery->GetEntries(query, resultSet);
1660     ASSERT_TRUE(resultSet != nullptr);
1661     EXPECT_EQ(errCode, OK);
1662     EXPECT_EQ(resultSet->GetCount(), 1);
1663     EXPECT_EQ(g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet), OK);
1664     EXPECT_TRUE(resultSet == nullptr);
1665 
1666     EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
1667     EXPECT_TRUE(g_mgr.DeleteKvStore("QueryGroup003") == OK);
1668 }
1669 
1670 /**
1671   * @tc.name: multiOrderBy001
1672   * @tc.desc: Test multiple orderby conditions together to query
1673   * @tc.type: FUNC
1674   * @tc.require: AR000DR9K7
1675   * @tc.author: sunpeng
1676   */
1677 HWTEST_F(DistributedDBInterfacesDataOperationTest, multiOrderBy001, TestSize.Level1)
1678 {
1679     KvStoreNbDelegate::Option option = {true, false, false};
1680     option.schema = SCHEMA_DEFINE2;
1681     g_mgr.GetKvStore("multiOrderBy001", option, g_kvNbDelegateCallbackForQuery);
1682     ASSERT_TRUE(g_kvNbDelegatePtrForQuery != nullptr);
1683     EXPECT_TRUE(g_kvDelegateStatusForQuery == OK);
1684 
1685     PreDataForGroupTest();
1686 
1687     Query query = Query::Select().PrefixKey({}).OrderBy("$.field_name1").OrderBy("$.field_name1");
1688     std::vector<Entry> entries;
1689     int errCode = g_kvNbDelegatePtrForQuery->GetEntries(query, entries);
1690     EXPECT_EQ(errCode, OK);
1691 
1692     errCode = g_kvNbDelegatePtrForQuery->GetEntries(query.Limit(2, 2), entries);
1693     EXPECT_EQ(errCode, OK);
1694 
1695     Query query1 = Query::Select().PrefixKey({}).Limit(2, 2).OrderBy("$.field_name1").OrderBy("$.field_name1");
1696     errCode = g_kvNbDelegatePtrForQuery->GetEntries(query1, entries);
1697     EXPECT_EQ(errCode, INVALID_QUERY_FORMAT);
1698 
1699     Query query2 = Query::Select().PrefixKey({}).OrderBy("$.field_name1").Limit(2, 2).OrderBy("$.field_name1");
1700     KvStoreResultSet *resultSet = nullptr;
1701     errCode = g_kvNbDelegatePtrForQuery->GetEntries(query2, resultSet);
1702     EXPECT_EQ(errCode, INVALID_QUERY_FORMAT);
1703 
1704     Query query3 = Query::Select().PrefixKey({}).OrderBy("$.field_name1").
1705         OrderBy("$.field_name1").OrderBy("$.field_name1");
1706     errCode = g_kvNbDelegatePtrForQuery->GetEntries(query3, resultSet);
1707     EXPECT_EQ(errCode, OK);
1708     EXPECT_EQ(g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet), OK);
1709     EXPECT_TRUE(resultSet == nullptr);
1710 
1711     EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
1712     EXPECT_TRUE(g_mgr.DeleteKvStore("multiOrderBy001") == OK);
1713 }
1714 
1715 /**
1716   * @tc.name: multiOrderBy001
1717   * @tc.desc: For multiple order query.
1718   * @tc.type: FUNC
1719   * @tc.require: AR000EPARK
1720   * @tc.author: sunpeng
1721   */
1722 HWTEST_F(DistributedDBInterfacesDataOperationTest, PreifxAndOrderBy001, TestSize.Level1)
1723 {
1724     KvStoreNbDelegate::Option option = {true, false, false};
1725     option.schema = SCHEMA_DEFINE2;
1726     g_mgr.GetKvStore("PreifxAndOrderBy001", option, g_kvNbDelegateCallbackForQuery);
1727     ASSERT_TRUE(g_kvNbDelegatePtrForQuery != nullptr);
1728     EXPECT_TRUE(g_kvDelegateStatusForQuery == OK);
1729 
1730     PresetDataForPreifxAndOrderBy001();
1731 
1732     Query query = Query::Select().PrefixKey({}).OrderBy("$.field_name1", false);
1733     std::vector<Entry> entriesRes;
1734     int errCode = g_kvNbDelegatePtrForQuery->GetEntries(query, entriesRes);
1735     EXPECT_EQ(errCode, OK);
1736     ASSERT_EQ(entriesRes.size(), 5ul);
1737     EXPECT_EQ(entriesRes[0].key, KEY_5);
1738     EXPECT_EQ(entriesRes[1].key, KEY_3);
1739     EXPECT_EQ(entriesRes[2].key, KEY_4);
1740     EXPECT_EQ(entriesRes[3].key, KEY_1);
1741     EXPECT_EQ(entriesRes[4].key, KEY_2);
1742 
1743     Query query1 = Query::Select().OrderBy("$.field_name1", false);
1744     errCode = g_kvNbDelegatePtrForQuery->GetEntries(query1, entriesRes);
1745     EXPECT_EQ(errCode, OK);
1746     ASSERT_EQ(entriesRes.size(), 5ul);
1747     EXPECT_EQ(entriesRes[0].key, KEY_5);
1748     EXPECT_EQ(entriesRes[1].key, KEY_4);
1749     EXPECT_EQ(entriesRes[2].key, KEY_3);
1750     EXPECT_EQ(entriesRes[3].key, KEY_2);
1751     EXPECT_EQ(entriesRes[4].key, KEY_1);
1752 
1753     Query query2 = Query::Select().PrefixKey({}).OrderBy("$.field_name1", false).OrderBy("$.field_name2", false);
1754     (void) g_kvNbDelegatePtrForQuery->GetEntries(query2, entriesRes);
1755     ASSERT_EQ(entriesRes.size(), 5ul);
1756     EXPECT_EQ(entriesRes[0].key, KEY_5);
1757     EXPECT_EQ(entriesRes[1].key, KEY_4);
1758     EXPECT_EQ(entriesRes[2].key, KEY_3);
1759     EXPECT_EQ(entriesRes[3].key, KEY_2);
1760     EXPECT_EQ(entriesRes[4].key, KEY_1);
1761 
1762     EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
1763     EXPECT_TRUE(g_mgr.DeleteKvStore("PreifxAndOrderBy001") == OK);
1764 }
1765 
1766 /**
1767   * @tc.name: PrefixAndOther001
1768   * @tc.desc: Combination of prefix query and logical filtering
1769   * @tc.type: FUNC
1770   * @tc.require: AR000EPARK
1771   * @tc.author: sunpeng
1772   */
1773 HWTEST_F(DistributedDBInterfacesDataOperationTest, PrefixAndOther001, TestSize.Level1)
1774 {
1775     KvStoreNbDelegate::Option option = {true, false, false};
1776     option.schema = SCHEMA_DEFINE2;
1777     g_mgr.GetKvStore("PrefixAndOther001", option, g_kvNbDelegateCallbackForQuery);
1778     ASSERT_TRUE(g_kvNbDelegatePtrForQuery != nullptr);
1779     EXPECT_TRUE(g_kvDelegateStatusForQuery == OK);
1780 
1781     PresetDataForPreifxAndOrderBy001();
1782 
1783     std::vector<Entry> entriesRes;
1784     Query query1 = Query::Select().EqualTo("$.field_name1", 1).PrefixKey({});
1785     int errCode = g_kvNbDelegatePtrForQuery->GetEntries(query1, entriesRes);
1786     EXPECT_EQ(errCode, OK);
1787     query1 = Query::Select().PrefixKey({}).EqualTo("$.field_name1", 1);
1788     errCode = g_kvNbDelegatePtrForQuery->GetEntries(query1, entriesRes);
1789     EXPECT_EQ(errCode, OK);
1790 
1791     query1 = Query::Select().EqualTo("$.field_name1", 1).PrefixKey({}).And().EqualTo("$.field_name1", 1);
1792     errCode = g_kvNbDelegatePtrForQuery->GetEntries(query1, entriesRes);
1793     EXPECT_EQ(errCode, OK);
1794 
1795     query1 = Query::Select().EqualTo("$.field_name1", 1).PrefixKey({}).And().EqualTo("$.field_name1", 2);
1796     errCode = g_kvNbDelegatePtrForQuery->GetEntries(query1, entriesRes);
1797     EXPECT_EQ(errCode, NOT_FOUND);
1798 
1799     EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
1800     EXPECT_TRUE(g_mgr.DeleteKvStore("PrefixAndOther001") == OK);
1801 }
1802 
1803 /**
1804   * @tc.name: InKeys001
1805   * @tc.desc: InKeys query base function
1806   * @tc.type: FUNC
1807   * @tc.require: AR000GOH06
1808   * @tc.author: xushaohua
1809   */
1810 HWTEST_F(DistributedDBInterfacesDataOperationTest, InKeys001, TestSize.Level1)
1811 {
1812     /**
1813      * @tc.steps: step1. Create a database And Preset Data
1814      */
1815     KvStoreNbDelegate::Option option = {true, false, false};
1816     g_mgr.GetKvStore("InKeys001", option, g_kvNbDelegateCallbackForQuery);
1817     ASSERT_NE(g_kvNbDelegatePtrForQuery, nullptr);
1818     EXPECT_EQ(g_kvDelegateStatusForQuery, OK);
1819 
1820     Key key = {'1'};
1821     DBStatus status = g_kvNbDelegatePtrForQuery->Put(key, VALUE_1);
1822     ASSERT_EQ(status, OK);
1823     const int dataSize = 10; // 10 data for test
1824     std::set<Key> keys;
1825     for (uint8_t i = 0; i < dataSize; i++) {
1826         key.push_back(i);
1827         status = g_kvNbDelegatePtrForQuery->Put(key, VALUE_1);
1828         ASSERT_EQ(status, OK);
1829         keys.emplace(key);
1830         key.pop_back();
1831     }
1832 
1833     /**
1834      * @tc.steps: step2. Call GetEntries With Query, set all keys at Inkeys.
1835      * @tc.expected: step2. Returns KvStoreResultSet, the count is dataSize,
1836      *  all data are equals the preset data
1837      */
1838     KvStoreResultSet *resultSet = nullptr;
1839     g_kvNbDelegatePtrForQuery->GetEntries(Query::Select().InKeys(keys), resultSet);
1840     ASSERT_NE(resultSet, nullptr);
1841     ASSERT_EQ(resultSet->GetCount(), dataSize);
1842     for (int i = 0; i < dataSize; i++) {
1843         resultSet->MoveToPosition(i);
1844         Entry entry;
1845         resultSet->GetEntry(entry);
1846         key.push_back(i);
1847         EXPECT_EQ(key, entry.key);
1848         EXPECT_EQ(entry.value, VALUE_1);
1849         key.pop_back();
1850     }
1851     g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet);
1852 
1853     /**
1854      * @tc.steps: step3. Call GetEntries With Query, set one other key at Inkeys.
1855      * @tc.expected: step3. Returns KvStoreResultSet, the count is 0,
1856      */
1857     g_kvNbDelegatePtrForQuery->GetEntries(Query::Select().InKeys({KEY_7}), resultSet);
1858     ASSERT_NE(resultSet, nullptr);
1859     ASSERT_EQ(resultSet->GetCount(), 0);
1860     g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet);
1861     EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
1862     EXPECT_EQ(g_mgr.DeleteKvStore("InKeys001"), OK);
1863 }
1864 
1865 /**
1866  * @tc.name: InKeysLimit001
1867  * @tc.desc: InKeys query limit verification
1868  * @tc.type: FUNC
1869  * @tc.require: AR000GOH06
1870  * @tc.author: xushaohua
1871  */
1872 HWTEST_F(DistributedDBInterfacesDataOperationTest, InKeysLimit001, TestSize.Level1)
1873 {
1874     /**
1875      * @tc.steps: step1. Create a database
1876      */
1877     KvStoreNbDelegate::Option option = {true, false, false};
1878     g_mgr.GetKvStore("InKeysLimit001", option, g_kvNbDelegateCallbackForQuery);
1879     ASSERT_NE(g_kvNbDelegatePtrForQuery, nullptr);
1880     EXPECT_EQ(g_kvDelegateStatusForQuery, OK);
1881 
1882     /**
1883      * @tc.steps: step2. Construct a key set, and the key size over MAX_BATCH_SIZE
1884      */
1885     std::set<Key> keys;
1886     for (uint8_t i = 0; i < DBConstant::MAX_BATCH_SIZE + 1; i++) {
1887         Key key = { i };
1888         keys.emplace(key);
1889     }
1890 
1891     /**
1892      * @tc.steps: step3. Call GetEntries With Query, set keys at Inkeys.
1893      * @tc.expected: step3. Returns OVER_MAX_LIMITS, the resultSet is nullptr,
1894      */
1895     KvStoreResultSet *resultSet = nullptr;
1896     DBStatus status = g_kvNbDelegatePtrForQuery->GetEntries(Query::Select().InKeys(keys), resultSet);
1897     EXPECT_EQ(status, OVER_MAX_LIMITS);
1898     EXPECT_EQ(resultSet, nullptr);
1899 
1900     /**
1901      * @tc.steps: step4. Call GetEntries With Query, set keys empty.
1902      * @tc.expected: step4. Returns INVALID_ARGS, the resultSet is nullptr,
1903      */
1904     status = g_kvNbDelegatePtrForQuery->GetEntries(Query::Select().InKeys({}), resultSet);
1905     EXPECT_EQ(status, INVALID_ARGS);
1906     EXPECT_EQ(resultSet, nullptr);
1907 
1908     /**
1909      * @tc.steps: step4. Call GetEntries With Query, set a invalid key.
1910      * @tc.expected: step4. Returns INVALID_ARGS, the resultSet is nullptr,
1911      */
1912     status = g_kvNbDelegatePtrForQuery->GetEntries(Query::Select().InKeys({{}}), resultSet);
1913     EXPECT_EQ(status, INVALID_ARGS);
1914     EXPECT_EQ(resultSet, nullptr);
1915 
1916     EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
1917     EXPECT_EQ(g_mgr.DeleteKvStore("InKeysLimit001"), OK);
1918 }
1919 
1920 /**
1921  * @tc.name: InKeysAndOther001
1922  * @tc.desc: Combination of InKeys query and logical filtering
1923  * @tc.type: FUNC
1924  * @tc.require: AR000GOH06
1925  * @tc.author: xushaohua
1926  */
1927 HWTEST_F(DistributedDBInterfacesDataOperationTest, InKeysAndOther001, TestSize.Level1)
1928 {
1929     /**
1930      * @tc.steps: step1. Create a database And Preset Data
1931      */
1932     KvStoreNbDelegate::Option option = {true, false, false};
1933     option.schema = SCHEMA_DEFINE2;
1934     g_mgr.GetKvStore("InKeysAndOther001", option, g_kvNbDelegateCallbackForQuery);
1935     ASSERT_NE(g_kvNbDelegatePtrForQuery, nullptr);
1936     EXPECT_EQ(g_kvDelegateStatusForQuery, OK);
1937 
1938     PresetDataForPreifxAndOrderBy001();
1939 
1940     std::set<Key> keys = { KEY_1, KEY_2, KEY_4 };
1941     std::vector<Entry> entriesRes;
1942 
1943     /**
1944      * @tc.steps: step2. Call GetEntries With Query, use EqualTo and InKeys
1945      * @tc.expected: step2. Returns OK
1946      */
1947     Query query1 = Query::Select().EqualTo("$.field_name1", 1).InKeys(keys);
1948     int errCode = g_kvNbDelegatePtrForQuery->GetEntries(query1, entriesRes);
1949     EXPECT_EQ(errCode, OK);
1950 
1951     /**
1952      * @tc.steps: step3. Call GetEntries With Query, use InKeys and EqualTo
1953      * @tc.expected: step3. Returns OK
1954      */
1955     query1 = Query::Select().InKeys(keys).EqualTo("$.field_name1", 1);
1956     errCode = g_kvNbDelegatePtrForQuery->GetEntries(query1, entriesRes);
1957     EXPECT_EQ(errCode, OK);
1958 
1959     /**
1960      * @tc.steps: step4. Call GetEntries With Query, use EqualTo, InKeys and EqualTo, all valid
1961      * @tc.expected: step4. Returns OK
1962      */
1963     query1 = Query::Select().EqualTo("$.field_name1", 1).InKeys(keys).And().EqualTo("$.field_name2", 2);
1964     errCode = g_kvNbDelegatePtrForQuery->GetEntries(query1, entriesRes);
1965     EXPECT_EQ(errCode, OK);
1966 
1967     /**
1968      * @tc.steps: step4. Call GetEntries With Query, use EqualTo, InKeys and EqualTo, has invalid
1969      * @tc.expected: step4. Returns NOT_FOUND
1970      */
1971     query1 = Query::Select().EqualTo("$.field_name1", 1).InKeys(keys).And().EqualTo("$.field_name1", 2);
1972     errCode = g_kvNbDelegatePtrForQuery->GetEntries(query1, entriesRes);
1973     EXPECT_EQ(errCode, NOT_FOUND);
1974 
1975     EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
1976     EXPECT_EQ(g_mgr.DeleteKvStore("InKeysAndOther001"), OK);
1977 }
1978 
1979 /**
1980  * @tc.name: InKeysAndOther002
1981  * @tc.desc: Combination of InKeys query and logical filtering
1982  * @tc.type: FUNC
1983  * @tc.require: AR000GOH06
1984  * @tc.author: lianhuix
1985  */
1986 HWTEST_F(DistributedDBInterfacesDataOperationTest, InKeysAndOther002, TestSize.Level1)
1987 {
1988     KvStoreNbDelegate::Option option = {true, false, false};
1989     option.schema = SCHEMA_DEFINE2;
1990     g_mgr.GetKvStore("InKeysAndOther001", option, g_kvNbDelegateCallbackForQuery);
1991     ASSERT_NE(g_kvNbDelegatePtrForQuery, nullptr);
1992     EXPECT_EQ(g_kvDelegateStatusForQuery, OK);
1993 
1994     std::set<Key> keys = { KEY_1, KEY_2, KEY_4 };
1995     std::vector<Query> queries = {
1996         Query::Select().PrefixKey({}).InKeys(keys).Or().EqualTo("$.field_name1", 2),
1997         Query::Select().PrefixKey({}).InKeys(keys).And().EqualTo("$.field_name1", 2),
1998         Query::Select().InKeys(keys).Or().EqualTo("$.field_name1", 2),
1999         Query::Select().InKeys(keys).And().EqualTo("$.field_name1", 2),
2000         Query::Select().PrefixKey({}).Or().EqualTo("$.field_name1", 2),
2001         Query::Select().PrefixKey({}).And().EqualTo("$.field_name1", 2),
2002         Query::Select().PrefixKey({}).And().InKeys(keys).EqualTo("$.field_name1", 2),
2003         Query::Select().And().InKeys(keys).EqualTo("$.field_name1", 2),
2004         Query::Select().Or().PrefixKey({}).EqualTo("$.field_name1", 2),
2005         Query::Select().BeginGroup().PrefixKey({}).Or().EqualTo("$.field_name1", 2).EndGroup(),
2006         Query::Select().EqualTo("$.field_name1", 2).Or().InKeys(keys),
2007         Query::Select().EqualTo("$.field_name1", 2).Or().PrefixKey({}),
2008     };
2009 
2010     for (const auto &query : queries) {
2011         std::vector<Entry> entriesRes;
2012         int errCode = g_kvNbDelegatePtrForQuery->GetEntries(query, entriesRes);
2013         EXPECT_EQ(errCode, INVALID_QUERY_FORMAT);
2014     }
2015 
2016     EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
2017     EXPECT_EQ(g_mgr.DeleteKvStore("InKeysAndOther001"), OK);
2018 }
2019 
2020 /**
2021   * @tc.name: WriteTimeSort001
2022   * @tc.desc: For prefixKey query with orderBy writeTime asc
2023   * @tc.type: FUNC
2024   * @tc.require: SR000H5U55
2025   * @tc.author: zhuwentao
2026   */
2027 HWTEST_F(DistributedDBInterfacesDataOperationTest, WriteTimeSort001, TestSize.Level0)
2028 {
2029     /**
2030      * @tc.steps: step1. Create a database And Preset Data
2031      */
2032     KvStoreNbDelegate::Option option = {true, false, false};
2033     g_mgr.GetKvStore("WriteTimeSort001", option, g_kvNbDelegateCallbackForQuery);
2034     ASSERT_NE(g_kvNbDelegatePtrForQuery, nullptr);
2035     EXPECT_EQ(g_kvDelegateStatusForQuery, OK);
2036     /**
2037      * @tc.steps: step2. put some data
2038      * @tc.expected: step2. Returns OK
2039      */
2040     Key key = {'x'};
2041     Key key2 = {'y'};
2042     const int dataSize = 100; // 100 data for test
2043     std::vector<Key> expectedKeys;
2044     std::vector<uint8_t> keySuffix;
2045     for (uint8_t i = 0; i < dataSize; i++) {
2046         keySuffix.push_back(rand () % 100);
2047     }
2048     for (uint8_t i = 0; i < dataSize; i++) {
2049         Key tmpKey = {key[0], keySuffix[i], i};
2050         ASSERT_EQ(g_kvNbDelegatePtrForQuery->Put(tmpKey, VALUE_1), OK);
2051         expectedKeys.push_back(tmpKey);
2052     }
2053     ASSERT_EQ(g_kvNbDelegatePtrForQuery->Put(key2, VALUE_1), OK);
2054 
2055     /**
2056      * @tc.steps: step2. Call GetEntries With prefix Query
2057      * @tc.expected: step2. Returns KvStoreResultSet, the count is dataSize,
2058      *  all data are equals the preset data
2059      */
2060     KvStoreResultSet *resultSet = nullptr;
2061     EXPECT_EQ(g_kvNbDelegatePtrForQuery->GetEntries(Query::Select().PrefixKey(key).OrderByWriteTime(true), resultSet),
2062         OK);
2063     ASSERT_NE(resultSet, nullptr);
2064     ASSERT_EQ(resultSet->GetCount(), dataSize);
2065     for (int i = 0; i < dataSize; i++) {
2066         resultSet->MoveToPosition(i);
2067         Entry entry;
2068         resultSet->GetEntry(entry);
2069         EXPECT_EQ(expectedKeys[i], entry.key);
2070         EXPECT_EQ(entry.value, VALUE_1);
2071     }
2072     g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet);
2073     /**
2074      * @tc.steps: step3. Call GetEntries With prefix Query limit
2075      * @tc.expected: step3. Returns KvStoreResultSet, the count is dataSize,
2076      *  all data are equals the preset data
2077      */
2078     KvStoreResultSet *resultSet2 = nullptr;
2079     EXPECT_EQ(g_kvNbDelegatePtrForQuery->GetEntries(
2080         Query::Select().PrefixKey(key).OrderByWriteTime(true).Limit(dataSize / 2, 0), resultSet2), OK);
2081     ASSERT_NE(resultSet2, nullptr);
2082     ASSERT_EQ(resultSet2->GetCount(), dataSize / 2);
2083     for (int i = 0; i < dataSize / 2; i++) {
2084         resultSet2->MoveToPosition(i);
2085         Entry entry;
2086         resultSet2->GetEntry(entry);
2087         EXPECT_EQ(expectedKeys[i], entry.key);
2088         EXPECT_EQ(entry.value, VALUE_1);
2089     }
2090     g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet2);
2091     EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
2092     EXPECT_EQ(g_mgr.DeleteKvStore("WriteTimeSort001"), OK);
2093 }
2094 
2095 /**
2096   * @tc.name: WriteTimeSort002
2097   * @tc.desc: For prefixKey query with orderBy writeTime asc
2098   * @tc.type: FUNC
2099   * @tc.require: SR000H5U55
2100   * @tc.author: zhuwentao
2101   */
2102 HWTEST_F(DistributedDBInterfacesDataOperationTest, WriteTimeSort002, TestSize.Level0)
2103 {
2104     /**
2105      * @tc.steps: step1. Create a database And Preset Data
2106      */
2107     KvStoreNbDelegate::Option option = {true, false, false};
2108     g_mgr.GetKvStore("WriteTimeSort002", option, g_kvNbDelegateCallbackForQuery);
2109     ASSERT_NE(g_kvNbDelegatePtrForQuery, nullptr);
2110     EXPECT_EQ(g_kvDelegateStatusForQuery, OK);
2111     /**
2112      * @tc.steps: step2. put some data
2113      * @tc.expected: step2. Returns OK
2114      */
2115     Key key = {'x'};
2116     Key key2 = {'y'};
2117     const int dataSize = 100; // 100 data for test
2118     std::vector<Key> expectedKeys;
2119     std::vector<uint8_t> keySuffix;
2120     for (uint8_t i = 0; i < dataSize; i++) {
2121         keySuffix.push_back(rand () % 100);
2122     }
2123     for (uint8_t i = 0; i < dataSize; i++) {
2124         Key tmpKey = {key[0], keySuffix[i], i};
2125         ASSERT_EQ(g_kvNbDelegatePtrForQuery->Put(tmpKey, VALUE_1), OK);
2126         expectedKeys.push_back(tmpKey);
2127     }
2128     ASSERT_EQ(g_kvNbDelegatePtrForQuery->Put(key2, VALUE_1), OK);
2129 
2130     /**
2131      * @tc.steps: step2. Call GetEntries With prefix Query
2132      * @tc.expected: step2. Returns entries
2133      *  all data are equals the preset data
2134      */
2135     std::vector<Entry> entries;
2136     EXPECT_EQ(g_kvNbDelegatePtrForQuery->GetEntries(Query::Select().PrefixKey(key).OrderByWriteTime(true), entries),
2137         OK);
2138     ASSERT_EQ(entries.size(), static_cast<long unsigned int>(dataSize));
2139     for (int i = 0; i < dataSize; i++) {
2140         EXPECT_EQ(expectedKeys[i], entries[i].key);
2141         EXPECT_EQ(entries[i].value, VALUE_1);
2142     }
2143     /**
2144      * @tc.steps: step3. Call GetEntries With prefix Query limit
2145      * @tc.expected: step3. Returns entries
2146      *  all data are equals the preset data
2147      */
2148     std::vector<Entry> entries2;
2149     EXPECT_EQ(g_kvNbDelegatePtrForQuery->GetEntries(
2150         Query::Select().PrefixKey(key).OrderByWriteTime(true).Limit(dataSize / 2, 0), entries2), OK);
2151     ASSERT_EQ(entries2.size(), static_cast<long unsigned int>(dataSize / 2));
2152     for (int i = 0; i < dataSize / 2; i++) {
2153         EXPECT_EQ(expectedKeys[i], entries2[i].key);
2154         EXPECT_EQ(entries2[i].value, VALUE_1);
2155     }
2156     EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
2157     EXPECT_EQ(g_mgr.DeleteKvStore("WriteTimeSort002"), OK);
2158 }
2159 
2160 /**
2161   * @tc.name: WriteTimeSort003
2162   * @tc.desc: For prefixKey query with orderBy writeTime desc
2163   * @tc.type: FUNC
2164   * @tc.require: SR000H5U55
2165   * @tc.author: zhuwentao
2166   */
2167 HWTEST_F(DistributedDBInterfacesDataOperationTest, WriteTimeSort003, TestSize.Level0)
2168 {
2169     /**
2170      * @tc.steps: step1. Create a database And Preset Data
2171      */
2172     KvStoreNbDelegate::Option option = {true, false, false};
2173     g_mgr.GetKvStore("WriteTimeSort003", option, g_kvNbDelegateCallbackForQuery);
2174     ASSERT_NE(g_kvNbDelegatePtrForQuery, nullptr);
2175     EXPECT_EQ(g_kvDelegateStatusForQuery, OK);
2176     /**
2177      * @tc.steps: step2. put some data
2178      * @tc.expected: step2. Returns OK
2179      */
2180     Key key = {'x'};
2181     Key key2 = {'y'};
2182     const int dataSize = 100; // 100 data for test
2183     std::vector<Key> expectedKeys;
2184     std::vector<uint8_t> keySuffix;
2185     for (uint8_t i = 0; i < dataSize; i++) {
2186         keySuffix.push_back(rand () % 100);
2187     }
2188     for (uint8_t i = 0; i < dataSize; i++) {
2189         Key tmpKey = {key[0], keySuffix[i], i};
2190         ASSERT_EQ(g_kvNbDelegatePtrForQuery->Put(tmpKey, VALUE_1), OK);
2191         expectedKeys.push_back(tmpKey);
2192     }
2193     ASSERT_EQ(g_kvNbDelegatePtrForQuery->Put(key2, VALUE_1), OK);
2194 
2195     /**
2196      * @tc.steps: step2. Call GetEntries With prefix Query
2197      * @tc.expected: step2. Returns KvStoreResultSet, the count is dataSize,
2198      *  all data are equals the preset data
2199      */
2200     KvStoreResultSet *resultSet = nullptr;
2201     EXPECT_EQ(g_kvNbDelegatePtrForQuery->GetEntries(Query::Select().PrefixKey(key).OrderByWriteTime(false), resultSet),
2202         OK);
2203     ASSERT_NE(resultSet, nullptr);
2204     ASSERT_EQ(resultSet->GetCount(), dataSize);
2205     for (int i = 0; i < dataSize; i++) {
2206         resultSet->MoveToPosition(i);
2207         Entry entry;
2208         resultSet->GetEntry(entry);
2209         EXPECT_EQ(expectedKeys[dataSize - i - 1], entry.key);
2210         EXPECT_EQ(entry.value, VALUE_1);
2211     }
2212     g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet);
2213     /**
2214      * @tc.steps: step3. Call GetEntries With prefix Query limit
2215      * @tc.expected: step3. Returns KvStoreResultSet, the count is dataSize,
2216      *  all data are equals the preset data
2217      */
2218     KvStoreResultSet *resultSet2 = nullptr;
2219     EXPECT_EQ(g_kvNbDelegatePtrForQuery->GetEntries(
2220         Query::Select().PrefixKey(key).OrderByWriteTime(false).Limit(dataSize / 2, 0), resultSet2), OK);
2221     ASSERT_NE(resultSet2, nullptr);
2222     ASSERT_EQ(resultSet2->GetCount(), dataSize / 2);
2223     for (int i = 0; i < dataSize / 2; i++) {
2224         resultSet2->MoveToPosition(i);
2225         Entry entry;
2226         resultSet2->GetEntry(entry);
2227         EXPECT_EQ(expectedKeys[dataSize - i - 1], entry.key);
2228         EXPECT_EQ(entry.value, VALUE_1);
2229     }
2230     g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet2);
2231     EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
2232     EXPECT_EQ(g_mgr.DeleteKvStore("WriteTimeSort003"), OK);
2233 }
2234 
2235 /**
2236   * @tc.name: WriteTimeSort004
2237   * @tc.desc: For prefixKey query with orderBy writeTime asc
2238   * @tc.type: FUNC
2239   * @tc.require: SR000H5U55
2240   * @tc.author: zhuwentao
2241   */
2242 HWTEST_F(DistributedDBInterfacesDataOperationTest, WriteTimeSort004, TestSize.Level0)
2243 {
2244     /**
2245      * @tc.steps: step1. Create a database And Preset Data
2246      */
2247     KvStoreNbDelegate::Option option = {true, false, false};
2248     g_mgr.GetKvStore("WriteTimeSort004", option, g_kvNbDelegateCallbackForQuery);
2249     ASSERT_NE(g_kvNbDelegatePtrForQuery, nullptr);
2250     EXPECT_EQ(g_kvDelegateStatusForQuery, OK);
2251     /**
2252      * @tc.steps: step2. put some data
2253      * @tc.expected: step2. Returns OK
2254      */
2255     Key key = {'x'};
2256     Key key2 = {'y'};
2257     const int dataSize = 100; // 100 data for test
2258     std::vector<Key> expectedKeys;
2259     std::vector<uint8_t> keySuffix;
2260     for (uint8_t i = 0; i < dataSize; i++) {
2261         keySuffix.push_back(rand () % 100);
2262     }
2263     for (uint8_t i = 0; i < dataSize; i++) {
2264         Key tmpKey = {key[0], keySuffix[i], i};
2265         ASSERT_EQ(g_kvNbDelegatePtrForQuery->Put(tmpKey, VALUE_1), OK);
2266         expectedKeys.push_back(tmpKey);
2267     }
2268     ASSERT_EQ(g_kvNbDelegatePtrForQuery->Put(key2, VALUE_1), OK);
2269 
2270     /**
2271      * @tc.steps: step2. Call GetEntries With prefix Query
2272      * @tc.expected: step2. Returns entries
2273      *  all data are equals the preset data
2274      */
2275     std::vector<Entry> entries;
2276     EXPECT_EQ(g_kvNbDelegatePtrForQuery->GetEntries(Query::Select().PrefixKey(key).OrderByWriteTime(false), entries),
2277         OK);
2278     ASSERT_EQ(entries.size(), static_cast<long unsigned int>(dataSize));
2279     for (int i = 0; i < dataSize; i++) {
2280         EXPECT_EQ(expectedKeys[dataSize - i - 1], entries[i].key);
2281         EXPECT_EQ(entries[i].value, VALUE_1);
2282     }
2283     /**
2284      * @tc.steps: step3. Call GetEntries With prefix Query limit
2285      * @tc.expected: step3. Returns entries
2286      *  all data are equals the preset data
2287      */
2288     std::vector<Entry> entries2;
2289     EXPECT_EQ(g_kvNbDelegatePtrForQuery->GetEntries(
2290         Query::Select().PrefixKey(key).OrderByWriteTime(false).Limit(dataSize / 2, 0), entries2), OK);
2291     ASSERT_EQ(entries2.size(), static_cast<long unsigned int>(dataSize / 2));
2292     for (int i = 0; i < dataSize / 2; i++) {
2293         EXPECT_EQ(expectedKeys[dataSize - i - 1], entries2[i].key);
2294         EXPECT_EQ(entries2[i].value, VALUE_1);
2295     }
2296     EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
2297     EXPECT_EQ(g_mgr.DeleteKvStore("WriteTimeSort004"), OK);
2298 }
2299 
2300 namespace {
CheckResultSize(KvStoreResultSet * resultSet,const std::vector<Key> & expectedKeys,int expectedSize)2301 void CheckResultSize(KvStoreResultSet *resultSet, const std::vector<Key> &expectedKeys, int expectedSize)
2302 {
2303     for (int i = 0; i < expectedSize; i++) {
2304         resultSet->MoveToPosition(i);
2305         Entry entry;
2306         resultSet->GetEntry(entry);
2307         EXPECT_EQ(expectedKeys[i], entry.key);
2308     }
2309 }
2310 }
2311 
2312 /**
2313   * @tc.name: WriteTimeSort005
2314   * @tc.desc: For inkeys query with orderBy writeTime asc
2315   * @tc.type: FUNC
2316   * @tc.require: SR000H5U55
2317   * @tc.author: zhuwentao
2318   */
2319 HWTEST_F(DistributedDBInterfacesDataOperationTest, WriteTimeSort005, TestSize.Level0)
2320 {
2321     /**
2322      * @tc.steps: step1. Create a database And Preset Data
2323      */
2324     KvStoreNbDelegate::Option option = {true, false, false};
2325     g_mgr.GetKvStore("WriteTimeSort005", option, g_kvNbDelegateCallbackForQuery);
2326     ASSERT_NE(g_kvNbDelegatePtrForQuery, nullptr);
2327     EXPECT_EQ(g_kvDelegateStatusForQuery, OK);
2328     /**
2329      * @tc.steps: step2. put some data
2330      * @tc.expected: step2. Returns OK
2331      */
2332     Key key = {'x'};
2333     Key key2 = {'y'};
2334     const int dataSize = 100; // 100 data for test
2335     std::vector<Key> expectedKeys;
2336     std::vector<uint8_t> keySuffix;
2337     for (uint8_t i = 0; i < dataSize; i++) {
2338         keySuffix.push_back(rand () % 100);
2339     }
2340     for (uint8_t i = 0; i < dataSize; i++) {
2341         Key tmpKey = {key[0], keySuffix[i], i};
2342         ASSERT_EQ(g_kvNbDelegatePtrForQuery->Put(tmpKey, VALUE_1), OK);
2343         if (rand() % 2) {
2344             expectedKeys.push_back(tmpKey);
2345         }
2346     }
2347     ASSERT_EQ(g_kvNbDelegatePtrForQuery->Put(key2, VALUE_1), OK);
2348     /**
2349      * @tc.steps: step2. Call GetEntries With prefix Query
2350      * @tc.expected: step2. Returns KvStoreResultSet, the count is dataSize,
2351      *  all data are equals the preset data
2352      */
2353     KvStoreResultSet *resultSet = nullptr;
2354     std::set<Key> keys(expectedKeys.begin(), expectedKeys.end());
2355     EXPECT_EQ(g_kvNbDelegatePtrForQuery->GetEntries(Query::Select().InKeys(keys).OrderByWriteTime(true), resultSet),
2356         OK);
2357     ASSERT_NE(resultSet, nullptr);
2358     ASSERT_EQ(resultSet->GetCount(), static_cast<int>(keys.size()));
2359     for (uint32_t i = 0; i < keys.size(); i++) {
2360         resultSet->MoveToPosition(i);
2361         Entry entry;
2362         resultSet->GetEntry(entry);
2363         EXPECT_EQ(expectedKeys[i], entry.key);
2364         EXPECT_EQ(entry.value, VALUE_1);
2365     }
2366     g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet);
2367     /**
2368      * @tc.steps: step3. Call GetEntries With prefix Query limit
2369      * @tc.expected: step3. Returns KvStoreResultSet, the count is dataSize,
2370      *  all data are equals the preset data
2371      */
2372     KvStoreResultSet *resultSet2 = nullptr;
2373     long unsigned int limitNum = 40;
2374     EXPECT_EQ(g_kvNbDelegatePtrForQuery->GetEntries(
2375         Query::Select().InKeys(keys).OrderByWriteTime(true).Limit(limitNum, 0), resultSet2), OK);
2376     ASSERT_NE(resultSet2, nullptr);
2377     int expectedSize = (keys.size() >= limitNum) ? limitNum : keys.size();
2378     ASSERT_EQ(resultSet2->GetCount(), static_cast<int>(expectedSize));
2379     CheckResultSize(resultSet2, expectedKeys, expectedSize);
2380     g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet2);
2381     EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
2382     EXPECT_EQ(g_mgr.DeleteKvStore("WriteTimeSort005"), OK);
2383 }
2384 
2385 /**
2386   * @tc.name: WriteTimeSort006
2387   * @tc.desc: For inkeys query with orderBy writeTime desc
2388   * @tc.type: FUNC
2389   * @tc.require: SR000H5U55
2390   * @tc.author: zhuwentao
2391   */
2392 HWTEST_F(DistributedDBInterfacesDataOperationTest, WriteTimeSort006, TestSize.Level0)
2393 {
2394     /**
2395      * @tc.steps: step1. Create a database And Preset Data
2396      */
2397     KvStoreNbDelegate::Option option = {true, false, false};
2398     g_mgr.GetKvStore("WriteTimeSort006", option, g_kvNbDelegateCallbackForQuery);
2399     ASSERT_NE(g_kvNbDelegatePtrForQuery, nullptr);
2400     EXPECT_EQ(g_kvDelegateStatusForQuery, OK);
2401     /**
2402      * @tc.steps: step2. put some data
2403      * @tc.expected: step2. Returns OK
2404      */
2405     Key key = {'x'};
2406     Key key2 = {'y'};
2407     const int dataSize = 100; // 100 data for test
2408     std::vector<Key> expectedKeys;
2409     std::vector<uint8_t> keySuffix;
2410     for (uint8_t i = 0; i < dataSize; i++) {
2411         keySuffix.push_back(rand () % 100);
2412     }
2413     for (uint8_t i = 0; i < dataSize; i++) {
2414         Key tmpKey = {key[0], keySuffix[i], i};
2415         ASSERT_EQ(g_kvNbDelegatePtrForQuery->Put(tmpKey, VALUE_1), OK);
2416         if (rand() % 2) {
2417             expectedKeys.push_back(tmpKey);
2418         }
2419     }
2420     ASSERT_EQ(g_kvNbDelegatePtrForQuery->Put(key2, VALUE_1), OK);
2421     /**
2422      * @tc.steps: step2. Call GetEntries With prefix Query
2423      * @tc.expected: step2. Returns KvStoreResultSet, the count is dataSize,
2424      *  all data are equals the preset data
2425      */
2426     KvStoreResultSet *resultSet = nullptr;
2427     std::set<Key> keys(expectedKeys.begin(), expectedKeys.end());
2428     EXPECT_EQ(g_kvNbDelegatePtrForQuery->GetEntries(Query::Select().InKeys(keys).OrderByWriteTime(false), resultSet),
2429         OK);
2430     ASSERT_NE(resultSet, nullptr);
2431     ASSERT_EQ(resultSet->GetCount(), static_cast<int>(keys.size()));
2432     for (uint32_t i = 0; i < keys.size(); i++) {
2433         resultSet->MoveToPosition(i);
2434         Entry entry;
2435         resultSet->GetEntry(entry);
2436         EXPECT_EQ(expectedKeys[keys.size() - i - 1], entry.key);
2437         EXPECT_EQ(entry.value, VALUE_1);
2438     }
2439     g_kvNbDelegatePtrForQuery->CloseResultSet(resultSet);
2440     /**
2441      * @tc.steps: step3. Call GetEntries With prefix Query limit
2442      * @tc.expected: step3. Returns entries
2443      *  all data are equals the preset data
2444      */
2445 
2446     std::vector<Entry> entries2;
2447     EXPECT_EQ(g_kvNbDelegatePtrForQuery->GetEntries(
2448         Query::Select().InKeys(keys).OrderByWriteTime(false).Limit(keys.size() / 2, 0), entries2), OK);
2449     ASSERT_EQ(entries2.size(), static_cast<long unsigned int>(expectedKeys.size() / 2));
2450     for (uint32_t i = 0; i < keys.size() / 2; i++) {
2451         EXPECT_EQ(expectedKeys[keys.size() - i - 1], entries2[i].key);
2452         EXPECT_EQ(entries2[i].value, VALUE_1);
2453     }
2454     EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
2455     EXPECT_EQ(g_mgr.DeleteKvStore("WriteTimeSort006"), OK);
2456 }
2457 
2458 /**
2459   * @tc.name: WriteTimeSort007
2460   * @tc.desc: For unsupport query when getEntries
2461   * @tc.type: FUNC
2462   * @tc.require: SR000H5U55
2463   * @tc.author: zhuwentao
2464   */
2465 HWTEST_F(DistributedDBInterfacesDataOperationTest, WriteTimeSort007, TestSize.Level0)
2466 {
2467     /**
2468      * @tc.steps: step1. Create a database And Preset Data
2469      */
2470     KvStoreNbDelegate::Option option = {true, false, false};
2471     g_mgr.GetKvStore("WriteTimeSort007", option, g_kvNbDelegateCallbackForQuery);
2472     ASSERT_NE(g_kvNbDelegatePtrForQuery, nullptr);
2473     EXPECT_EQ(g_kvDelegateStatusForQuery, OK);
2474     /**
2475      * @tc.steps: step2. Call GetEntries With unsupport Query
2476      * @tc.expected: step2. Returns NOT_SUPPORT
2477      */
2478     Query query = Query::Select().BeginGroup().LessThan("$.field_name1", 5).OrderByWriteTime(false);
2479     KvStoreResultSet *resultSet = nullptr;
2480     EXPECT_EQ(g_kvNbDelegatePtrForQuery->GetEntries(query, resultSet), NOT_SUPPORT);
2481     std::vector<Entry> entries2;
2482     EXPECT_EQ(g_kvNbDelegatePtrForQuery->GetEntries(query, entries2), NOT_SUPPORT);
2483     int count = 0;
2484     EXPECT_EQ(g_kvNbDelegatePtrForQuery->GetCount(query, count), NOT_SUPPORT);
2485     Key key = {'x'};
2486     ASSERT_EQ(g_kvNbDelegatePtrForQuery->Put(key, VALUE_1), OK);
2487     Query query1 = Query::Select().PrefixKey(key).OrderByWriteTime(false);
2488     EXPECT_EQ(g_kvNbDelegatePtrForQuery->GetCount(query1, count), OK);
2489     EXPECT_EQ(count, 1);
2490     EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtrForQuery), OK);
2491     EXPECT_EQ(g_mgr.DeleteKvStore("WriteTimeSort007"), OK);
2492 }
2493 #endif // OMIT_JSON
2494