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 #ifndef OMIT_JSON
16 #include <gtest/gtest.h>
17 
18 #include "distributeddb_schema_test_tools.h"
19 
20 using namespace std;
21 using namespace testing;
22 #if defined TESTCASES_USING_GTEST_EXT
23 using namespace testing::ext;
24 #endif
25 using namespace DistributedDB;
26 using namespace DistributedDBDataGenerator;
27 
28 namespace DistributeddbNbSchemaDb {
29 KvStoreNbDelegate *g_nbSchemaDelegate = nullptr;
30 KvStoreDelegateManager *g_manager = nullptr;
31 
32 // invalid filed number: 0 or 257
GetInvalidFieldNumber(vector<string> & defineResult)33 void GetInvalidFieldNumber(vector<string> &defineResult)
34 {
35     defineResult.push_back(INVALID_DEFINE_1);
36     LongDefine param;
37     param.recordNum = RECORDNUM;
38     param.recordSize = RECORDSIZE;
39     param.prefix = 'f';
40     string invalidField;
41     GetLongSchemaDefine(param, invalidField);
42     defineResult.push_back(invalidField);
43 }
44 
GetInvalidDefault(vector<string> & defineResult)45 void GetInvalidDefault(vector<string> &defineResult)
46 {
47     LongDefine param;
48     param.recordNum = ONE_RECORD;
49     param.recordSize = OVER_MAXSIZE;
50     param.prefix = 'k';
51     string invalidField;
52     GetLongSchemaDefine(param, invalidField);
53     defineResult.push_back(invalidField);
54     // the level of field is over 4
55     defineResult.push_back(INVALID_DEFINE_2);
56 }
57 
GetInvalidDefine(SchemaDefine & validDefine,SchemaDefine & invalidDefine)58 vector<string> GetInvalidDefine(SchemaDefine &validDefine, SchemaDefine &invalidDefine)
59 {
60     string define;
61     string invalidField(KEY_SIXTYFOUR_BYTE + 1, 'a');
62     define = define + "\"" + invalidField + "\"";
63     invalidDefine.field.push_back(define);
64     vector<string> defineResult;
65     // invalid field name
66     for (const auto &iter : invalidDefine.field) {
67         define.clear();
68         define = define + "{" + iter + ":" + "\"" + validDefine.type.at(0) + "," + validDefine.notnull.at(0) +
69             "," + validDefine.defaultValue.at(0) + "\"" + "}";
70         defineResult.push_back(define);
71     }
72     // invalid filed number: 0 or 257
73     GetInvalidFieldNumber(defineResult);
74     // invalid field attributes: type
75     for (const auto &iter : invalidDefine.type) {
76         define.clear();
77         define = define + "{" + validDefine.field.at(0) + ":" + "\"" + iter + "," + validDefine.notnull.at(0) +
78              "\"" + "}";
79         defineResult.push_back(define);
80     }
81     // invalid field attributes: not_null
82     for (const auto &iter : invalidDefine.notnull) {
83         define.clear();
84         define = define + "{" + validDefine.field.at(0) + ":" + "\"" + validDefine.type.at(0) + "," + iter +
85             "," + validDefine.defaultValue.at(0) + "\"" + "}";
86         defineResult.push_back(define);
87     }
88     // invalid field attributes: DEFAULT x
89     for (unsigned int index1 = 0; index1 < validDefine.type.size(); index1++) {
90         for (unsigned int index2 = 0; index2 < invalidDefine.defaultValue.size(); index2++) {
91             define.clear();
92             if (index1 == 0 && ((index2 == INDEX_FIFY) || (index2 == INDEX_SIX) || (index2 == INDEX_NINE) ||
93                 (index2 == INDEX_TEN))) {
94                 continue;
95             } else {
96                 define = define + "{" + validDefine.field.at(0) + ":" + "\"" + validDefine.type[index1] + "," +
97                     validDefine.notnull.at(0) + "," + invalidDefine.defaultValue[index2] + "\"" + "}";
98                 defineResult.push_back(define);
99             }
100         }
101     }
102     // invalid field attributes: mix of type,not_null,DEFAULT x and DEFAULT x over the range of INTEGER/LONG/DOUBLE
103     for (const auto &iter : INVALID_ATTRIBUTES) {
104         define.clear();
105         define = define + "{" + validDefine.field.at(0) + ":" + iter + "}";
106         defineResult.push_back(define);
107     }
108     // DEFAULT x over 4K is invalid
109     GetInvalidDefault(defineResult);
110     return defineResult;
111 }
112 
113 class DistributeddbNbSchemaTest : public testing::Test {
114 public:
115     void SetUp();
116     void TearDown();
117 private:
118 };
119 
SetUp(void)120 void DistributeddbNbSchemaTest::SetUp(void)
121 {
122     RemoveDir(DistributedDBConstant::NB_DIRECTOR);
123 
124     UnitTest *test = UnitTest::GetInstance();
125     ASSERT_NE(test, nullptr);
126     const TestInfo *testinfo = test->current_test_info();
127     ASSERT_NE(testinfo, nullptr);
128     string testCaseName = string(testinfo->name());
129     MST_LOG("[SetUp] test case %s is start to run", testCaseName.c_str());
130 }
131 
TearDown(void)132 void DistributeddbNbSchemaTest::TearDown(void)
133 {
134     MST_LOG("TearDownTestCase after case.");
135     RemoveDir(DistributedDBConstant::NB_DIRECTOR);
136 }
137 
138 /**
139  * @tc.name: BuildSchemaDb 001
140  * @tc.desc: Verify that single-ver db can support create schema db if the schema is valid.
141  * @tc.type: FUNC
142  * @tc.require: SR000DR9JO
143  * @tc.author: fengxiaoyun
144  */
145 HWTEST_F(DistributeddbNbSchemaTest, BuildSchemaDb001, TestSize.Level1)
146 {
147     KvStoreNbDelegate *delegate = nullptr;
148     KvStoreDelegateManager *manager = nullptr;
149     /**
150      * @tc.steps: step1. create db with valid schema.
151      * @tc.expected: step1. create successfully.
152      */
153     Schema validSchema;
154     validSchema.version = VALID_VERSION;
155     validSchema.mode = VALID_MODE;
156     validSchema.define = VALID_DEFINE;
157     validSchema.index = VALID_INDEX;
158     vector<string> validSchemaStr = GetValidSchema(validSchema, true);
159     Option option = g_option;
160     option.isMemoryDb = false;
161     int count = 0;
162     for (const auto &iter : validSchemaStr) {
163         MST_LOG("######## ######## ######## BuildSchemaDb001 : SubCase[%d] BEGIN ######## ######## ########", count);
164         option.schema = iter;
165         delegate = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
166         ASSERT_TRUE(manager != nullptr && delegate != nullptr);
167         EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, option.isMemoryDb));
168         MST_LOG("######## ######## ######## BuildSchemaDb001 : SubCase[%d] END ######## ######## ########", count++);
169     }
170 }
171 
172 /**
173  * @tc.name: BuildSchemaDb 002
174  * @tc.desc: Verify that single-ver db can't create schema db if the schema is invalid.
175  * @tc.type: FUNC
176  * @tc.require: SR000DR9JO
177  * @tc.author: fengxiaoyun
178  */
179 HWTEST_F(DistributeddbNbSchemaTest, BuildSchemaDb002, TestSize.Level1)
180 {
181     KvStoreNbDelegate *delegate = nullptr;
182     KvStoreDelegateManager *manager = nullptr;
183     Schema validSchema, invalidSchema;
184     validSchema.version = VALID_VERSION;
185     validSchema.mode = VALID_MODE;
186     validSchema.define = VALID_DEFINE;
187     validSchema.index = VALID_INDEX;
188 
189     SchemaDefine invalidDefine, validDefine;
190     invalidDefine.field = INVALID_DEFINE_FIELD;
191     invalidDefine.type = INVALID_TYPE;
192     invalidDefine.notnull = INVALID_NOTNULL;
193     invalidDefine.defaultValue = INVALID_DEFAULT;
194     validDefine.field = VALID_DEFINE_FIELD;
195     validDefine.type = VALID_TYPE;
196     validDefine.notnull = VALID_NOTNULL;
197     validDefine.defaultValue = VALID_DEFAULT;
198     vector<string> defineRes = GetInvalidDefine(validDefine, invalidDefine);
199     invalidSchema.version = INVALID_VERSION;
200     invalidSchema.mode = INVALID_MODE;
201     invalidSchema.define = defineRes;
202     invalidSchema.index = INALID_INDEX;
203     map<int, vector<string>> schemaRes1 = GetInvalidSchema(invalidSchema, validSchema, false);
204     map<int, vector<string>> schemaRes2 = GetInvalidSchema(invalidSchema, validSchema, true);
205 
206     /**
207      * @tc.steps: step1. create db with invalid schema without SCHEMA_INDEX.
208      * @tc.expected: step1. create failed and return INVALID_SCHEMA.
209      */
210     Option option = g_option;
211     option.isMemoryDb = false;
212     DBStatus status;
213     int count = 0;
214     for (int index = 0; index < SCHEMA_INDEX; index++) {
215         for (const auto &iter : schemaRes1[index]) {
216             option.schema = iter;
217             MST_LOG("######## ######## BuildSchemaDb002 : SubCase[%d] BEGIN ######## ######## ########", count);
218             delegate = DistributedDBNbTestTools::GetNbDelegateStatus(manager, status, g_dbParameter3, option);
219             MST_LOG("The invalid field is %d", index);
220             EXPECT_EQ(delegate, nullptr);
221             EXPECT_EQ(status, INVALID_SCHEMA);
222             MST_LOG("######## ######## BuildSchemaDb002 : SubCase[%d] END ######## ######## ########", count++);
223         }
224     }
225     /**
226      * @tc.steps: step2. create db with invalid schema with invalid SCHEMA_INDEX.
227      * @tc.expected: step2. create failed and return INVALID_SCHEMA.
228      */
229     for (int index = 0; index < SCHEMA_INDEX; index++) {
230         for (const auto &iter : schemaRes2[index]) {
231             option.schema = iter;
232             delegate = DistributedDBNbTestTools::GetNbDelegateStatus(manager, status, g_dbParameter2, option);
233             EXPECT_EQ(delegate, nullptr);
234             EXPECT_EQ(status, INVALID_SCHEMA);
235         }
236     }
237 }
238 
239 /**
240  * @tc.name: BuildSchemaDb 003
241  * @tc.desc: Verify that single-ver memory db can't support create schema db.
242  * @tc.type: FUNC
243  * @tc.require: SR000DR9JO
244  * @tc.author: fengxiaoyun
245  */
246 HWTEST_F(DistributeddbNbSchemaTest, BuildSchemaDb003, TestSize.Level0)
247 {
248     KvStoreNbDelegate *delegate = nullptr;
249     KvStoreDelegateManager *manager = nullptr;
250     /**
251      * @tc.steps: step1. create memore db with valid schema.
252      * @tc.expected: step1. create failed and return NOT_SUPPORT.
253      */
254     Schema validSchema;
255     validSchema.version = VALID_VERSION;
256     validSchema.mode = VALID_MODE;
257     validSchema.define = VALID_DEFINE;
258     validSchema.index = VALID_INDEX;
259     vector<string> validSchemaStr = GetValidSchema(validSchema, true);
260     Option option = g_option;
261     option.isMemoryDb = true;
262     DBStatus status;
263     for (const auto &iter : validSchemaStr) {
264         option.schema = iter;
265         delegate = DistributedDBNbTestTools::GetNbDelegateStatus(manager, status, g_dbParameter2, option);
266         EXPECT_EQ(delegate, nullptr);
267         EXPECT_EQ(status, NOT_SUPPORT);
268     }
269 }
270 
271 /**
272  * @tc.name: OpenSchemaDb 001
273  * @tc.desc: Verify that can open with schema when the kvstore is not schema db.
274  * @tc.type: FUNC
275  * @tc.require: SR000DR9JO
276  * @tc.author: fengxiaoyun
277  */
278 HWTEST_F(DistributeddbNbSchemaTest, OpenSchemaDb001, TestSize.Level1)
279 {
280     KvStoreNbDelegate *delegate = nullptr;
281     KvStoreDelegateManager *manager = nullptr;
282     Option option = g_option;
283     option.isMemoryDb = false;
284     delegate = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
285     ASSERT_TRUE(manager != nullptr && delegate != nullptr);
286     EXPECT_TRUE(manager->CloseKvStore(delegate) == OK);
287     delegate = nullptr;
288 
289     /**
290      * @tc.steps: step1. reopen db with schema of STRICT mode and put(k1,value).
291      * @tc.expected: step1. reopen and put successfully.
292      */
293     LongDefine param;
294     param.recordNum = ONE_RECORD;
295     param.recordSize = RECORDSIZE;
296     param.prefix = 'k';
297     string invalidField;
298     GetLongSchemaDefine(param, invalidField);
299     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_1, invalidField, VALID_INDEX_1);
300     option.createIfNecessary = false;
301     delegate = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
302     ASSERT_TRUE(manager != nullptr && delegate != nullptr);
303     Value valueSchema(invalidField.begin(), invalidField.end());
304     EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate, KEY_1, valueSchema), OK);
305 
306     /**
307      * @tc.steps: step2. Get(k1) and delete(k1).
308      * @tc.expected: step2. Get(k1)=value and delete successfully.
309      */
310     Value valueResult;
311     EXPECT_EQ(DistributedDBNbTestTools::Get(*delegate, KEY_1, valueResult), OK);
312     EXPECT_EQ(valueResult, valueSchema);
313     EXPECT_EQ(DistributedDBNbTestTools::Delete(*delegate, KEY_1), OK);
314     EXPECT_TRUE(manager->CloseKvStore(delegate) == OK);
315     delegate = nullptr;
316 
317     /**
318      * @tc.steps: step3. reopen db with no schema and put(k1,v1),delete(k1),Get(k1).
319      * @tc.expected: step3. reopen successfully and put,delete return READ_ONLY,Get return NOT_FOUND.
320      */
321     option.schema.clear();
322     delegate = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
323     ASSERT_TRUE(manager != nullptr && delegate != nullptr);
324     EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate, KEY_1, valueSchema), READ_ONLY);
325     EXPECT_EQ(DistributedDBNbTestTools::Delete(*delegate, KEY_1), READ_ONLY);
326     EXPECT_EQ(DistributedDBNbTestTools::Get(*delegate, KEY_1, valueResult), NOT_FOUND);
327     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, option.isMemoryDb));
328 }
329 
330 /**
331  * @tc.name: OpenSchemaDb 002
332  * @tc.desc: Verify that single-ver db can't reopen schema db if the schema is invalid when the kvstore is
333  *     not a schema db.
334  * @tc.type: FUNC
335  * @tc.require: SR000DR9JO
336  * @tc.author: fengxiaoyun
337  */
338 HWTEST_F(DistributeddbNbSchemaTest, OpenSchemaDb002, TestSize.Level1)
339 {
340     KvStoreNbDelegate *delegate = nullptr;
341     KvStoreDelegateManager *manager = nullptr;
342     Option option = g_option;
343     option.isMemoryDb = false;
344     delegate = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
345     ASSERT_TRUE(manager != nullptr && delegate != nullptr);
346     EXPECT_TRUE(manager->CloseKvStore(delegate) == OK);
347 
348     Schema validSchema, invalidSchema;
349     validSchema.version = VALID_VERSION;
350     validSchema.mode = VALID_MODE;
351     validSchema.define = VALID_DEFINE;
352     validSchema.index = VALID_INDEX;
353 
354     SchemaDefine invalidDefine, validDefine;
355     invalidDefine.field = INVALID_DEFINE_FIELD;
356     invalidDefine.type = INVALID_TYPE;
357     invalidDefine.notnull = INVALID_NOTNULL;
358     invalidDefine.defaultValue = INVALID_DEFAULT;
359     validDefine.field = VALID_DEFINE_FIELD;
360     validDefine.type = VALID_TYPE;
361     validDefine.notnull = VALID_NOTNULL;
362     validDefine.defaultValue = VALID_DEFAULT;
363     vector<string> defineRes = GetInvalidDefine(validDefine, invalidDefine);
364     invalidSchema.version = INVALID_VERSION;
365     invalidSchema.mode = INVALID_MODE;
366     invalidSchema.define = defineRes;
367     invalidSchema.index = INALID_INDEX;
368     map<int, vector<string>> schemaRes1 = GetInvalidSchema(invalidSchema, validSchema, false);
369     map<int, vector<string>> schemaRes2 = GetInvalidSchema(invalidSchema, validSchema, true);
370 
371     /**
372      * @tc.steps: step1. reopen db with invalid schema without SCHEMA_INDEX.
373      * @tc.expected: step1. reopen failed and return INVALID_SCHEMA.
374      */
375     option.createIfNecessary = false;
376     DBStatus status;
377     for (int index = 0; index < SCHEMA_INDEX; index++) {
378         for (const auto &iter : schemaRes1[index]) {
379             option.schema = iter;
380             delegate = DistributedDBNbTestTools::GetNbDelegateStatus(manager, status, g_dbParameter2, option);
381             MST_LOG("The invalid field is %d", index);
382             EXPECT_EQ(delegate, nullptr);
383             EXPECT_EQ(status, INVALID_SCHEMA);
384         }
385     }
386     /**
387      * @tc.steps: step2. reopen db with invalid schema with invalid SCHEMA_INDEX.
388      * @tc.expected: step2. reopen failed and return INVALID_SCHEMA.
389      */
390     for (int index = 0; index < SCHEMA_INDEX; index++) {
391         for (const auto &iter : schemaRes2[index]) {
392             option.schema = iter;
393             delegate = DistributedDBNbTestTools::GetNbDelegateStatus(manager, status, g_dbParameter2, option);
394             EXPECT_EQ(delegate, nullptr);
395             EXPECT_EQ(status, INVALID_SCHEMA);
396         }
397     }
398 }
399 
400 /**
401  * @tc.name: OpenSchemaDb 003
402  * @tc.desc: Verify that can open with no schema when the kvstore is schema db.
403  * @tc.type: FUNC
404  * @tc.require: SR000DR9JO
405  * @tc.author: fengxiaoyun
406  */
407 HWTEST_F(DistributeddbNbSchemaTest, OpenSchemaDb003, TestSize.Level1)
408 {
409     KvStoreNbDelegate *delegate = nullptr;
410     KvStoreDelegateManager *manager = nullptr;
411     Option option = g_option;
412     option.isMemoryDb = false;
413     LongDefine param;
414     param.recordNum = ONE_RECORD;
415     param.recordSize = RECORDSIZE;
416     param.prefix = 'k';
417     string validField;
418     GetLongSchemaDefine(param, validField);
419     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_1, validField, VALID_INDEX_1);
420     delegate = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
421     ASSERT_TRUE(manager != nullptr && delegate != nullptr);
422     Value valueSchema(validField.begin(), validField.end());
423     EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate, KEY_1, valueSchema), OK);
424     EXPECT_TRUE(manager->CloseKvStore(delegate) == OK);
425     /**
426      * @tc.steps: step1. reopen db with no schema.
427      * @tc.expected: step1. reopen successfully.
428      */
429     option.createIfNecessary = false;
430     option.schema.clear();
431     delegate = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
432     ASSERT_TRUE(manager != nullptr && delegate != nullptr);
433     /**
434      * @tc.steps: step2. Get(k1) and put(k1,v1), delete(k1).
435      * @tc.expected: step2. Get(k1)=value, put and delete failed.
436      */
437     Value valueResult;
438     EXPECT_EQ(DistributedDBNbTestTools::Get(*delegate, KEY_1, valueResult), OK);
439     EXPECT_EQ(valueResult, valueSchema);
440     EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate, KEY_1, VALUE_1), READ_ONLY);
441     EXPECT_EQ(DistributedDBNbTestTools::Delete(*delegate, KEY_1), READ_ONLY);
442     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, option.isMemoryDb));
443 }
444 
445 /**
446  * @tc.name: OpenSchemaDb 004
447  * @tc.desc: Verify that can open with schema when the kvstore is schema db even if the order of same
448  *     level is different.
449  * @tc.type: FUNC
450  * @tc.require: SR000DR9JO
451  * @tc.author: fengxiaoyun
452  */
453 HWTEST_F(DistributeddbNbSchemaTest, OpenSchemaDb004, TestSize.Level1)
454 {
455     KvStoreNbDelegate *delegate = nullptr;
456     KvStoreDelegateManager *manager = nullptr;
457     Option option = g_option;
458     option.isMemoryDb = false;
459     LongDefine param;
460     param.recordNum = ONE_RECORD;
461     param.recordSize = RECORDSIZE;
462     param.prefix = 'k';
463     string validField;
464     GetLongSchemaDefine(param, validField);
465     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_1, validField, VALID_INDEX_1);
466     delegate = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
467     ASSERT_TRUE(manager != nullptr && delegate != nullptr);
468     Value valueSchema(validField.begin(), validField.end());
469     EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate, KEY_1, valueSchema), OK);
470     EXPECT_TRUE(manager->CloseKvStore(delegate) == OK);
471     /**
472      * @tc.steps: step1. reopen db with schema that the order of schema is different with kvstore.
473      * @tc.expected: step1. reopen successfully.
474      */
475     option.createIfNecessary = false;
476     option.schema.clear();
477     option.schema = option.schema + "{" + "\"SCHEMA_DEFINE\"" + ":"  + validField + "," +
478         "\"SCHEMA_VERSION\"" + ":" + "\"" + VALID_VERSION_1 + "\"" + "," +
479         "\"SCHEMA_INDEXES\"" + ":" + VALID_INDEX_1 + "," +
480         "\"SCHEMA_MODE\"" + ":" + "\"" + VALID_MODE_1 + "\"" + "}";
481     MST_LOG("schema is %s", option.schema.c_str());
482     delegate = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
483     ASSERT_TRUE(manager != nullptr && delegate != nullptr);
484     /**
485      * @tc.steps: step2. Get(k1) and put(k1,v1), delete(k1).
486      * @tc.expected: step2. Get(k1)=value1, put and delete successfully.
487      */
488     Value valueResult;
489     EXPECT_EQ(DistributedDBNbTestTools::Get(*delegate, KEY_1, valueResult), OK);
490     EXPECT_EQ(valueResult, valueSchema);
491     string value2 = "{\"field0\":\"fxy\"}";
492     Value valueSchema2(value2.begin(), value2.end());
493     EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate, KEY_1, valueSchema2), OK);
494     EXPECT_EQ(DistributedDBNbTestTools::Delete(*delegate, KEY_1), OK);
495     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, option.isMemoryDb));
496 }
497 
498 /**
499  * @tc.name: OpenSchemaDb 005
500  * @tc.desc: Verify that can't open with schema when the schema is mismatch with the original kvstore schema.
501  * @tc.type: FUNC
502  * @tc.require: SR000DR9JO
503  * @tc.author: fengxiaoyun
504  */
505 HWTEST_F(DistributeddbNbSchemaTest, OpenSchemaDb005, TestSize.Level1)
506 {
507     KvStoreNbDelegate *delegate = nullptr;
508     KvStoreDelegateManager *manager = nullptr;
509     Option option = g_option;
510     option.isMemoryDb = false;
511     LongDefine param;
512     param.recordNum = ONE_RECORD;
513     param.recordSize = RECORDSIZE;
514     param.prefix = 'k';
515     string validField;
516     GetLongSchemaDefine(param, validField);
517     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_2, validField, VALID_INDEX_1);
518     delegate = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
519     ASSERT_TRUE(manager != nullptr && delegate != nullptr);
520     EXPECT_TRUE(manager->CloseKvStore(delegate) == OK);
521     /**
522      * @tc.steps: step1. reopen db with schema which mode is different from the original kvstore schema.
523      * @tc.expected: step1. reopen failed and return SCHEMA_MISMATCH.
524      */
525     option.createIfNecessary = false;
526     option.schema.clear();
527     DBStatus status;
528     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_1, validField, VALID_INDEX_1);
529     delegate = DistributedDBNbTestTools::GetNbDelegateStatus(manager, status, g_dbParameter2, option);
530     EXPECT_EQ(delegate, nullptr);
531     EXPECT_EQ(status, SCHEMA_MISMATCH);
532     /**
533      * @tc.steps: step2. reopen db with schema which define fields is more than the original kvstore schema.
534      * @tc.expected: step2. reopen failed and return SCHEMA_MISMATCH.(extra field has not null but no default)
535      */
536     string validField2;
537     param.recordNum = TWO_RECORD;
538     GetLongSchemaDefine(param, validField2);
539     std::string toBeErased = ",DEFAULT 'kkk2'";
540     auto iter = std::search(validField2.begin(), validField2.end(), toBeErased.begin(), toBeErased.end());
541     validField2.erase(iter, iter + toBeErased.size());
542     option.schema.clear();
543     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_2, validField2, VALID_INDEX_1);
544     delegate = DistributedDBNbTestTools::GetNbDelegateStatus(manager, status, g_dbParameter2, option);
545     EXPECT_EQ(delegate, nullptr);
546     EXPECT_EQ(status, SCHEMA_MISMATCH);
547 
548     /**
549      * @tc.steps: step3. reopen db with schema which SCHEMA_INDEX is not null.
550      * @tc.expected: step3. reopen failed and return SCHEMA_MISMATCH.(extra field has not null but no default)
551      */
552     option.schema.erase(option.schema.size() - 3, 3); // erase 3 chars that starting at 3 st last.
553     option.schema.append("[\"$.field0\"]}");
554     MST_LOG("option.schema is %s", option.schema.c_str());
555     delegate = DistributedDBNbTestTools::GetNbDelegateStatus(manager, status, g_dbParameter2, option);
556     EXPECT_EQ(delegate, nullptr);
557     EXPECT_EQ(status, SCHEMA_MISMATCH);
558 
559     /**
560      * @tc.steps: step4. reopen db with schema which schema_index is absent.
561      * @tc.expected: step4. reopen successfully.
562      */
563     option.schema.clear();
564     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_2, validField, VALID_INDEX_1);
565     option.schema.erase(option.schema.size() - 21, 20); // erase 20 char that starting at 21 st last.
566     MST_LOG("schema is %s", option.schema.c_str());
567     delegate = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
568     ASSERT_TRUE(manager != nullptr && delegate != nullptr);
569     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, option.isMemoryDb));
570 }
571 
ReopenDBWithDiffSchema(string & schemaDefine,Option & option,KvStoreDelegateManager * & manager,KvStoreNbDelegate * & delegate)572 void ReopenDBWithDiffSchema(string &schemaDefine, Option &option,
573     KvStoreDelegateManager *&manager, KvStoreNbDelegate *&delegate)
574 {
575     option.schema.clear();
576     DBStatus status;
577     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_1, schemaDefine, VALID_INDEX_1);
578     delegate = DistributedDBNbTestTools::GetNbDelegateStatus(manager, status, g_dbParameter2, option);
579     EXPECT_TRUE(manager == nullptr && delegate == nullptr);
580     EXPECT_EQ(status, SCHEMA_MISMATCH);
581 }
582 
583 /**
584  * @tc.name: OpenSchemaDb 006
585  * @tc.desc: Verify that can't open with schema when the schema_define attributes are mismatch with the
586  *     original kvstore schema.
587  * @tc.type: FUNC
588  * @tc.require: SR000DR9JO
589  * @tc.author: fengxiaoyun
590  */
591 HWTEST_F(DistributeddbNbSchemaTest, OpenSchemaDb006, TestSize.Level1)
592 {
593     KvStoreNbDelegate *delegate = nullptr;
594     KvStoreDelegateManager *manager = nullptr;
595     Option option = g_option;
596     option.isMemoryDb = false;
597     string schemaDefine1 = "{\"field0\":\"INTEGER,NOT NULL,DEFAULT 10\",\"field1\":[]}";
598     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_1, schemaDefine1, VALID_INDEX_1);
599     delegate = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
600     ASSERT_TRUE(manager != nullptr && delegate != nullptr);
601     EXPECT_TRUE(manager->CloseKvStore(delegate) == OK);
602     delegate = nullptr;
603     /**
604      * @tc.steps: step1. reopen db with schema which schema_define's type is different from the original kvstore schema.
605      * @tc.expected: step1. reopen failed and return SCHEMA_MISMATCH.
606      */
607     option.createIfNecessary = false;
608     string schemaDefine2 = "{\"field0\":\"LONG,NOT NULL,DEFAULT 10\",\"field1\":[]}";
609     ReopenDBWithDiffSchema(schemaDefine2, option, manager, delegate);
610     /**
611      * @tc.steps: step2. reopen db with schema which schema_define's not_null is different from the
612      *     original kvstore schema.
613      * @tc.expected: step2. reopen failed and return SCHEMA_MISMATCH.
614      */
615     string schemaDefine3 = "{\"field0\":\"INTEGER,DEFAULT 10\",\"field1\":[]}";
616     ReopenDBWithDiffSchema(schemaDefine3, option, manager, delegate);
617     /**
618      * @tc.steps: step3. reopen db with schema which schema_define's default x is different from the
619      *     original kvstore schema.
620      * @tc.expected: step3. reopen failed and return SCHEMA_MISMATCH.
621      */
622     string schemaDefine4 = "{\"field0\":\"INTEGER,NOT NULL,DEFAULT 11\",\"field1\":[]}";
623     ReopenDBWithDiffSchema(schemaDefine4, option, manager, delegate);
624     string schemaDefine5 = "{\"field0\":\"INTEGER,NOT NULL\",\"field1\":[]}";
625     ReopenDBWithDiffSchema(schemaDefine5, option, manager, delegate);
626     /**
627      * @tc.steps: step4. reopen db with schema which schema_define's Json Array is different from the
628      *     original kvstore schema.
629      * @tc.expected: step4. reopen failed and return SCHEMA_MISMATCH.
630      */
631     string schemaDefine6 = "{\"field0\":\"INTEGER,NOT NULL,DEFAULT 10\",\"field1\":{}}";
632     ReopenDBWithDiffSchema(schemaDefine6, option, manager, delegate);
633     KvStoreDelegateManager *manager1 = new (std::nothrow) KvStoreDelegateManager(APP_ID_2, USER_ID_2);
634     ASSERT_NE(manager1, nullptr);
635     EXPECT_EQ(manager1->SetKvStoreConfig({ .dataDir = DistributedDBConstant::NB_DIRECTOR }), OK);
636     EXPECT_EQ(manager1->DeleteKvStore(STORE_ID_2), OK);
637     delete manager1;
638     manager1 = nullptr;
639 }
640 
641 /**
642  * @tc.name: OpenSchemaDb 007
643  * @tc.desc: Verify that open new db conn must be the same as first time(common) when the original db is common db.
644  * @tc.type: FUNC
645  * @tc.require: SR000DR9JO
646  * @tc.author: fengxiaoyun
647  */
648 HWTEST_F(DistributeddbNbSchemaTest, OpenSchemaDb007, TestSize.Level1)
649 {
650     map<string, KvStoreNbDelegate *> delegate;
651     KvStoreDelegateManager *manager = nullptr;
652     Option option = g_option;
653     option.isMemoryDb = false;
654     delegate["OriNormalDB"] = nullptr;
655     delegate["OriNormalDB"] = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
656     ASSERT_TRUE(manager != nullptr && delegate["OriNormalDB"] != nullptr);
657     EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate["OriNormalDB"], KEY_1, VALUE_1), OK);
658     EXPECT_TRUE(manager->CloseKvStore(delegate["OriNormalDB"]) == OK);
659 
660     /**
661      * @tc.steps: step1. get delegate1 without schema.
662      * @tc.expected: step1. get successfully.
663      */
664     option.createIfNecessary = false;
665     delegate["OpenNormalDB"] = nullptr;
666     delegate["OpenNormalDB"] = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
667     ASSERT_TRUE(manager != nullptr && delegate["OpenNormalDB"] != nullptr);
668 
669     /**
670      * @tc.steps: step2.  get delegate2 with schema.
671      * @tc.expected: step2. get failed and return SCHEMA_MISMATCH.
672      */
673     string validField = "{\"field0\":\"INTEGER,DEFAULT 10\",\"field1\":[]}";
674     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_1, validField, VALID_INDEX_1);
675     DBStatus status;
676     delegate["OpenSchemaDB"] = nullptr;
677     delegate["OpenSchemaDB"] = DistributedDBNbTestTools::GetNbDelegateStatus(manager, status, g_dbParameter2, option);
678     EXPECT_EQ(delegate["OpenSchemaDB"], nullptr);
679     EXPECT_EQ(status, SCHEMA_MISMATCH);
680 
681     /**
682      * @tc.steps: step3. get delegate3 without schema.
683      * @tc.expected: step3. get successfully.
684      */
685     option.schema.clear();
686     delegate["OpenNormalDB2"] = nullptr;
687     delegate["OpenNormalDB2"] = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
688     ASSERT_TRUE(manager != nullptr && delegate["OpenNormalDB2"] != nullptr);
689 
690     /**
691      * @tc.steps: step4. put(k1,v2),Get(k1),delete(k1) with delegate3.
692      * @tc.expected: step4. put and delete successfully, Get(k1)=v2,.
693      */
694     EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate["OpenNormalDB2"], KEY_1, VALUE_2), OK);
695     Value valueResult;
696     EXPECT_EQ(DistributedDBNbTestTools::Get(*delegate["OpenNormalDB2"], KEY_1, valueResult), OK);
697     EXPECT_EQ(valueResult, VALUE_2);
698     EXPECT_EQ(DistributedDBNbTestTools::Delete(*delegate["OpenNormalDB2"], KEY_1), OK);
699     EXPECT_TRUE(manager->CloseKvStore(delegate["OpenNormalDB"]) == OK);
700     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate["OpenNormalDB2"], STORE_ID_2, option.isMemoryDb));
701 }
702 
703 /**
704  * @tc.name: OpenSchemaDb 008
705  * @tc.desc: Verify that open new db conn must be the same as first time(common) when the original db is schema db.
706  * @tc.type: FUNC
707  * @tc.require: SR000DR9JO
708  * @tc.author: fengxiaoyun
709  */
710 HWTEST_F(DistributeddbNbSchemaTest, OpenSchemaDb008, TestSize.Level1)
711 {
712     map<string, KvStoreNbDelegate *> delegate;
713     KvStoreDelegateManager *manager = nullptr;
714     Option option = g_option;
715     option.isMemoryDb = false;
716     string validField = "{\"field0\":\"INTEGER,NOT NULL,DEFAULT 10\",\"field1\":[]}";
717     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_1, validField, VALID_INDEX_1);
718     delegate["OriSchemaDB"] = nullptr;
719     delegate["OriSchemaDB"] = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
720     ASSERT_TRUE(manager != nullptr && delegate["OriSchemaDB"] != nullptr);
721     string valueStr = "{\"field0\":15,\"field1\":[20]}";
722     Value valueSchema(valueStr.begin(), valueStr.end());
723     EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate["OriSchemaDB"], KEY_1, valueSchema), OK);
724     EXPECT_TRUE(manager->CloseKvStore(delegate["OriSchemaDB"]) == OK);
725 
726     /**
727      * @tc.steps: step1. get delegate1 without schema.
728      * @tc.expected: step1. get successfully.
729      */
730     option.createIfNecessary = false;
731     option.schema.clear();
732     delegate["OpenNormalDB"] = nullptr;
733     delegate["OpenNormalDB"] = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
734     ASSERT_TRUE(manager != nullptr && delegate["OpenNormalDB"] != nullptr);
735 
736     /**
737      * @tc.steps: step2.  get delegate2 with schema.
738      * @tc.expected: step2. get failed and return SCHEMA_MISMATCH.
739      */
740     DBStatus status;
741     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_1, validField, VALID_INDEX_1);
742     delegate["OpenSchemaDB"] = nullptr;
743     delegate["OpenSchemaDB"] = DistributedDBNbTestTools::GetNbDelegateStatus(manager, status, g_dbParameter2, option);
744     EXPECT_EQ(delegate["OpenSchemaDB"], nullptr);
745     EXPECT_EQ(status, SCHEMA_MISMATCH);
746 
747     /**
748      * @tc.steps: step3. get delegate3 without schema.
749      * @tc.expected: step3. get successfully.
750      */
751     option.schema.clear();
752     delegate["OpenNormalDB2"] = nullptr;
753     delegate["OpenNormalDB2"] = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
754     ASSERT_TRUE(manager != nullptr && delegate["OpenNormalDB2"] != nullptr);
755 
756     /**
757      * @tc.steps: step4. put(k1,v2),Get(k1),delete(k1) with delegate3.
758      * @tc.expected: step4. put and delete successfully, Get(k1)=v2,.
759      */
760     EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate["OpenNormalDB2"], KEY_1, VALUE_2), READ_ONLY);
761     Value valueResult;
762     EXPECT_EQ(DistributedDBNbTestTools::Get(*delegate["OpenNormalDB2"], KEY_1, valueResult), OK);
763     EXPECT_EQ(valueResult, valueSchema);
764     EXPECT_EQ(DistributedDBNbTestTools::Delete(*delegate["OpenNormalDB2"], KEY_1), READ_ONLY);
765     EXPECT_TRUE(manager->CloseKvStore(delegate["OpenNormalDB"]) == OK);
766     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate["OpenNormalDB2"], STORE_ID_2, option.isMemoryDb));
767 }
768 
769 /**
770  * @tc.name: OpenSchemaDb 009
771  * @tc.desc: Verify that open new db conn must be the same as first time(schema) when the original db is common db.
772  * @tc.type: FUNC
773  * @tc.require: SR000DR9JO
774  * @tc.author: fengxiaoyun
775  */
776 HWTEST_F(DistributeddbNbSchemaTest, OpenSchemaDb009, TestSize.Level1)
777 {
778     map<string, KvStoreNbDelegate *> delegate;
779     KvStoreDelegateManager *manager = nullptr;
780     Option option = g_option;
781     option.isMemoryDb = false;
782     delegate["OriNormalDB"] = nullptr;
783     delegate["OriNormalDB"] = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
784     ASSERT_TRUE(manager != nullptr && delegate["OriNormalDB"] != nullptr);
785     EXPECT_TRUE(manager->CloseKvStore(delegate["OriNormalDB"]) == OK);
786 
787     /**
788      * @tc.steps: step1. get delegate1 with schema.
789      * @tc.expected: step1. get successfully.
790      */
791     option.createIfNecessary = false;
792     string validField = "{\"field0\":\"INTEGER,NOT NULL,DEFAULT 10\",\"field1\":[]}";
793     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_1, validField, VALID_INDEX_1);
794     delegate["FirstOpenSchema"] = nullptr;
795     delegate["FirstOpenSchema"] = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
796     ASSERT_TRUE(manager != nullptr && delegate["FirstOpenSchema"] != nullptr);
797 
798     /**
799      * @tc.steps: step2.  get delegate2 without schema.
800      * @tc.expected: step2. get failed and return SCHEMA_MISMATCH.
801      */
802     option.schema.clear();
803     DBStatus status;
804     delegate["OpenNormal"] = nullptr;
805     delegate["OpenNormal"] = DistributedDBNbTestTools::GetNbDelegateStatus(manager, status, g_dbParameter2, option);
806     EXPECT_EQ(delegate["OpenNormal"], nullptr);
807     EXPECT_EQ(status, SCHEMA_MISMATCH);
808 
809     /**
810      * @tc.steps: step3. get delegate3 with schema2.
811      * @tc.expected: step3. get failed and return SCHEMA_MISMATCH.
812      */
813     option.schema.clear();
814     string validField1 = "{\"field0\":\"INTEGER,NOT NULL,DEFAULT 10\"}";
815     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_1, validField1, VALID_INDEX_1);
816     delegate["OpenDiffSchema"] = nullptr;
817     delegate["OpenDiffSchema"] = DistributedDBNbTestTools::GetNbDelegateStatus(manager, status, g_dbParameter2, option);
818     EXPECT_EQ(delegate["OpenDiffSchema"], nullptr);
819     EXPECT_EQ(status, SCHEMA_MISMATCH);
820 
821     /**
822      * @tc.steps: step4. get delegate4 with schema.
823      * @tc.expected: step4.get successfully.
824      */
825     option.schema.clear();
826     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_1, validField, VALID_INDEX_1);
827     delegate["OpenSameSchema"] = nullptr;
828     delegate["OpenSameSchema"] = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
829     ASSERT_TRUE(manager != nullptr && delegate["OpenSameSchema"] != nullptr);
830     // close all opened delegates.
831     EXPECT_TRUE(manager->CloseKvStore(delegate["OpenSameSchema"]) == OK);
832     EXPECT_TRUE(manager->CloseKvStore(delegate["FirstOpenSchema"]) == OK);
833     delegate.clear();
834 
835     /**
836      * @tc.steps: step5. get delegate5 without schema after close all delegates that were opened.
837      * @tc.expected: step4.get successfully.
838      */
839     option.schema.clear();
840     delegate["ReopenNormal"] = nullptr;
841     delegate["ReopenNormal"] = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
842     ASSERT_TRUE(manager != nullptr && delegate["ReopenNormal"] != nullptr);
843     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate["ReopenNormal"], STORE_ID_2, option.isMemoryDb));
844 }
845 
846 /**
847  * @tc.name: OpenSchemaDb 010
848  * @tc.desc: Verify that open new db conn must be the same as first time(schema) when the original db is schema db.
849  * @tc.type: FUNC
850  * @tc.require: SR000DR9JO
851  * @tc.author: fengxiaoyun
852  */
853 HWTEST_F(DistributeddbNbSchemaTest, OpenSchemaDb010, TestSize.Level1)
854 {
855     std::map<std::string, KvStoreNbDelegate *> delegateGroup;
856     KvStoreDelegateManager *manager = nullptr;
857     Option option = g_option;
858     option.isMemoryDb = false;
859     string validField = "{\"field0\":\"INTEGER,NOT NULL,DEFAULT 10\",\"field1\":[]}";
860     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_1, validField, VALID_INDEX_1);
861     delegateGroup["OriSchemaDB"] = nullptr;
862     delegateGroup["OriSchemaDB"] = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
863     ASSERT_TRUE(manager != nullptr && delegateGroup["OriSchemaDB"] != nullptr);
864     EXPECT_TRUE(manager->CloseKvStore(delegateGroup["OriSchemaDB"]) == OK);
865     delegateGroup["OriSchemaDB"] = nullptr;
866     delete manager;
867     manager = nullptr;
868 
869     /**
870      * @tc.steps: step1. get delegate1 with schema.
871      * @tc.expected: step1. get successfully.
872      */
873     option.createIfNecessary = false;
874     delegateGroup["OriSchemaDB"] = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
875     ASSERT_TRUE(manager != nullptr && delegateGroup["OriSchemaDB"] != nullptr);
876 
877     /**
878      * @tc.steps: step2.  get delegate2 without schema.
879      * @tc.expected: step2. get failed and return SCHEMA_MISMATCH.
880      */
881     delegateGroup["NormalDB"] = nullptr;
882     option.schema.clear();
883     DBStatus status;
884     delegateGroup["NormalDB"] = DistributedDBNbTestTools::GetNbDelegateStatus(manager, status,
885         g_dbParameter2, option);
886     EXPECT_EQ(delegateGroup["NormalDB"], nullptr);
887     EXPECT_EQ(status, SCHEMA_MISMATCH);
888 
889     /**
890      * @tc.steps: step3. get delegate3 with schema2.
891      * @tc.expected: step3. get failed and return SCHEMA_MISMATCH.
892      */
893     delegateGroup["DiffSchemaDB"] = nullptr;
894     option.schema.clear();
895     string validField1 = "{\"field0\":\"INTEGER,NOT NULL,DEFAULT 10\"}";
896     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_1, validField1, VALID_INDEX_1);
897     delegateGroup["DiffSchemaDB"] = DistributedDBNbTestTools::GetNbDelegateStatus(manager, status,
898         g_dbParameter2, option);
899     EXPECT_EQ(delegateGroup["DiffSchemaDB"], nullptr);
900     EXPECT_EQ(status, SCHEMA_MISMATCH);
901 
902     /**
903      * @tc.steps: step4. get delegate4 with schema.
904      * @tc.expected: step4.get successfully.
905      */
906     delegateGroup["SameSchemaDB"] = nullptr;
907     option.schema.clear();
908     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_1, validField, VALID_INDEX_1);
909     delegateGroup["SameSchemaDB"] = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
910     ASSERT_TRUE(manager != nullptr && delegateGroup["SameSchemaDB"] != nullptr);
911     // Close all opened delegate
912     EXPECT_TRUE(manager->CloseKvStore(delegateGroup["OriSchemaDB"]) == OK);
913     EXPECT_TRUE(manager->CloseKvStore(delegateGroup["SameSchemaDB"]) == OK);
914     delegateGroup.clear();
915 
916     /**
917      * @tc.steps: step5. get delegate5 without schema after close all delegates that were opened.
918      * @tc.expected: step4.get successfully.
919      */
920     delegateGroup["NormalDB"] = nullptr;
921     option.schema.clear();
922     delegateGroup["NormalDB"] = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
923     ASSERT_TRUE(manager != nullptr && delegateGroup["NormalDB"] != nullptr);
924     EXPECT_TRUE(EndCaseDeleteDB(manager, delegateGroup["NormalDB"], STORE_ID_2, option.isMemoryDb));
925 }
926 
927 /**
928  * @tc.name: SchemaPut 001
929  * @tc.desc: Verify that PUT value will return OK if the format is the same as define of schema.
930  * @tc.type: FUNC
931  * @tc.require: SR000DR9JO
932  * @tc.author: fengxiaoyun
933  */
934 HWTEST_F(DistributeddbNbSchemaTest, SchemaPut001, TestSize.Level0)
935 {
936     KvStoreNbDelegate *delegate = nullptr;
937     KvStoreDelegateManager *manager = nullptr;
938     Option option = g_option;
939     option.isMemoryDb = false;
940     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_1, VALID_DEFINE_1, VALID_INDEX_2);
941     delegate = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
942     ASSERT_TRUE(manager != nullptr && delegate != nullptr);
943 
944     /**
945      * @tc.steps: step1. put(k1,value1) that value1's format is the same as define of schema.
946      * @tc.expected: step1. put successfully.
947      */
948     string valueRes1;
949     valueRes1 = valueRes1 + "{" + VALUE_MATCH_1 + "," + VALUE_MATCH_2 + "}";
950     Value valueSchema1(valueRes1.begin(), valueRes1.end());
951     EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate, KEY_1, valueSchema1), OK);
952 
953     /**
954      * @tc.steps: step2. put(k2,value2) that value2's format is the same as define of schema except there exist an
955      *     repeat field in the same level.
956      * @tc.expected: step2. put successfully.
957      */
958     string valueRes2;
959     valueRes2 = valueRes2 + "{" + VALUE_MATCH_1 + "," + VALUE_MATCH_2 + "," + "\"field17\": 20000000" + "}";
960     Value valueSchema2(valueRes2.begin(), valueRes2.end());
961     EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate, KEY_2, valueSchema2), OK);
962 
963     /**
964      * @tc.steps: step3. put(k3,value3) that value3's format is the same as define of schema except the order of
965      *    fields in the same level is being upset.
966      * @tc.expected: step3. put successfully.
967      */
968     string valueRes3;
969     valueRes3 = valueRes3 + "{" + VALUE_MATCH_2 + "," + VALUE_MATCH_1 + "}";
970     Value valueSchema3(valueRes3.begin(), valueRes3.end());
971     EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate, KEY_3, valueSchema3), OK);
972 
973     /**
974      * @tc.steps: step4. Get(k1,k2,k3).
975      * @tc.expected: step4. Get(k1)=value1, Get(k2)=value2, Get(k3)=value3.
976      */
977     Value valueResult;
978     EXPECT_EQ(DistributedDBNbTestTools::Get(*delegate, KEY_1, valueResult), OK);
979     EXPECT_EQ(valueResult, valueSchema1);
980     EXPECT_EQ(DistributedDBNbTestTools::Get(*delegate, KEY_2, valueResult), OK);
981     EXPECT_EQ(valueResult, valueSchema2);
982     EXPECT_EQ(DistributedDBNbTestTools::Get(*delegate, KEY_3, valueResult), OK);
983     EXPECT_EQ(valueResult, valueSchema3);
984     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, option.isMemoryDb));
985 }
986 
987 /**
988  * @tc.name: SchemaPut 002
989  * @tc.desc: Verify that PUT value will return INVALID_VALUE_FIELDS if the format is different from define of schema
990  *     when SCHEMA_MODE = STRICT.
991  * @tc.type: FUNC
992  * @tc.require: SR000DR9JO
993  * @tc.author: fengxiaoyun
994  */
995 HWTEST_F(DistributeddbNbSchemaTest, SchemaPut002, TestSize.Level0)
996 {
997     KvStoreNbDelegate *delegate = nullptr;
998     KvStoreDelegateManager *manager = nullptr;
999     Option option = g_option;
1000     option.isMemoryDb = false;
1001     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_1, VALID_DEFINE_1, VALID_INDEX_1);
1002     delegate = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
1003     ASSERT_TRUE(manager != nullptr && delegate != nullptr);
1004 
1005     /**
1006      * @tc.steps: step1. put(k1,value1) that value1's field is less than define of schema.
1007      * @tc.expected: step1. put ok(less field no notnull).
1008      */
1009     string valueMatch = VALUE_MATCH_2;
1010     valueMatch.erase(valueMatch.size() - 9, 9); // erase 9 chars starting at 9 st last.
1011     string valueRes1;
1012     valueRes1 = valueRes1 + "{" + VALUE_MATCH_1 + "," + valueMatch + "}";
1013     Value valueSchema1(valueRes1.begin(), valueRes1.end());
1014     EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate, KEY_1, valueSchema1), OK);
1015 
1016     /**
1017      * @tc.steps: step2. put(k2,value2) that value2's field is more than define of schema.
1018      * @tc.expected: step2. put failed.
1019      */
1020     string valueRes2;
1021     valueRes2 = valueRes2 + "{" + VALUE_MATCH_1 + "," + VALUE_MATCH_2 + "," + "\"field19\": 20" + "}";
1022     Value valueSchema2(valueRes2.begin(), valueRes2.end());
1023     EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate, KEY_2, valueSchema2), INVALID_VALUE_FIELDS);
1024 
1025     /**
1026      * @tc.steps: step3. put(k3,value3) that there exist a field is not start with char or _ in value3.
1027      * @tc.expected: step3. put failed.
1028      */
1029     string valueRes3;
1030     valueRes3 = valueRes3 + "{" + VALUE_MATCH_1 + "," + VALUE_MATCH_2 + "," + "\"19field\": 20" + "}";
1031     Value valueSchema3(valueRes3.begin(), valueRes3.end());
1032     EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate, KEY_3, valueSchema3), INVALID_VALUE_FIELDS);
1033 
1034     /**
1035      * @tc.steps: step4. put(k4,value4) that there exist a field'level is upseted in value4.
1036      * @tc.expected: step4. put failed(less field notnull).
1037      */
1038     string valueRes = "\"_field1\":{\"field1\":\"abc\",\"field2\":null,\"field3\":{\"field6\":\"def\","
1039         "\"field5\":{\"field4\":\"fxy\",\"field7\":[]}}}";
1040     string valueRes4;
1041     valueRes4 = valueRes4 + "{" + valueRes + "," + VALUE_MATCH_2 + "}";
1042     Value valueSchema4(valueRes4.begin(), valueRes4.end());
1043     EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate, KEY_4, valueSchema4), CONSTRAIN_VIOLATION);
1044     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, option.isMemoryDb));
1045 }
1046 
PutAfterReplace(string & operateStr,const string findStr,const vector<string> replaceStr,KvStoreNbDelegate * & delegate)1047 bool PutAfterReplace(string &operateStr, const string findStr, const vector<string> replaceStr,
1048     KvStoreNbDelegate *&delegate)
1049 {
1050     if (findStr == "[]" || findStr == "{}") {
1051         string valueMatch = operateStr;
1052         if (valueMatch.find(findStr) == string::npos) {
1053             MST_LOG("Can't find findStr in operateStr!");
1054             return false;
1055         }
1056         valueMatch.insert(valueMatch.find(findStr) + 1, "\"field8\"\"error\"");
1057         string valueRes;
1058         if (operateStr == VALUE_MATCH_1) {
1059             valueRes = valueRes + "{" + valueMatch + "," + VALUE_MATCH_2 + "}";
1060         } else {
1061             valueRes = valueRes + "{" + VALUE_MATCH_1 + "," + valueMatch + "}";
1062         }
1063         Value valueSchema(valueRes.begin(), valueRes.end());
1064         MST_LOG("valueSchema is %s", valueRes.c_str());
1065         EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate, KEY_1, valueSchema), INVALID_FORMAT);
1066         return true;
1067     }
1068     for (const auto &iter : replaceStr) {
1069         string valueMatch = operateStr;
1070         if (valueMatch.find(findStr) == string::npos) {
1071             MST_LOG("Can't find findStr in operateStr!");
1072             return false;
1073         }
1074         valueMatch.replace(valueMatch.find(findStr), findStr.size(), iter);
1075         string valueRes;
1076         if (operateStr == VALUE_MATCH_1) {
1077             valueRes = valueRes + "{" + valueMatch + "," + VALUE_MATCH_2 + "}";
1078         } else {
1079             valueRes = valueRes + "{" + VALUE_MATCH_1 + "," + valueMatch + "}";
1080         }
1081         Value valueSchema(valueRes.begin(), valueRes.end());
1082         MST_LOG("valueSchema is %s", valueRes.c_str());
1083         if (iter == "null") {
1084             EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate, KEY_1, valueSchema), CONSTRAIN_VIOLATION);
1085         } else if (iter == "0X2B") {
1086             EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate, KEY_1, valueSchema), INVALID_FORMAT);
1087         } else {
1088             EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate, KEY_1, valueSchema), INVALID_FIELD_TYPE);
1089         }
1090     }
1091     return true;
1092 }
1093 /**
1094  * @tc.name: SchemaPut 003
1095  * @tc.desc: Verify that PUT value will return error if the field attributes are different with define of schema
1096  *     when SCHEMA_MODE = STRICT.
1097  * @tc.type: FUNC
1098  * @tc.require: SR000DR9JO
1099  * @tc.author: fengxiaoyun
1100  */
1101 HWTEST_F(DistributeddbNbSchemaTest, SchemaPut003, TestSize.Level0)
1102 {
1103     KvStoreNbDelegate *delegate = nullptr;
1104     KvStoreDelegateManager *manager = nullptr;
1105     Option option = g_option;
1106     option.isMemoryDb = false;
1107     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_1, VALID_DEFINE_1, VALID_INDEX_1);
1108     delegate = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
1109     ASSERT_TRUE(manager != nullptr && delegate != nullptr);
1110 
1111     /**
1112      * @tc.steps: step1-2. put(k1,value1) that value1's type or not_null is different with define of schema.
1113      * @tc.expected: step1-2. put failed.
1114      */
1115     // the define of schema's type is string
1116     string findStr1 = "\"abc\"";
1117     vector<string> replaceStr1 = {"123", "true", "false", "null"};
1118     EXPECT_TRUE(PutAfterReplace(VALUE_MATCH_1, findStr1, replaceStr1, delegate));
1119 
1120     // the define of schema's type is bool
1121     string findStr2 = "false";
1122     vector<string> replaceStr2 = {"\"false\"", "\"true\"", "null"};
1123     EXPECT_TRUE(PutAfterReplace(VALUE_MATCH_2, findStr2, replaceStr2, delegate));
1124 
1125     // the define of schema's type is INTEGER
1126     string findStr3 = "-1000000";
1127     vector<string> replaceStr3 = {"\"-1000000\"", "10.5", "-10.00001", std::to_string(INT32_MAX) + "1",
1128         std::to_string(INT32_MIN) + "1", "0X2B", "null"};
1129     EXPECT_TRUE(PutAfterReplace(VALUE_MATCH_2, findStr3, replaceStr3, delegate));
1130 
1131     // the define of schema's type is LONG
1132     string findStr4 = "666";
1133     vector<string> replaceStr4 = {"\"666\"", "10.5", "10.10", std::to_string(INT64_MAX) + "1",
1134         std::to_string(INT64_MIN) + "1", "0X2B", + "null"};
1135     EXPECT_TRUE(PutAfterReplace(VALUE_MATCH_2, findStr4, replaceStr4, delegate));
1136 
1137     // the define of schema's type is DOUBLE
1138     string findStr5 = "-1.05e-4";
1139     vector<string> replaceStr5 = {"\"-1.05e4\"", "1" + std::to_string(DBL_MAX),
1140         "-1" + std::to_string(DBL_MAX), "0X2B", "null"};
1141     EXPECT_TRUE(PutAfterReplace(VALUE_MATCH_2, findStr5, replaceStr5, delegate));
1142 
1143     /**
1144      * @tc.steps: step3. put(k2,value2) that value2 isn't Json format.
1145      * @tc.expected: step3. put failed.
1146      */
1147     string valueRes;
1148     valueRes = valueRes + "{" + VALUE_MATCH_1 + "," + VALUE_MATCH_2 + "," + "}";
1149     Value valueSchema(valueRes.begin(), valueRes.end());
1150     EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate, KEY_2, valueSchema), INVALID_FORMAT);
1151 
1152     /**
1153      * @tc.steps: step4. put(k3,value3) that value3's Json array or Json object isn't Json format.
1154      * @tc.expected: step4. put failed.
1155      */
1156     string findStr6 = "[]";
1157     vector<string> replaceStr6 = {""};
1158     EXPECT_TRUE(PutAfterReplace(VALUE_MATCH_1, findStr6, replaceStr6, delegate));
1159     string findStr7 = "{}";
1160     EXPECT_TRUE(PutAfterReplace(VALUE_MATCH_2, findStr7, replaceStr6, delegate));
1161     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, option.isMemoryDb));
1162 }
1163 
1164 /**
1165  * @tc.name: SchemaPut 004
1166  * @tc.desc: Verify that PUT value will return OK if the format is the same as define of schema with
1167  *     SCHEMA_MODE = COMPATIBLE.
1168  * @tc.type: FUNC
1169  * @tc.require: SR000DR9JO
1170  * @tc.author: fengxiaoyun
1171  */
1172 HWTEST_F(DistributeddbNbSchemaTest, SchemaPut004, TestSize.Level0)
1173 {
1174     KvStoreNbDelegate *delegate = nullptr;
1175     KvStoreDelegateManager *manager = nullptr;
1176     Option option = g_option;
1177     option.isMemoryDb = false;
1178     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_2, VALID_DEFINE_1, VALID_INDEX_2);
1179     delegate = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
1180     ASSERT_TRUE(manager != nullptr && delegate != nullptr);
1181 
1182     /**
1183      * @tc.steps: step1. put(k1,value1) that value1's format is the same as define of schema.
1184      * @tc.expected: step1. put successfully.
1185      */
1186     string valueRes1;
1187     valueRes1 = valueRes1 + "{" + VALUE_MATCH_1 + "," + VALUE_MATCH_2 + "}";
1188     Value valueSchema1(valueRes1.begin(), valueRes1.end());
1189     EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate, KEY_1, valueSchema1), OK);
1190 
1191     /**
1192      * @tc.steps: step2. put(k2,value2) that value2's format is the same as define of schema except there exist an
1193      *     repeat field in the same level.
1194      * @tc.expected: step2. put successfully.
1195      */
1196     string valueRes2;
1197     valueRes2 = valueRes2 + "{" + VALUE_MATCH_1 + "," + VALUE_MATCH_2 + "," + "\"field17\": 20000000" + "}";
1198     Value valueSchema2(valueRes2.begin(), valueRes2.end());
1199     EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate, KEY_2, valueSchema2), OK);
1200 
1201     /**
1202      * @tc.steps: step3. put(k3,value3) that value3's format is the same as define of schema except the order of
1203      *    fields in the same level is being upset.
1204      * @tc.expected: step3. put successfully.
1205      */
1206     string valueRes3;
1207     valueRes3 = valueRes3 + "{" + VALUE_MATCH_2 + "," + VALUE_MATCH_1 + "}";
1208     Value valueSchema3(valueRes3.begin(), valueRes3.end());
1209     EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate, KEY_3, valueSchema3), OK);
1210 
1211     /**
1212      * @tc.steps: step3. put(k4,value4) that value4's field is more than define of schema.
1213      * @tc.expected: step3. put successfully.
1214      */
1215     string valueRes4;
1216     valueRes4 = valueRes4 + "{" + VALUE_MATCH_2 + "," + VALUE_MATCH_1 + "," + "\"field20\": 2e7" + "}";
1217     Value valueSchema4(valueRes4.begin(), valueRes4.end());
1218     EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate, KEY_4, valueSchema4), OK);
1219 
1220     /**
1221      * @tc.steps: step4. Get(k1,k2,k3,k4).
1222      * @tc.expected: step4. Get(k1)=value1, Get(k2)=value2, Get(k3)=value3, Get(k4)=value4.
1223      */
1224     Value valueResult;
1225     EXPECT_EQ(DistributedDBNbTestTools::Get(*delegate, KEY_1, valueResult), OK);
1226     EXPECT_EQ(valueResult, valueSchema1);
1227     EXPECT_EQ(DistributedDBNbTestTools::Get(*delegate, KEY_2, valueResult), OK);
1228     EXPECT_EQ(valueResult, valueSchema2);
1229     EXPECT_EQ(DistributedDBNbTestTools::Get(*delegate, KEY_3, valueResult), OK);
1230     EXPECT_EQ(valueResult, valueSchema3);
1231     EXPECT_EQ(DistributedDBNbTestTools::Get(*delegate, KEY_4, valueResult), OK);
1232     EXPECT_EQ(valueResult, valueSchema4);
1233     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, option.isMemoryDb));
1234 }
1235 
1236 /**
1237  * @tc.name: SchemaPut 005
1238  * @tc.desc: Verify that PUT value will return error if the format is different from define of schema
1239  *     when SCHEMA_MODE = COMPATIBLE.
1240  * @tc.type: FUNC
1241  * @tc.require: SR000DR9JO
1242  * @tc.author: fengxiaoyun
1243  */
1244 HWTEST_F(DistributeddbNbSchemaTest, SchemaPut005, TestSize.Level0)
1245 {
1246     KvStoreNbDelegate *delegate = nullptr;
1247     KvStoreDelegateManager *manager = nullptr;
1248     Option option = g_option;
1249     option.isMemoryDb = false;
1250     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_2, VALID_DEFINE_1, VALID_INDEX_1);
1251     delegate = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
1252     ASSERT_TRUE(manager != nullptr && delegate != nullptr);
1253 
1254     /**
1255      * @tc.steps: step1. put(k1,value1) that value1's field is less than define of schema.
1256      * @tc.expected: step1. put ok(lack field no notnull).
1257      */
1258     string valueMatch = VALUE_MATCH_2;
1259     valueMatch.erase(valueMatch.size() - 9, 9); // erase 9 chars starting at 9 st last.
1260     string valueRes1;
1261     valueRes1 = valueRes1 + "{" + VALUE_MATCH_1 + "," + valueMatch + "}";
1262     Value valueSchema1(valueRes1.begin(), valueRes1.end());
1263     EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate, KEY_1, valueSchema1), OK);
1264 
1265     /**
1266      * @tc.steps: step2. put(k2,value2) that value2's field is more than define of schema.
1267      * @tc.expected: step2. put success.
1268      */
1269     string valueRes2;
1270     valueRes2 = valueRes2 + "{" + VALUE_MATCH_1 + "," + VALUE_MATCH_2 + "," + "\"19field\": 20" + "}";
1271     Value valueSchema2(valueRes2.begin(), valueRes2.end());
1272     EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate, KEY_2, valueSchema2), OK);
1273 
1274     /**
1275      * @tc.steps: step3. put(k3,value3) that there exist a field'level is upseted in value4.
1276      * @tc.expected: step3. put failed(lack field notnull).
1277      */
1278     string valueRes = "\"_field1\":{\"field1\":\"abc\",\"field2\":null,\"field3\":{\"field6\":\"def\","
1279     "\"field5\":{\"field4\":\"fxy\",\"field7\":[]}}}";
1280     string valueRes3;
1281     valueRes3 = valueRes3 + "{" + valueRes + "," + VALUE_MATCH_2 + "}";
1282     Value valueSchema3(valueRes3.begin(), valueRes3.end());
1283     EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate, KEY_3, valueSchema3), CONSTRAIN_VIOLATION);
1284 
1285     /**
1286      * @tc.steps: step4. put(k4,value4) that value4 isn't Json format.
1287      * @tc.expected: step4. put failed.
1288      */
1289     string valueRes4;
1290     valueRes4 = valueRes4 + "{" + VALUE_MATCH_1 + "," + VALUE_MATCH_2 + "," + "}";
1291     Value valueSchema4(valueRes4.begin(), valueRes4.end());
1292     EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate, KEY_4, valueSchema4), INVALID_FORMAT);
1293 
1294     /**
1295      * @tc.steps: step4. put(k5,value5) that value5's Json array or Json object isn't Json format.
1296      * @tc.expected: step4. put failed.
1297      */
1298     string findStr = "[]";
1299     vector<string> replaceStr = {""};
1300     PutAfterReplace(VALUE_MATCH_1, findStr, replaceStr, delegate);
1301     string findStr1 = "{}";
1302     PutAfterReplace(VALUE_MATCH_2, findStr1, replaceStr, delegate);
1303     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, option.isMemoryDb));
1304 }
1305 
1306 /**
1307  * @tc.name: SchemaPut 006
1308  * @tc.desc: Verify that PUT value will return error if the field attributes are different with define of schema
1309  *     when SCHEMA_MODE = COMPATIBLE.
1310  * @tc.type: FUNC
1311  * @tc.require: SR000DR9JO
1312  * @tc.author: fengxiaoyun
1313  */
1314 HWTEST_F(DistributeddbNbSchemaTest, SchemaPut006, TestSize.Level0)
1315 {
1316     KvStoreNbDelegate *delegate = nullptr;
1317     KvStoreDelegateManager *manager = nullptr;
1318     Option option = g_option;
1319     option.isMemoryDb = false;
1320     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_2, VALID_DEFINE_1, VALID_INDEX_1);
1321     delegate = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
1322     ASSERT_TRUE(manager != nullptr && delegate != nullptr);
1323 
1324     /**
1325      * @tc.steps: step1-2. put(k1,value1) that value1's type or not_null is different with define of schema.
1326      * @tc.expected: step1-2. put failed.
1327      */
1328     // the define of schema's type is string
1329     string findStr1 = "\"abc\"";
1330     vector<string> replaceStr1 = {"123", "true", "false", "null"};
1331     PutAfterReplace(VALUE_MATCH_1, findStr1, replaceStr1, delegate);
1332 
1333     // the define of schema's type is bool
1334     string findStr2 = "false";
1335     vector<string> replaceStr2 = {"\"false\"", "\"true\"", "null"};
1336     PutAfterReplace(VALUE_MATCH_2, findStr2, replaceStr2, delegate);
1337 
1338     // the define of schema's type is INTEGER
1339     string findStr3 = "-1000000";
1340     vector<string> replaceStr3 = {"\"-1000000\"", "10.5", "-10.00001", std::to_string(INT32_MAX) + "1",
1341         std::to_string(INT32_MIN) + "1", "0X2B", "null"};
1342     PutAfterReplace(VALUE_MATCH_2, findStr3, replaceStr3, delegate);
1343 
1344     // the define of schema's type is LONG
1345     string findStr4 = "666";
1346     vector<string> replaceStr4 = {"\"666\"", "10.5", "-10.10", std::to_string(INT64_MAX) + "1",
1347         std::to_string(INT64_MIN) + "1", "0X2B", "null"};
1348     PutAfterReplace(VALUE_MATCH_2, findStr4, replaceStr4, delegate);
1349 
1350     // the define of schema's type is DOUBLE
1351     string findStr5 = "-1.05e-4";
1352     vector<string> replaceStr5 = {"\"-1.05e4\"", "1" + std::to_string(DBL_MAX),
1353         "-1" + std::to_string(DBL_MAX), "0X2B", "null"};
1354     PutAfterReplace(VALUE_MATCH_2, findStr5, replaceStr5, delegate);
1355     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, option.isMemoryDb));
1356 }
1357 
1358 /**
1359  * @tc.name: SchemaPut 007
1360  * @tc.desc: Verify that if there are duplicate fields in schema, the latter will prevail when put.
1361  * @tc.type: FUNC
1362  * @tc.require: SR000DR9JO
1363  * @tc.author: fengxiaoyun
1364  */
1365 HWTEST_F(DistributeddbNbSchemaTest, SchemaPut007, TestSize.Level0)
1366 {
1367     KvStoreNbDelegate *delegate = nullptr;
1368     KvStoreDelegateManager *manager = nullptr;
1369     Option option = g_option;
1370     option.isMemoryDb = false;
1371     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_1, VALID_DEFINE_1, VALID_INDEX_2);
1372     delegate = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
1373     ASSERT_TRUE(manager != nullptr && delegate != nullptr);
1374 
1375     /**
1376      * @tc.steps: step1. put(k1,value1) that value1 transfer all the value that repeat field in the same level.
1377      * @tc.expected: step1. put failed.
1378      */
1379     string valueRes1;
1380     valueRes1 = valueRes1 + "{" + VALUE_MATCH_1 + "," + VALUE_MATCH_2 + ",\"field1\": \"false\"" + "}";
1381     Value valueSchema1(valueRes1.begin(), valueRes1.end());
1382     MST_LOG("valueRes1 is %s", valueRes1.c_str());
1383     EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate, KEY_1, valueSchema1), INVALID_FIELD_TYPE);
1384 
1385     /**
1386      * @tc.steps: step2.4. put(k2,value2) that value2's format is the same as define of schema.
1387      * @tc.expected: step2.4. put successfully.
1388      */
1389     string valueRes2;
1390     valueRes2 = valueRes2 + "{" + VALUE_MATCH_1 + "," + VALUE_MATCH_2 + "}";
1391     Value valueSchema2(valueRes2.begin(), valueRes2.end());
1392     MST_LOG("valueRes2 is %s", valueRes2.c_str());
1393     EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate, KEY_2, valueSchema2), OK);
1394 
1395     /**
1396      * @tc.steps: step3. put(k3,value3) that value3 transfer only one that repeat field in the different level.
1397      * @tc.expected: step3. put failed(field require not null but has default value).
1398      */
1399     string deleteStr = VALUE_MATCH_1;
1400     string findStr = "\"field1\":\"abc\",";
1401     deleteStr.erase(deleteStr.find(findStr), findStr.size());
1402     string valueRes3;
1403     valueRes3 = valueRes3 + "{" + deleteStr + "," + VALUE_MATCH_2 + "}";
1404     Value valueSchema3(valueRes3.begin(), valueRes3.end());
1405     EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate, KEY_3, valueSchema3), OK);
1406 
1407     /**
1408      * @tc.steps: step5. put(k4,value4) that value4's Json Array has large fields so that the total fields are
1409      *     over 256.
1410      * @tc.expected: step5. put successfully.
1411      */
1412     LongDefine param;
1413     param.recordNum = TWO_FIVE_SIX_RECORDS;
1414     param.recordSize = RECORDSIZE;
1415     param.prefix = 'k';
1416     string longField;
1417     GetLongSchemaDefine(param, longField);
1418     string valueMatch = VALUE_MATCH_1;
1419     valueMatch.insert(valueMatch.find("[]") + 1, longField);
1420     string valueRes4;
1421     valueRes4 = valueRes4 + "{" + valueMatch + "," + VALUE_MATCH_2 + "}";
1422     Value valueSchema4(valueRes4.begin(), valueRes4.end());
1423     EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate, KEY_4, valueSchema4), OK);
1424 
1425     /**
1426      * @tc.steps: step6. put(k5,value5) that value5's Json Object has large fields so that the total fields are
1427      *     over 256.
1428      * @tc.expected: step6. put successfully.
1429      */
1430     string valueMatch2 = VALUE_MATCH_2;
1431     longField.erase(0, 1);
1432     longField.erase(longField.size() - 1, 1);
1433     valueMatch2.insert(valueMatch2.find("{}") + 1, longField);
1434     string valueRes5;
1435     valueRes5 = valueRes5 + "{" + VALUE_MATCH_1 + "," + valueMatch2 + "}";
1436     Value valueSchema5(valueRes5.begin(), valueRes5.end());
1437     EXPECT_EQ(DistributedDBNbTestTools::Put(*delegate, KEY_5, valueSchema5), OK);
1438     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, option.isMemoryDb));
1439 }
1440 
1441 /**
1442  * @tc.name: SchemaIndex 001
1443  * @tc.desc: Verify that the schema db created with non-index mode can be upgrade to index mode when open it again with
1444  *    schema that include schema_index.
1445  * @tc.type: FUNC
1446  * @tc.require: SR000DR9JQ
1447  * @tc.author: fengxiaoyun
1448  */
1449 HWTEST_F(DistributeddbNbSchemaTest, SchemaIndex001, TestSize.Level1)
1450 {
1451     /**
1452      * @tc.steps: step1. create schema db that without schema_index and close but don't delete it.
1453      * @tc.expected: step1. operate successfully.
1454      */
1455     KvStoreNbDelegate *delegate = nullptr;
1456     KvStoreDelegateManager *manager = nullptr;
1457     Option option = g_option;
1458     option.isMemoryDb = false;
1459     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_2, VALID_DEFINE_1);
1460     delegate = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
1461     ASSERT_TRUE(manager != nullptr && delegate != nullptr);
1462     EXPECT_EQ(manager->CloseKvStore(delegate), OK);
1463     delegate = nullptr;
1464 
1465     /**
1466      * @tc.steps: step2. open the db again with schema_index mode, and the schema_index is
1467      *    [$.field9,$.field10.field10,$._field1.field3.field4,$._field1.field3.field5.field6].
1468      * @tc.expected: step2. open successfully.
1469      */
1470     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_2, VALID_DEFINE_1, VALID_INDEX_4);
1471     option.createIfNecessary = false;
1472     delegate = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
1473     ASSERT_TRUE(manager != nullptr && delegate != nullptr);
1474 
1475     /**
1476      * @tc.steps: step3. check is the schema_index exist.
1477      * @tc.expected: step3. can find 4 schema_indexs in table.
1478      */
1479     EXPECT_TRUE(DistributedDBSchemaTestTools::SchemaIndexQuery(g_dbParameter2,
1480         DistributedDBConstant::NB_DIRECTOR, "$.field9"));
1481     EXPECT_TRUE(DistributedDBSchemaTestTools::SchemaIndexQuery(g_dbParameter2,
1482         DistributedDBConstant::NB_DIRECTOR, "$.field10.field10"));
1483     EXPECT_TRUE(DistributedDBSchemaTestTools::SchemaIndexQuery(g_dbParameter2,
1484         DistributedDBConstant::NB_DIRECTOR, "$._field1.field3.field4"));
1485     EXPECT_TRUE(DistributedDBSchemaTestTools::SchemaIndexQuery(
1486         g_dbParameter2, DistributedDBConstant::NB_DIRECTOR, "$._field1.field3.field5.field6"));
1487 
1488     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, option.isMemoryDb));
1489 }
1490 
1491 /**
1492  * @tc.name: SchemaIndex 002
1493  * @tc.desc: Verify that if the schema db created with index mode, then it can be degrade to non-index mode db
1494  *    when open it again with schema that do not include schema_index.
1495  * @tc.type: FUNC
1496  * @tc.require: SR000DR9JQ
1497  * @tc.author: fengxiaoyun
1498  */
1499 HWTEST_F(DistributeddbNbSchemaTest, SchemaIndex002, TestSize.Level1)
1500 {
1501     /**
1502      * @tc.steps: step1. create schema db that with schema_index.
1503      * @tc.expected: step1. create successfully.
1504      */
1505     KvStoreNbDelegate *delegate = nullptr;
1506     KvStoreDelegateManager *manager = nullptr;
1507     Option option = g_option;
1508     option.isMemoryDb = false;
1509     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_2, VALID_DEFINE_1, VALID_INDEX_4);
1510     delegate = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
1511     ASSERT_TRUE(manager != nullptr && delegate != nullptr);
1512     /**
1513      * @tc.steps: step2. check is the schema_index exist.
1514      * @tc.expected: step2. can find 4 schema_indexs in table.
1515      */
1516     EXPECT_TRUE(DistributedDBSchemaTestTools::SchemaIndexQuery(g_dbParameter2,
1517         DistributedDBConstant::NB_DIRECTOR, "$.field9"));
1518     EXPECT_TRUE(DistributedDBSchemaTestTools::SchemaIndexQuery(g_dbParameter2,
1519         DistributedDBConstant::NB_DIRECTOR, "$.field10.field10"));
1520     EXPECT_TRUE(DistributedDBSchemaTestTools::SchemaIndexQuery(g_dbParameter2,
1521         DistributedDBConstant::NB_DIRECTOR, "$._field1.field3.field4"));
1522     EXPECT_TRUE(DistributedDBSchemaTestTools::SchemaIndexQuery(
1523         g_dbParameter2, DistributedDBConstant::NB_DIRECTOR, "$._field1.field3.field5.field6"));
1524     EXPECT_EQ(manager->CloseKvStore(delegate), OK);
1525     delegate = nullptr;
1526 
1527     /**
1528      * @tc.steps: step3. open the db again with non_index mode.
1529      * @tc.expected: step3. open successfully.
1530      */
1531     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_2, VALID_DEFINE_1);
1532     option.createIfNecessary = false;
1533     delegate = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
1534     ASSERT_TRUE(manager != nullptr && delegate != nullptr);
1535     /**
1536      * @tc.steps: step4. check is the schema_index exist.
1537      * @tc.expected: step4. can't find the schema_index in table.
1538      */
1539     EXPECT_FALSE(DistributedDBSchemaTestTools::SchemaIndexQuery(g_dbParameter2,
1540         DistributedDBConstant::NB_DIRECTOR, "$.field9"));
1541     EXPECT_FALSE(DistributedDBSchemaTestTools::SchemaIndexQuery(g_dbParameter2,
1542         DistributedDBConstant::NB_DIRECTOR, "$.field10.field10"));
1543     EXPECT_FALSE(DistributedDBSchemaTestTools::SchemaIndexQuery(g_dbParameter2,
1544         DistributedDBConstant::NB_DIRECTOR, "$._field1.field3.field4"));
1545     EXPECT_FALSE(DistributedDBSchemaTestTools::SchemaIndexQuery(
1546         g_dbParameter2, DistributedDBConstant::NB_DIRECTOR, "$._field1.field3.field5.field6"));
1547 
1548     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, option.isMemoryDb));
1549 }
1550 
CloseKvStoreTemp(KvStoreDelegateManager * & manager,KvStoreNbDelegate * & delegate)1551 void CloseKvStoreTemp(KvStoreDelegateManager *&manager, KvStoreNbDelegate *&delegate)
1552 {
1553     EXPECT_EQ(manager->CloseKvStore(delegate), OK);
1554     delegate = nullptr;
1555     delete manager;
1556     manager = nullptr;
1557 }
1558 /**
1559  * @tc.name: SchemaIndex 003
1560  * @tc.desc: Verify that whether the schema db has schema_index depended on is the first delegate has schema_index
1561  * @tc.type: FUNC
1562  * @tc.require: SR000DR9JQ
1563  * @tc.author: fengxiaoyun
1564  */
1565 HWTEST_F(DistributeddbNbSchemaTest, SchemaIndex003, TestSize.Level1)
1566 {
1567     /**
1568      * @tc.steps: step1. create schema db that without schema_index and close it but do not delete it.
1569      * @tc.expected: step1. create and close successfully.
1570      */
1571     KvStoreNbDelegate *delegate = nullptr;
1572     KvStoreDelegateManager *manager = nullptr;
1573     Option option = g_option;
1574     option.isMemoryDb = false;
1575     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_2, VALID_DEFINE_1);
1576     delegate = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
1577     ASSERT_TRUE(manager != nullptr && delegate != nullptr);
1578     EXPECT_EQ(manager->CloseKvStore(delegate), OK);
1579     delegate = nullptr;
1580 
1581     /**
1582      * @tc.steps: step2. open the db again with index mode, the schema_index is VALID_INDEX_4.
1583      * @tc.expected: step2. open successfully.
1584      */
1585     KvStoreNbDelegate *delegate1 = nullptr;
1586     KvStoreDelegateManager *manager1 = nullptr;
1587     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_2, VALID_DEFINE_1, VALID_INDEX_4);
1588     option.createIfNecessary = false;
1589     delegate1 = DistributedDBNbTestTools::GetNbDelegateSuccess(manager1, g_dbParameter2, option);
1590     ASSERT_TRUE(manager1 != nullptr && delegate1 != nullptr);
1591 
1592     /**
1593      * @tc.steps: step3. open the db again with non-index mode.
1594      * @tc.expected: step3. open failed and return SCHEMA_MISMATCH.
1595      */
1596     KvStoreNbDelegate *delegate2 = nullptr;
1597     KvStoreDelegateManager *manager2 = nullptr;
1598     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_2, VALID_DEFINE_1);
1599     DBStatus status;
1600     delegate2 = DistributedDBNbTestTools::GetNbDelegateStatus(manager2, status, g_dbParameter2, option);
1601     ASSERT_EQ(delegate2, nullptr);
1602     EXPECT_EQ(status, SCHEMA_MISMATCH);
1603 
1604     /**
1605      * @tc.steps: step4. open the db again using index mode with the index that is different from the index which used
1606      *    by the first delegate.
1607      * @tc.expected: step4. open failed and return SCHEMA_MISMATCH.
1608      */
1609     KvStoreNbDelegate *delegate3 = nullptr;
1610     KvStoreDelegateManager *manager3 = nullptr;
1611     std::string validIndexTemp = "[\"$.field9\", \"$._field1.field3.field5.field6\"]";
1612     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_2, VALID_DEFINE_1, validIndexTemp);
1613     delegate3 = DistributedDBNbTestTools::GetNbDelegateStatus(manager3, status, g_dbParameter2, option);
1614     ASSERT_EQ(delegate3, nullptr);
1615     EXPECT_EQ(status, SCHEMA_MISMATCH);
1616 
1617     /**
1618      * @tc.steps: step5. open the db again using index mode with the index that is used by the first delegate.
1619      * @tc.expected: step5. open successfully.
1620      */
1621     KvStoreNbDelegate *delegate4 = nullptr;
1622     KvStoreDelegateManager *manager4 = nullptr;
1623     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_2, VALID_DEFINE_1, VALID_INDEX_4);
1624     delegate4 = DistributedDBNbTestTools::GetNbDelegateStatus(manager4, status, g_dbParameter2, option);
1625     ASSERT_NE(delegate4, nullptr);
1626     EXPECT_EQ(status, OK);
1627 
1628     CloseKvStoreTemp(manager1, delegate1);
1629     CloseKvStoreTemp(manager4, delegate4);
1630     EXPECT_EQ(manager->DeleteKvStore(STORE_ID_2), OK);
1631     delete manager;
1632     manager = nullptr;
1633 }
1634 
1635 /**
1636  * @tc.name: SchemaIndex 004
1637  * @tc.desc: Verify that if open the schema db has schema_index circularly using wrong schema index and non-index will
1638  *    remove the valid index
1639  * @tc.type: FUNC
1640  * @tc.require: SR000DR9JQ
1641  * @tc.author: fengxiaoyun
1642  */
1643 HWTEST_F(DistributeddbNbSchemaTest, SchemaIndex004, TestSize.Level2)
1644 {
1645     /**
1646      * @tc.steps: step1. create schema db that with schema_index and close it but do not delete it.
1647      * @tc.expected: step1. create and close successfully.
1648      */
1649     KvStoreNbDelegate *delegate = nullptr;
1650     KvStoreDelegateManager *manager = nullptr;
1651     Option option = g_option;
1652     option.isMemoryDb = false;
1653     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_2, VALID_DEFINE_1, VALID_INDEX_4);
1654     delegate = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
1655     ASSERT_TRUE(manager != nullptr && delegate != nullptr);
1656     EXPECT_EQ(manager->CloseKvStore(delegate), OK);
1657     delegate = nullptr;
1658 
1659     /**
1660      * @tc.steps: step2. check is the schema_index exist.
1661      * @tc.expected: step2. can find 4 schema_indexs in table.
1662      */
1663     EXPECT_TRUE(DistributedDBSchemaTestTools::SchemaIndexQuery(g_dbParameter2,
1664         DistributedDBConstant::NB_DIRECTOR, "$.field9"));
1665     EXPECT_TRUE(DistributedDBSchemaTestTools::SchemaIndexQuery(g_dbParameter2,
1666         DistributedDBConstant::NB_DIRECTOR, "$.field10.field10"));
1667     EXPECT_TRUE(DistributedDBSchemaTestTools::SchemaIndexQuery(g_dbParameter2,
1668         DistributedDBConstant::NB_DIRECTOR, "$._field1.field3.field4"));
1669     EXPECT_TRUE(DistributedDBSchemaTestTools::SchemaIndexQuery(
1670         g_dbParameter2, DistributedDBConstant::NB_DIRECTOR, "$._field1.field3.field5.field6"));
1671 
1672     /**
1673      * @tc.steps: step3. open the db with the different index and non-index circularly.
1674      * @tc.expected: step3. open success.
1675      */
1676     std::string validIndexTemp = "[\"$.field9\", \"$._field1.field3.field5.field6\"]";
1677     KvStoreNbDelegate *delegate1 = nullptr;
1678     KvStoreDelegateManager *manager1 = nullptr;
1679     option.createIfNecessary = false;
1680     for (int index =0; index < HUNDRED_TIMES; index++) {
1681         option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_2, VALID_DEFINE_1, validIndexTemp);
1682         delegate1 = DistributedDBNbTestTools::GetNbDelegateSuccess(manager1, g_dbParameter2, option);
1683         ASSERT_TRUE(manager1 != nullptr && delegate1 != nullptr);
1684         CloseKvStoreTemp(manager1, delegate1);
1685 
1686         option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_2, VALID_DEFINE_1, VALID_INDEX_1);
1687         delegate1 = DistributedDBNbTestTools::GetNbDelegateSuccess(manager1, g_dbParameter2, option);
1688         ASSERT_TRUE(manager1 != nullptr && delegate1 != nullptr);
1689         CloseKvStoreTemp(manager1, delegate1);
1690     }
1691 
1692     /**
1693      * @tc.steps: step4. check is the schema_index exist.
1694      * @tc.expected: step4. can't find the schema_index in table.
1695      */
1696     EXPECT_FALSE(DistributedDBSchemaTestTools::SchemaIndexQuery(g_dbParameter2,
1697         DistributedDBConstant::NB_DIRECTOR, "$.field9"));
1698     EXPECT_FALSE(DistributedDBSchemaTestTools::SchemaIndexQuery(g_dbParameter2,
1699         DistributedDBConstant::NB_DIRECTOR, "$.field10.field10"));
1700     EXPECT_FALSE(DistributedDBSchemaTestTools::SchemaIndexQuery(g_dbParameter2,
1701         DistributedDBConstant::NB_DIRECTOR, "$._field1.field3.field4"));
1702     EXPECT_FALSE(DistributedDBSchemaTestTools::SchemaIndexQuery(
1703         g_dbParameter2, DistributedDBConstant::NB_DIRECTOR, "$._field1.field3.field5.field6"));
1704 
1705     EXPECT_EQ(manager->DeleteKvStore(STORE_ID_2), OK);
1706     delete manager;
1707     manager = nullptr;
1708 }
1709 
RandIndex(bool isFirst)1710 void RandIndex(bool isFirst)
1711 {
1712     std::string validIndexTemp;
1713     if (isFirst) {
1714         validIndexTemp = validIndexTemp + "[\"$.field9\", \"$._field1.field3.field4\"]";
1715     } else {
1716         validIndexTemp = validIndexTemp + "[\"$.field9\", \"$._field1.field3.field5.field6\"]";
1717     }
1718     std::string validIndexTemp2 = "[\"$.field9\"]";
1719     vector<std::string> indexes = {validIndexTemp, validIndexTemp2};
1720     int randSubscript = GetRandInt(0, 1);
1721 
1722     KvStoreNbDelegate *delegate = nullptr;
1723     KvStoreDelegateManager *manager = nullptr;
1724     Option option = g_option;
1725     option.isMemoryDb = false;
1726     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_2, VALID_DEFINE_1, indexes[randSubscript]);
1727     delegate = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
1728     if (delegate != nullptr) {
1729         EXPECT_EQ(manager->CloseKvStore(delegate), OK);
1730         delegate = nullptr;
1731     }
1732     delete manager;
1733     manager = nullptr;
1734 }
1735 
1736 /**
1737  * @tc.name: SchemaIndex 005
1738  * @tc.desc: Verify that Concurrency operate index won't cause the process to crash
1739  * @tc.type: FUNC
1740  * @tc.require: SR000DR9JQ
1741  * @tc.author: fengxiaoyun
1742  */
1743 HWTEST_F(DistributeddbNbSchemaTest, SchemaIndex005, TestSize.Level1)
1744 {
1745     /**
1746      * @tc.steps: step1. create schema db that with index $.field9 and close it but do not delete it.
1747      * @tc.expected: step1. create and close successfully.
1748      */
1749     KvStoreNbDelegate *delegate = nullptr;
1750     KvStoreDelegateManager *manager = nullptr;
1751     Option option = g_option;
1752     option.isMemoryDb = false;
1753     std::string validIndexTemp = "[\"$.field9\"]";
1754     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_2, VALID_DEFINE_1, validIndexTemp);
1755     delegate = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
1756     ASSERT_TRUE(manager != nullptr && delegate != nullptr);
1757     EXPECT_EQ(manager->CloseKvStore(delegate), OK);
1758     delegate = nullptr;
1759 
1760     /**
1761      * @tc.steps: step2. check is the schema_index exist.
1762      * @tc.expected: step2. can find 1 schema_index in table.
1763      */
1764     EXPECT_TRUE(DistributedDBSchemaTestTools::SchemaIndexQuery(g_dbParameter2,
1765         DistributedDBConstant::NB_DIRECTOR, "$.field9"));
1766 
1767     /**
1768      * @tc.steps: step3. start 5 threads to increase or decrease index field, 3 of which randly increase or decrease
1769      *    [$._field1.field3.field4] and the rest of them increase or decrease [$._field1.field3.field5.field6] randly.
1770      * @tc.expected: step3. the program runs normally.
1771      */
1772     vector<thread> threads;
1773     threads.push_back(std::thread(RandIndex, true));
1774     threads.push_back(std::thread(RandIndex, true));
1775     threads.push_back(std::thread(RandIndex, true));
1776     threads.push_back(std::thread(RandIndex, false));
1777     threads.push_back(std::thread(RandIndex, false));
1778 
1779     for (auto &th : threads) {
1780         th.join();
1781     }
1782 
1783     /**
1784      * @tc.steps: step4. check is the schema_index exist.
1785      * @tc.expected: step4. can find the index $.field9 in table.
1786      */
1787     EXPECT_TRUE(DistributedDBSchemaTestTools::SchemaIndexQuery(g_dbParameter2,
1788         DistributedDBConstant::NB_DIRECTOR, "$.field9"));
1789 
1790     EXPECT_EQ(manager->DeleteKvStore(STORE_ID_2), OK);
1791     delete manager;
1792     manager = nullptr;
1793 }
1794 
1795 /**
1796  * @tc.name: SkipTest 001
1797  * @tc.desc: Verify that SCHEMA_SKIPSIZE must be integer in range [0, 4M-2] or it will return INVALID_SCHEMA
1798  * @tc.type: FUNC
1799  * @tc.require: SR000DR9JQ
1800  * @tc.author: fengxiaoyun
1801  */
1802 HWTEST_F(DistributeddbNbSchemaTest, SkipTest001, TestSize.Level1)
1803 {
1804     /**
1805      * @tc.steps: step1. create schema db that with invalid skip size "10.5", "true", "*&", "汉字", "-10", "4194305".
1806      * @tc.expected: step1. create failed and return INVALID_SCHEMA.
1807      */
1808     KvStoreNbDelegate *delegate = nullptr;
1809     KvStoreDelegateManager *manager = nullptr;
1810     Option option = g_option;
1811     option.isMemoryDb = false;
1812     DBStatus status;
1813     vector<std::string> skipSize = {"10.5", "\"20\"", "true", "-10", "*&", "汉字", "4194303", "4194304"};
1814     for (unsigned long index = 0; index < skipSize.size(); index++) {
1815         option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_2, VALID_DEFINE_1, VALID_INDEX_1, skipSize[index]);
1816         delegate = DistributedDBNbTestTools::GetNbDelegateStatus(manager, status, g_dbParameter2, option);
1817         EXPECT_EQ(delegate, nullptr);
1818         EXPECT_EQ(status, INVALID_SCHEMA);
1819     }
1820 
1821     /**
1822      * @tc.steps: step2. create schema db that with invalid skip size "10.0", "1.23e2", "4194303", "4194304".
1823      * @tc.expected: step2. create failed and return INVALID_SCHEMA.
1824      */
1825     skipSize.clear();
1826     skipSize = {"0", "10", "123", "4194302"};
1827     for (unsigned long index = 0; index < skipSize.size(); index++) {
1828         option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_2, VALID_DEFINE_1, VALID_INDEX_1, skipSize[index]);
1829         delegate = DistributedDBNbTestTools::GetNbDelegateStatus(manager, status, g_dbParameter2, option);
1830         EXPECT_NE(delegate, nullptr);
1831         EXPECT_EQ(status, OK);
1832         EXPECT_EQ(manager->CloseKvStore(delegate), OK);
1833         delegate = nullptr;
1834         EXPECT_EQ(manager->DeleteKvStore(STORE_ID_2), OK);
1835         delete manager;
1836         manager = nullptr;
1837     }
1838 }
1839 
1840 /**
1841  * @tc.name: SkipTest 002
1842  * @tc.desc: Verify that the value must be with prefix whose size is SCHEMA_SKIPSIZE or it will put failed.
1843  * @tc.type: FUNC
1844  * @tc.require: SR000DR9JQ
1845  * @tc.author: fengxiaoyun
1846  */
1847 HWTEST_F(DistributeddbNbSchemaTest, SkipTest002, TestSize.Level0)
1848 {
1849     /**
1850      * @tc.steps: step1. create schema db that with valid skip size "16".
1851      * @tc.expected: step1. create success.
1852      */
1853     KvStoreNbDelegate *delegate = nullptr;
1854     KvStoreDelegateManager *manager = nullptr;
1855     Option option = g_option;
1856     option.isMemoryDb = false;
1857     DBStatus status;
1858     std::string skipSize = "16";
1859     const std::string validDefine = "{\"field1\":\"STRING,NOT NULL,DEFAULT 'fxy'\"}";
1860     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_2, validDefine, VALID_INDEX_1, skipSize);
1861     delegate = DistributedDBNbTestTools::GetNbDelegateStatus(manager, status, g_dbParameter2, option);
1862     EXPECT_NE(delegate, nullptr);
1863     EXPECT_EQ(status, OK);
1864 
1865     /**
1866      * @tc.steps: step2. put (k1, v1) to db, v1.size() < 16, put (k2, v2) to db, v2.size() > 16 but has no prefix.
1867      * @tc.expected: step2. put failed.
1868      */
1869     std::string schemaValue = "{\"field1\":\"fxy\"}";
1870 
1871     Value value1;
1872     value1.assign(15, 'a'); // 15 bytes char, which is shorter than 16
1873     std::string schemaValueMiddle = "aa{\"field1\":\"fxy\"}";
1874     Value value2(schemaValueMiddle.begin(), schemaValueMiddle.end());
1875     EXPECT_EQ(delegate->Put(KEY_1, value1), INVALID_FORMAT);
1876     EXPECT_EQ(delegate->Put(KEY_2, value2), INVALID_FORMAT);
1877     /**
1878      * @tc.steps: step3. put 3 valid records which has the same schema define.
1879      * @tc.expected: step3. create failed and return INVALID_SCHEMA.
1880      */
1881     string validPre1 = "abbbbabbbbabbbbb";
1882     string validPre2 = "abbbbabbbbabbbbc";
1883     string validPre3 = "abbbbabbbbabbbbd";
1884 
1885     std::string defineValue1 = validPre1 + schemaValue;
1886     std::string defineValue2 = validPre2 + schemaValue;
1887     std::string defineValue3 = validPre3 + schemaValue;
1888     Value value4(defineValue1.begin(), defineValue1.end());
1889     Value value5(defineValue2.begin(), defineValue2.end());
1890     Value value6(defineValue3.begin(), defineValue3.end());
1891     EXPECT_EQ(delegate->Put(KEY_4, value4), OK);
1892     EXPECT_EQ(delegate->Put(KEY_5, value5), OK);
1893     EXPECT_EQ(delegate->Put(KEY_6, value6), OK);
1894 
1895     /**
1896      * @tc.steps: step4. query the result in the db on field = "fxy".
1897      * @tc.expected: step4. can find 3 records in the db.
1898      */
1899     vector<Entry> entries;
1900     Query query = Query::Select().EqualTo("$.field1", "fxy");
1901     EXPECT_EQ(delegate->GetEntries(query, entries), OK);
1902     EXPECT_EQ(entries.size(), static_cast<unsigned long>(3)); // 3 record
1903 
1904     /**
1905      * @tc.steps: step5. delete k3, and query the result in the db on field = "fxy".
1906      * @tc.expected: step5. can find 2 records in the db.
1907      */
1908     EXPECT_EQ(delegate->Delete(KEY_6), OK);
1909     query = Query::Select().EqualTo("$.field1", "fxy");
1910     EXPECT_EQ(delegate->GetEntries(query, entries), OK);
1911     vector<Entry> entriesExpect = {{KEY_4, value4}, {KEY_5, value5}};
1912     EXPECT_TRUE(CompareEntriesVector(entries, entriesExpect));
1913 
1914     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, option.isMemoryDb));
1915 }
1916 
1917 /**
1918  * @tc.name: SkipTest 003
1919  * @tc.desc: Verify that when the field in pre-SCHEMA_SKIPSIZE, it will be ignored.
1920  * @tc.type: FUNC
1921  * @tc.require: SR000DR9JQ
1922  * @tc.author: fengxiaoyun
1923  */
1924 HWTEST_F(DistributeddbNbSchemaTest, SkipTest003, TestSize.Level0)
1925 {
1926     /**
1927      * @tc.steps: step1. create schema db that with valid skip size "16".
1928      * @tc.expected: step1. create success.
1929      */
1930     KvStoreNbDelegate *delegate = nullptr;
1931     KvStoreDelegateManager *manager = nullptr;
1932     Option option = g_option;
1933     option.isMemoryDb = false;
1934     DBStatus status;
1935     std::string skipSize = "16";
1936     const std::string validDefine = "{\"field1\":\"STRING,NOT NULL,DEFAULT 'fxy'\"}";
1937     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_2, validDefine, VALID_INDEX_1, skipSize);
1938     delegate = DistributedDBNbTestTools::GetNbDelegateStatus(manager, status, g_dbParameter2, option);
1939     EXPECT_NE(delegate, nullptr);
1940     EXPECT_EQ(status, OK);
1941 
1942     /**
1943      * @tc.steps: step2. put (k1, v1) to db, which has field2 in the prefix char only.
1944      * @tc.expected: step2. put successfully.
1945      */
1946     string validPre1 = "{\"field1\":\"abc\"}{\"field1\":\"fxy\"}";
1947     string validPre2 = "{\"field1\":\"abc\"}{\"field1\":\"fxy\", \"field2\": \"abc\"}";
1948 
1949     Value value1(validPre1.begin(), validPre1.end());
1950     Value value2(validPre2.begin(), validPre2.end());
1951     EXPECT_EQ(delegate->Put(KEY_1, value1), OK);
1952 
1953     /**
1954      * @tc.steps: step3. query the result in the db on field2 = "fxy".
1955      * @tc.expected: step3. can't find records in the db.
1956      */
1957     vector<Entry> entries;
1958     Query query = Query::Select().EqualTo("$.field1", "abc");
1959     EXPECT_EQ(delegate->GetEntries(query, entries), NOT_FOUND);
1960 
1961     /**
1962      * @tc.steps: step4. put (k2, v2) to db and query the records in db on field2 = "fxy".
1963      * @tc.expected: step4. can find one record in the db.
1964      */
1965     EXPECT_EQ(delegate->Put(KEY_2, value2), OK);
1966     query = Query::Select().EqualTo("$.field1", "fxy");
1967     EXPECT_EQ(delegate->GetEntries(query, entries), OK);
1968     vector<Entry> entriesExpect = {{KEY_1, value1}, {KEY_2, value2}};
1969     EXPECT_TRUE(CompareEntriesVector(entries, entriesExpect));
1970 
1971     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, option.isMemoryDb));
1972 }
1973 
1974 /**
1975  * @tc.name: SkipTest 004
1976  * @tc.desc: Verify that when open the db that has a valid schema-size with a schema-size that not equal to define,
1977  *    or without schema-size, it will open failed and return SCHEMA_MISMATCH
1978  * @tc.type: FUNC
1979  * @tc.require: SR000DR9JQ
1980  * @tc.author: fengxiaoyun
1981  */
1982 HWTEST_F(DistributeddbNbSchemaTest, SkipTest004, TestSize.Level1)
1983 {
1984     /**
1985      * @tc.steps: step1. create schema db that with valid skip size "16".
1986      * @tc.expected: step1. create success.
1987      */
1988     map<string, KvStoreNbDelegate *> delegate;
1989     map<string, KvStoreDelegateManager *> manager;
1990     Option option = g_option;
1991     option.isMemoryDb = false;
1992     DBStatus status;
1993     std::string skipSize = "16";
1994     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_2, VALID_DEFINE_1, VALID_INDEX_1, skipSize);
1995     delegate["ValidSkip"] = DistributedDBNbTestTools::GetNbDelegateStatus(manager["ValidSkip"],
1996         status, g_dbParameter2, option);
1997     EXPECT_NE(delegate["ValidSkip"], nullptr);
1998     EXPECT_EQ(status, OK);
1999     EXPECT_EQ(manager["ValidSkip"]->CloseKvStore(delegate["ValidSkip"]), OK);
2000     delegate["ValidSkip"] = nullptr;
2001     delete manager["ValidSkip"];
2002     manager["ValidSkip"] = nullptr;
2003 
2004     /**
2005      * @tc.steps: step2. open the db that without SCHEMA_SIZE.
2006      * @tc.expected: step2. open failed and return SCHEMA_MISMATCH.
2007      */
2008     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_2, VALID_DEFINE_1, VALID_INDEX_1);
2009     delegate["NoSkip"] = DistributedDBNbTestTools::GetNbDelegateStatus(manager["NoSkip"],
2010         status, g_dbParameter2, option);
2011     EXPECT_EQ(delegate["NoSkip"], nullptr);
2012     EXPECT_EQ(status, SCHEMA_MISMATCH);
2013     /**
2014      * @tc.steps: step3. open the db again with the SCHEMA_SIZE that larger or smaller than skipSize.
2015      * @tc.expected: step3. open failed and return SCHEMA_MISMATCH.
2016      */
2017     skipSize = "17";
2018     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_2, VALID_DEFINE_1, VALID_INDEX_1, skipSize);
2019     delegate["longerSkip"] = DistributedDBNbTestTools::GetNbDelegateStatus(manager["longerSkip"],
2020         status, g_dbParameter2, option);
2021     EXPECT_EQ(delegate["longerSkip"], nullptr);
2022     EXPECT_EQ(status, SCHEMA_MISMATCH);
2023 
2024     skipSize = "15";
2025     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_2, VALID_DEFINE_1, VALID_INDEX_1, skipSize);
2026     delegate["shorterSkip"] = DistributedDBNbTestTools::GetNbDelegateStatus(manager["shorterSkip"],
2027         status, g_dbParameter2, option);
2028     EXPECT_EQ(delegate["shorterSkip"], nullptr);
2029     EXPECT_EQ(status, SCHEMA_MISMATCH);
2030 
2031     /**
2032      * @tc.steps: step4. open the db the right SCHEMA_SIZE.
2033      * @tc.expected: step4. open successfully.
2034      */
2035     skipSize = "16";
2036     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_2, VALID_DEFINE_1, VALID_INDEX_4, skipSize);
2037     delegate["ValidSkip"] = DistributedDBNbTestTools::GetNbDelegateStatus(manager["ValidSkip"],
2038         status, g_dbParameter2, option);
2039     EXPECT_NE(delegate["ValidSkip"], nullptr);
2040     EXPECT_EQ(manager["ValidSkip"]->CloseKvStore(delegate["ValidSkip"]), OK);
2041     delegate["ValidSkip"] = nullptr;
2042     EXPECT_EQ(status, OK);
2043 
2044     EXPECT_EQ(manager["ValidSkip"]->DeleteKvStore(STORE_ID_2), OK);
2045     delete manager["ValidSkip"];
2046     manager["ValidSkip"] = nullptr;
2047 }
2048 
2049 /**
2050  * @tc.name: SkipTest 005
2051  * @tc.desc: Verify that it can open one db that with schema-size with a schema that include schema-size.
2052  *    And also, it will must need the right schema-size that used the first time to open the db after that.
2053  * @tc.type: FUNC
2054  * @tc.require: SR000DR9JQ
2055  * @tc.author: fengxiaoyun
2056  */
2057 HWTEST_F(DistributeddbNbSchemaTest, SkipTest005, TestSize.Level1)
2058 {
2059     /**
2060      * @tc.steps: step1. create schema db that without schema.
2061      * @tc.expected: step1. create success.
2062      */
2063     map<string, KvStoreNbDelegate *> delegate;
2064     map<string, KvStoreDelegateManager *>manager;
2065     Option option = g_option;
2066     option.isMemoryDb = false;
2067     DBStatus status;
2068     delegate["Normal"] = DistributedDBNbTestTools::GetNbDelegateStatus(manager["Normal"],
2069         status, g_dbParameter2, option);
2070     ASSERT_NE(delegate["Normal"], nullptr);
2071     EXPECT_EQ(status, OK);
2072     EXPECT_EQ(manager["Normal"]->CloseKvStore(delegate["Normal"]), OK);
2073     delegate["Normal"] = nullptr;
2074 
2075     /**
2076      * @tc.steps: step2. open the db again with the schema and SCHEMA_SIZE = 16.
2077      * @tc.expected: step2. open successfully.
2078      */
2079     std::string skipSize = "16";
2080     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_2, VALID_DEFINE_1, VALID_INDEX_3, skipSize);
2081     delegate["Skip1"] = DistributedDBNbTestTools::GetNbDelegateStatus(manager["Skip1"], status, g_dbParameter2, option);
2082     ASSERT_NE(delegate["Skip1"], nullptr);
2083     EXPECT_EQ(status, OK);
2084 
2085     /**
2086      * @tc.steps: step3. open the db again with the SCHEMA_SIZE = 15.
2087      * @tc.expected: step3. open failed and return SCHEMA_MISMATCH.
2088      */
2089     skipSize = "15";
2090     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_2, VALID_DEFINE_1, VALID_INDEX_1, skipSize);
2091     delegate["Skip2"] = DistributedDBNbTestTools::GetNbDelegateStatus(manager["Skip2"], status, g_dbParameter2, option);
2092     ASSERT_EQ(delegate["Skip2"], nullptr);
2093     EXPECT_EQ(status, SCHEMA_MISMATCH);
2094 
2095     /**
2096      * @tc.steps: step3. open the db that without SCHEMA_SIZE.
2097      * @tc.expected: step3. open failed and return SCHEMA_MISMATCH.
2098      */
2099     skipSize = "16";
2100     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_2, VALID_DEFINE_1, VALID_INDEX_3, skipSize);
2101     delegate["Skip2"] = DistributedDBNbTestTools::GetNbDelegateStatus(manager["Skip2"], status, g_dbParameter2, option);
2102     ASSERT_NE(delegate["Skip2"], nullptr);
2103     EXPECT_EQ(status, OK);
2104     EXPECT_EQ(manager["Skip2"]->CloseKvStore(delegate["Skip2"]), OK);
2105     delegate["Skip2"] = nullptr;
2106     delete manager["Skip2"];
2107     manager["Skip2"] = nullptr;
2108 
2109     EXPECT_EQ(manager["Skip1"]->CloseKvStore(delegate["Skip1"]), OK);
2110     delegate["Skip1"] = nullptr;
2111     delete manager["Skip1"];
2112     manager["Skip1"] = nullptr;
2113     EXPECT_EQ(manager["Normal"]->DeleteKvStore(STORE_ID_2), OK);
2114     delete manager["Normal"];
2115     manager["Normal"] = nullptr;
2116 }
2117 
2118 /**
2119  * @tc.name: DataTypeVerify 001
2120  * @tc.desc: Verify that it can Verify the data type of INTEGER and LONG criticality value rightly.
2121  * @tc.type: FUNC
2122  * @tc.require: SR000DR9JQ
2123  * @tc.author: fengxiaoyun
2124  */
2125 HWTEST_F(DistributeddbNbSchemaTest, DataTypeVerify001, TestSize.Level0)
2126 {
2127     /**
2128      * @tc.steps: step1. create schema db that with schema include the field of INTEGER LONG and DOUBLE type.
2129      * @tc.expected: step1. create success.
2130      */
2131     KvStoreNbDelegate *delegate = nullptr;
2132     KvStoreDelegateManager *manager = nullptr;
2133     Option option = g_option;
2134     option.isMemoryDb = false;
2135     std::string schemaDefine = "{\"field1\":\"INTEGER ,DEFAULT null\",\"field2\":\"LONG ,DEFAULT null\","
2136         "\"field3\":\"DOUBLE ,DEFAULT null\"}";
2137     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_1, schemaDefine, VALID_INDEX_1);
2138     delegate = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
2139     ASSERT_TRUE(manager != nullptr && delegate != nullptr);
2140 
2141     /**
2142      * @tc.steps: step2. put the records where field1 is INT32_MIN, INT32_MAX, INT32_MIN - 1, and INT32_MAX + 1.
2143      * @tc.expected: step2. when field1 is INT32_MIN, INT32_MAX can put successfully,
2144      *    but when it is INT32_MIN - 1, and INT32_MAX + 1 will be failed.
2145      */
2146     string int32Min = "{\"field1\":-2147483648,\"field2\":null, \"field3\":null}";
2147     string int32Max = "{\"field1\":2147483647,\"field2\":null, \"field3\":null}";
2148     string int32MinSub1 = "{\"field1\":-2147483649,\"field2\":null, \"field3\":null}";
2149     string int32MaxPlus1 = "{\"field1\":2147483648,\"field2\":null, \"field3\":null}";
2150     Value value1(int32Min.begin(), int32Min.end());
2151     Value value2(int32Max.begin(), int32Max.end());
2152     Value value3(int32MinSub1.begin(), int32MinSub1.end());
2153     Value value4(int32MaxPlus1.begin(), int32MaxPlus1.end());
2154     EXPECT_EQ(delegate->Put(KEY_1, value1), OK);
2155     EXPECT_EQ(delegate->Put(KEY_2, value2), OK);
2156     EXPECT_EQ(delegate->Put(KEY_3, value3), INVALID_FIELD_TYPE);
2157     EXPECT_EQ(delegate->Put(KEY_4, value4), INVALID_FIELD_TYPE);
2158 
2159     /**
2160      * @tc.steps: step3. put the records where field2 is INT64_MIN, INT64_MAX, INT64_MIN - 1, and INT64_MAX + 1.
2161      * @tc.expected: step3. when field2 is INT64_MIN, INT64_MAX can put successfully,
2162      *    but when it is INT64_MIN - 1, and INT64_MAX + 1 will be failed.
2163      */
2164     string int64Min = "{\"field1\":null,\"field2\":-9223372036854775808, \"field3\":null}";
2165     string int64Max = "{\"field1\":null,\"field2\":9223372036854775807, \"field3\":null}";
2166     string int64MinSub1 = "{\"field1\":null,\"field2\":-9223372036854775809, \"field3\":null}";
2167     string int64MaxPlus1 = "{\"field1\":null,\"field2\":9223372036854775808, \"field3\":null}";
2168     Value value5(int64Min.begin(), int64Min.end());
2169     Value value6(int64Max.begin(), int64Max.end());
2170     Value value7(int64MinSub1.begin(), int64MinSub1.end());
2171     Value value8(int64MaxPlus1.begin(), int64MaxPlus1.end());
2172     EXPECT_EQ(delegate->Put(KEY_1, value5), OK);
2173     EXPECT_EQ(delegate->Put(KEY_2, value6), OK);
2174     EXPECT_EQ(delegate->Put(KEY_3, value7), INVALID_FIELD_TYPE);
2175     EXPECT_EQ(delegate->Put(KEY_4, value8), INVALID_FIELD_TYPE);
2176 
2177     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, option.isMemoryDb));
2178 }
2179 
2180 /**
2181  * @tc.name: DataTypeVerify 002
2182  * @tc.desc: Verify that it can Verify the data type of INTEGER and LONG criticality value rightly.
2183  * @tc.type: FUNC
2184  * @tc.require: SR000DR9JQ
2185  * @tc.author: fengxiaoyun
2186  */
2187 HWTEST_F(DistributeddbNbSchemaTest, DataTypeVerify002, TestSize.Level0)
2188 {
2189     /**
2190      * @tc.steps: step1. create schema db that with schema include the field of INTEGER LONG and DOUBLE type.
2191      * @tc.expected: step1. create success.
2192      */
2193     KvStoreNbDelegate *delegate = nullptr;
2194     KvStoreDelegateManager *manager = nullptr;
2195     Option option = g_option;
2196     option.isMemoryDb = false;
2197     std::string schemaDefine = "{\"field1\":\"INTEGER ,DEFAULT null\",\"field2\":\"LONG ,DEFAULT null\","
2198         "\"field3\":\"DOUBLE ,DEFAULT null\"}";
2199     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_1, schemaDefine, VALID_INDEX_1);
2200     delegate = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
2201     ASSERT_TRUE(manager != nullptr && delegate != nullptr);
2202 
2203     /**
2204      * @tc.steps: step2. put the records where field1 is -10.1, 10.1, 10E5, and 10.123E5.
2205      * @tc.expected: step2. all of them will be failed.
2206      */
2207     string negativeAndPoitInt = "{\"field1\":-10.1,\"field2\":null, \"field3\":null}";
2208     string positiveAndPoitInt = "{\"field1\":10.1,\"field2\":null, \"field3\":null}";
2209     string scientificNotationInt = "{\"field1\":10E5,\"field2\":null, \"field3\":null}";
2210     string scientificNotationAndPoitInt = "{\"field1\":10.123E5,\"field2\":null, \"field3\":null}";
2211     Value value1(negativeAndPoitInt.begin(), negativeAndPoitInt.end());
2212     Value value2(positiveAndPoitInt.begin(), positiveAndPoitInt.end());
2213     Value value3(scientificNotationInt.begin(), scientificNotationInt.end());
2214     Value value4(scientificNotationAndPoitInt.begin(), scientificNotationAndPoitInt.end());
2215     EXPECT_EQ(delegate->Put(KEY_1, value1), INVALID_FIELD_TYPE);
2216     EXPECT_EQ(delegate->Put(KEY_2, value2), INVALID_FIELD_TYPE);
2217     EXPECT_EQ(delegate->Put(KEY_3, value3), INVALID_FIELD_TYPE);
2218     EXPECT_EQ(delegate->Put(KEY_4, value4), INVALID_FIELD_TYPE);
2219 
2220     /**
2221      * @tc.steps: step3. put the records where field2 is -10.1, 10.1, 10E5, and 10.123E5.
2222      * @tc.expected: step3. all of them will be failed.
2223      */
2224     string negativeAndPoitLong = "{\"field1\":null,\"field2\":-10.1, \"field3\":null}";
2225     string positiveAndPoitLong = "{\"field1\":null,\"field2\":10.1, \"field3\":null}";
2226     string scientificNotationLong = "{\"field1\":null,\"field2\":10E5, \"field3\":null}";
2227     string scientificNotationAndPoitLong = "{\"field1\":null,\"field2\":10.123E5, \"field3\":null}";
2228     Value value5(negativeAndPoitLong.begin(), negativeAndPoitLong.end());
2229     Value value6(positiveAndPoitLong.begin(), positiveAndPoitLong.end());
2230     Value value7(scientificNotationLong.begin(), scientificNotationLong.end());
2231     Value value8(scientificNotationAndPoitLong.begin(), scientificNotationAndPoitLong.end());
2232     EXPECT_EQ(delegate->Put(KEY_1, value5), INVALID_FIELD_TYPE);
2233     EXPECT_EQ(delegate->Put(KEY_2, value6), INVALID_FIELD_TYPE);
2234     EXPECT_EQ(delegate->Put(KEY_3, value7), INVALID_FIELD_TYPE);
2235     EXPECT_EQ(delegate->Put(KEY_4, value8), INVALID_FIELD_TYPE);
2236 
2237     /**
2238      * @tc.steps: step4. put the records where field3 is -10.1, 10.1, 10E5, and 10.123E5.
2239      * @tc.expected: step4. all of them will be success.
2240      */
2241     string negativeAndPoitDouble = "{\"field1\":null,\"field2\":null, \"field3\":-10.1}";
2242     string positiveAndPoitDouble = "{\"field1\":null,\"field2\":null, \"field3\":10.1}";
2243     string scientificNotationDouble = "{\"field1\":null,\"field2\":null, \"field3\":10E5}";
2244     string scientificNotationAndPoitDouble = "{\"field1\":null,\"field2\":null, \"field3\":10.123E5}";
2245     Value value9(negativeAndPoitDouble.begin(), negativeAndPoitDouble.end());
2246     Value value10(positiveAndPoitDouble.begin(), positiveAndPoitDouble.end());
2247     Value value11(scientificNotationDouble.begin(), scientificNotationDouble.end());
2248     Value value12(scientificNotationAndPoitDouble.begin(), scientificNotationAndPoitDouble.end());
2249     EXPECT_EQ(delegate->Put(KEY_1, value9), OK);
2250     EXPECT_EQ(delegate->Put(KEY_2, value10), OK);
2251     EXPECT_EQ(delegate->Put(KEY_3, value11), OK);
2252     EXPECT_EQ(delegate->Put(KEY_4, value12), OK);
2253 
2254     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, option.isMemoryDb));
2255 }
2256 namespace {
GenerateLargeDepth(int depth)2257 std::string GenerateLargeDepth(int depth)
2258 {
2259     string resultStr;
2260     for (int index = 1; index <= depth; index++) {
2261         std::string ind = std::to_string(index);
2262         if (index == depth) {
2263             resultStr = resultStr + "\"filed" + ind + "\":" + ind;
2264         } else {
2265             resultStr = resultStr + "\"filed" + ind + "\":{";
2266         }
2267     }
2268     resultStr.append(depth - 1, '}');
2269     return resultStr;
2270 }
2271 const int SKIPSTR_LEN = 16;
2272 const int JSON_LEN = 99;
2273 }
2274 
2275 /**
2276  * @tc.name: JsonTest 001
2277  * @tc.desc: Verify that it can parse the Json string which nesting depth is equal to 100.
2278  * @tc.type: FUNC
2279  * @tc.require: SR000F3L0Q
2280  * @tc.author: fengxiaoyun
2281  */
2282 HWTEST_F(DistributeddbNbSchemaTest, JsonTest001, TestSize.Level0)
2283 {
2284     /**
2285      * @tc.steps: step1. create schema db that with schema_define = {"field":{}, "field1":"STRING"}.
2286      * @tc.expected: step1. create success.
2287      */
2288     KvStoreNbDelegate *delegate = nullptr;
2289     KvStoreDelegateManager *manager = nullptr;
2290     Option option = g_option;
2291     option.isMemoryDb = false;
2292     std::string schemaDefine = "{\"field\":{}, \"field1\": \"STRING\"}";
2293     string schemaIndex = "[\"$.field1\"]";
2294     std::string skipSize = "16";
2295     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_1, schemaDefine, schemaIndex, skipSize);
2296     delegate = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
2297     ASSERT_TRUE(manager != nullptr && delegate != nullptr);
2298 
2299     /**
2300      * @tc.steps: step2. put the records where the depth of Json is equal to 100.
2301      * @tc.expected: step2. put successfully.
2302      */
2303     string skipStr(SKIPSTR_LEN, '0');
2304     string field1Str = skipStr + "{\"field\":" + "{\"field1\": \"string\"}" + ",\"field1\":\"abc\"}";
2305     string field1Int = skipStr + "{\"field\":" + "{\"field1\": 0}" + ",\"field1\":\"bcd\"}";
2306     string field1Long = skipStr + "{\"field\":" + "{\"field1\": 500}" + ",\"field1\":\"cde\"}";
2307     string field1Float = skipStr + "{\"field\":" + "{\"field1\": 3.14}" + ",\"field1\":\"def\"}";
2308     string field1 = GenerateLargeDepth(JSON_LEN);
2309     string field1Object = skipStr + "{\"field\":{" + field1 + "},\"field1\":\"efg\"}";
2310     Value value1(field1Str.begin(), field1Str.end());
2311     Value value2(field1Int.begin(), field1Int.end());
2312     Value value3(field1Long.begin(), field1Long.end());
2313     Value value4(field1Float.begin(), field1Float.end());
2314     Value value5(field1Object.begin(), field1Object.end());
2315     EXPECT_EQ(delegate->Put(KEY_1, value1), OK);
2316     EXPECT_EQ(delegate->Put(KEY_2, value2), OK);
2317     EXPECT_EQ(delegate->Put(KEY_3, value3), OK);
2318     EXPECT_EQ(delegate->Put(KEY_4, value4), OK);
2319     EXPECT_EQ(delegate->Put(KEY_5, value5), OK);
2320 
2321     /**
2322      * @tc.steps: step3. query data in db.
2323      * @tc.expected: step3. operate successfully.
2324      */
2325     vector<Entry> entriesResult;
2326     KvStoreResultSet *resultSet = nullptr;
2327     Query query = Query::Select().PrefixKey({'k'}).OrderBy("$.field1", true);
2328     EXPECT_EQ(delegate->GetEntries(query, entriesResult), OK);
2329     EXPECT_EQ(delegate->GetEntries(query, resultSet), OK);
2330     EXPECT_TRUE(entriesResult.size() == FIVE_RECORDS);
2331     EXPECT_TRUE(resultSet->GetCount() == FIVE_RECORDS);
2332     EXPECT_EQ(delegate->CloseResultSet(resultSet), OK);
2333     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, option.isMemoryDb));
2334 }
2335 
2336 /**
2337  * @tc.name: JsonTest 002
2338  * @tc.desc: Verify that it can parse the Json string which include "\n,\r,\t".
2339  * @tc.type: FUNC
2340  * @tc.require: SR000F3L0Q
2341  * @tc.author: fengxiaoyun
2342  */
2343 HWTEST_F(DistributeddbNbSchemaTest, JsonTest002, TestSize.Level0)
2344 {
2345     /**
2346      * @tc.steps: step1. create schema db that with schema_define = {"field":{}, "field1":"STRING"}.
2347      * @tc.expected: step1. create success.
2348      */
2349     KvStoreNbDelegate *delegate = nullptr;
2350     KvStoreDelegateManager *manager = nullptr;
2351     Option option = g_option;
2352     option.isMemoryDb = false;
2353     std::string schemaDefine = "{\"field\":{}, \"field1\": \"STRING\"}";
2354     std::string skipSize = "16";
2355     option.schema = SpliceToSchema(VALID_VERSION_1, VALID_MODE_1, schemaDefine, VALID_INDEX_1, skipSize);
2356     delegate = DistributedDBNbTestTools::GetNbDelegateSuccess(manager, g_dbParameter2, option);
2357     ASSERT_TRUE(manager != nullptr && delegate != nullptr);
2358 
2359     /**
2360      * @tc.steps: step2. put the records where the Json string includes "\n,\r,\t".
2361      * @tc.expected: step2. put successfully.
2362      */
2363     string skipStr(SKIPSTR_LEN, '\\');
2364     string field1Str = skipStr + "{\"field\":" + "{\"\\nfield1\": \"a\"}" + ",\"field1\":\"abc\"}";
2365     string fieldBool = skipStr + "{\"field\":" + "{\"\\rfield1\": true}" + ",\"field1\":\"bcd\"}";
2366     // test Json string with space.
2367     string field1Int = skipStr + "{\"field\":" + "{\"field1\":  100}" + ",\"field1\":\"cde\"}";
2368     string field1Long = skipStr + "{\"field\":" + "{\"field1\": 1000}" + ",\"field1\":\"def\\t\"}";
2369     string field1Float = skipStr + "{\"field\":" + "{\"field1\": 3.14}" + ",\"field1\":\"efg\"}";
2370     Value value1(field1Str.begin(), field1Str.end());
2371     Value value2(fieldBool.begin(), fieldBool.end());
2372     Value value3(field1Int.begin(), field1Int.end());
2373     Value value4(field1Long.begin(), field1Long.end());
2374     Value value5(field1Float.begin(), field1Float.end());
2375     EXPECT_EQ(delegate->Put(KEY_1, value1), OK);
2376     EXPECT_EQ(delegate->Put(KEY_2, value2), OK);
2377     EXPECT_EQ(delegate->Put(KEY_3, value3), OK);
2378     EXPECT_EQ(delegate->Put(KEY_4, value4), OK);
2379     EXPECT_EQ(delegate->Put(KEY_5, value5), OK);
2380 
2381     /**
2382      * @tc.steps: step3. query data in db.
2383      * @tc.expected: step3. operate successfully.
2384      */
2385     vector<Entry> entriesResult;
2386     KvStoreResultSet *resultSet = nullptr;
2387     Query query = Query::Select().IsNotNull("$.field1").Limit(10, 0); // query from 0 offset 10.
2388     EXPECT_EQ(delegate->GetEntries(query, entriesResult), OK);
2389     EXPECT_EQ(delegate->GetEntries(query, resultSet), OK);
2390     EXPECT_TRUE(entriesResult.size() == FIVE_RECORDS);
2391     EXPECT_TRUE(resultSet->GetCount() == FIVE_RECORDS);
2392     EXPECT_EQ(delegate->CloseResultSet(resultSet), OK);
2393     EXPECT_TRUE(EndCaseDeleteDB(manager, delegate, STORE_ID_2, option.isMemoryDb));
2394 }
2395 }
2396 #endif