From dd589508f4919ee071bdaa74a06ab519d2d07e1e Mon Sep 17 00:00:00 2001 From: Rahim Kanji Date: Thu, 24 Apr 2025 19:47:34 +0500 Subject: [PATCH] Added regression test --- .../pgsql-connection_parameters_test-t.cpp | 73 +++++++++++++++++-- 1 file changed, 66 insertions(+), 7 deletions(-) diff --git a/test/tap/tests/pgsql-connection_parameters_test-t.cpp b/test/tap/tests/pgsql-connection_parameters_test-t.cpp index 063a75e77..077d80ff4 100644 --- a/test/tap/tests/pgsql-connection_parameters_test-t.cpp +++ b/test/tap/tests/pgsql-connection_parameters_test-t.cpp @@ -620,14 +620,14 @@ bool test_parameters(PGconn* admin_conn, const parameter_test& test) { snprintf(buffer, sizeof(buffer), "SET %s='%s'", parameter.name.c_str(), parameter.value.c_str()); if (executeQueries(admin_conn, { buffer, "LOAD PGSQL VARIABLES TO RUNTIME" }) == false) { - BAIL_OUT("Error: failed to set admin variable in file %s, line %d", __FILE__, __LINE__); + diag("Error: failed to set admin variable in file %s, line %d", __FILE__, __LINE__); return false; } } int sock = connect_server(cl.pgsql_host, cl.pgsql_port); if (sock == -1) { - BAIL_OUT("Error: failed to connect to the server in file %s, line %d", __FILE__, __LINE__); + diag("Error: failed to connect to the server in file %s, line %d", __FILE__, __LINE__); return false; } @@ -671,7 +671,7 @@ bool test_parameters(PGconn* admin_conn, const parameter_test& test) { // Send StartupMessage if (send_data(sock, startup_msg.data(), startup_msg.size()) == false) { - BAIL_OUT("Error: failed to send startup message in file %s, line %d", __FILE__, __LINE__); + diag("Error: failed to send startup message in file %s, line %d", __FILE__, __LINE__); goto cleanup; } @@ -692,7 +692,7 @@ bool test_parameters(PGconn* admin_conn, const parameter_test& test) { auto result = execute_query(sock, buffer); if (result == nullptr) { - BAIL_OUT("Error: failed to execute query in file %s, line %d", __FILE__, __LINE__); + diag("Error: failed to execute query in file %s, line %d", __FILE__, __LINE__); goto cleanup; } @@ -707,7 +707,7 @@ bool test_parameters(PGconn* admin_conn, const parameter_test& test) { diag("Executing: %s\n", reset_cmd.c_str()); auto result = execute_query(sock, reset_cmd); if (result == nullptr) { - BAIL_OUT("Error: failed to reset parameter in file %s, line %d", __FILE__, __LINE__); + diag("Error: failed to reset parameter in file %s, line %d", __FILE__, __LINE__); goto cleanup; } if (result->error.empty() == false) { @@ -722,7 +722,7 @@ bool test_parameters(PGconn* admin_conn, const parameter_test& test) { diag("Executing: %s\n", show_cmd.c_str()); auto result = execute_query(sock, show_cmd); if (result == nullptr) { - BAIL_OUT("Error: failed to execute query in file %s, line %d", __FILE__, __LINE__); + diag("Error: failed to execute query in file %s, line %d", __FILE__, __LINE__); goto cleanup; } if (test.expect_failure == false && result->error.empty()) { @@ -859,6 +859,26 @@ std::vector test_cases = { } }; +constexpr int MAX_REG_ITERATION_PER_THREAD = 5; +constexpr int MAX_REG_THREAD = 2; + +void test_invalid_param_reg_4919_thread() { + auto admin_conn = createNewConnection(ConnType::ADMIN, "", false); + + if (!admin_conn || PQstatus(admin_conn.get()) != CONNECTION_OK) { + diag("Error: failed to connect to the database in file %s, line %d", __FILE__, __LINE__); + return; + } + + parameter_test invalid_param_test = test_cases.back(); + + for (int i = 0; i < MAX_REG_ITERATION_PER_THREAD; i++) { + if (test_parameters(admin_conn.get(), invalid_param_test) == false) { + diag("Error: failed to test parameters in file %s, line %d", __FILE__, __LINE__); + return; + } + } +} int main(int argc, char** argv) { @@ -879,6 +899,29 @@ int main(int argc, char** argv) { test_count += test_case.conn_params.size() * 2; } + // Regression test for Issue#4919 (https://github.com/sysown/proxysql/issues/4919) + int test_count_regression = 0; + + const auto& test_case = test_cases.back(); + + if (test_case.expect_failure) { + int case_count = 1; + + if (test_case.set_commands.empty() == false) + case_count++; + if (test_case.reset_after) + case_count++; + + test_count_regression += test_case.conn_params.size() * case_count; + } + else + test_count_regression += test_case.conn_params.size() * 2; + + test_count_regression *= MAX_REG_ITERATION_PER_THREAD * MAX_REG_THREAD; + test_count_regression += 1; // execute "select 1" to check if proxysql is alive + // Regression test for Issue#4919 + test_count += test_count_regression; + plan(test_count); if (cl.getEnv()) @@ -900,10 +943,26 @@ int main(int argc, char** argv) { for (const auto& test_case : test_cases) { if (test_parameters(admin_conn.get(), test_case) == false) { - BAIL_OUT("Error: failed to test parameters in file %s, line %d", __FILE__, __LINE__); + diag("Error: failed to test parameters in file %s, line %d", __FILE__, __LINE__); return exit_status(); } } + // Regression test for Issue#4919 (https://github.com/sysown/proxysql/issues/4919) + std::vector threads; + + for (int i = 0; i < MAX_REG_THREAD; ++i) { + threads.emplace_back(test_invalid_param_reg_4919_thread); + } + + for (auto& t : threads) { + t.join(); + } + + auto result = executeQueries(admin_conn.get(), {"SELECT 1"}); + + ok(result, "ProxySQL should be alive"); + // Regression test for Issue#4919 + return exit_status(); }