 4afa70a218
			
		
	
	4afa70a218
	
	
	
		
			
			Co-authored-by: Carrot-77 <1012982871@qq.com> Co-authored-by: wu-xingying <729224612@qq.com>
		
			
				
	
	
		
			1689 lines
		
	
	
		
			75 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			1689 lines
		
	
	
		
			75 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /**
 | |
|  * Copyright (c) 2021 OceanBase
 | |
|  * OceanBase CE is licensed under Mulan PubL v2.
 | |
|  * You can use this software according to the terms and conditions of the Mulan PubL v2.
 | |
|  * You may obtain a copy of Mulan PubL v2 at:
 | |
|  *          http://license.coscl.org.cn/MulanPubL-2.0
 | |
|  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 | |
|  * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 | |
|  * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 | |
|  * See the Mulan PubL v2 for more details.
 | |
|  */
 | |
| 
 | |
| #include <gtest/gtest.h>
 | |
| #define private public
 | |
| #include "lib/json_type/ob_json_tree.h"
 | |
| #include "lib/json_type/ob_json_parse.h"
 | |
| #include "lib/timezone/ob_timezone_info.h"
 | |
| #include "lib/json_type/ob_json_schema.h"
 | |
| #undef private
 | |
| 
 | |
| #include <sys/time.h>
 | |
| using namespace std;
 | |
