From 3c18d62c5e9d672d2226fc4e049f0a67f9fbb95c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Jaramago=20Fern=C3=A1ndez?= Date: Mon, 15 Jun 2020 17:40:20 +0200 Subject: [PATCH] Added test for the new added commands for 'mysqlsh' --- test/tap/tests/Makefile | 3 + test/tap/tests/test_mysqlsh-t.cpp | 120 ++++++++++++++++++++++++++++++ 2 files changed, 123 insertions(+) create mode 100644 test/tap/tests/test_mysqlsh-t.cpp diff --git a/test/tap/tests/Makefile b/test/tap/tests/Makefile index 8d8d7f859..8f135f725 100644 --- a/test/tap/tests/Makefile +++ b/test/tap/tests/Makefile @@ -109,3 +109,6 @@ test_tokenizer-t: test_tokenizer-t.cpp $(TAP_LIBDIR)/libtap.a 2793_compression: reg_test_2793-compression-t.cpp g++ -DDEBUG reg_test_2793-compression-t.cpp $(INCLUDEDIRS) $(LDIRS) $(OPT) -std=c++11 $(OBJ) $(MYLIBS) -ltap -ldl $(STATIC_LIBS) -o reg_test_2793-compression-t -DGITVERSION=\"$(GIT_VERSION)\" + +test_mysqlsh: test_mysqlsh-t.cpp + g++ -DDEBUG test_mysqlsh-t.cpp $(INCLUDEDIRS) $(LDIRS) $(OPT) -std=c++11 $(OBJ) $(MYLIBS) -ltap -ldl $(STATIC_LIBS) -o test_mysqlsh-t -DGITVERSION=\"$(GIT_VERSION)\" diff --git a/test/tap/tests/test_mysqlsh-t.cpp b/test/tap/tests/test_mysqlsh-t.cpp new file mode 100644 index 000000000..98ccaa5c7 --- /dev/null +++ b/test/tap/tests/test_mysqlsh-t.cpp @@ -0,0 +1,120 @@ +/** + * @file test_mysqlsh_support-t.cpp + * @brief This test verifies the new added queries for supporting mysqlsh in the 'Admin module'. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "tap.h" +#include "command_line.h" +#include "utils.h" + +using std::string; + +std::vector split(const std::string& s, char delimiter) +{ + std::vector tokens; + std::string token; + std::istringstream tokenStream(s); + while (std::getline(tokenStream, token, delimiter)) + { + tokens.push_back(token); + } + return tokens; +} + +int main(int argc, char** argv) { + CommandLine cl; + + if (cl.getEnv()) { + diag("Failed to get the required environmental variables."); + return -1; + } + + // Test that mysqlsh is able to connect and execute a query + + const char* mysqlsh_client = "mysqlsh"; + const std::string admin_user = std::string("-u") + cl.admin_username + " "; + const std::string admin_pass = std::string("-p") + cl.admin_password + " "; + const std::string admin_port = std::string("-P") + std::to_string(cl.admin_port) + " "; + const std::string host = std::string("-h ") + std::string(cl.host) + " "; + + int mysqlsh_res = system((std::string("mysqlsh ") + std::string("--sql ") + admin_user + admin_pass + admin_port + host + "-e \"SELECT NULL LIMIT 0\"").c_str()); + ok(mysqlsh_res == 0, "'mysqlsh' empty select command should be correctly executed. Err code was: %d", mysqlsh_res); + + // Test the new introduced query "select concat(@@version, ' ', @@version_comment)" + + MYSQL* mysql_server = mysql_init(NULL); + + if (!mysql_server) { + fprintf(stderr, "File %s, line %d, Error: %s\n", __FILE__, __LINE__, mysql_error(mysql_server)); + return -1; + } + + if (!mysql_real_connect(mysql_server, cl.host, cl.admin_username, cl.admin_password, NULL, cl.admin_port, NULL, 0)) { + fprintf(stderr, "File %s, line %d, Error: %s\n", __FILE__, __LINE__, mysql_error(mysql_server)); + return -1; + } + + int query_res = mysql_query(mysql_server, "select concat(@@version, ' ', @@version_comment)"); + + if (query_res == 0) { + MYSQL_RES* concat_res = mysql_store_result(mysql_server); + unsigned int concat_num_fields = mysql_num_fields(concat_res); + query_res = mysql_query(mysql_server, "select @@version"); + + if (query_res == 0) { + MYSQL_RES* ver_res = mysql_store_result(mysql_server); + unsigned int ver_num_fields = mysql_num_fields(ver_res); + MYSQL_ROW concat_row = mysql_fetch_row(concat_res); + MYSQL_ROW ver_row = mysql_fetch_row(ver_res); + + if (concat_row && ver_row && concat_num_fields == 1 && ver_num_fields == 1) { + std::string concat_row_str { concat_row[0] }; + std::string ver_row_str { ver_row[0] }; + + std::vector concat_split_res = split(concat_row_str, ' '); + bool exp_concat_res = + concat_split_res.size() == 3 && + concat_split_res[0] == ver_row_str && + concat_split_res[1] + " " + concat_split_res[2] == "Admin Module"; + + ok(exp_concat_res, "Output received for \"select concat(@@version, ' ', @@version_comment)\" was: %s", concat_row_str.c_str()); + } else { + ok(false, "Invalid resulset. Expected 'num_fields' = 1, not %d", concat_num_fields); + } + + mysql_free_result(concat_res); + } + + mysql_free_result(concat_res); + } else { + ok(false, "Query result for \"select concat(@@version, ' ', @@version_comment)\" should be 0. Was: %d", query_res); + } + + // Test the new introduced query "select @@sql_mode" + + query_res = mysql_query(mysql_server, "select @@sql_mode"); + if (query_res == 0) {; + MYSQL_RES* sql_mode_res = mysql_store_result(mysql_server); + unsigned int sql_mode_num_fields = mysql_num_fields(sql_mode_res); + + if (sql_mode_res && sql_mode_num_fields == 1) { + MYSQL_ROW mode_row = mysql_fetch_row(sql_mode_res); + + ok(std::string(mode_row[0]) == "", "Resulting row from \"select @@sql_mode\" should be an empty string. Result was: %s", mode_row[0]); + } else { + ok(false, "Invalid resulset. Expected 'num_fields' = 1, not %d", sql_mode_num_fields); + } + } else { + ok(false, "Query result for \"select @@sql_mode\" should be 0. Was: %d", query_res); + } + + return exit_status(); +}