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