| namespace oceanbase {
 | |
| namespace common {
 | |
| 
 | |
| class TestJsonSchema : public ::testing::Test {
 | |
| public:
 | |
|   TestJsonSchema()
 | |
|   {}
 | |
|   ~TestJsonSchema()
 | |
|   {}
 | |
|   virtual void SetUp()
 | |
|   {}
 | |
|   virtual void TearDown()
 | |
|   {}
 | |
| 
 | |
|   static void SetUpTestCase()
 | |
|   {}
 | |
| 
 | |
|   static void TearDownTestCase()
 | |
|   {}
 | |
| 
 | |
| private:
 | |
|   // disallow copy
 | |
|   DISALLOW_COPY_AND_ASSIGN(TestJsonSchema);
 | |
| };
 | |
| 
 | |
| ObString j_schema_to_str("{\"$id\": \"httpexample.com/schemas/customer\", \"type\": \"object\", \"$defs\": {\"name\": {\"type\": \"string\"}}, \"required\": [\"first_name\", \"last_name\"], \"properties\": {\"last_name\": {\"$ref\": \"#/$defs/name\"}, \"first_name\": {\"$ref\": \"#/$defs/name\"}}}");
 | |
| TEST_F(TestJsonSchema, test_parse_json_schema_ref)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"$id\": \"httpexample.com/schemas/customer\","
 | |
|                           "\"type\": \"object\","
 | |
|                           "\"properties\": {\"first_name\": { \"$ref\": \"#/$defs/name\" },"
 | |
|                           "\"last_name\": { \"$ref\": \"#/$defs/name\" }},"
 | |
|                           "\"required\": [\"first_name\", \"last_name\"],"
 | |
|                           "\"$defs\": {\"name\": { \"type\": \"string\" }}}");
 | |
| 
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ASSERT_EQ(OB_SUCCESS, j_tree->print(j_buf, false));
 | |
|   ASSERT_EQ(j_schema_to_str, ObString(j_buf.length(), j_buf.ptr()));
 | |
|   common::ObString j_text_wrong("{\"$id\": \"httpexample.com/schemas/customer\","
 | |
|                                 "\"type\": \"object\","
 | |
|                                 "\"properties\": {\"first_name\": { \"$ref\": \"#/$defs/name\" },"
 | |
|                                 "\"last_name\": { \"$ref\": \"/$defs/name\" }},"
 | |
|                                 "\"required\": [\"first_name\", \"last_name\"],"
 | |
|                                 "\"$defs\": {\"name\": { \"type\": \"string\" }}}");
 | |
|   ASSERT_EQ(OB_ERR_UNSUPPROTED_REF_IN_JSON_SCHEMA, ObJsonBaseFactory::get_json_base(&allocator, j_text_wrong,
 | |
|             ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
| }
 | |
| 
 | |
| TEST_F(TestJsonSchema, test_parse_json_schema_dup_key)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"$id\": \"httpexample.com/schemas/customer\","
 | |
|                           "\"type\": \"object\","
 | |
|                           "\"type\": \"number\","
 | |
|                           "\"properties\": {\"first_name\": { \"$ref\": \"#/$defs/name\" },"
 | |
|                           "\"last_name\": { \"$ref\": \"#/$defs/name\" }},"
 | |
|                           "\"required\": [\"first_name\", \"last_name\"],"
 | |
|                           "\"required\": [\"test_name\"],"
 | |
|                           "\"$defs\": {\"name\": { \"type\": \"string\" }}}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ASSERT_EQ(OB_SUCCESS,j_tree->print(j_buf, false));
 | |
|   ASSERT_EQ(j_schema_to_str, ObString(j_buf.length(), j_buf.ptr()));
 | |
|   common::ObString j_text_wrong("{\"$id\": \"httpexample.com/schemas/customer\","
 | |
|                                 "\"type\": \"object\","
 | |
|                                 "\"properties\": {\"first_name\": { \"$ref\": \"#/$defs/name\" },"
 | |
|                                 "\"last_name\": { \"$ref\": \"#/$defs/name\" }},"
 | |
|                                 "\"last_name\": { \"$ref\": \"/$defs/name\" }},"
 | |
|                                 "\"required\": [\"first_name\", \"last_name\"],"
 | |
|                                 "\"$defs\": {\"name\": { \"type\": \"string\" }}}");
 | |
|   ASSERT_EQ(OB_ERR_UNSUPPROTED_REF_IN_JSON_SCHEMA, ObJsonBaseFactory::get_json_base(&allocator, j_text_wrong,
 | |
|             ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
| }
 | |
| 
 | |
| # define STRING_TYPE_COUNT 2
 | |
| ObString string_type_str[STRING_TYPE_COUNT] = {
 | |
|   "{\"schema\": {\"type\": 4, \"pattern\": \"^S_\", \"maxLength\": 3, \"minLength\": 2}}",
 | |
|   "{}"
 | |
| };
 | |
| TEST_F(TestJsonSchema, test_parse_string_type)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"string\",\"pattern\":\"^S_\",\"minLength\": 2,\"maxLength\": 3}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   int schema_count = json_schema.schema_map_->element_count();
 | |
|   ASSERT_EQ(STRING_TYPE_COUNT, schema_count);
 | |
|   for (int i = 0; i < schema_count; ++i) {
 | |
|     ObIJsonBase *value = nullptr;
 | |
|     ASSERT_EQ(OB_SUCCESS, json_schema.schema_map_->get_array_element(i, value));
 | |
|     j_buf.reset();
 | |
|     ASSERT_EQ(OB_SUCCESS, value->print(j_buf, false));
 | |
|     cout<<"json_schema "<<i<<" : "<<j_buf.ptr()<<endl;
 | |
|     ASSERT_EQ(ObString(j_buf.ptr()), string_type_str[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| # define NUMBER_TYPE_COUNT 2
 | |
| ObString number_type_str[NUMBER_TYPE_COUNT] = {
 | |
|   "{\"schema\": {\"type\": 8, \"minimum\": 0, \"exclusiveMaximum\": 100}}",
 | |
|   "{}"
 | |
| };
 | |
| TEST_F(TestJsonSchema, test_parse_number_type)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"number\", \"minimum\": 0, \"maximum\": 100, \"exclusiveMinimum\": false, \"exclusiveMaximum\": true}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   int schema_count = json_schema.schema_map_->element_count();
 | |
|   ASSERT_EQ(NUMBER_TYPE_COUNT, schema_count);
 | |
|   for (int i = 0; i < schema_count; ++i) {
 | |
|     ObIJsonBase *value = nullptr;
 | |
|     ASSERT_EQ(OB_SUCCESS, json_schema.schema_map_->get_array_element(i, value));
 | |
|     j_buf.reset();
 | |
|     ASSERT_EQ(OB_SUCCESS, value->print(j_buf, false));
 | |
|     cout<<"json_schema "<<i<<" : "<<j_buf.ptr()<<endl;
 | |
|     ASSERT_EQ(ObString(j_buf.ptr()), number_type_str[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| ObString integer_type_str[NUMBER_TYPE_COUNT] = {
 | |
|   "{\"schema\": {\"type\": 16, \"minimum\": 0, \"exclusiveMaximum\": 100}}",
 | |
|   "{}"
 | |
| };
 | |
| TEST_F(TestJsonSchema, test_parse_integer_type)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"integer\",\"type\": \"number\", \"minimum\": 0, \"maximum\": 100,\"exclusiveMaximum\": true, \"exclusiveMinimum\": false}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   int schema_count = json_schema.schema_map_->element_count();
 | |
|   ASSERT_EQ(NUMBER_TYPE_COUNT, schema_count);
 | |
|   for (int i = 0; i < schema_count; ++i) {
 | |
|     ObIJsonBase *value = nullptr;
 | |
|     ASSERT_EQ(OB_SUCCESS, json_schema.schema_map_->get_array_element(i, value));
 | |
|     j_buf.reset();
 | |
|     ASSERT_EQ(OB_SUCCESS, value->print(j_buf, false));
 | |
|     cout<<"json_schema "<<i<<" : "<<j_buf.ptr()<<endl;
 | |
|     ASSERT_EQ(ObString(j_buf.ptr()), integer_type_str[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| # define NULL_TYPE_COUNT 2
 | |
| ObString null_type_str[NULL_TYPE_COUNT] = {
 | |
|   "{\"schema\": {\"enum\": [\"red\", \"amber\", \"green\"], \"type\": 1}}",
 | |
|   "{}"
 | |
| };
 | |
| TEST_F(TestJsonSchema, test_parse_null_type)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"null\", \"enum\": [\"red\", \"amber\", \"green\"], \"minimum\": 0, \"maximum\": 100,\"exclusiveMaximum\": true}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   int schema_count = json_schema.schema_map_->element_count();
 | |
|   ASSERT_EQ(NULL_TYPE_COUNT, schema_count);
 | |
|   for (int i = 0; i < schema_count; ++i) {
 | |
|     ObIJsonBase *value = nullptr;
 | |
|     ASSERT_EQ(OB_SUCCESS, json_schema.schema_map_->get_array_element(i, value));
 | |
|     j_buf.reset();
 | |
|     ASSERT_EQ(OB_SUCCESS, value->print(j_buf, false));
 | |
|     cout<<"json_schema "<<i<<" : "<<j_buf.ptr()<<endl;
 | |
|     ASSERT_EQ(ObString(j_buf.ptr()), null_type_str[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| ObString boolean_type_str[NULL_TYPE_COUNT] = {
 | |
|   "{\"schema\": {\"enum\": [\"red\", \"amber\", \"green\"], \"type\": 2}}",
 | |
|   "{}"
 | |
| };
 | |
| TEST_F(TestJsonSchema, test_parse_boolean_type)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"boolean\", \"enum\": [\"red\", \"amber\", \"green\"], \"minimum\": 0, \"maximum\": 100,\"exclusiveMaximum\": true}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   int schema_count = json_schema.schema_map_->element_count();
 | |
|   ASSERT_EQ(NULL_TYPE_COUNT, schema_count);
 | |
|   for (int i = 0; i < schema_count; ++i) {
 | |
|     ObIJsonBase *value = nullptr;
 | |
|     ASSERT_EQ(OB_SUCCESS, json_schema.schema_map_->get_array_element(i, value));
 | |
|     j_buf.reset();
 | |
|     ASSERT_EQ(OB_SUCCESS, value->print(j_buf, false));
 | |
|     cout<<"json_schema "<<i<<" : "<<j_buf.ptr()<<endl;
 | |
|     ASSERT_EQ(ObString(j_buf.ptr()), boolean_type_str[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| # define PRO_COUNT 2
 | |
| ObString pro_str[PRO_COUNT] = {
 | |
|   "{\"schema\": {\"type\": 32}, \"properties\": {\"number\": {\"schema\": {\"type\": 8}}, \"street_name\": {\"schema\": {\"type\": 4}}, \"street_type\": {\"schema\": {\"enum\": [\"Street\", \"Avenue\", \"Boulevard\"]}}}}",
 | |
|   "{}"
 | |
| };
 | |
| TEST_F(TestJsonSchema, test_parse_property)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"object\","
 | |
|   "\"properties\": {"
 | |
|     "\"number\": { \"type\": \"number\" },"
 | |
|     "\"street_name\": { \"type\": \"string\" },"
 | |
|     "\"street_type\": { \"enum\": [\"Street\", \"Avenue\", \"Boulevard\"]}}}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   int schema_count = json_schema.schema_map_->element_count();
 | |
|   ASSERT_EQ(PRO_COUNT, schema_count);
 | |
|   for (int i = 0; i < schema_count; ++i) {
 | |
|     ObIJsonBase *value = nullptr;
 | |
|     ASSERT_EQ(OB_SUCCESS, json_schema.schema_map_->get_array_element(i, value));
 | |
|     j_buf.reset();
 | |
|     ASSERT_EQ(OB_SUCCESS, value->print(j_buf, false));
 | |
|     cout<<"json_schema "<<i<<" : "<<j_buf.ptr()<<endl;
 | |
|     ASSERT_EQ(ObString(j_buf.ptr()), pro_str[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| # define DEP_REUQUIRED_COUNT 2
 | |
| ObString dep_required_str[DEP_REUQUIRED_COUNT] = {
 | |
|   "{\"schema\": {\"type\": 32, \"dependentRequired\": {\"credit_card\": [\"billing_address\"]}}, \"properties\": {\"number\": {\"schema\": {\"type\": 8}}, \"street_name\": {\"schema\": {\"type\": 4}}, \"street_type\": {\"schema\": {\"enum\": [\"Street\", \"Avenue\", \"Boulevard\"]}}}}",
 | |
|   "{}"
 | |
| };
 | |
| TEST_F(TestJsonSchema, test_parse_dep_required)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"object\","
 | |
|   "\"properties\": {"
 | |
|     "\"number\": { \"type\": \"number\" },"
 | |
|     "\"street_name\": { \"type\": \"string\" },"
 | |
|     "\"street_type\": { \"enum\": [\"Street\", \"Avenue\", \"Boulevard\"]}},"
 | |
|     "\"dependencies\": {\"credit_card\": [\"billing_address\"]}}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   int schema_count = json_schema.schema_map_->element_count();
 | |
|   ASSERT_EQ(DEP_REUQUIRED_COUNT, schema_count);
 | |
|   for (int i = 0; i < schema_count; ++i) {
 | |
|     ObIJsonBase *value = nullptr;
 | |
|     ASSERT_EQ(OB_SUCCESS, json_schema.schema_map_->get_array_element(i, value));
 | |
|     j_buf.reset();
 | |
|     ASSERT_EQ(OB_SUCCESS, value->print(j_buf, false));
 | |
|     cout<<"json_schema "<<i<<" : "<<j_buf.ptr()<<endl;
 | |
|     ASSERT_EQ(ObString(j_buf.ptr()), dep_required_str[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| # define DEP_UNNESTED_COUNT 3
 | |
| ObString dep_unnested_str[DEP_UNNESTED_COUNT] = {
 | |
|   "{\"schema\": {\"type\": 32, \"required\": [\"name\"], \"dependentRequired\": {\"name\": [\"last_name\"]}}, \"properties\": {\"name\": {\"schema\": {\"type\": 4}}, \"credit_card\": {\"schema\": {\"type\": 8}}, \"billing_address\": {\"schema\": {\"type\": 4}, \"composition\": [2]}}, \"composition\": [], \"dependentSchemas\": {\"credit_card\": [2]}}",
 | |
|   "{}",
 | |
|   "{\"type\": 8}"
 | |
| };
 | |
| TEST_F(TestJsonSchema, test_parse_dep_unnested)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"object\","
 | |
|   "\"properties\": {"
 | |
|     "\"name\": { \"type\": \"string\" },"
 | |
|     "\"credit_card\": { \"type\": \"number\" },"
 | |
|     "\"billing_address\": { \"type\": \"string\" }},"
 | |
|   "\"required\": [\"name\"],"
 | |
|   "\"dependencies\": {"
 | |
|     "\"credit_card\": {"
 | |
|       "\"properties\": {"
 | |
|         "\"billing_address\": { \"type\": \"number\" }}},"
 | |
|     "\"name\": [\"last_name\"]}}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   int schema_count = json_schema.schema_map_->element_count();
 | |
|   ASSERT_EQ(DEP_UNNESTED_COUNT, schema_count);
 | |
|   for (int i = 0; i < schema_count; ++i) {
 | |
|     ObIJsonBase *value = nullptr;
 | |
|     ASSERT_EQ(OB_SUCCESS, json_schema.schema_map_->get_array_element(i, value));
 | |
|     j_buf.reset();
 | |
|     ASSERT_EQ(OB_SUCCESS, value->print(j_buf, false));
 | |
|     cout<<"json_schema "<<i<<" : "<<j_buf.ptr()<<endl;
 | |
|     ASSERT_EQ(ObString(j_buf.ptr()), dep_unnested_str[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| # define DEP_NESTED_COUNT 4
 | |
| ObString dep_nested_str[DEP_NESTED_COUNT] = {
 | |
|   "{\"schema\": {\"type\": 32, \"required\": [\"name\"], \"dependentRequired\": {\"name\": [\"billing_address\"]}}, \"properties\": {\"name\": {\"schema\": {\"type\": 4}}, \"credit_card\": {\"schema\": {\"type\": 8}}, \"billing_address\": {\"schema\": {\"type\": 4}, \"composition\": [2]}}, \"composition\": [3], \"dependentSchemas\": {\"credit_card\": [2, {\"dependentSchemas\": {\"billing_address\": [3]}}]}}",
 | |
|   "{}",
 | |
|   "{\"type\": 4}",
 | |
|   "{\"required\": [\"credit_card\"]}"
 | |
| };
 | |
| TEST_F(TestJsonSchema, test_parse_dep_nested)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"object\","
 | |
|   "\"properties\": {"
 | |
|     "\"name\": { \"type\": \"string\" },"
 | |
|     "\"credit_card\": { \"type\": \"number\" },"
 | |
|     "\"billing_address\": { \"type\": \"string\" }},"
 | |
|   "\"required\": [\"name\"],"
 | |
|   "\"dependencies\": {\"credit_card\": {\"properties\": {"
 | |
|     "\"billing_address\": { \"type\": \"string\" }},"
 | |
|     "\"dependencies\": {\"billing_address\": { \"required\": [\"credit_card\"]}}},"
 | |
|     "\"name\": [\"billing_address\"]}}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   int schema_count = json_schema.schema_map_->element_count();
 | |
|   ASSERT_EQ(DEP_NESTED_COUNT, schema_count);
 | |
|   for (int i = 0; i < schema_count; ++i) {
 | |
|     ObIJsonBase *value = nullptr;
 | |
|     ASSERT_EQ(OB_SUCCESS, json_schema.schema_map_->get_array_element(i, value));
 | |
|     j_buf.reset();
 | |
|     ASSERT_EQ(OB_SUCCESS, value->print(j_buf, false));
 | |
|     cout<<"json_schema "<<i<<" : "<<j_buf.ptr()<<endl;
 | |
|     ASSERT_EQ(ObString(j_buf.ptr()), dep_nested_str[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| # define PATTERN_COUNT 2
 | |
| ObString pattern_pro_str[PATTERN_COUNT] = {
 | |
|   "{\"schema\": {\"type\": 32}, \"patternProperties\": {\"^I_\": {\"schema\": {\"type\": 16}}, \"^S_\": {\"schema\": {\"type\": 4}}}}",
 | |
|   "{}"
 | |
| };
 | |
| TEST_F(TestJsonSchema, test_parse_pattern_pro)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"object\","
 | |
|   "\"patternProperties\": {"
 | |
|     "\"^S_\": { \"type\": \"string\" },"
 | |
|     "\"^I_\": { \"type\": \"integer\" },"
 | |
|     "\"^*\": { \"type\": \"boolean\" }}}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   int schema_count = json_schema.schema_map_->element_count();
 | |
|   ASSERT_EQ(PATTERN_COUNT, schema_count);
 | |
|   for (int i = 0; i < schema_count; ++i) {
 | |
|     ObIJsonBase *value = nullptr;
 | |
|     ASSERT_EQ(OB_SUCCESS, json_schema.schema_map_->get_array_element(i, value));
 | |
|     j_buf.reset();
 | |
|     ASSERT_EQ(OB_SUCCESS, value->print(j_buf, false));
 | |
|     cout<<"json_schema "<<i<<" : "<<j_buf.ptr()<<endl;
 | |
|     ASSERT_EQ(ObString(j_buf.ptr()), pattern_pro_str[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| # define PATTERN_AND_PRO 2
 | |
| ObString pattern_and_pro_str[PATTERN_AND_PRO] = {
 | |
|   "{\"schema\": {\"type\": 32}, \"properties\": {\"I_0\": {\"schema\": {\"type\": 128, \"maxLength\": 20}}, \"S_25\": {\"schema\": {\"type\": 128, \"maxLength\": 20}}}, \"patternProperties\": {\"^I_\": {\"schema\": {\"type\": 16}}, \"^S_\": {\"schema\": {\"type\": 4}}, \"^[SI]*\": {\"schema\": {\"maxLength\": 20}}}}",
 | |
|   "{}",
 | |
| };
 | |
| TEST_F(TestJsonSchema, test_parse_pattern_and_pro)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"object\","
 | |
|   "\"patternProperties\": {"
 | |
|     "\"^S_\": { \"type\": \"string\" },"
 | |
|     "\"^I_\": { \"type\": \"integer\" },"
 | |
|     "\"^[SI]*\": { \"maxLength\": 20 }},"
 | |
|     "\"properties\": {"
 | |
|     "\"S_25\": { \"type\": \"number\" },"
 | |
|     "\"I_0\": { \"type\": \"string\" }}}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   int schema_count = json_schema.schema_map_->element_count();
 | |
|   ASSERT_EQ(PATTERN_AND_PRO, schema_count);
 | |
|   for (int i = 0; i < schema_count; ++i) {
 | |
|     ObIJsonBase *value = nullptr;
 | |
|     ASSERT_EQ(OB_SUCCESS, json_schema.schema_map_->get_array_element(i, value));
 | |
|     j_buf.reset();
 | |
|     ASSERT_EQ(OB_SUCCESS, value->print(j_buf, false));
 | |
|     cout<<"json_schema "<<i<<" : "<<j_buf.ptr()<<endl;
 | |
|     ASSERT_EQ(ObString(j_buf.ptr()), pattern_and_pro_str[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| # define ADD_PRO_COUNT 2
 | |
| ObString add_pro_str[ADD_PRO_COUNT] = {
 | |
|   "{\"schema\": {\"type\": 32, \"additionalProperties\": [[], [\"^I_\", \"^S_\"]]}, \"patternProperties\": {\"^I_\": {\"schema\": {\"type\": 16}}, \"^S_\": {\"schema\": {\"type\": 4}}}}",
 | |
|   "{}"
 | |
| };
 | |
| TEST_F(TestJsonSchema, test_parse_add_pro)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"object\","
 | |
|   "\"patternProperties\": {"
 | |
|     "\"^S_\": { \"type\": \"string\" },"
 | |
|     "\"^I_\": { \"type\": \"integer\" },"
 | |
|     "\"^*\": { \"type\": \"boolean\" }},"
 | |
|     "\"additionalProperties\": false }");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   int schema_count = json_schema.schema_map_->element_count();
 | |
|   ASSERT_EQ(ADD_PRO_COUNT, schema_count);
 | |
|   for (int i = 0; i < schema_count; ++i) {
 | |
|     ObIJsonBase *value = nullptr;
 | |
|     ASSERT_EQ(OB_SUCCESS, json_schema.schema_map_->get_array_element(i, value));
 | |
|     j_buf.reset();
 | |
|     ASSERT_EQ(OB_SUCCESS, value->print(j_buf, false));
 | |
|     cout<<"json_schema "<<i<<" : "<<j_buf.ptr()<<endl;
 | |
|     ASSERT_EQ(ObString(j_buf.ptr()), add_pro_str[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| # define PATTERN_PRO_ADD 2
 | |
| ObString pattern_pro_add_str[PATTERN_PRO_ADD] = {
 | |
|   "{\"schema\": {\"type\": 32, \"required\": [\"name\", \"email\"]}, \"properties\": {\"I_0\": {\"schema\": {\"type\": 128, \"maxLength\": 20}}, \"S_25\": {\"schema\": {\"type\": 128, \"maxLength\": 20}}}, \"patternProperties\": {\"^I_\": {\"schema\": {\"type\": 16}}, \"^S_\": {\"schema\": {\"type\": 4}}, \"^[SI]*\": {\"schema\": {\"maxLength\": 20}}}, "
 | |
|   "\"additionalProperties\": [[[\"I_0\", \"S_25\", \"name\", \"email\"], [\"^I_\", \"^S_\", \"^[SI]*\"]], {\"schema\": {\"type\": 4}}]}",
 | |
|   "{}",
 | |
| };
 | |
| TEST_F(TestJsonSchema, test_parse_pattern_pro_additional)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"object\","
 | |
|   "\"patternProperties\": {"
 | |
|     "\"^S_\": { \"type\": \"string\" },"
 | |
|     "\"^I_\": { \"type\": \"integer\" },"
 | |
|     "\"^[SI]*\": { \"maxLength\": 20 }},"
 | |
|     "\"properties\": {"
 | |
|     "\"S_25\": { \"type\": \"number\" },"
 | |
|     "\"I_0\": { \"type\": \"string\" }},"
 | |
|     "\"additionalProperties\": { \"type\": \"string\" },"
 | |
|     "\"required\": [\"name\", \"email\"]}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   int schema_count = json_schema.schema_map_->element_count();
 | |
|   ASSERT_EQ(PATTERN_PRO_ADD, schema_count);
 | |
|   for (int i = 0; i < schema_count; ++i) {
 | |
|     ObIJsonBase *value = nullptr;
 | |
|     ASSERT_EQ(OB_SUCCESS, json_schema.schema_map_->get_array_element(i, value));
 | |
|     j_buf.reset();
 | |
|     ASSERT_EQ(OB_SUCCESS, value->print(j_buf, false));
 | |
|     cout<<"json_schema "<<i<<" : "<<j_buf.ptr()<<endl;
 | |
|     ASSERT_EQ(ObString(j_buf.ptr()), pattern_pro_add_str[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| # define ITEMS_COUNT 2
 | |
| ObString itmes_str[ITEMS_COUNT] = {
 | |
|   "{\"items\": {\"schema\": {\"enum\": [1, 2, 3, 4], \"type\": 8}}, \"schema\": {\"type\": 64}}",
 | |
|   "{}",
 | |
| };
 | |
| TEST_F(TestJsonSchema, test_parse_items)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"array\","
 | |
|   "\"items\": { \"type\": \"number\","
 | |
|               "\"enum\": [1, 2, 3, 4] }}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   int schema_count = json_schema.schema_map_->element_count();
 | |
|   ASSERT_EQ(ITEMS_COUNT, schema_count);
 | |
|   for (int i = 0; i < schema_count; ++i) {
 | |
|     ObIJsonBase *value = nullptr;
 | |
|     ASSERT_EQ(OB_SUCCESS, json_schema.schema_map_->get_array_element(i, value));
 | |
|     j_buf.reset();
 | |
|     ASSERT_EQ(OB_SUCCESS, value->print(j_buf, false));
 | |
|     cout<<"json_schema "<<i<<" : "<<j_buf.ptr()<<endl;
 | |
|     ASSERT_EQ(ObString(j_buf.ptr()), itmes_str[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| # define TUPLE_ITEMS_COUNT 2
 | |
| ObString tuple_itmes_str[TUPLE_ITEMS_COUNT] = {
 | |
|   "{\"schema\": {\"type\": 64, \"additionalItems\": 4}, \"tupleItems\": {\"0\": {\"schema\": {\"type\": 8}}, \"1\": {\"schema\": {\"type\": 4}}, \"2\": {\"schema\": {\"enum\": [\"Street\", \"Avenue\", \"Boulevard\"]}}, \"3\": {\"schema\": {\"enum\": [\"NW\", \"NE\", \"SW\", \"SE\"]}}}}",
 | |
|   "{}"
 | |
| };
 | |
| TEST_F(TestJsonSchema, test_parse_tuple_items)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"array\","
 | |
|   "\"items\": [{ \"type\": \"number\" },"
 | |
|     "{ \"type\": \"string\" },"
 | |
|     "{ \"enum\": [\"Street\", \"Avenue\", \"Boulevard\"] },"
 | |
|     "{ \"enum\": [\"NW\", \"NE\", \"SW\", \"SE\"] }],"
 | |
|   "\"additionalItems\": false}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   int schema_count = json_schema.schema_map_->element_count();
 | |
|   ASSERT_EQ(TUPLE_ITEMS_COUNT, schema_count);
 | |
|   for (int i = 0; i < schema_count; ++i) {
 | |
|     ObIJsonBase *value = nullptr;
 | |
|     ASSERT_EQ(OB_SUCCESS, json_schema.schema_map_->get_array_element(i, value));
 | |
|     j_buf.reset();
 | |
|     ASSERT_EQ(OB_SUCCESS, value->print(j_buf, false));
 | |
|     cout<<"json_schema "<<i<<" : "<<j_buf.ptr()<<endl;
 | |
|     ASSERT_EQ(ObString(j_buf.ptr()), tuple_itmes_str[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| # define ADD_ITEMS_COUNT 2
 | |
| ObString add_itmes_str[ADD_ITEMS_COUNT] = {
 | |
|   "{\"schema\": {\"type\": 64}, \"tupleItems\": {\"0\": {\"schema\": {\"type\": 8}}, \"1\": {\"schema\": {\"type\": 4}}, \"2\": {\"schema\": {\"enum\": [\"Street\", \"Avenue\", \"Boulevard\"]}}, \"3\": {\"schema\": {\"enum\": [\"NW\", \"NE\", \"SW\", \"SE\"]}}}, \"additionalItems\": {\"4\": {\"schema\": {\"type\": 4}}}}",
 | |
|   "{}"
 | |
| };
 | |
| TEST_F(TestJsonSchema, test_parse_add_items)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"array\","
 | |
|   "\"items\": [{ \"type\": \"number\" },"
 | |
|     "{ \"type\": \"string\" },"
 | |
|     "{ \"enum\": [\"Street\", \"Avenue\", \"Boulevard\"] },"
 | |
|     "{ \"enum\": [\"NW\", \"NE\", \"SW\", \"SE\"] }],"
 | |
|   "\"additionalItems\": { \"type\": \"string\" }}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   int schema_count = json_schema.schema_map_->element_count();
 | |
|   ASSERT_EQ(ADD_ITEMS_COUNT, schema_count);
 | |
|   for (int i = 0; i < schema_count; ++i) {
 | |
|     ObIJsonBase *value = nullptr;
 | |
|     ASSERT_EQ(OB_SUCCESS, json_schema.schema_map_->get_array_element(i, value));
 | |
|     j_buf.reset();
 | |
|     ASSERT_EQ(OB_SUCCESS, value->print(j_buf, false));
 | |
|     cout<<"json_schema "<<i<<" : "<<j_buf.ptr()<<endl;
 | |
|     ASSERT_EQ(ObString(j_buf.ptr()), add_itmes_str[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| # define ALLOF_UNNESTED_COUNT 4
 | |
| ObString allof_unnested_str[ALLOF_UNNESTED_COUNT] = {
 | |
|   "{\"allOf\": [[2], [3]], \"schema\": {\"type\": 64, \"additionalItems\": 4}, \"tupleItems\": {\"0\": {\"schema\": {\"type\": 8}}, \"1\": {\"schema\": {\"type\": 4}}, \"2\": {\"schema\": {\"enum\": [\"Street\", \"Avenue\", \"Boulevard\"]}}, \"3\": {\"schema\": {\"enum\": [\"NW\", \"NE\", \"SW\", \"SE\"]}}}, \"composition\": [2, 3]}",
 | |
|   "{}",
 | |
|   "{\"type\": 4}",
 | |
|   "{\"maxLength\": 5}"
 | |
| };
 | |
| TEST_F(TestJsonSchema, test_all_of_unnested)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"array\","
 | |
|   "\"items\": [{ \"type\": \"number\" },"
 | |
|     "{ \"type\": \"string\" },"
 | |
|     "{ \"enum\": [\"Street\", \"Avenue\", \"Boulevard\"] },"
 | |
|     "{ \"enum\": [\"NW\", \"NE\", \"SW\", \"SE\"] }],"
 | |
|   "\"additionalItems\": false,"
 | |
|   "\"allOf\": ["
 | |
|     "{ \"type\": \"string\"},"
 | |
|     "{ \"maxLength\": 5 }]}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   int schema_count = json_schema.schema_map_->element_count();
 | |
|   ASSERT_EQ(ALLOF_UNNESTED_COUNT, schema_count);
 | |
|   for (int i = 0; i < schema_count; i++) {
 | |
|     ObIJsonBase *value = nullptr;
 | |
|     ASSERT_EQ(OB_SUCCESS, json_schema.schema_map_->get_array_element(i, value));
 | |
|     j_buf.reset();
 | |
|     ASSERT_EQ(OB_SUCCESS, value->print(j_buf, false));
 | |
|     cout<<"json_schema "<<i<<" : "<<j_buf.ptr()<<endl;
 | |
|     ASSERT_EQ(ObString(j_buf.ptr()), allof_unnested_str[i]);
 | |
|   }
 | |
| }
 | |
| # define ALLOF_NESTED_COUNT 6
 | |
| ObString allof_nested_str[ALLOF_NESTED_COUNT] = {
 | |
|   "{\"allOf\": [[2], [3], [{\"allOf\": [[4, {\"allOf\": [[5]]}]]}]], \"schema\": {\"type\": 64, \"additionalItems\": 4}, \"tupleItems\": {\"0\": {\"schema\": {\"type\": 8}}, \"1\": {\"schema\": {\"type\": 4}}, \"2\": {\"schema\": {\"enum\": [\"Street\", \"Avenue\", \"Boulevard\"]}}, \"3\": {\"schema\": {\"enum\": [\"NW\", \"NE\", \"SW\", \"SE\"]}}}, \"composition\": [2, 3, 4, 5]}",
 | |
|   "{}",
 | |
|   "{\"type\": 4}",
 | |
|   "{\"maxLength\": 5}",
 | |
|   "{\"type\": 8}",
 | |
|   "{\"required\": [\"city\"]}"
 | |
| };
 | |
| TEST_F(TestJsonSchema, test_all_of_nested)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"array\","
 | |
|   "\"items\": [{ \"type\": \"number\" },"
 | |
|     "{ \"type\": \"string\" },"
 | |
|     "{ \"enum\": [\"Street\", \"Avenue\", \"Boulevard\"] },"
 | |
|     "{ \"enum\": [\"NW\", \"NE\", \"SW\", \"SE\"] }],"
 | |
|   "\"additionalItems\": false,"
 | |
|   "\"allOf\": ["
 | |
|     "{ \"type\": \"string\"},"
 | |
|     "{ \"maxLength\": 5 },"
 | |
|     "{ \"allOf\": [{\"type\": \"number\", \"allOf\":[{\"required\":[\"city\"]} ]} ]} ]}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   int schema_count = json_schema.schema_map_->element_count();
 | |
|   ASSERT_EQ(ALLOF_NESTED_COUNT, schema_count);
 | |
|   for (int i = 0; i < schema_count; i++) {
 | |
|     ObIJsonBase *value = nullptr;
 | |
|     ASSERT_EQ(OB_SUCCESS, json_schema.schema_map_->get_array_element(i, value));
 | |
|     j_buf.reset();
 | |
|     ASSERT_EQ(OB_SUCCESS, value->print(j_buf, false));
 | |
|     cout<<"json_schema "<<i<<" : "<<j_buf.ptr()<<endl;
 | |
|     ASSERT_EQ(ObString(j_buf.ptr()), allof_nested_str[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| # define NOT_NESTED_COUNT 3
 | |
| ObString not_nested_str[NOT_NESTED_COUNT] = {
 | |
|   "{\"not\": [{\"not\": [2]}], \"schema\": {\"type\": 64, \"additionalItems\": 4}, \"tupleItems\": {\"0\": {\"schema\": {\"type\": 8}}, \"1\": {\"schema\": {\"type\": 4}}, \"2\": {\"schema\": {\"enum\": [\"Street\", \"Avenue\", \"Boulevard\"]}}, \"3\": {\"schema\": {\"enum\": [\"NW\", \"NE\", \"SW\", \"SE\"]}}}, \"composition\": [2]}",
 | |
|   "{}",
 | |
|   "{\"required\": [\"city\"]}"
 | |
| };
 | |
| TEST_F(TestJsonSchema, test_not_nested)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"array\","
 | |
|   "\"items\": [{ \"type\": \"number\" },"
 | |
|     "{ \"type\": \"string\" },"
 | |
|     "{ \"enum\": [\"Street\", \"Avenue\", \"Boulevard\"] },"
 | |
|     "{ \"enum\": [\"NW\", \"NE\", \"SW\", \"SE\"] }],"
 | |
|   "\"additionalItems\": false,"
 | |
|   "\"not\": "
 | |
|     "{ \"not\": {\"required\":[\"city\"]}}}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   int schema_count = json_schema.schema_map_->element_count();
 | |
|   ASSERT_EQ(NOT_NESTED_COUNT, schema_count);
 | |
|   for (int i = 0; i < schema_count; i++) {
 | |
|     ObIJsonBase *value = nullptr;
 | |
|     ASSERT_EQ(OB_SUCCESS, json_schema.schema_map_->get_array_element(i, value));
 | |
|     j_buf.reset();
 | |
|     ASSERT_EQ(OB_SUCCESS, value->print(j_buf, false));
 | |
|     cout<<"json_schema "<<i<<" : "<<j_buf.ptr()<<endl;
 | |
|     ASSERT_EQ(ObString(j_buf.ptr()), not_nested_str[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| # define COUNT_COMPLEX_SCHEMA 17
 | |
| ObString complex_str[COUNT_COMPLEX_SCHEMA] = {
 | |
|   "{\"allOf\": [[2], [3, 4], [{\"oneOf\": [[5, {\"allOf\": [[6]]}]]}]], \"anyOf\": [[7], [8, 9, 10, 11, 12, 13], [{\"oneOf\": [[14], [], [15, 16]]}]], "
 | |
|   "\"schema\": {\"type\": 32, \"required\": [\"street_address\"]}, \"properties\": {\"city\": {\"composition\": [9, 12]}, \"state\": {\"composition\": [3, 10, 13]}, \"street_address\": {\"schema\": {\"type\": 32}, "
 | |
|   "\"properties\": {\"k2\": {\"schema\": {\"type\": 4}}}, \"composition\": [16]}}, \"composition\": [2, 5, 6, 7, 8, 14, 15], \"patternProperties\": {\"^[cs]*\": {\"composition\": [11]}, \"^city*\": {\"schema\": {\"type\": 4}}}, "
 | |
|   "\"additionalProperties\": [[[\"street_address\"], [\"^city*\"]], {\"schema\": {\"type\": 4}}, [[\"state\"], []], {\"composition\": [4]}]}",
 | |
|   "{}",
 | |
|   "{\"type\": 32}",
 | |
|   "{\"type\": 4}",
 | |
|   "{\"maxProperties\": 6}",
 | |
|   "{\"type\": 8}",
 | |
|   "{\"required\": [\"city\"]}",
 | |
|   "{\"type\": 32}",
 | |
|   "{\"type\": 32}",
 | |
|   "{\"type\": 4}",
 | |
|   "{\"type\": 4}",
 | |
|   "{\"type\": 4}",
 | |
|   "-1",
 | |
|   "-1",
 | |
|   "{\"type\": 8}",
 | |
|   "{\"type\": 32}",
 | |
|   "{\"type\": 4}",
 | |
| };
 | |
| TEST_F(TestJsonSchema, test_complex_schema)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"object\","
 | |
|   "\"properties\": {\"street_address\": { \"type\": \"object\", \"properties\": {\"k2\":{\"type\": \"string\"}}}},"
 | |
|   "\"patternProperties\": {\"^city*\": { \"type\": \"string\" }},"
 | |
|   "\"additionalProperties\": { \"type\": \"string\" },"
 | |
|   "\"required\": [\"street_address\"],"
 | |
| 
 | |
|   "\"allOf\": [{\"type\":\"object\",\"require\":[\"state\"]},"
 | |
|   "{\"properties\": {\"state\": { \"type\": \"string\"} },"
 | |
|   "\"additionalProperties\": { \"maxProperties\": 6}},"
 | |
|   "{ \"oneOf\": [{\"type\": \"number\",\"allOf\":[{\"required\":[\"city\"]}]}]}],"
 | |
|   "\"anyOf\": [{\"type\":\"object\"},{\"type\": \"object\","
 | |
|   "\"properties\": {\"city\": { \"type\": \"string\" },\"state\": { \"type\": \"string\" }},"
 | |
|     "\"patternProperties\": {\"^[cs]*\": { \"type\": \"string\" }}},"
 | |
|     "{ \"oneOf\": [{\"type\": \"number\"},{\"maxmum\":10},"
 | |
|     "{\"type\": \"object\",\"properties\": {\"street_address\":{\"type\": \"string\"}}}]}]}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   int schema_count = json_schema.schema_map_->element_count();
 | |
|   ASSERT_EQ(COUNT_COMPLEX_SCHEMA, schema_count);
 | |
|   for (int i = 0; i < schema_count; i++) {
 | |
|     ObIJsonBase *value = nullptr;
 | |
|     ASSERT_EQ(OB_SUCCESS, json_schema.schema_map_->get_array_element(i, value));
 | |
|     j_buf.reset();
 | |
|     ASSERT_EQ(OB_SUCCESS, value->print(j_buf, false));
 | |
|     cout<<"json_schema "<<i<<" : "<<j_buf.ptr()<<endl;
 | |
|     ASSERT_EQ(ObString(j_buf.ptr()), complex_str[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| # define STRING_VALIDATOR_COUNT 8
 | |
| ObString string_validator_text = {
 | |
|   "[\"S_1\",\"S_\", \"S\", \"S_12\", [\"S_1\"] , 12 , true , null ]"
 | |
| };
 | |
| bool string_validator_ans[STRING_VALIDATOR_COUNT] = {true, true, false, false, false, false, false, false};
 | |
| TEST_F(TestJsonSchema, test_validate_string_type)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"string\",\"pattern\":\"^S_\",\"minLength\": 2,\"maxLength\": 3}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   ObJsonSchemaValidator schema_validator(&allocator, json_schema.schema_map_);
 | |
|   ObIJsonBase *j_doc = NULL;
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, string_validator_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_doc, 0));
 | |
|   for (int i = 0; i < STRING_VALIDATOR_COUNT; ++i) {
 | |
|     ObIJsonBase *j_value = NULL;
 | |
|     bool is_valid = false;
 | |
|     ASSERT_EQ(OB_SUCCESS,j_doc->get_array_element(i, j_value));
 | |
|     ASSERT_EQ(OB_SUCCESS,schema_validator.schema_validator(j_value, is_valid));
 | |
|     //cout<<i<<":"<<is_valid<<endl;
 | |
|     ASSERT_EQ(is_valid, string_validator_ans[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| # define NULL_VALIDATOR_COUNT 5
 | |
| ObString null_validator_text = {
 | |
|   "[null,\"S_\", 12 , true , [12] ]"
 | |
| };
 | |
| bool null_validator_ans[NULL_VALIDATOR_COUNT] = {true, false, false, false, false};
 | |
| TEST_F(TestJsonSchema, test_validate_null_type)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"null\",\"pattern\":\"^S_\",\"minLength\": 2,\"maxLength\": 3}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   ObJsonSchemaValidator schema_validator(&allocator, json_schema.schema_map_);
 | |
|   ObIJsonBase *j_doc = NULL;
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, null_validator_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_doc, 0));
 | |
|   for (int i = 0; i < NULL_VALIDATOR_COUNT; ++i) {
 | |
|     ObIJsonBase *j_value = NULL;
 | |
|     bool is_valid = false;
 | |
|     ASSERT_EQ(OB_SUCCESS,j_doc->get_array_element(i, j_value));
 | |
|     ASSERT_EQ(OB_SUCCESS,schema_validator.schema_validator(j_value, is_valid));
 | |
|     //cout<<i<<":"<<is_valid<<endl;
 | |
|     ASSERT_EQ(is_valid, null_validator_ans[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| ObString bool_validator_text = {
 | |
|   "[null,\"S_\", 12 , true , [12] ]"
 | |
| };
 | |
| bool bool_validator_ans[NULL_VALIDATOR_COUNT] = {false, false, false, true, false};
 | |
| TEST_F(TestJsonSchema, test_validate_bool_type)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"boolean\",\"pattern\":\"^S_\",\"minLength\": 2,\"maxLength\": 3}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   ObJsonSchemaValidator schema_validator(&allocator, json_schema.schema_map_);
 | |
|   ObIJsonBase *j_doc = NULL;
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, null_validator_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_doc, 0));
 | |
|   for (int i = 0; i < NULL_VALIDATOR_COUNT; ++i) {
 | |
|     ObIJsonBase *j_value = NULL;
 | |
|     bool is_valid = false;
 | |
|     ASSERT_EQ(OB_SUCCESS,j_doc->get_array_element(i, j_value));
 | |
|     ASSERT_EQ(OB_SUCCESS,schema_validator.schema_validator(j_value, is_valid));
 | |
|     //cout<<i<<":"<<is_valid<<endl;
 | |
|     ASSERT_EQ(is_valid, bool_validator_ans[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| # define NUMBER_VALIDATOR_COUNT 10
 | |
| ObString number_validator_text = {
 | |
|   "[0, 100, 50, 50.5, 3.141592653, true, false, \"test\", {\"a\":1}, [2]]"
 | |
| };
 | |
| bool number_validator_ans[NUMBER_VALIDATOR_COUNT] = {true, false, true, true, true, false, false, false, false, false};
 | |
| TEST_F(TestJsonSchema, test_validate_number_type)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"number\", \"minimum\": 0, \"maximum\": 100, \"exclusiveMinimum\": false, \"exclusiveMaximum\": true}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   ObJsonSchemaValidator schema_validator(&allocator, json_schema.schema_map_);
 | |
|   ObIJsonBase *j_doc = NULL;
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, number_validator_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_doc, 0));
 | |
|   for (int i = 0; i < NUMBER_VALIDATOR_COUNT; ++i) {
 | |
|     ObIJsonBase *j_value = NULL;
 | |
|     bool is_valid = false;
 | |
|     ASSERT_EQ(OB_SUCCESS,j_doc->get_array_element(i, j_value));
 | |
|     ASSERT_EQ(OB_SUCCESS,schema_validator.schema_validator(j_value, is_valid));
 | |
|     //cout<<i<<":"<<is_valid<<endl;
 | |
|     ASSERT_EQ(is_valid, number_validator_ans[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| # define INTEGER_VALIDATOR_COUNT 10
 | |
| ObString integer_validator_text = {
 | |
|   "[0, 100, 50, \"50.5\", 3.141592653, true, false, \"test\", {\"a\":1}, [2]]"
 | |
| };
 | |
| bool integer_validator_ans[INTEGER_VALIDATOR_COUNT] = {true, true, true, false, false, false, false, false, false, false};
 | |
| TEST_F(TestJsonSchema, test_validate_integer_type)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"integer\", \"minimum\": 0, \"maximum\": 100.5, \"exclusiveMinimum\": false, \"exclusiveMaximum\": true}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   ObJsonSchemaValidator schema_validator(&allocator, json_schema.schema_map_);
 | |
|   ObIJsonBase *j_doc = NULL;
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, integer_validator_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_doc, 0));
 | |
|   for (int i = 0; i < INTEGER_VALIDATOR_COUNT; ++i) {
 | |
|     ObIJsonBase *j_value = NULL;
 | |
|     bool is_valid = false;
 | |
|     ASSERT_EQ(OB_SUCCESS,j_doc->get_array_element(i, j_value));
 | |
|     ASSERT_EQ(OB_SUCCESS,schema_validator.schema_validator(j_value, is_valid));
 | |
|     //cout<<i<<":"<<is_valid<<endl;
 | |
|     ASSERT_EQ(is_valid, integer_validator_ans[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| # define OBJECT_SCALAR_VALIDATOR_COUNT 10
 | |
| ObString object_scalar_validator_text = {
 | |
|   "[{\"name\": 0, \"test\": 1, \"credit_card\": 2, \"billing_address\": 3},"
 | |
|   "{\"name\": 0, \"test\": 1},"
 | |
|   "{\"name\": 0, \"billing_address\": 3},"
 | |
|   "{\"name\": 0, \"credit_card\": 2, \"billing_address\": 3},"
 | |
|   "{\"name\": 0},"
 | |
|   "{\"credit_card\": 2, \"billing_address\": 3},"
 | |
|   "{\"name\": 0, \"credit_card\": 2},"
 | |
|   "{\"name\": 0, \"credit_card\": 2, \"billing_address1\": 3},"
 | |
|   "{\"name\": 0, \"credit_card\": 2, \"billing_addresss\": 3},"
 | |
|   "[{\"name\": 0, \"test\": 1, \"credit_card\": 2, \"billing_address\": 3}]"
 | |
|   "]"
 | |
| };
 | |
| bool object_scalar_validator_ans[OBJECT_SCALAR_VALIDATOR_COUNT] = {true, true, true, true, false, false, false, false, false, false};
 | |
| TEST_F(TestJsonSchema, test_object_scalar_type)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"object\",\"minProperties\": 2,\"maxProperties\": 3.5,"
 | |
|                           "\"dependencies\": {\"credit_card\": [\"billing_address\"]},"
 | |
|                           "\"required\": [\"name\"]}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   ObJsonSchemaValidator schema_validator(&allocator, json_schema.schema_map_);
 | |
|   ObIJsonBase *j_doc = NULL;
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, object_scalar_validator_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_doc, 0));
 | |
|   for (int i = 0; i < OBJECT_SCALAR_VALIDATOR_COUNT; ++i) {
 | |
|     ObIJsonBase *j_value = NULL;
 | |
|     bool is_valid = false;
 | |
|     ASSERT_EQ(OB_SUCCESS, j_doc->get_array_element(i, j_value));
 | |
|     ASSERT_EQ(OB_SUCCESS,schema_validator.schema_validator(j_value, is_valid));
 | |
|     //cout<<i<<":"<<is_valid<<endl;
 | |
|     ASSERT_EQ(is_valid, object_scalar_validator_ans[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| # define ARRAY_SCALAR_VALIDATOR_COUNT 5
 | |
| ObString array_scalar_validator_text = {
 | |
|   "[[1],"
 | |
|   "[1,2,3,4,5],"
 | |
|   "[1,2,3,4,5,6],"
 | |
|   "[1,2,3,1],"
 | |
|   "{\"name\": 0, \"test\": 1, \"credit_card\": 2, \"billing_address\": 3}"
 | |
|   "]"
 | |
| };
 | |
| bool array_scalar_validator_ans[ARRAY_SCALAR_VALIDATOR_COUNT] = {true, true, false, false, false};
 | |
| TEST_F(TestJsonSchema, test_array_scalar_type)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"array\", \"minItems\": 2.5, \"maxItems\": 5, \"uniqueItems\": true}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   ObJsonSchemaValidator schema_validator(&allocator, json_schema.schema_map_);
 | |
|   ObIJsonBase *j_doc = NULL;
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, array_scalar_validator_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_doc, 0));
 | |
|   for (int i = 0; i < ARRAY_SCALAR_VALIDATOR_COUNT; ++i) {
 | |
|     ObIJsonBase *j_value = NULL;
 | |
|     bool is_valid = false;
 | |
|     ASSERT_EQ(OB_SUCCESS, j_doc->get_array_element(i, j_value));
 | |
|     ASSERT_EQ(OB_SUCCESS,schema_validator.schema_validator(j_value, is_valid));
 | |
|     //cout<<i<<":"<<is_valid<<endl;
 | |
|     ASSERT_EQ(is_valid, array_scalar_validator_ans[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| # define ENUM_VALIDATOR_COUNT 10
 | |
| ObString enum_validator_text = {
 | |
|   "[\"test\", 1, [2], false, null, {\"test\":3}, 2, true, \"test1\", {\"test\":4}]"
 | |
| };
 | |
| bool enum_validator_ans[ENUM_VALIDATOR_COUNT] = {true, true, true, true, true, true, false, false, false, false};
 | |
| TEST_F(TestJsonSchema, test_enum_validator)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"enum\": [\"test\", 1, false, null, [2], {\"test\":3}]}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   ObJsonSchemaValidator schema_validator(&allocator, json_schema.schema_map_);
 | |
|   ObIJsonBase *j_doc = NULL;
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator,enum_validator_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_doc, 0));
 | |
|   for (int i = 0; i < ENUM_VALIDATOR_COUNT; ++i) {
 | |
|     ObIJsonBase *j_value = NULL;
 | |
|     bool is_valid = false;
 | |
|     ASSERT_EQ(OB_SUCCESS, j_doc->get_array_element(i, j_value));
 | |
|     ASSERT_EQ(OB_SUCCESS,schema_validator.schema_validator(j_value, is_valid));
 | |
|     //cout<<i<<":"<<is_valid<<endl;
 | |
|     ASSERT_EQ(is_valid, enum_validator_ans[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| # define PRO_VALIDATOR_COUNT 6
 | |
| ObString pro_validator_text = {
 | |
|   "[{\"number\": 1600, \"street_name\": \"Pennsylvania\", \"street_type\": \"Avenue\" },"
 | |
|   "{ },"
 | |
|   "{\"number\": 1600, \"street_name\": \"Pennsylvania\" },"
 | |
|   "{\"number\": \"1600\", \"street_name\": \"Pennsylvania\", \"street_type\": \"Avenue\"},"
 | |
|   "{\"number\": 1600, \"street_name\": \"Pennsylvania\", \"street_type\": \"Avenue\", \"direction\": \"NW\"},"
 | |
|   "{\"number\": 1600, \"street_name\": \"Pennsylvania\", \"street_type\": \"test\" }]"
 | |
| };
 | |
| bool pro_validator_ans[PRO_VALIDATOR_COUNT] = {true, true, true, false, false, false};
 | |
| TEST_F(TestJsonSchema, test_pro_validator)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"object\","
 | |
|   "\"properties\": {"
 | |
|     "\"number\": { \"type\": \"number\" },"
 | |
|     "\"street_name\": { \"type\": \"string\" },"
 | |
|     "\"street_type\": { \"enum\": [\"Street\", \"Avenue\", \"Boulevard\"]}},"
 | |
|     "\"additionalProperties\": false}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   ObJsonSchemaValidator schema_validator(&allocator, json_schema.schema_map_);
 | |
|   ObIJsonBase *j_doc = NULL;
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, pro_validator_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_doc, 0));
 | |
|   for (int i = 0; i < PRO_VALIDATOR_COUNT; ++i) {
 | |
|     ObIJsonBase *j_value = NULL;
 | |
|     bool is_valid = false;
 | |
|     ASSERT_EQ(OB_SUCCESS, j_doc->get_array_element(i, j_value));
 | |
|     ASSERT_EQ(OB_SUCCESS,schema_validator.schema_validator(j_value, is_valid));
 | |
|     //cout<<i<<":"<<is_valid<<endl;
 | |
|     ASSERT_EQ(is_valid, pro_validator_ans[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| # define PATTERN_PRO_VALIDATOR_COUNT 8
 | |
| ObString pattern_pro_validator_text = {
 | |
|   "[{ \"S_25\": \"This is a string\" },"
 | |
|   "{ },"
 | |
|   "{ \"I_0\": 42 },"
 | |
|   "{ \"I_0\": 42, \"S_25\": \"This is a string\", \"S_test\": \"string\" },"
 | |
|   "{ \"keyword\": \"value\" },"
 | |
|   "{ \"S_25\": \"test\" },"
 | |
|   "{ \"S_25\": \"This is a string\" , \"I_0\": 42, \"I_1\": \"test\"},"
 | |
|   "{ \"S_25\": \"This is a string\" , \"I_0\": \"test\", \"I_0\": 42}]"
 | |
| };
 | |
| bool pattern_pro_validator_ans[PATTERN_PRO_VALIDATOR_COUNT] = {true, true, true, true, false, false, false, false};
 | |
| TEST_F(TestJsonSchema, test_pattern_pro_validator)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"object\","
 | |
|   "\"properties\": {"
 | |
|     "\"S_25\": { \"minLength\": 5 }},"
 | |
|   "\"patternProperties\": {"
 | |
|     "\"^S_\": { \"type\": \"string\" },"
 | |
|     "\"^I_\": { \"type\": \"integer\"}},"
 | |
|     "\"additionalProperties\": false}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   ObJsonSchemaValidator schema_validator(&allocator, json_schema.schema_map_);
 | |
|   ObIJsonBase *j_doc = NULL;
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, pattern_pro_validator_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_doc, ObJsonParser::JSN_PRESERVE_DUP_FLAG));
 | |
|   for (int i = 0; i < PATTERN_PRO_VALIDATOR_COUNT; ++i) {
 | |
|     ObIJsonBase *j_value = NULL;
 | |
|     bool is_valid = false;
 | |
|     ASSERT_EQ(OB_SUCCESS, j_doc->get_array_element(i, j_value));
 | |
|     ASSERT_EQ(OB_SUCCESS,schema_validator.schema_validator(j_value, is_valid));
 | |
|     j_buf.reset();
 | |
|     j_value->print(j_buf, false);
 | |
|     // cout<<i<<":"<<is_valid<<": "<<j_buf.ptr()<<endl;
 | |
|     ASSERT_EQ(is_valid, pattern_pro_validator_ans[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| # define ADD_PRO_VALIDATOR_COUNT 10
 | |
| ObString add_pro_validator_text = {
 | |
|   "[{ \"S_25\": \"This is a string\" },"
 | |
|   "{ },"
 | |
|   "{ \"I_0\": 42 },"
 | |
|   "{ \"I_0\": 42, \"S_25\": \"This is a string\", \"S_test\": \"string\" },"
 | |
|   "{ \"builtin\": 42 },"
 | |
|   "{ \"keyword\": \"value\" },"
 | |
|   "{ \"keyword\": 16 },"
 | |
|   "{ \"I_0\": 2.5 },"
 | |
|   "{ \"test1\": true},"
 | |
|   "{ \"test2\": null}]"
 | |
| };
 | |
| bool add_pro_validator_ans[ADD_PRO_VALIDATOR_COUNT] = {true, true, true, true, true, true, false, false, false, false};
 | |
| TEST_F(TestJsonSchema, test_add_pro_validator)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"object\","
 | |
|   "\"properties\": {\"builtin\": { \"type\": \"number\" }},"
 | |
|   "\"patternProperties\": {\"^S_\": { \"type\": \"string\" },\"^I_\": { \"type\": \"integer\" }},"
 | |
|   "\"additionalProperties\": { \"type\": \"string\" }}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   ObJsonSchemaValidator schema_validator(&allocator, json_schema.schema_map_);
 | |
|   ObIJsonBase *j_doc = NULL;
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, add_pro_validator_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_doc, 0));
 | |
|   for (int i = 0; i < json_schema.schema_map_->element_count(); ++i) {
 | |
|     ObIJsonBase *value = nullptr;
 | |
|     ASSERT_EQ(OB_SUCCESS, json_schema.schema_map_->get_array_element(i, value));
 | |
|     j_buf.reset();
 | |
|     ASSERT_EQ(OB_SUCCESS, value->print(j_buf, false));
 | |
|     cout<<"json_schema "<<i<<" : "<<j_buf.ptr()<<endl;
 | |
|   }
 | |
|   for (int i = 0; i < ADD_PRO_VALIDATOR_COUNT; ++i) {
 | |
|     ObIJsonBase *j_value = NULL;
 | |
|     bool is_valid = false;
 | |
|     ASSERT_EQ(OB_SUCCESS, j_doc->get_array_element(i, j_value));
 | |
|     ASSERT_EQ(OB_SUCCESS,schema_validator.schema_validator(j_value, is_valid));
 | |
|     cout<<i<<":"<<is_valid<<endl;
 | |
|     ASSERT_EQ(is_valid, add_pro_validator_ans[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| # define ITEMS_VALIDATOR_COUNT 4
 | |
| ObString items_validator_text = {
 | |
|   "[[\"NW\", \"NE\", \"SW\", \"SE\"],"
 | |
|   "[],"
 | |
|   "[\"NW\"],"
 | |
|   "[\"NW\", \"NE\", \"SW\", \"SE\", \"test\"]]"
 | |
| };
 | |
| bool items_validator_ans[ITEMS_VALIDATOR_COUNT] = {true, true, true, false};
 | |
| TEST_F(TestJsonSchema, test_items_validator)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"array\","
 | |
|   "\"items\": { \"enum\": [\"NW\", \"NE\", \"SW\", \"SE\"]},"
 | |
|   "\"additionalItems\": true}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   ObJsonSchemaValidator schema_validator(&allocator, json_schema.schema_map_);
 | |
|   ObIJsonBase *j_doc = NULL;
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, items_validator_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_doc, 0));
 | |
|   for (int i = 0; i < ITEMS_VALIDATOR_COUNT; ++i) {
 | |
|     ObIJsonBase *j_value = NULL;
 | |
|     bool is_valid = false;
 | |
|     ASSERT_EQ(OB_SUCCESS, j_doc->get_array_element(i, j_value));
 | |
|     ASSERT_EQ(OB_SUCCESS,schema_validator.schema_validator(j_value, is_valid));
 | |
|     //cout<<i<<":"<<is_valid<<endl;
 | |
|     ASSERT_EQ(is_valid, items_validator_ans[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| # define TUPLE_ITEMS_VALIDATOR_COUNT 4
 | |
| ObString tuple_items_validator_text = {
 | |
|   "[[1600, \"Pennsylvania\", \"Avenue\", \"NW\"],"
 | |
|   "[],"
 | |
|   "[1600, \"Pennsylvania\", \"Avenue\"],"
 | |
|   "[1600, \"Pennsylvania\", \"Avenue\", \"NW\", \"test\"]]"
 | |
| };
 | |
| bool tuple_items_validator_ans[TUPLE_ITEMS_VALIDATOR_COUNT] = {true, true, true, false};
 | |
| TEST_F(TestJsonSchema, test_tuple_items_validator)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"array\","
 | |
|   "\"items\": ["
 | |
|     "{ \"type\": \"number\" },"
 | |
|     "{ \"type\": \"string\" },"
 | |
|     "{ \"enum\": [\"Street\", \"Avenue\", \"Boulevard\"] },"
 | |
|     "{ \"enum\": [\"NW\", \"NE\", \"SW\", \"SE\"] }],"
 | |
|   "\"additionalItems\": false}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   ObJsonSchemaValidator schema_validator(&allocator, json_schema.schema_map_);
 | |
|   ObIJsonBase *j_doc = NULL;
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, tuple_items_validator_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_doc, 0));
 | |
|   for (int i = 0; i < TUPLE_ITEMS_VALIDATOR_COUNT; ++i) {
 | |
|     ObIJsonBase *j_value = NULL;
 | |
|     bool is_valid = false;
 | |
|     ASSERT_EQ(OB_SUCCESS, j_doc->get_array_element(i, j_value));
 | |
|     ASSERT_EQ(OB_SUCCESS, schema_validator.schema_validator(j_value, is_valid));
 | |
|     //cout<<i<<":"<<is_valid<<endl;
 | |
|     ASSERT_EQ(is_valid, tuple_items_validator_ans[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| # define ADD_ITEMS_VALIDATOR_COUNT 4
 | |
| ObString add_items_validator_text = {
 | |
|   "[[1600, \"Pennsylvania\", \"Avenue\", \"NW\"],"
 | |
|   "[],"
 | |
|   "[1600, \"Pennsylvania\", \"Avenue\", \"NW\", 89757],"
 | |
|   "[1600, \"Pennsylvania\", \"Avenue\", \"NW\", \"test\"]]"
 | |
| };
 | |
| bool add_items_validator_ans[ADD_ITEMS_VALIDATOR_COUNT] = {true, true, true, false};
 | |
| TEST_F(TestJsonSchema, test_add_items_validator)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"array\","
 | |
|   "\"items\": ["
 | |
|     "{ \"type\": \"number\" },"
 | |
|     "{ \"type\": \"string\" },"
 | |
|     "{ \"enum\": [\"Street\", \"Avenue\", \"Boulevard\"] },"
 | |
|     "{ \"enum\": [\"NW\", \"NE\", \"SW\", \"SE\"] }],"
 | |
|   "\"additionalItems\": { \"type\": \"number\" }}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   ObJsonSchemaValidator schema_validator(&allocator, json_schema.schema_map_);
 | |
|   ObIJsonBase *j_doc = NULL;
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, add_items_validator_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_doc, 0));
 | |
|   for (int i = 0; i < ADD_ITEMS_VALIDATOR_COUNT; ++i) {
 | |
|     ObIJsonBase *j_value = NULL;
 | |
|     bool is_valid = false;
 | |
|     ASSERT_EQ(OB_SUCCESS, j_doc->get_array_element(i, j_value));
 | |
|     ASSERT_EQ(OB_SUCCESS, schema_validator.schema_validator(j_value, is_valid));
 | |
|     //cout<<i<<":"<<is_valid<<endl;
 | |
|     ASSERT_EQ(is_valid, add_items_validator_ans[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| # define UNNESTED_ALLOF_VALIDATOR_COUNT 6
 | |
| ObString unnested_allof_validator_text = {
 | |
|   "[[1600, \"test\", \"Avenue\", \"NW\"],"
 | |
|   "[],"
 | |
|   "[1600, \"test\", \"Avenue\"],"
 | |
|   "[1600, \"Pennsylvania\", \"Avenue\", \"NW\"],"
 | |
|   "[1600, \"test\", \"Boulevard\", \"NW\"],"
 | |
|   "[1600]]"
 | |
| };
 | |
| bool unnested_allof_validator_ans[UNNESTED_ALLOF_VALIDATOR_COUNT] = {true, true, true, false, false, true};
 | |
| TEST_F(TestJsonSchema, test_unnested_allof_validator)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"array\","
 | |
|   "\"items\": [{ \"type\": \"number\" },"
 | |
|     "{ \"type\": \"string\" },"
 | |
|     "{ \"enum\": [\"Street\", \"Avenue\", \"Boulevard\"] },"
 | |
|     "{ \"enum\": [\"NW\", \"NE\", \"SW\", \"SE\"] }],"
 | |
|   "\"additionalItems\": false,"
 | |
|   "\"allOf\": [{\"items\":{ \"maxLength\": 6 }}]}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   ObJsonSchemaValidator schema_validator(&allocator, json_schema.schema_map_);
 | |
|   ObIJsonBase *j_doc = NULL;
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, unnested_allof_validator_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_doc, 0));
 | |
|   for (int i = 0; i < UNNESTED_ALLOF_VALIDATOR_COUNT; ++i) {
 | |
|     ObIJsonBase *j_value = NULL;
 | |
|     bool is_valid = false;
 | |
|     ASSERT_EQ(OB_SUCCESS, j_doc->get_array_element(i, j_value));
 | |
|     ASSERT_EQ(OB_SUCCESS, schema_validator.schema_validator(j_value, is_valid));
 | |
|     //cout<<i<<":"<<is_valid<<endl;
 | |
|     ASSERT_EQ(is_valid, unnested_allof_validator_ans[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| # define UNNESTED_ANYOF_VALIDATOR_COUNT 6
 | |
| ObString unnested_anyof_validator_text = {
 | |
|   "[[1600, \"test\", \"Avenue\", \"NW\"],"
 | |
|   "[],"
 | |
|   "[1600, \"test\", \"Avenue\"],"
 | |
|   "[1600, \"Pennsylvania\", \"Avenue\", \"NW\"],"
 | |
|   "[1600, \"test\", \"Boulevard\", \"NW\"],"
 | |
|   "[1600]]"
 | |
| };
 | |
| bool unnested_anyof_validator_ans[UNNESTED_ANYOF_VALIDATOR_COUNT] = {true, true, true, false, true, true};
 | |
| TEST_F(TestJsonSchema, test_unnested_anyof_validator)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"array\","
 | |
|   "\"items\": [{ \"type\": \"number\" },"
 | |
|     "{ \"type\": \"string\" },"
 | |
|     "{ \"enum\": [\"Street\", \"Avenue\", \"Boulevard\"] },"
 | |
|     "{ \"enum\": [\"NW\", \"NE\", \"SW\", \"SE\"] }],"
 | |
|   "\"additionalItems\": false,"
 | |
|   "\"anyOf\": [{\"items\":{ \"maxLength\": 6 }}, {\"items\":{ \"maxLength\": 9 }}]}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   ObJsonSchemaValidator schema_validator(&allocator, json_schema.schema_map_);
 | |
|   ObIJsonBase *j_doc = NULL;
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, unnested_anyof_validator_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_doc, 0));
 | |
|   for (int i = 0; i < UNNESTED_ANYOF_VALIDATOR_COUNT; ++i) {
 | |
|     ObIJsonBase *j_value = NULL;
 | |
|     bool is_valid = false;
 | |
|     ASSERT_EQ(OB_SUCCESS, j_doc->get_array_element(i, j_value));
 | |
|     ASSERT_EQ(OB_SUCCESS, schema_validator.schema_validator(j_value, is_valid));
 | |
|     //cout<<i<<":"<<is_valid<<endl;
 | |
|     ASSERT_EQ(is_valid, unnested_anyof_validator_ans[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| # define UNNESTED_ONEOF_VALIDATOR_COUNT 6
 | |
| ObString unnested_oneof_validator_text = {
 | |
|   "[[1600, \"test\", \"Avenue\", \"NW\"],"
 | |
|   "[],"
 | |
|   "[1600, \"test\", \"Boulevard\"],"
 | |
|   "[1600, \"Pennsylvania\", \"Boulevard\"],"
 | |
|   "[1600, \"test\", \"Boulevard\",\"SW\"],"
 | |
|   "[1600]]"
 | |
| };
 | |
| bool unnested_oneof_validator_ans[UNNESTED_ONEOF_VALIDATOR_COUNT] = {false, false, true, true, true, false};
 | |
| TEST_F(TestJsonSchema, test_unnested_oneof_validator)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"array\","
 | |
|   "\"items\": [{ \"type\": \"number\" },"
 | |
|     "{ \"type\": \"string\" },"
 | |
|     "{ \"enum\": [\"Street\", \"Avenue\", \"Boulevard\"] },"
 | |
|     "{ \"enum\": [\"NW\", \"NE\", \"SW\", \"SE\"] }],"
 | |
|   "\"additionalItems\": false,"
 | |
|   "\"oneOf\": [{\"items\":{ \"maxLength\": 6 }}, {\"items\":{ \"maxLength\": 12 }}]}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   ObJsonSchemaValidator schema_validator(&allocator, json_schema.schema_map_);
 | |
|   ObIJsonBase *j_doc = NULL;
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, unnested_oneof_validator_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_doc, 0));
 | |
|   for (int i = 0; i < UNNESTED_ONEOF_VALIDATOR_COUNT; ++i) {
 | |
|     ObIJsonBase *j_value = NULL;
 | |
|     bool is_valid = false;
 | |
|     ASSERT_EQ(OB_SUCCESS, j_doc->get_array_element(i, j_value));
 | |
|     ASSERT_EQ(OB_SUCCESS, schema_validator.schema_validator(j_value, is_valid));
 | |
|     //cout<<i<<":"<<is_valid<<endl;
 | |
|     ASSERT_EQ(is_valid, unnested_oneof_validator_ans[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| # define UNNESTED_NOT_VALIDATOR_COUNT 6
 | |
| ObString unnested_not_validator_text = {
 | |
|   "[[1600, \"test\", \"Avenue\", \"NW\"],"
 | |
|   "[],"
 | |
|   "[1600, \"test\", \"Boulevard\"],"
 | |
|   "[1600, \"Pennsylvania\"],"
 | |
|   "[1600, \"test\", \"Boulevard\",\"SW\"],"
 | |
|   "[1600]]"
 | |
| };
 | |
| bool unnested_not_validator_ans[UNNESTED_NOT_VALIDATOR_COUNT] = {true, false, true, false, true, false};
 | |
| TEST_F(TestJsonSchema, test_unnested_not_validator)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"array\","
 | |
|   "\"items\": [{ \"type\": \"number\" },"
 | |
|     "{ \"type\": \"string\" },"
 | |
|     "{ \"enum\": [\"Street\", \"Avenue\", \"Boulevard\"] },"
 | |
|     "{ \"enum\": [\"NW\", \"NE\", \"SW\", \"SE\"] }],"
 | |
|   "\"additionalItems\": false,"
 | |
|   "\"not\": {\"items\":{ \"minLength\": 9 }}}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   ObJsonSchemaValidator schema_validator(&allocator, json_schema.schema_map_);
 | |
|   ObIJsonBase *j_doc = NULL;
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, unnested_not_validator_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_doc, 0));
 | |
|   for (int i = 0; i < UNNESTED_NOT_VALIDATOR_COUNT; ++i) {
 | |
|     ObIJsonBase *j_value = NULL;
 | |
|     bool is_valid = false;
 | |
|     ASSERT_EQ(OB_SUCCESS, j_doc->get_array_element(i, j_value));
 | |
|     ASSERT_EQ(OB_SUCCESS, schema_validator.schema_validator(j_value, is_valid));
 | |
|     //cout<<i<<":"<<is_valid<<endl;
 | |
|     ASSERT_EQ(is_valid, unnested_not_validator_ans[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| # define UNNESTED_DEP_SCHEMA_VALIDATOR_COUNT 6
 | |
| ObString unnested_dep_schema_validator_text = {
 | |
|   "[{\"name\":\"test_name\", \"last_name\":\"test_last_name\", \"credit_card\": 123, \"billing_address\": \"addstr\"},"
 | |
|   "[],"
 | |
|   "{\"name\":\"test_name\", \"last_name\":\"test_last_name\", \"billing_address\": \"add_str\"},"
 | |
|   "{\"name\":\"test_name\", \"billing_address\": \"add_str\"},"
 | |
|   "{\"name\":\"test_name\", \"last_name\":\"test_last_name\", \"credit_card\": 123},"
 | |
|   "{\"name\":\"test_name\", \"last_name\":\"test_last_name\", \"credit_card\": 123, \"billing_address\": 123}]"
 | |
| };
 | |
| bool unnested_dep_schema_validator_ans[UNNESTED_DEP_SCHEMA_VALIDATOR_COUNT] = {true, false, true, false, true, false};
 | |
| TEST_F(TestJsonSchema, test_unnested_dep_schema_validator)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"object\","
 | |
|   "\"properties\": {"
 | |
|     "\"name\": { \"type\": \"string\" },"
 | |
|     "\"credit_card\": { \"type\": \"number\" },"
 | |
|     "\"billing_address\": { \"type\": \"string\" }},"
 | |
|   "\"required\": [\"name\"],"
 | |
|   "\"dependencies\": {"
 | |
|     "\"credit_card\": {"
 | |
|       "\"properties\": {"
 | |
|         "\"billing_address\": {  \"maxLength\": 6  }}},"
 | |
|     "\"name\": [\"last_name\"]}}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   ObJsonSchemaValidator schema_validator(&allocator, json_schema.schema_map_);
 | |
|   ObIJsonBase *j_doc = NULL;
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, unnested_dep_schema_validator_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_doc, 0));
 | |
|   for (int i = 0; i < UNNESTED_DEP_SCHEMA_VALIDATOR_COUNT; ++i) {
 | |
|     ObIJsonBase *j_value = NULL;
 | |
|     bool is_valid = false;
 | |
|     ASSERT_EQ(OB_SUCCESS, j_doc->get_array_element(i, j_value));
 | |
|     ASSERT_EQ(OB_SUCCESS, schema_validator.schema_validator(j_value, is_valid));
 | |
|     //cout<<i<<":"<<is_valid<<endl;
 | |
|     ASSERT_EQ(is_valid, unnested_dep_schema_validator_ans[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| # define COMPLEX_VALIDATOR_COUNT 3
 | |
| ObString complex_validator_text = {
 | |
|   "[{\"street_address\": {\"k2\": \"Pennsylvania Avenue NW\"}, \"city\": \"Washington\",\"state\": \"DC\",\"type\": \"business\"},"
 | |
|   "{\"street_address\": {\"k2\": \"Pennsylvania Avenue NW\"}, \"city\": \"Washington\",\"state\": \"DC\",\"type\": \"business\", \"test1\": \"test\", \"test2\": \"test\", \"test3\": \"test\"},"
 | |
|   "{\"street_address\": {\"k2\": \"Pennsylvania Avenue NW\"}, \"city\": \"Washington\",\"state\": \"DC\",\"type\": \"business\", \"test_pro\": \"test\"}"
 | |
|   "]"
 | |
| };
 | |
| bool complex_validator_ans[COMPLEX_VALIDATOR_COUNT] = {true, true, false};
 | |
| TEST_F(TestJsonSchema, test_complex_schema_validator)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"type\": \"object\","
 | |
|   "\"properties\": {\"street_address\": "
 | |
|   "{ \"type\": \"object\", "
 | |
|   "\"properties\": {\"k2\":{\"type\": \"string\"}}}},"
 | |
|   "\"patternProperties\": {\"^city*\": { \"type\": \"string\" }},"
 | |
|   "\"additionalProperties\": { \"type\": \"string\" },"
 | |
|   "\"required\": [\"street_address\"],"
 | |
|   "\"allOf\": ["
 | |
|   "{\"type\":\"object\",\"require\":[\"state\"]},"
 | |
|   "{\"properties\": {\"state\": { \"type\": \"string\"} }, \"additionalProperties\": { \"maxProperties\": 6}},"
 | |
|   "{ \"oneOf\": ["
 | |
|     "{\"required\":[\"test_pro\"]},"
 | |
|     "{\"allOf\":[{\"required\":[\"state\"]}]}"
 | |
|   "]}],"
 | |
|   "\"anyOf\": ["
 | |
|   "{\"type\":\"object\"},"
 | |
|   "{\"type\": \"object\","
 | |
|   "\"properties\": {\"city\": { \"type\": \"string\" },\"state\": { \"type\": \"string\" }},"
 | |
|     "\"patternProperties\": {\"^[cs]*\": { \"type\": \"string\" }}},"
 | |
|     "{ \"oneOf\": [{\"type\": \"number\"},{\"maximum\":10},"
 | |
|     "{\"type\": \"object\",\"properties\": {\"street_address\":{\"type\": \"string\"}}}]}]}");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   ObJsonSchemaValidator schema_validator(&allocator, json_schema.schema_map_);
 | |
|   ObIJsonBase *j_doc = NULL;
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, complex_validator_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_doc, 0));
 | |
|   for (int i = 0; i < json_schema.schema_map_->element_count(); ++i) {
 | |
|     ObIJsonBase *value = nullptr;
 | |
|     ASSERT_EQ(OB_SUCCESS, json_schema.schema_map_->get_array_element(i, value));
 | |
|     j_buf.reset();
 | |
|     ASSERT_EQ(OB_SUCCESS, value->print(j_buf, false));
 | |
|     //cout<<"json_schema "<<i<<" : "<<j_buf.ptr()<<endl;
 | |
|   }
 | |
|   for (int i = 0; i < COMPLEX_VALIDATOR_COUNT; ++i) {
 | |
|     ObIJsonBase *j_value = NULL;
 | |
|     bool is_valid = false;
 | |
|     ASSERT_EQ(OB_SUCCESS, j_doc->get_array_element(i, j_value));
 | |
|     ASSERT_EQ(OB_SUCCESS, schema_validator.schema_validator(j_value, is_valid));
 | |
|     //cout<<i<<":"<<is_valid<<endl;
 | |
|     ASSERT_EQ(is_valid, complex_validator_ans[i]);
 | |
|   }
 | |
| }
 | |
| 
 | |
| TEST_F(TestJsonSchema, test_complex_schema2)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObIJsonBase *j_tree = NULL;
 | |
|   ObIJsonBase *j_bin = NULL;
 | |
|   ObJsonSeekResult hit;
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   common::ObString j_text("{\"definitions\": {\"item\": {\"type\": \"array\",\"additionalItems\": false,"
 | |
|                 "\"items\": [{ \"$ref\": \"#/definitions/sub-item\" },{ \"$ref\": \"#/definitions/sub-item\" }]},"
 | |
|                 "\"sub-item\": {\"type\": \"object\",\"required\": [\"foo\"]}},"
 | |
|             "\"type\": \"array\",\"additionalItems\": false,"
 | |
|             "\"items\": [{ \"$ref\": \"#/\" },{ \"$ref\": \"#/definitions/item\" },"
 | |
|            " { \"$ref\": \"#/definitions/item\" }]}");
 | |
|   ObString j_doc_txt("[[ {\"foo\": null}, {\"foo\": null} ]]");
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_text,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree, ObJsonParser::JSN_SCHEMA_FLAG));
 | |
|   ObJsonSchemaTree json_schema(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, json_schema.build_schema_tree(j_tree));
 | |
|   ObJsonSchemaValidator schema_validator(&allocator, json_schema.schema_map_);
 | |
|   ObIJsonBase *j_doc = NULL;
 | |
|   ASSERT_EQ(OB_SUCCESS, ObJsonBaseFactory::get_json_base(&allocator, j_doc_txt,
 | |
|       ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_doc, 0));
 | |
|   for (int i = 0; i < json_schema.schema_map_->element_count(); ++i) {
 | |
|     ObIJsonBase *value = nullptr;
 | |
|     ASSERT_EQ(OB_SUCCESS, json_schema.schema_map_->get_array_element(i, value));
 | |
|     j_buf.reset();
 | |
|     ASSERT_EQ(OB_SUCCESS, value->print(j_buf, false));
 | |
|     //cout<<"json_schema "<<i<<" : "<<j_buf.ptr()<<endl;
 | |
|   }
 | |
|   bool is_valid = false;
 | |
|   ASSERT_EQ(OB_SUCCESS, schema_validator.schema_validator(j_doc, is_valid));
 | |
|   ASSERT_EQ(true, is_valid);
 | |
| }
 | |
| 
 | |
| # define REGEX_COUNT 6
 | |
| ObString regex_pattern_str[REGEX_COUNT] = {
 | |
|   "^S_",
 | |
|   "^I_",
 | |
|   "^[SI]*",
 | |
|   "^[+-]?\\d{1,3}\\.?\\d?$",
 | |
|   "f.o",
 | |
|   /*"^*"*/"("
 | |
| };
 | |
| ObString regex_valid_str[REGEX_COUNT] = {
 | |
|   "S_25",
 | |
|   "I_0",
 | |
|   "I_0",
 | |
|   "+0.1",
 | |
|   "foo",
 | |
|   "S_25"
 | |
| };
 | |
| TEST_F(TestJsonSchema, test_regex_match)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObJsonBuffer j_buf(&allocator);
 | |
|   for(int i = 0; i < REGEX_COUNT; ++i) {
 | |
|     bool is_valid = false;
 | |
|     ObJsonSchemaUtils::is_valid_pattern(regex_pattern_str[i], j_buf, is_valid);
 | |
|     if (is_valid) {
 | |
|       ObJsonSchemaUtils::if_regex_match(regex_valid_str[i], regex_pattern_str[i], j_buf, is_valid);
 | |
|       //cout<<"pattern "<<i<<" : "<<is_valid<<endl;
 | |
|       ASSERT_EQ(is_valid, true);
 | |
|     } else {
 | |
|       ASSERT_EQ(i, REGEX_COUNT-1);
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| } // namespace common
 | |
| } // namespace oceanbase
 | |
| 
 | |
| int main(int argc, char** argv)
 | |
| {
 | |
|   ::testing::InitGoogleTest(&argc, argv);
 | |
|   /*
 | |
|   system("rm -f test_json_schema.log");
 | |
|   OB_LOGGER.set_file_name("test_json_schema.log");
 | |
|   OB_LOGGER.set_log_level("INFO");
 | |
|   */
 | |
|   return RUN_ALL_TESTS();
 | |
| }
 |