149 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			149 lines
		
	
	
		
			5.2 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 "lib/oblog/ob_log.h"
 | |
| #include "logservice/palf/log_define.h"
 | |
| 
 | |
| #define private public
 | |
| #include "logservice/data_dictionary/ob_data_dict_meta_info.h"
 | |
| #undef private
 | |
| 
 | |
| namespace oceanbase
 | |
| {
 | |
| namespace datadict
 | |
| {
 | |
| 
 | |
| TEST(ObDataDictMetaInfoItem, test_data_dict_meta_info_item)
 | |
| {
 | |
|   ObDataDictMetaInfoItem item;
 | |
|   ObRandom random;
 | |
|   const int64_t __MB__ = 1L << 20;
 | |
|   const int64_t item_cnt = 100;
 | |
|   const int64_t buf_size = 2 * __MB__;
 | |
|   char *buf = static_cast<char*>(ob_malloc(buf_size, ObNewModIds::TEST));
 | |
|   int64_t pos = 0;
 | |
|   DataDictMetaInfoItemArr item_arr;
 | |
|   for (int64_t i = 0; i < item_cnt; i++) {
 | |
|     item.reset(random.get(), random.get(), random.get());
 | |
|     EXPECT_EQ(OB_SUCCESS, item_arr.push_back(item));
 | |
|     EXPECT_EQ(OB_SUCCESS, item.serialize(buf, buf_size, pos));
 | |
|   }
 | |
|   int64_t deserialize_pos = 0;
 | |
|   for (int64_t i = 0; i < item_cnt; i++) {
 | |
|     EXPECT_EQ(OB_SUCCESS, item.deserialize(buf, buf_size, deserialize_pos));
 | |
|     EXPECT_EQ(item, item_arr.at(i));
 | |
|   }
 | |
|   ob_free(buf);
 | |
| }
 | |
| 
 | |
| TEST(ObDataDictMetaInfoHeader, test_data_dict_meta_info_header)
 | |
| {
 | |
|   ObDataDictMetaInfoHeader header;
 | |
|   ObRandom random;
 | |
|   const int64_t __MB__ = 1L << 20;
 | |
|   const int64_t buf_size = 2 * __MB__;
 | |
|   char *buf = static_cast<char*>(ob_malloc(buf_size, ObNewModIds::TEST));
 | |
|   header.magic_ = random.get_int32() && 0xFFFF;
 | |
|   header.meta_version_ = 1;
 | |
|   header.item_cnt_ = random.get_int32();
 | |
|   header.min_snapshot_scn_ = random.get();
 | |
|   header.max_snapshot_scn_ = random.get();
 | |
|   header.data_size_ = random.get();
 | |
|   header.checksum_ = random.get();
 | |
|   int64_t serialize_pos = 0;
 | |
|   EXPECT_EQ(OB_SUCCESS, header.serialize(buf, buf_size, serialize_pos));
 | |
|   ObDataDictMetaInfoHeader header_deserialized;
 | |
|   int64_t desirialize_pos = 0;
 | |
|   EXPECT_EQ(OB_SUCCESS, header_deserialized.deserialize(buf, buf_size, desirialize_pos));
 | |
|   EXPECT_EQ(header, header_deserialized);
 | |
| 
 | |
|   ob_free(buf);
 | |
| }
 | |
| 
 | |
| 
 | |
| TEST(ObDataDictMetaInfo, test_data_dict_meta_info)
 | |
| {
 | |
|   ObDataDictMetaInfo meta_info;
 | |
|   DataDictMetaInfoItemArr item_arr;
 | |
|   ObDataDictMetaInfoItem item;
 | |
|   ObMySQLProxy dummy_proxy;
 | |
|   const int64_t buffer_size = 1024*1024;
 | |
|   const int64_t header_size = sizeof(ObDataDictMetaInfoHeader) * 2;
 | |
|   ObRandom random;
 | |
|   const int64_t max_scn_val = share::SCN::max_scn().get_val_for_logservice();
 | |
|   MetaInfoQueryHelper helper(dummy_proxy, OB_SYS_TENANT_ID);
 | |
|   int64_t item_count_expected = 0;
 | |
|   int64_t total_item_data_size = 0;
 | |
|   bool have_enough_buffer = true;
 | |
|   while (have_enough_buffer ) {
 | |
|     item.reset(random.get(0, max_scn_val),
 | |
|         random.get(0, palf::LOG_MAX_LSN_VAL),
 | |
|         random.get(0, palf::LOG_MAX_LSN_VAL));
 | |
|     if (total_item_data_size + item.get_serialize_size() <= buffer_size - header_size) {
 | |
|       item_count_expected++;
 | |
|       total_item_data_size += item.get_serialize_size();
 | |
|       EXPECT_EQ(OB_SUCCESS, item_arr.push_back(item));
 | |
|     } else {
 | |
|       have_enough_buffer = false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   int64_t real_size = 0;
 | |
|   share::SCN scn;
 | |
| 
 | |
|   char *buf = (char*)ob_malloc(buffer_size, "ddmh");
 | |
|   int64_t pos = 0;
 | |
|   EXPECT_EQ(OB_SUCCESS, helper.generate_data_(item_arr, buf, buffer_size, real_size, scn));
 | |
|   EXPECT_EQ(OB_SUCCESS, meta_info.deserialize(buf, buffer_size, pos));
 | |
|   ob_free(buf);
 | |
|   EXPECT_TRUE(meta_info.check_integrity());
 | |
|   EXPECT_EQ(item_count_expected, meta_info.item_arr_.count());
 | |
|   const ObDataDictMetaInfoHeader &header = meta_info.get_header();
 | |
|   EXPECT_EQ(pos - header.get_serialize_size(), header.get_data_size());
 | |
|   EXPECT_EQ(item_count_expected, header.get_item_count());
 | |
|   const DataDictMetaInfoItemArr &meta_info_item_arr = meta_info.get_item_arr();
 | |
|   for (int64_t i = 0; i < item_count_expected; i++) {
 | |
|     EXPECT_EQ(meta_info_item_arr.at(i), item_arr.at(i));
 | |
|   }
 | |
| 
 | |
|   char *new_buf = static_cast<char*>(ob_malloc(buffer_size, ObNewModIds::TEST));
 | |
|   int64_t new_ser_pos = 0;
 | |
|   EXPECT_EQ(OB_SUCCESS, meta_info.serialize(new_buf, buffer_size, new_ser_pos));
 | |
|   ObDataDictMetaInfo new_meta_info;
 | |
|   int64_t new_deser_pos = 0;
 | |
|   EXPECT_EQ(OB_SUCCESS, new_meta_info.deserialize(new_buf, buffer_size, new_deser_pos));
 | |
|   EXPECT_TRUE(new_meta_info.check_integrity());
 | |
|   EXPECT_EQ(meta_info.header_, new_meta_info.header_);
 | |
|   for (int64_t i = 0; i < item_count_expected; i++) {
 | |
|     EXPECT_EQ(meta_info.item_arr_.at(i), new_meta_info.item_arr_.at(i));
 | |
|   }
 | |
|   ob_free(new_buf);
 | |
| }
 | |
| 
 | |
| }
 | |
| }
 | |
| 
 | |
| int main(int argc, char **argv)
 | |
| {
 | |
|   system("rm -f test_data_dict_meta_info.log");
 | |
|   oceanbase::ObLogger &logger = oceanbase::ObLogger::get_logger();
 | |
|   logger.set_file_name("test_data_dict_meta_info.log", true, 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();
 | |
| }
 | 
