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();
 | 
						|
}
 |