164 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			164 lines
		
	
	
		
			4.7 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 <gtest/gtest.h>
 | |
| #include "lib/net/ob_addr.h"
 | |
| #include "storage/ob_partition_service_rpc.h"
 | |
| #include "rpc/testing.h"
 | |
| #include "mockcontainer/mock_ob_partition_service.h"
 | |
| #include "mockcontainer/mock_ob_iterator.h"
 | |
| #include "storage/ob_partition_base_data_ob_reader.h"
 | |
| #include "storage/ob_i_store.h"
 | |
| 
 | |
| namespace oceanbase {
 | |
| using namespace common;
 | |
| using namespace obrpc;
 | |
| using namespace storage;
 | |
| using namespace blocksstable;
 | |
| using namespace memtable;
 | |
| 
 | |
| namespace obrpc {
 | |
| class TestMigrateRpc : public ::testing::Test {
 | |
| public:
 | |
|   static void SetUpTestCase();
 | |
|   void SetUp()
 | |
|   {}
 | |
|   void TearDown()
 | |
|   {}
 | |
|   static rpctesting::Service service_;
 | |
|   static ObPartitionServiceRpcProxy rpc_proxy_;
 | |
|   static ObInOutBandwidthThrottle bandwidth_throttle_;
 | |
|   static ObAddr self_addr_;
 | |
| };
 | |
| 
 | |
| rpctesting::Service TestMigrateRpc::service_;
 | |
| ObPartitionServiceRpcProxy TestMigrateRpc::rpc_proxy_;
 | |
| ObInOutBandwidthThrottle TestMigrateRpc::bandwidth_throttle_;
 | |
| ObAddr TestMigrateRpc::self_addr_;
 | |
| 
 | |
| void TestMigrateRpc::SetUpTestCase()
 | |
| {
 | |
|   ASSERT_EQ(OB_SUCCESS, service_.init());
 | |
|   self_addr_ = ObAddr(ObAddr::IPV4, "127.0.0.1", service_.get_listen_port());
 | |
| 
 | |
|   ASSERT_EQ(OB_SUCCESS, service_.get_proxy(rpc_proxy_));
 | |
|   ASSERT_EQ(OB_SUCCESS, bandwidth_throttle_.init(INT64_MAX));
 | |
| }
 | |
| 
 | |
| class ObMockFetchPartitionInfoP : public ObFetchPartitionInfoP {
 | |
| public:
 | |
|   ObMockFetchPartitionInfoP() : ObFetchPartitionInfoP(NULL)
 | |
|   {}
 | |
|   ~ObMockFetchPartitionInfoP()
 | |
|   {}
 | |
| 
 | |
| protected:
 | |
|   int process()
 | |
|   {
 | |
|     result_.meta_.pkey_ = arg_.pkey_;
 | |
|     result_.major_version_ = arg_.pkey_.table_id_ % 10;
 | |
|     return OB_SUCCESS;
 | |
|   }
 | |
| };
 | |
| 
 | |
| class ObMockFetchLogicRowP : public ObFetchLogicRowP {
 | |
| public:
 | |
|   ObMockFetchLogicRowP() : ObFetchLogicRowP(NULL, NULL)
 | |
|   {}
 | |
|   ~ObMockFetchLogicRowP()
 | |
|   {}
 | |
| 
 | |
|   ObMockIterator iter_;
 | |
| 
 | |
| protected:
 | |
|   int process()
 | |
|   {
 | |
|     int ret = OB_SUCCESS;
 | |
|     ObStoreRow* store_row = NULL;
 | |
|     iter_.reset_iter();
 | |
| 
 | |
|     char* buf = NULL;
 | |
|     if (NULL == (buf = reinterpret_cast<char*>(allocator_.alloc(OB_MALLOC_BIG_BLOCK_SIZE)))) {
 | |
|       ret = OB_ALLOCATE_MEMORY_FAILED;
 | |
|       STORAGE_LOG(WARN, "failed to alloc migrate data buffer.", K(ret));
 | |
|     } else if (!result_.set_data(buf, OB_MALLOC_BIG_BLOCK_SIZE)) {
 | |
|       ret = OB_ALLOCATE_MEMORY_FAILED;
 | |
|       STORAGE_LOG(WARN, "failed set data to result", K(ret));
 | |
|     }
 | |
| 
 | |
|     while (OB_SUCC(ret)) {
 | |
|       if (OB_FAIL(iter_.get_next_row(store_row))) {
 | |
|         if (OB_ITER_END != ret) {
 | |
|           STORAGE_LOG(WARN, "failed to get next row", K(ret));
 | |
|         } else {
 | |
|           ret = OB_SUCCESS;
 | |
|         }
 | |
|         break;
 | |
|       } else if (NULL == store_row) {
 | |
|         ret = OB_ERR_UNEXPECTED;
 | |
|         STORAGE_LOG(ERROR, "store row must not be NULL", K(ret), KP(store_row));
 | |
|       } else if (OB_FAIL(fill_data(*store_row))) {
 | |
|         STORAGE_LOG(WARN, "failed to fill data", K(ret));
 | |
|       } else {
 | |
|         STORAGE_LOG(INFO, "succ to fill data", K(*store_row));
 | |
|       }
 | |
|     }
 | |
|     iter_.reset_iter();
 | |
|     return ret;
 | |
|   }
 | |
| };
 | |
| 
 | |
| TEST_F(TestMigrateRpc, FetchPartitionInfo)
 | |
| {
 | |
|   ObMockFetchPartitionInfoP* p = new ObMockFetchPartitionInfoP();
 | |
|   service_.reg_processor(p);
 | |
| 
 | |
|   ObFetchPartitionInfoArg arg;
 | |
|   arg.pkey_.table_id_ = 123456789;
 | |
| 
 | |
|   ObFetchPartitionInfoResult result;
 | |
|   ASSERT_EQ(OB_SUCCESS, rpc_proxy_.to(self_addr_).fetch_partition_info(arg, result));
 | |
|   ASSERT_EQ(result.meta_.pkey_, arg.pkey_);
 | |
|   ASSERT_EQ(result.major_version_, 9);
 | |
| }
 | |
| 
 | |
| TEST_F(TestMigrateRpc, FetchLogicRowP)
 | |
| {
 | |
|   ObMockFetchLogicRowP* p = new ObMockFetchLogicRowP();
 | |
|   service_.reg_processor(p);
 | |
| 
 | |
|   const char* input = "int    varchar number                     \n"
 | |
|                       "1      feiji   999999999999999999999999999\n"
 | |
|                       "2      tank    1234567898765431           \n"
 | |
|                       "3      lehaha  100000                     \n";
 | |
|   ASSERT_EQ(OB_SUCCESS, p->iter_.from(input));
 | |
| 
 | |
|   ObLogicRowReader reader;
 | |
|   ObFetchLogicRowArg arg_;
 | |
|   arg_.key_range_.set_whole_range();
 | |
|   ASSERT_EQ(OB_SUCCESS, reader.init(rpc_proxy_, bandwidth_throttle_, self_addr_, arg_));
 | |
| 
 | |
|   ASSERT_TRUE(p->iter_.equals(reader));
 | |
| }
 | |
| 
 | |
| }  // namespace obrpc
 | |
| }  // namespace oceanbase
 | |
| 
 | |
| int main(int argc, char* argv[])
 | |
| {
 | |
|   system("rm -f test_migrate_rpc.log");
 | |
|   OB_LOGGER.set_file_name("test_migrate_rpc.log");
 | |
|   OB_LOGGER.set_log_level("INFO");
 | |
|   ::testing::InitGoogleTest(&argc, argv);
 | |
|   return RUN_ALL_TESTS();
 | |
| }
 | 
