Added regression test

pull/4921/head
Rahim Kanji 1 year ago
parent d113bcb193
commit dd589508f4

@ -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<parameter_test> 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<std::thread> 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();
}

Loading…
Cancel
Save