246 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			246 lines
		
	
	
		
			12 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.
 | |
|  */
 | |
| 
 | |
| #define USING_LOG_PREFIX SHARE
 | |
| #include <gtest/gtest.h>
 | |
| #define private public
 | |
| #include "lib/oblog/ob_log.h"
 | |
| #include "lib/time/ob_time_utility.h"
 | |
| #define private public
 | |
| #include "share/schema/ob_outline_mgr.h"
 | |
| 
 | |
| namespace oceanbase {
 | |
| using namespace share::schema;
 | |
| 
 | |
| namespace common {
 | |
| 
 | |
| class TestOutlineMgr : public ::testing::Test {};
 | |
| 
 | |
| #define GEN_OUTLINE_SCHEMA(outline_schema, tenant_id, outline_id, database_id, name, signature, schema_version) \
 | |
|   outline_schema.reset();                                                                                       \
 | |
|   outline_schema.set_tenant_id(tenant_id);                                                                      \
 | |
|   outline_schema.set_outline_id(outline_id);                                                                    \
 | |
|   outline_schema.set_database_id(database_id);                                                                  \
 | |
|   outline_schema.set_name(name);                                                                                \
 | |
|   outline_schema.set_signature(signature);                                                                      \
 | |
|   outline_schema.set_schema_version(schema_version);
 | |
| 
 | |
| #define OUTLINE_EQUAL(a, b)                                    \
 | |
|   ASSERT_EQ((a).get_tenant_id(), (b).get_tenant_id());         \
 | |
|   ASSERT_EQ((a).get_outline_id(), (b).get_outline_id());       \
 | |
|   ASSERT_EQ((a).get_database_id(), (b).get_database_id());     \
 | |
|   ASSERT_EQ((a).get_name_str(), (b).get_name_str());           \
 | |
|   ASSERT_EQ((a).get_signature_str(), (b).get_signature_str()); \
 | |
|   ASSERT_EQ((a).get_schema_version(), (b).get_schema_version());
 | |
| 
 | |
| TEST_F(TestOutlineMgr, basic_interface)
 | |
| {
 | |
|   ObOutlineMgr outline_mgr;
 | |
|   uint64_t tenant_id = 1;
 | |
|   uint64_t outline_id = combine_id(1, 1);
 | |
|   uint64_t database_id = combine_id(1, 1);
 | |
|   ObString name;
 | |
|   ObString signature;
 | |
|   ObSimpleOutlineSchema outline_schema;
 | |
|   ObArray<const ObSimpleOutlineSchema*> outlines;
 | |
| 
 | |
|   // add_outline
 | |
|   outline_mgr.reset();
 | |
|   tenant_id = 1;
 | |
|   outline_id = combine_id(1, 1);
 | |
|   database_id = combine_id(1, 1);
 | |
|   name = "outline1";
 | |
|   signature = "sig";
 | |
|   const ObSimpleOutlineSchema* outline = NULL;
 | |
|   GEN_OUTLINE_SCHEMA(outline_schema, tenant_id, outline_id, database_id, name, signature, 0);
 | |
|   ASSERT_EQ(OB_SUCCESS, outline_mgr.add_outline(outline_schema));
 | |
|   // get outline by id
 | |
|   ASSERT_EQ(OB_SUCCESS, outline_mgr.get_outline_schema(outline_id, outline));
 | |
|   OUTLINE_EQUAL(outline_schema, *outline);
 | |
|   ASSERT_EQ(OB_SUCCESS, outline_mgr.get_outline_schema(combine_id(1, 2), outline));
 | |
|   ASSERT_EQ(NULL, outline);
 | |
|   // get outline by name
 | |
|   ASSERT_EQ(OB_SUCCESS, outline_mgr.get_outline_schema_with_name(tenant_id, database_id, name, outline));
 | |
|   OUTLINE_EQUAL(outline_schema, *outline);
 | |
|   ASSERT_EQ(
 | |
|       OB_SUCCESS, outline_mgr.get_outline_schema_with_signature(tenant_id, database_id, "outline_not_exist", outline));
 | |
|   ASSERT_EQ(NULL, outline);
 | |
|   // del_outline
 | |
|   ASSERT_EQ(OB_SUCCESS, outline_mgr.del_outline(ObTenantOutlineId(tenant_id, outline_id)));
 | |
|   ASSERT_EQ(OB_SUCCESS, outline_mgr.get_outline_schema(outline_id, outline));
 | |
|   ASSERT_EQ(NULL, outline);
 | |
|   ASSERT_EQ(OB_SUCCESS, outline_mgr.get_outline_schema_with_name(tenant_id, database_id, name, outline));
 | |
|   ASSERT_EQ(NULL, outline);
 | |
|   ASSERT_EQ(OB_SUCCESS, outline_mgr.get_outline_schema_with_signature(tenant_id, database_id, signature, outline));
 | |
|   ASSERT_EQ(NULL, outline);
 | |
|   // add outlines
 | |
|   outline_mgr.reset();
 | |
|   ObArray<ObSimpleOutlineSchema> outline_schemas;
 | |
|   GEN_OUTLINE_SCHEMA(outline_schema, 1, combine_id(1, 1), combine_id(1, 1), "outline1", "sig1", 0);
 | |
|   outline_schemas.push_back(outline_schema);
 | |
|   GEN_OUTLINE_SCHEMA(outline_schema, 1, combine_id(1, 2), combine_id(1, 1), "outline2", "sig2", 0);
 | |
|   outline_schemas.push_back(outline_schema);
 | |
|   GEN_OUTLINE_SCHEMA(outline_schema, 1, combine_id(1, 3), combine_id(1, 1), "outline3", "sig3", 0);
 | |
|   outline_schemas.push_back(outline_schema);
 | |
|   GEN_OUTLINE_SCHEMA(outline_schema, 1, combine_id(1, 4), combine_id(1, 1), "outline4", "sig4", 0);
 | |
|   outline_schemas.push_back(outline_schema);
 | |
|   ASSERT_EQ(OB_SUCCESS, outline_mgr.add_outlines(outline_schemas));
 | |
|   ASSERT_EQ(OB_SUCCESS, outline_mgr.get_outline_schemas_in_tenant(tenant_id, outlines));
 | |
|   ASSERT_EQ(4, outlines.count());
 | |
|   for (int64_t i = 0; i < 4; ++i) {
 | |
|     OUTLINE_EQUAL(*outlines.at(i), outline_schemas.at(i));
 | |
|   }
 | |
|   // del outlines
 | |
|   ObArray<ObTenantOutlineId> tenant_outline_ids;
 | |
|   tenant_outline_ids.push_back(ObTenantOutlineId(1, combine_id(1, 1)));
 | |
|   tenant_outline_ids.push_back(ObTenantOutlineId(1, combine_id(1, 2)));
 | |
|   tenant_outline_ids.push_back(ObTenantOutlineId(1, combine_id(1, 3)));
 | |
|   tenant_outline_ids.push_back(ObTenantOutlineId(1, combine_id(1, 4)));
 | |
|   ASSERT_EQ(OB_SUCCESS, outline_mgr.del_outlines(tenant_outline_ids));
 | |
|   ASSERT_EQ(OB_SUCCESS, outline_mgr.get_outline_schemas_in_tenant(tenant_id, outlines));
 | |
|   ASSERT_EQ(0, outlines.count());
 | |
| 
 | |
|   // del schemas in tenant
 | |
|   outline_mgr.reset();
 | |
|   GEN_OUTLINE_SCHEMA(outline_schema, 1, combine_id(1, 1), combine_id(1, 1), "outline1", "sig1", 0);
 | |
|   ASSERT_EQ(OB_SUCCESS, outline_mgr.add_outline(outline_schema));
 | |
|   GEN_OUTLINE_SCHEMA(outline_schema, 1, combine_id(1, 2), combine_id(1, 1), "outline2", "sig2", 0);
 | |
|   ASSERT_EQ(OB_SUCCESS, outline_mgr.add_outline(outline_schema));
 | |
|   ASSERT_EQ(OB_SUCCESS, outline_mgr.get_outline_schemas_in_tenant(1, outlines));
 | |
|   ASSERT_EQ(2, outlines.count());
 | |
|   ASSERT_EQ(OB_SUCCESS, outline_mgr.del_schemas_in_tenant(1));
 | |
|   ASSERT_EQ(OB_SUCCESS, outline_mgr.get_outline_schemas_in_tenant(1, outlines));
 | |
|   ASSERT_EQ(0, outlines.count());
 | |
| }
 | |
| 
 | |
| TEST_F(TestOutlineMgr, iteration_interface)
 | |
| {
 | |
|   {
 | |
|     // get outlines in tenant
 | |
|     ObOutlineMgr outline_mgr;
 | |
|     ObArray<ObSimpleOutlineSchema> outline_schemas1;
 | |
|     ObArray<ObSimpleOutlineSchema> outline_schemas2;
 | |
|     ObArray<const ObSimpleOutlineSchema*> outlines;
 | |
|     ObSimpleOutlineSchema outline_schema;
 | |
|     GEN_OUTLINE_SCHEMA(outline_schema, 1, combine_id(1, 1), combine_id(1, 1), "outline1", "sig1", 0);
 | |
|     outline_schemas1.push_back(outline_schema);
 | |
|     ASSERT_EQ(OB_SUCCESS, outline_mgr.add_outline(outline_schema));
 | |
|     GEN_OUTLINE_SCHEMA(outline_schema, 1, combine_id(1, 2), combine_id(1, 1), "outline2", "sig2", 0);
 | |
|     outline_schemas1.push_back(outline_schema);
 | |
|     ASSERT_EQ(OB_SUCCESS, outline_mgr.add_outline(outline_schema));
 | |
|     GEN_OUTLINE_SCHEMA(outline_schema, 2, combine_id(2, 1), combine_id(2, 1), "outline3", "sig3", 0);
 | |
|     outline_schemas2.push_back(outline_schema);
 | |
|     ASSERT_EQ(OB_SUCCESS, outline_mgr.add_outline(outline_schema));
 | |
|     GEN_OUTLINE_SCHEMA(outline_schema, 2, combine_id(2, 2), combine_id(2, 1), "outline4", "sig4", 0);
 | |
|     outline_schemas2.push_back(outline_schema);
 | |
|     ASSERT_EQ(OB_SUCCESS, outline_mgr.add_outline(outline_schema));
 | |
|     ASSERT_EQ(OB_SUCCESS, outline_mgr.get_outline_schemas_in_tenant(1, outlines));
 | |
|     ASSERT_EQ(2, outlines.count());
 | |
|     for (int64_t i = 1; i < outlines.count(); ++i) {
 | |
|       const ObSimpleOutlineSchema* simple_outline = outlines.at(i);
 | |
|       for (int64_t j = 1; j < outline_schemas1.count(); ++j) {
 | |
|         const ObSimpleOutlineSchema& outline = outline_schemas1.at(j);
 | |
|         if (simple_outline->get_outline_id() == outline.get_outline_id()) {
 | |
|           OUTLINE_EQUAL((*simple_outline), outline);
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|     ASSERT_EQ(OB_SUCCESS, outline_mgr.get_outline_schemas_in_tenant(2, outlines));
 | |
|     ASSERT_EQ(2, outlines.count());
 | |
|     for (int64_t i = 1; i < outlines.count(); ++i) {
 | |
|       const ObSimpleOutlineSchema* simple_outline = outlines.at(i);
 | |
|       for (int64_t j = 1; j < outline_schemas2.count(); ++j) {
 | |
|         const ObSimpleOutlineSchema& outline = outline_schemas2.at(j);
 | |
|         if (simple_outline->get_outline_id() == outline.get_outline_id()) {
 | |
|           OUTLINE_EQUAL((*simple_outline), outline);
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   {
 | |
|     // get outlines in database
 | |
|     ObOutlineMgr outline_mgr;
 | |
|     ObArray<ObSimpleOutlineSchema> outline_schemas1;
 | |
|     ObArray<ObSimpleOutlineSchema> outline_schemas2;
 | |
|     ObArray<const ObSimpleOutlineSchema*> outlines;
 | |
|     ObSimpleOutlineSchema outline_schema;
 | |
|     GEN_OUTLINE_SCHEMA(outline_schema, 1, combine_id(1, 1), combine_id(1, 1), "outline1", "sig1", 0);
 | |
|     outline_schemas1.push_back(outline_schema);
 | |
|     ASSERT_EQ(OB_SUCCESS, outline_mgr.add_outline(outline_schema));
 | |
|     GEN_OUTLINE_SCHEMA(outline_schema, 1, combine_id(1, 2), combine_id(1, 1), "outline2", "sig2", 0);
 | |
|     outline_schemas1.push_back(outline_schema);
 | |
|     ASSERT_EQ(OB_SUCCESS, outline_mgr.add_outline(outline_schema));
 | |
|     GEN_OUTLINE_SCHEMA(outline_schema, 1, combine_id(1, 3), combine_id(1, 2), "outline3", "sig3", 0);
 | |
|     outline_schemas2.push_back(outline_schema);
 | |
|     ASSERT_EQ(OB_SUCCESS, outline_mgr.add_outline(outline_schema));
 | |
|     GEN_OUTLINE_SCHEMA(outline_schema, 1, combine_id(1, 4), combine_id(1, 2), "outline4", "sig4", 0);
 | |
|     outline_schemas2.push_back(outline_schema);
 | |
|     ASSERT_EQ(OB_SUCCESS, outline_mgr.add_outline(outline_schema));
 | |
|     ASSERT_EQ(OB_SUCCESS, outline_mgr.get_outline_schemas_in_database(1, combine_id(1, 1), outlines));
 | |
|     ASSERT_EQ(2, outlines.count());
 | |
|     for (int64_t i = 1; i < outlines.count(); ++i) {
 | |
|       const ObSimpleOutlineSchema* simple_outline = outlines.at(i);
 | |
|       for (int64_t j = 1; j < outline_schemas1.count(); ++j) {
 | |
|         const ObSimpleOutlineSchema& outline = outline_schemas1.at(j);
 | |
|         if (simple_outline->get_outline_id() == outline.get_outline_id()) {
 | |
|           OUTLINE_EQUAL((*simple_outline), outline);
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|     ASSERT_EQ(OB_SUCCESS, outline_mgr.get_outline_schemas_in_database(1, combine_id(1, 2), outlines));
 | |
|     ASSERT_EQ(2, outlines.count());
 | |
|     for (int64_t i = 1; i < outlines.count(); ++i) {
 | |
|       const ObSimpleOutlineSchema* simple_outline = outlines.at(i);
 | |
|       for (int64_t j = 1; j < outline_schemas2.count(); ++j) {
 | |
|         const ObSimpleOutlineSchema& outline = outline_schemas2.at(j);
 | |
|         if (simple_outline->get_outline_id() == outline.get_outline_id()) {
 | |
|           OUTLINE_EQUAL((*simple_outline), outline);
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| TEST_F(TestOutlineMgr, assign_and_deep_copy)
 | |
| {
 | |
|   ObMalloc global_allocator(ObModIds::OB_TEMP_VARIABLES);
 | |
|   ObOutlineMgr mgr1(global_allocator);
 | |
|   ObOutlineMgr mgr2;
 | |
|   ObOutlineMgr mgr3;
 | |
|   ObSimpleOutlineSchema outline_schema;
 | |
|   GEN_OUTLINE_SCHEMA(outline_schema, 1, combine_id(1, 1), combine_id(1, 1), "sys_outline", "sig", 0);
 | |
|   ASSERT_EQ(OB_SUCCESS, mgr1.add_outline(outline_schema));
 | |
|   ASSERT_EQ(OB_SUCCESS, mgr2.assign(mgr1));
 | |
|   ASSERT_EQ(0, mgr2.local_allocator_.used());
 | |
|   ASSERT_EQ(OB_SUCCESS, mgr3.deep_copy(mgr1));
 | |
|   ASSERT_NE(0, mgr3.local_allocator_.used());
 | |
| 
 | |
|   const ObSimpleOutlineSchema* outline = NULL;
 | |
|   ASSERT_EQ(OB_SUCCESS, mgr2.get_outline_schema(combine_id(1, 1), outline));
 | |
|   ASSERT_TRUE(NULL != outline);
 | |
|   ASSERT_EQ(outline_schema, *outline);
 | |
|   ASSERT_EQ(OB_SUCCESS, mgr3.get_outline_schema(combine_id(1, 1), outline));
 | |
|   ASSERT_TRUE(NULL != outline);
 | |
|   ASSERT_EQ(outline_schema, *outline);
 | |
| }
 | |
| 
 | |
| }  // namespace common
 | |
| }  // namespace oceanbase
 | |
| 
 | |
| int main(int argc, char** argv)
 | |
| {
 | |
|   oceanbase::common::ObLogger::get_logger().set_log_level("INFO");
 | |
|   testing::InitGoogleTest(&argc, argv);
 | |
|   return RUN_ALL_TESTS();
 | |
| }
 | 
