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();
|
|
}
|