Files
oceanbase/unittest/data_dictionary/test_data_dict_struct.cpp

273 lines
10 KiB
C++

/**
* Copyright (c) 2022 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.
*
* This file defines test_ob_cdc_part_trans_resolver.cpp
*/
#include "gtest/gtest.h"
#include "data_dict_test_utils.h"
using namespace oceanbase;
using namespace common;
using namespace share;
using namespace share::schema;
namespace oceanbase
{
namespace datadict
{
TEST(ObDictMetaHeader, test_raw)
{
ObDictMetaHeader header(ObDictMetaType::TABLE_META);
ObDictMetaHeader header_after(ObDictMetaType::INVALID_META);
SCN scn;
header.version_ = OB_INVALID_VERSION;
header.set_snapshot_scn(scn);
header.set_storage_type(ObDictMetaStorageType::FULL);
EXPECT_FALSE(header.is_valid());
scn.convert_for_gts(get_timestamp());
header.set_snapshot_scn(scn);
header.set_dict_serialize_length(9678);
EXPECT_TRUE(header.is_valid());
const int64_t serialize_size = header.get_serialize_size();
char *buf = (char*)ob_malloc(serialize_size, "test");
int64_t pos = 0;
EXPECT_EQ(OB_SUCCESS, header.serialize(buf, serialize_size, pos));
EXPECT_EQ(serialize_size, pos);
int64_t deserialize_pos = 0;
EXPECT_EQ(OB_SUCCESS, header_after.deserialize(buf, serialize_size, deserialize_pos));
EXPECT_EQ(serialize_size, deserialize_pos);
EXPECT_TRUE(header == header_after);
// verify serialize_size is not changed after change storage_type
header.set_storage_type(ObDictMetaStorageType::MIDDLE);
EXPECT_EQ(serialize_size, header.get_serialize_size());
}
TEST(ObDictTenantMeta, test_raw)
{
ObArenaAllocator allocator;
ObArenaAllocator allocator_for_deserialize;
ObDictTenantMeta tenant_meta(&allocator);
ObDictMetaHeader header(ObDictMetaType::TENANT_META);
tenant_meta.tenant_id_ = 1001;
tenant_meta.schema_version_=100003124341;
tenant_meta.tenant_name_ = "md_tenant";
tenant_meta.tenant_status_ = ObTenantStatus::TENANT_STATUS_NORMAL;
tenant_meta.charset_type_ = ObCharsetType::CHARSET_GB18030;
tenant_meta.collation_type_ = ObCollationType::CS_TYPE_GB18030_ZH3_0900_AS_CS;
ObLSArray ls_arr;
EXPECT_EQ(OB_SUCCESS, ls_arr.push_back(ObLSID(1)));
EXPECT_EQ(OB_SUCCESS, ls_arr.push_back(ObLSID(1004)));
tenant_meta.ls_arr_.assign(ls_arr);
const int64_t serialize_size = tenant_meta.get_serialize_size();
DDLOG(INFO, "tenant_meta", K(tenant_meta), K(serialize_size));
char *buf = (char*)ob_malloc(serialize_size, "test");
int64_t pos = 0;
EXPECT_EQ(OB_SUCCESS, tenant_meta.serialize(buf, serialize_size, pos));
DDLOG(INFO, "serialize_info", K(serialize_size), K(pos));
ObDictTenantMeta tenant_meta_after(&allocator_for_deserialize);
int64_t deserialize_pos = 0;
EXPECT_EQ(OB_SUCCESS, tenant_meta_after.deserialize(header, buf, serialize_size, deserialize_pos));
DDLOG(INFO, "deserialized_meta", K(deserialize_pos), K(tenant_meta_after));
ob_free(buf);
EXPECT_EQ(serialize_size, deserialize_pos);
EXPECT_EQ(OB_INVALID_TENANT_ID, tenant_meta_after.tenant_id_);
// EXPECT_EQ(tenant_meta.tenant_id_, tenant_meta_after.tenant_id_);
EXPECT_EQ(tenant_meta.tenant_name_, tenant_meta_after.tenant_name_);
EXPECT_EQ(ls_arr[1], tenant_meta_after.ls_arr_[1]);
EXPECT_TRUE(tenant_meta == tenant_meta_after);
tenant_meta_after.ls_arr_.push_back(ObLSID(8930));
EXPECT_FALSE(tenant_meta == tenant_meta_after);
}
TEST(ObDictDatabaseMeta, test_raw)
{
ObArenaAllocator allocator;
ObArenaAllocator allocator_for_deserialize;
ObDictDatabaseMeta db_meta(&allocator);
ObDictMetaHeader header(ObDictMetaType::DATABASE_META);
db_meta.database_id_ = 1003030501;
db_meta.tenant_id_ = 23412;
db_meta.schema_version_ = 790134621334;
db_meta.database_name_ = "md_test_db";
db_meta.charset_type_ = ObCharsetType::CHARSET_UTF8MB4;
db_meta.collation_type_ = ObCollationType::CS_TYPE_UTF8MB4_UNICODE_CI;
db_meta.name_case_mode_ = ObNameCaseMode::OB_ORIGIN_AND_INSENSITIVE;
db_meta.in_recyclebin_ = true;
const int64_t serialize_size = db_meta.get_serialize_size();
DDLOG(INFO, "db_meta", K(db_meta), K(serialize_size));
char *buf = (char*)ob_malloc(serialize_size, "test");
int64_t pos = 0;
EXPECT_EQ(OB_SUCCESS, db_meta.serialize(buf, serialize_size, pos));
DDLOG(INFO, "serialize_info", K(serialize_size), K(pos));
ObDictDatabaseMeta db_meta_after(&allocator_for_deserialize);
int64_t deserialize_pos = 0;
EXPECT_EQ(OB_SUCCESS, db_meta_after.deserialize(header, buf, serialize_size, deserialize_pos));
DDLOG(INFO, "deserialized_meta", K(deserialize_pos), K(db_meta_after));
ob_free(buf);
EXPECT_EQ(serialize_size, deserialize_pos);
EXPECT_EQ(db_meta.database_id_, db_meta_after.database_id_);
EXPECT_EQ(OB_INVALID_TENANT_ID, db_meta_after.tenant_id_);
//EXPECT_EQ(db_meta.tenant_id_, db_meta_after.tenant_id_);
EXPECT_EQ(db_meta.database_name_, db_meta_after.database_name_);
EXPECT_EQ(db_meta.schema_version_, db_meta_after.schema_version_);
EXPECT_EQ(db_meta.name_case_mode_, db_meta_after.name_case_mode_);
EXPECT_EQ(db_meta.in_recyclebin_, db_meta_after.in_recyclebin_);
EXPECT_EQ(db_meta.collation_type_, db_meta_after.collation_type_);
EXPECT_TRUE(db_meta == db_meta_after);
db_meta_after.database_id_ = 4376212345;
EXPECT_FALSE(db_meta == db_meta_after);
}
TEST(ObDictColumnMeta, test_raw)
{
ObArenaAllocator allocator;
ObArenaAllocator allocator_for_deserialize;
DictTableMetaBuilder meta_builder;
ObDictColumnMeta col_meta(&allocator);
ObDictMetaHeader header(ObDictMetaType::TABLE_META);
meta_builder.build_column_meta(&col_meta);
DDLOG(INFO, "build_column_meta", K(col_meta));
const int64_t serialize_size = col_meta.get_serialize_size();
char *buf = (char*)ob_malloc(serialize_size, "test");
int64_t pos = 0;
EXPECT_EQ(OB_SUCCESS, col_meta.serialize(buf, serialize_size, pos));
DDLOG(INFO, "serialize_info", K(serialize_size), K(pos));
ObDictColumnMeta col_meta_after(&allocator_for_deserialize);
int64_t deserialize_pos = 0;
EXPECT_EQ(OB_SUCCESS, col_meta_after.deserialize(header, buf, serialize_size, deserialize_pos));
DDLOG(INFO, "deserialized_meta", K(deserialize_pos), K(col_meta_after));
ob_free(buf);
EXPECT_EQ(serialize_size, deserialize_pos);
EXPECT_EQ(col_meta.column_name_, col_meta_after.column_name_);
EXPECT_EQ(col_meta.orig_default_value_, col_meta_after.orig_default_value_);
EXPECT_TRUE(col_meta == col_meta_after);
ObObjMeta new_meta;
new_meta.set_clob();
col_meta_after.orig_default_value_.set_meta_type(new_meta);
EXPECT_FALSE(col_meta == col_meta_after);
}
TEST(ObObjMeta, test_objmeta_serialize)
{
ObObjMeta objmeta;
objmeta.set_collation_type(ObCollationType::CS_TYPE_GB18030_BIN);
objmeta.set_collation_level(ObCollationLevel::CS_LEVEL_IGNORABLE);
DDLOG(INFO, "build_objmeta", K(objmeta));
const int64_t serialize_size = objmeta.get_serialize_size();
char *buf = (char*)ob_malloc(serialize_size, "test");
int64_t pos = 0;
EXPECT_EQ(OB_SUCCESS, objmeta.serialize(buf, serialize_size, pos));
DDLOG(INFO, "serialize_info", K(serialize_size), K(pos));
ObObjMeta objmet_after;
int64_t deserialize_pos = 0;
EXPECT_EQ(OB_SUCCESS, objmet_after.deserialize(buf, serialize_size, deserialize_pos));
DDLOG(INFO, "deserialized_meta", K(deserialize_pos), K(objmet_after));
EXPECT_EQ(serialize_size, deserialize_pos);
EXPECT_TRUE(objmeta == objmet_after);
ob_free(buf);
}
TEST(ObRowkeyColumn, test_rowkey_col)
{
ObRowkeyColumn rcol;
rcol.column_id_ = 245763451346;
rcol.length_ = 431652345;
rcol.order_ = ObOrderType::DESC;
rcol.fulltext_flag_ = true;
DDLOG(INFO, "build_rowkey_column", K(rcol));
const int64_t serialize_size = rcol.get_serialize_size();
char *buf = (char*)ob_malloc(serialize_size, "test");
int64_t pos = 0;
EXPECT_EQ(OB_SUCCESS, rcol.serialize(buf, serialize_size, pos));
DDLOG(INFO, "serialize_info", K(serialize_size), K(pos));
ObRowkeyColumn rcol_after_serialize;
int64_t deserialize_pos = 0;
EXPECT_EQ(OB_SUCCESS, rcol_after_serialize.deserialize(buf, serialize_size, deserialize_pos));
DDLOG(INFO, "deserialized_meta", K(deserialize_pos), K(rcol_after_serialize));
ob_free(buf);
EXPECT_EQ(serialize_size, deserialize_pos);
}
TEST(ObDictTableMeta, test_raw)
{
ObArenaAllocator allocator_for_deserialize;
DictTableMetaBuilder meta_builder;
ObDictTableMeta *tb_meta;
ObDictMetaHeader header(ObDictMetaType::TABLE_META);
const int64_t col_count = 4000;
const int64_t rowkey_count = 57;
const int64_t index_column_count = 1235;
EXPECT_EQ(OB_SUCCESS, meta_builder.build_table_meta(tb_meta, rowkey_count, col_count, index_column_count));
EXPECT_NE(nullptr, tb_meta);
DDLOG(INFO, "build_table_meta", KPC(tb_meta));
EXPECT_EQ(rowkey_count, tb_meta->rowkey_column_count_);
EXPECT_EQ(col_count, tb_meta->column_count_);
const int64_t serialize_size = tb_meta->get_serialize_size();
char *buf = (char*)ob_malloc(serialize_size, "test");
int64_t pos = 0;
EXPECT_EQ(OB_SUCCESS, tb_meta->serialize(buf, serialize_size, pos));
DDLOG(INFO, "serialize_info", K(serialize_size), K(pos));
ObDictTableMeta tb_meta_after(&allocator_for_deserialize);
int64_t deserialize_pos = 0;
EXPECT_EQ(OB_SUCCESS, tb_meta_after.deserialize(header, buf, serialize_size, deserialize_pos));
DDLOG(INFO, "deserialized_meta", K(deserialize_pos), K(tb_meta_after));
ob_free(buf);
EXPECT_EQ(serialize_size, deserialize_pos);
EXPECT_EQ(tb_meta->table_name_, tb_meta_after.table_name_);
EXPECT_EQ(rowkey_count, tb_meta_after.rowkey_column_count_);
EXPECT_EQ(col_count, tb_meta_after.column_count_);
EXPECT_TRUE(*tb_meta == tb_meta_after);
tb_meta_after.index_column_count_ ++;
EXPECT_FALSE(*tb_meta == tb_meta_after);
}
} // namespace datadict
} // namespace oceanbase
int main(int argc, char **argv)
{
// testing::FLAGS_gtest_filter = "DO_NOT_RUN";
system("rm -f test_data_dict_struct.log");
ObLogger &logger = ObLogger::get_logger();
bool not_output_obcdc_log = true;
logger.set_file_name("test_data_dict_struct.log", not_output_obcdc_log, false);
logger.set_log_level(OB_LOG_LEVEL_DEBUG);
logger.set_mod_log_levels("ALL.*:DEBUG, DATA_DICT.*:DEBUG");
logger.set_enable_async_log(false);
testing::InitGoogleTest(&argc,argv);
return RUN_ALL_TESTS();
}