191 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			191 lines
		
	
	
		
			6.6 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.
 | |
|  */
 | |
| 
 | |
| #include "clog/ob_info_block_handler.h"
 | |
| 
 | |
| #include <gtest/gtest.h>
 | |
| #include "share/ob_define.h"
 | |
| #include "common/ob_partition_key.h"
 | |
| 
 | |
| namespace oceanbase {
 | |
| using namespace common;
 | |
| using namespace clog;
 | |
| namespace unittest {
 | |
| class ObInfoBlockHandlerTest : public testing::Test {
 | |
| public:
 | |
|   static void SetUpTestCase()
 | |
|   {
 | |
|     EXPECT_EQ(OB_SUCCESS, commit_handler_.init());
 | |
|     EXPECT_EQ(OB_SUCCESS, index_handler_.init());
 | |
|   }
 | |
|   static void TearDownTestCase()
 | |
|   {
 | |
|     commit_handler_.destroy();
 | |
|     index_handler_.destroy();
 | |
|   }
 | |
|   static ObCommitInfoBlockHandler commit_handler_;
 | |
|   static ObIndexInfoBlockHandler index_handler_;
 | |
| };
 | |
| 
 | |
| ObCommitInfoBlockHandler ObInfoBlockHandlerTest::commit_handler_;
 | |
| ObIndexInfoBlockHandler ObInfoBlockHandlerTest::index_handler_;
 | |
| 
 | |
| TEST_F(ObInfoBlockHandlerTest, commit_info_block_handler)
 | |
| {
 | |
|   const int64_t MAX_BUF_LEN = 512 * 1024;
 | |
|   char buf[MAX_BUF_LEN];
 | |
| 
 | |
|   common::ObPartitionKey key1(1099511627777, 1, 1);
 | |
|   common::ObPartitionKey key2(1099511627778, 1, 1);
 | |
|   common::ObPartitionKey key3(1099511627779, 1, 1);
 | |
| 
 | |
|   commit_handler_.update_info(key1, 10, 100);
 | |
|   commit_handler_.update_info(key1, 11, 110);
 | |
|   commit_handler_.update_info(key1, 100, 1000);
 | |
| 
 | |
|   commit_handler_.update_info(key2, 20, 200);
 | |
|   commit_handler_.update_info(key2, 21, 210);
 | |
|   commit_handler_.update_info(key2, 200, 2000);
 | |
| 
 | |
|   commit_handler_.update_info(key3, 30, 300);
 | |
|   commit_handler_.update_info(key3, 31, 310);
 | |
|   commit_handler_.update_info(key3, 300, 3000);
 | |
| 
 | |
|   EXPECT_EQ(3, commit_handler_.get_entry_cnt());
 | |
| 
 | |
|   uint64_t max_log_id = OB_INVALID_ID;
 | |
|   EXPECT_EQ(OB_SUCCESS, commit_handler_.get_max_log_id(key1, max_log_id));
 | |
|   EXPECT_EQ(100, max_log_id);
 | |
|   int64_t max_submit_timestamp = 0;
 | |
|   EXPECT_EQ(OB_SUCCESS, commit_handler_.get_max_submit_timestamp(max_submit_timestamp));
 | |
|   EXPECT_EQ(3000, max_submit_timestamp);
 | |
| 
 | |
|   int64_t pos = 0;
 | |
|   EXPECT_EQ(OB_SUCCESS, commit_handler_.build_info_block(buf, MAX_BUF_LEN, pos));
 | |
|   EXPECT_NE(0, pos);
 | |
| 
 | |
|   ObCommitInfoBlockHandler tmp_handler;
 | |
|   EXPECT_EQ(OB_SUCCESS, tmp_handler.init());
 | |
|   pos = 0;
 | |
|   EXPECT_EQ(OB_SUCCESS, tmp_handler.resolve_info_block(buf, MAX_BUF_LEN, pos));
 | |
|   EXPECT_NE(0, pos);
 | |
|   EXPECT_EQ(3, tmp_handler.get_entry_cnt());
 | |
| 
 | |
|   EXPECT_EQ(OB_SUCCESS, tmp_handler.get_max_log_id(key1, max_log_id));
 | |
|   EXPECT_EQ(100, max_log_id);
 | |
|   EXPECT_EQ(OB_SUCCESS, tmp_handler.get_max_log_id(key2, max_log_id));
 | |
|   EXPECT_EQ(200, max_log_id);
 | |
|   EXPECT_EQ(OB_SUCCESS, tmp_handler.get_max_log_id(key3, max_log_id));
 | |
|   EXPECT_EQ(300, max_log_id);
 | |
| 
 | |
|   max_submit_timestamp = 0;
 | |
|   EXPECT_EQ(OB_SUCCESS, tmp_handler.get_max_submit_timestamp(max_submit_timestamp));
 | |
|   EXPECT_EQ(3000, max_submit_timestamp);
 | |
| 
 | |
|   tmp_handler.destroy();
 | |
| }
 | |
| 
 | |
| TEST_F(ObInfoBlockHandlerTest, index_info_block_handler)
 | |
| {
 | |
|   const int64_t MAX_BUF_LEN = 512 * 1024;
 | |
|   char buf[MAX_BUF_LEN];
 | |
| 
 | |
|   common::ObPartitionKey key1(1099511627777, 1, 1);
 | |
|   common::ObPartitionKey key2(1099511627778, 1, 1);
 | |
|   common::ObPartitionKey key3(1099511627779, 1, 1);
 | |
|   common::ObPartitionKey key4(1099511627780, 1, 1);
 | |
| 
 | |
|   uint64_t min_log_id = OB_INVALID_ID;
 | |
|   uint64_t max_log_id = OB_INVALID_ID;
 | |
| 
 | |
|   index_handler_.update_info(key1, 10, 100);
 | |
|   index_handler_.update_info(key1, 11, 110);
 | |
|   index_handler_.update_info(key1, 100, 1000);
 | |
| 
 | |
|   index_handler_.update_info(key2, 20, 200);
 | |
|   index_handler_.update_info(key2, 21, 210);
 | |
|   index_handler_.update_info(key2, 200, 2000);
 | |
| 
 | |
|   index_handler_.update_info(key3, 30, 300);
 | |
|   index_handler_.update_info(key3, 31, 310);
 | |
|   index_handler_.update_info(key3, 300, 3000);
 | |
| 
 | |
|   EXPECT_EQ(3, index_handler_.get_entry_cnt());
 | |
| 
 | |
|   EXPECT_EQ(OB_SUCCESS, index_handler_.get_max_log_id(key1, max_log_id));
 | |
|   EXPECT_EQ(100, max_log_id);
 | |
| 
 | |
|   EXPECT_EQ(OB_SUCCESS, index_handler_.get_min_log_id(key1, min_log_id));
 | |
|   EXPECT_EQ(10, min_log_id);
 | |
|   EXPECT_EQ(OB_SUCCESS, index_handler_.get_min_log_id(key2, min_log_id));
 | |
|   EXPECT_EQ(20, min_log_id);
 | |
|   EXPECT_EQ(OB_SUCCESS, index_handler_.get_min_log_id(key3, min_log_id));
 | |
|   EXPECT_EQ(30, min_log_id);
 | |
|   EXPECT_EQ(OB_ENTRY_NOT_EXIST, index_handler_.get_min_log_id(key4, min_log_id));
 | |
| 
 | |
|   int64_t max_submit_timestamp = 0;
 | |
|   EXPECT_EQ(OB_SUCCESS, index_handler_.get_max_submit_timestamp(max_submit_timestamp));
 | |
|   EXPECT_EQ(3000, max_submit_timestamp);
 | |
| 
 | |
|   ObIndexInfoBlockHandler::MinLogIdInfo min_log_id_info;
 | |
|   EXPECT_EQ(OB_SUCCESS, index_handler_.get_all_min_log_id_info(min_log_id_info));
 | |
|   EXPECT_EQ(3, min_log_id_info.size());
 | |
|   EXPECT_EQ(OB_SUCCESS, min_log_id_info.get(key1, min_log_id));
 | |
|   EXPECT_EQ(10, min_log_id);
 | |
|   EXPECT_EQ(OB_SUCCESS, min_log_id_info.get(key2, min_log_id));
 | |
|   EXPECT_EQ(20, min_log_id);
 | |
|   EXPECT_EQ(OB_SUCCESS, min_log_id_info.get(key3, min_log_id));
 | |
|   EXPECT_EQ(30, min_log_id);
 | |
|   EXPECT_EQ(OB_ENTRY_NOT_EXIST, min_log_id_info.get(key4, min_log_id));
 | |
| 
 | |
|   int64_t pos = 0;
 | |
|   EXPECT_EQ(OB_SUCCESS, index_handler_.build_info_block(buf, MAX_BUF_LEN, pos));
 | |
|   EXPECT_NE(0, pos);
 | |
| 
 | |
|   ObIndexInfoBlockHandler tmp_handler;
 | |
|   EXPECT_EQ(OB_SUCCESS, tmp_handler.init());
 | |
|   pos = 0;
 | |
|   EXPECT_EQ(OB_SUCCESS, tmp_handler.resolve_info_block(buf, MAX_BUF_LEN, pos));
 | |
|   EXPECT_NE(0, pos);
 | |
|   EXPECT_EQ(3, tmp_handler.get_entry_cnt());
 | |
| 
 | |
|   EXPECT_EQ(OB_SUCCESS, tmp_handler.get_max_log_id(key1, max_log_id));
 | |
|   EXPECT_EQ(100, max_log_id);
 | |
|   EXPECT_EQ(OB_SUCCESS, tmp_handler.get_max_log_id(key2, max_log_id));
 | |
|   EXPECT_EQ(200, max_log_id);
 | |
|   EXPECT_EQ(OB_SUCCESS, tmp_handler.get_max_log_id(key3, max_log_id));
 | |
|   EXPECT_EQ(300, max_log_id);
 | |
| 
 | |
|   EXPECT_EQ(OB_SUCCESS, tmp_handler.get_min_log_id(key1, min_log_id));
 | |
|   EXPECT_EQ(10, min_log_id);
 | |
|   EXPECT_EQ(OB_SUCCESS, tmp_handler.get_min_log_id(key2, min_log_id));
 | |
|   EXPECT_EQ(20, min_log_id);
 | |
|   EXPECT_EQ(OB_SUCCESS, tmp_handler.get_min_log_id(key3, min_log_id));
 | |
|   EXPECT_EQ(30, min_log_id);
 | |
|   EXPECT_EQ(OB_ENTRY_NOT_EXIST, tmp_handler.get_min_log_id(key4, min_log_id));
 | |
| 
 | |
|   max_submit_timestamp = 0;
 | |
|   EXPECT_EQ(OB_SUCCESS, tmp_handler.get_max_submit_timestamp(max_submit_timestamp));
 | |
|   EXPECT_EQ(3000, max_submit_timestamp);
 | |
| }
 | |
| }  // namespace unittest
 | |
| }  // namespace oceanbase
 | |
| 
 | |
| int main(int argc, char** argv)
 | |
| {
 | |
|   OB_LOGGER.set_file_name("test_info_block_handler.log", true);
 | |
|   OB_LOGGER.set_log_level("TRACE");
 | |
|   CLOG_LOG(INFO, "begin unittest: test_info_block_handler");
 | |
|   ::testing::InitGoogleTest(&argc, argv);
 | |
|   return RUN_ALL_TESTS();
 | |
| }
 | 
