Files
oceanbase/unittest/share/schema/test_outline_mgr.cpp
oceanbase-admin cea7de1475 init push
2021-05-31 22:56:52 +08:00

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