249 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			249 lines
		
	
	
		
			8.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.
 | |
|  */
 | |
| 
 | |
| #define USING_LOG_PREFIX OBLOG
 | |
| 
 | |
| #include <gtest/gtest.h>
 | |
| #include "share/ob_web_service_root_addr.h" // to_json
 | |
| #include "lib/oblog/ob_log_module.h"
 | |
| #include "lib/string/ob_sql_string.h"       // ObSqlString
 | |
| 
 | |
| #include "ob_log_sql_server_provider.h"
 | |
| 
 | |
| namespace oceanbase
 | |
| {
 | |
| using namespace common;
 | |
| using namespace share;
 | |
| 
 | |
| namespace libobcdc
 | |
| {
 | |
| #define CONFIG_SERVER_PORT 6789
 | |
| #define CONFIG_SERVER_PORT_STR "6789"
 | |
| #define CONFIG_SERVER_IP "127.0.0.1"
 | |
| #define CONFIG_SERVER_PROGRAM "./fake_config_server"
 | |
| 
 | |
| class TestLogSQLServerProvider : public ::testing::Test
 | |
| {
 | |
|   static const int64_t MAX_JASON_BUFFER_SIZE = 1 << 10;
 | |
|   static const int64_t MAX_CONFIG_URL_LENGTH = 1 << 10;
 | |
|   static const int64_t MAX_APPNAME_LENGTH = 1 << 10;
 | |
| 
 | |
| public:
 | |
|   TestLogSQLServerProvider() : rs_leader_(),
 | |
|                                rs_follower_1_(),
 | |
|                                rs_follower_2_(),
 | |
|                                service_pid_(0),
 | |
|                                server_provider_()
 | |
|   {}
 | |
| 
 | |
|   virtual void SetUp();
 | |
|   virtual void TearDown();
 | |
| 
 | |
|   void set_rs_list(const ObRootAddrList &rs_list);
 | |
| 
 | |
| protected:
 | |
|   ObRootAddr              rs_leader_;
 | |
|   ObRootAddr              rs_follower_1_;
 | |
|   ObRootAddr              rs_follower_2_;
 | |
| 
 | |
|   pid_t                   service_pid_;
 | |
|   ObLogSQLServerProvider  server_provider_;
 | |
| 
 | |
|   char                    appname_[MAX_APPNAME_LENGTH];
 | |
|   char                    config_url_[MAX_CONFIG_URL_LENGTH];
 | |
|   char                    json_buffer_[MAX_JASON_BUFFER_SIZE];
 | |
| };
 | |
| 
 | |
| void TestLogSQLServerProvider::SetUp()
 | |
| {
 | |
|   int ret = OB_SUCCESS;
 | |
|   const char *config_url_arbitrary_str = "i_am_an_arbitrary_string/versin=1";
 | |
|   const char *appname_str = "test";
 | |
| 
 | |
|   // Constructing the ConfigURL
 | |
|   // Note that the URL is actually only accessible as "http::/IP:PORT", the subsequent string is an arbitrary string
 | |
|   (void)snprintf(config_url_, sizeof(config_url_), "http://%s:%d/%s",
 | |
|       CONFIG_SERVER_IP, CONFIG_SERVER_PORT, config_url_arbitrary_str);
 | |
| 
 | |
|   (void)snprintf(appname_, sizeof(appname_), "%s", appname_str);
 | |
| 
 | |
|   // Create configure server simulation process
 | |
|   pid_t pid = fork();
 | |
|   if (0 == pid) {
 | |
|     // Set the child process to a new child process group to facilitate KILL
 | |
|     ret = setpgid(pid, pid);
 | |
|     if (ret < 0) {
 | |
|       LOG_ERROR("setpgid failed", K(errno));
 | |
|     } else if (-1 == (ret = execl(
 | |
|         "/bin/bash", CONFIG_SERVER_PROGRAM, CONFIG_SERVER_PROGRAM, CONFIG_SERVER_PORT_STR, (char *)NULL))) {
 | |
|       LOG_ERROR("execl failed", K(errno));
 | |
|     }
 | |
|     exit(1);
 | |
|   } else if (-1 == pid) {
 | |
|     LOG_ERROR("fork failed", K(errno));
 | |
|   } else {
 | |
|     LOG_INFO("create child", K(pid));
 | |
|     service_pid_ = pid;
 | |
| 
 | |
|     // wait child process execute.
 | |
|     usleep(100000);
 | |
|   }
 | |
| 
 | |
|   // init rs addr list
 | |
|   ObSEArray<ObRootAddr, 3> rs_list;
 | |
| 
 | |
|   rs_leader_.server_.set_ip_addr("10.210.170.11", 100);
 | |
|   rs_leader_.role_ = LEADER;
 | |
|   rs_leader_.sql_port_ = 2828;
 | |
|   rs_list.push_back(rs_leader_);
 | |
| 
 | |
|   rs_follower_1_.server_.set_ip_addr("10.210.170.16", 200);
 | |
|   rs_follower_1_.role_ = FOLLOWER;
 | |
|   rs_follower_1_.sql_port_ = 3838;
 | |
|   rs_list.push_back(rs_follower_1_);
 | |
| 
 | |
|   rs_follower_2_.server_.set_ip_addr("10.210.180.96", 300);
 | |
|   rs_follower_2_.role_ = FOLLOWER;
 | |
|   rs_follower_2_.sql_port_ = 4848;
 | |
|   rs_list.push_back(rs_follower_2_);
 | |
| 
 | |
|   // Setting up the Rootserver list
 | |
|   set_rs_list(rs_list);
 | |
| 
 | |
|   // init Server Provider
 | |
|   ret = server_provider_.init(config_url_, appname_);
 | |
|   ASSERT_EQ(OB_SUCCESS, ret);
 | |
| 
 | |
|   // init 3 rootserver
 | |
|   ObAddr server;
 | |
|   EXPECT_EQ(3, server_provider_.get_server_count());
 | |
|   EXPECT_EQ(OB_SUCCESS, server_provider_.get_server(0, server));
 | |
|   EXPECT_EQ(rs_leader_.server_.get_ipv4(), server.get_ipv4());
 | |
|   EXPECT_EQ(rs_leader_.sql_port_, server.get_port());
 | |
|   EXPECT_EQ(OB_SUCCESS, server_provider_.get_server(1, server));
 | |
|   EXPECT_EQ(rs_follower_1_.server_.get_ipv4(), server.get_ipv4());
 | |
|   EXPECT_EQ(rs_follower_1_.sql_port_, server.get_port());
 | |
|   EXPECT_EQ(OB_SUCCESS, server_provider_.get_server(2, server));
 | |
|   EXPECT_EQ(rs_follower_2_.server_.get_ipv4(), server.get_ipv4());
 | |
|   EXPECT_EQ(rs_follower_2_.sql_port_, server.get_port());
 | |
|   EXPECT_EQ(OB_ENTRY_NOT_EXIST, server_provider_.get_server(3, server));
 | |
| }
 | |
| 
 | |
| void TestLogSQLServerProvider::TearDown()
 | |
| {
 | |
|   int status = 0;
 | |
|   int64_t orig_server_count = server_provider_.get_server_count();
 | |
| 
 | |
|   // Sends SIGINT to all processes in the process group of the child process
 | |
|   kill(-service_pid_, SIGINT);
 | |
| 
 | |
|   pid_t pid = wait(&status);
 | |
|   LOG_INFO("child exit", K(pid));
 | |
| 
 | |
|   // Refresh error if Configure Server does not exist
 | |
|   EXPECT_NE(OB_SUCCESS, server_provider_.refresh_server_list());
 | |
| 
 | |
|   // Refresh the error without modifying the previous Server list
 | |
|   EXPECT_EQ(orig_server_count, server_provider_.get_server_count());
 | |
| }
 | |
| 
 | |
| void TestLogSQLServerProvider::set_rs_list(const ObRootAddrList &rs_list)
 | |
| {
 | |
|   int ret = OB_SUCCESS;
 | |
|   ObSqlString cmd;
 | |
|   ObSqlString json;
 | |
| 
 | |
|   usleep(50000);
 | |
|   const int64_t cluster_id = 100;
 | |
|   ret = ObWebServiceRootAddr::to_json(rs_list, appname_, cluster_id, json);
 | |
|   ASSERT_EQ(OB_SUCCESS, ret);
 | |
|   LOG_INFO("to_json", K(json));
 | |
| 
 | |
|   ret = cmd.assign_fmt("echo -n 'POST / HTTP/1.1\r\nContent-Length: %ld\r\n%s' | nc %s %d &> /dev/null",
 | |
|       json.length(), json.ptr(), CONFIG_SERVER_IP, CONFIG_SERVER_PORT);
 | |
|   ASSERT_EQ(OB_SUCCESS, ret);
 | |
| 
 | |
|   ret = system(cmd.ptr());
 | |
|   usleep(50000);
 | |
| }
 | |
| 
 | |
| TEST_F(TestLogSQLServerProvider, fetch)
 | |
| {
 | |
|   ObAddr server;
 | |
|   ObSEArray<ObRootAddr, 16> rs_list;
 | |
| 
 | |
|   // Test zero RS
 | |
|   rs_list.reuse();
 | |
|   set_rs_list(rs_list); // Set up a new RS list
 | |
|   ASSERT_EQ(OB_SUCCESS, server_provider_.refresh_server_list()); // Refresh RS list
 | |
|   EXPECT_EQ(0, server_provider_.get_server_count());
 | |
|   EXPECT_EQ(OB_ENTRY_NOT_EXIST, server_provider_.get_server(0, server));
 | |
| 
 | |
|   // Test one RS
 | |
|   rs_list.reuse();
 | |
|   rs_list.push_back(rs_leader_);
 | |
|   set_rs_list(rs_list); // Set up a new RS list
 | |
|   ASSERT_EQ(OB_SUCCESS, server_provider_.refresh_server_list()); // Refresh RS list
 | |
|   EXPECT_EQ(1, server_provider_.get_server_count());
 | |
|   EXPECT_EQ(OB_SUCCESS, server_provider_.get_server(0, server));
 | |
|   EXPECT_EQ(rs_leader_.server_.get_ipv4(), server.get_ipv4());
 | |
|   EXPECT_EQ(rs_leader_.sql_port_, server.get_port());     // Server的端口应该是SQL端口
 | |
| 
 | |
|   EXPECT_EQ(OB_ENTRY_NOT_EXIST, server_provider_.get_server(1, server));
 | |
|   EXPECT_EQ(OB_INVALID_ARGUMENT, server_provider_.get_server(-1, server));
 | |
| 
 | |
|   // Test two RS
 | |
|   rs_list.reuse();
 | |
|   rs_list.push_back(rs_leader_);
 | |
|   rs_list.push_back(rs_follower_1_);
 | |
|   set_rs_list(rs_list); // Set up a new RS list
 | |
|   ASSERT_EQ(OB_SUCCESS, server_provider_.refresh_server_list()); // Refresh RS list
 | |
|   EXPECT_EQ(2, server_provider_.get_server_count());
 | |
|   EXPECT_EQ(OB_SUCCESS, server_provider_.get_server(0, server));
 | |
|   EXPECT_EQ(rs_leader_.server_.get_ipv4(), server.get_ipv4());
 | |
|   EXPECT_EQ(rs_leader_.sql_port_, server.get_port());
 | |
|   EXPECT_EQ(OB_SUCCESS, server_provider_.get_server(1, server));
 | |
|   EXPECT_EQ(rs_follower_1_.server_.get_ipv4(), server.get_ipv4());
 | |
|   EXPECT_EQ(rs_follower_1_.sql_port_, server.get_port());
 | |
|   EXPECT_EQ(OB_ENTRY_NOT_EXIST, server_provider_.get_server(2, server));
 | |
| 
 | |
|   // Test three RS
 | |
|   rs_list.reuse();
 | |
|   rs_list.push_back(rs_leader_);
 | |
|   rs_list.push_back(rs_follower_1_);
 | |
|   rs_list.push_back(rs_follower_2_);
 | |
|   set_rs_list(rs_list); // Set up a new RS list
 | |
|   ASSERT_EQ(OB_SUCCESS, server_provider_.refresh_server_list()); // Refresh RS list
 | |
|   EXPECT_EQ(3, server_provider_.get_server_count());
 | |
|   EXPECT_EQ(OB_SUCCESS, server_provider_.get_server(0, server));
 | |
|   EXPECT_EQ(rs_leader_.server_.get_ipv4(), server.get_ipv4());
 | |
|   EXPECT_EQ(rs_leader_.sql_port_, server.get_port());
 | |
|   EXPECT_EQ(OB_SUCCESS, server_provider_.get_server(1, server));
 | |
|   EXPECT_EQ(rs_follower_1_.server_.get_ipv4(), server.get_ipv4());
 | |
|   EXPECT_EQ(rs_follower_1_.sql_port_, server.get_port());
 | |
|   EXPECT_EQ(OB_SUCCESS, server_provider_.get_server(2, server));
 | |
|   EXPECT_EQ(rs_follower_2_.server_.get_ipv4(), server.get_ipv4());
 | |
|   EXPECT_EQ(rs_follower_2_.sql_port_, server.get_port());
 | |
|   EXPECT_EQ(OB_ENTRY_NOT_EXIST, server_provider_.get_server(3, server));
 | |
| }
 | |
| 
 | |
| } // end namespace share
 | |
| } // end namespace oceanbase
 | |
| 
 | |
| int main(int argc, char **argv)
 | |
| {
 | |
|   oceanbase::common::ObLogger::get_logger().set_log_level("INFO");
 | |
|   OB_LOGGER.set_log_level("INFO");
 | |
|   testing::InitGoogleTest(&argc, argv);
 | |
|   return RUN_ALL_TESTS();
 | |
| }
 | 
