Fix mysql-set_wait_timeout-t.cpp compilation and JSON testing

- Replace <json/json.h> include with <json.hpp> and proper nlohmann namespace
- Replace manual JSON parsing with fetch_internal_session() utility function
- Replace fail() calls with ok(false, ...) to follow TAP framework standards
- Add comprehensive JSON validation test for various wait_timeout values
- Include edge case testing: zero values, maximum values, and clamping behavior

Resolves compilation issues and enables proper testing of wait_timeout JSON output.
pull/4901/head
Rene Cannao 5 months ago
parent 6539587c9a
commit 0c9c938d66

@ -4,13 +4,15 @@
*/
#include <unistd.h>
#include <json/json.h>
#include "mysql.h"
#include "tap.h"
#include "command_line.h"
#include "utils.h"
#include "json.hpp"
using namespace nlohmann;
MYSQL* init_mysql_conn(char* host, char* user, char* pass, int port) {
diag("Creating MySQL conn host=\"%s\" port=\"%d\" user=\"%s\"", host, port, user);
@ -32,37 +34,24 @@ int run_q(MYSQL *mysql, const char *q) {
return 0;
}
// Helper function to parse JSON value from PROXYSQL INTERNAL SESSION result
int extract_wait_timeout_from_json(MYSQL* mysql, unsigned long long &wait_timeout_value) {
MYSQL_RES* res = mysql_store_result(mysql);
if (!res) return 0;
MYSQL_ROW row = mysql_fetch_row(res);
if (!row) {
mysql_free_result(res);
return 0;
}
Json::Value root;
Json::CharReaderBuilder builder;
Json::CharReader* reader = builder.newCharReader();
std::string errors;
bool parsingSuccessful = reader->parse(row[0], row[0] + strlen(row[0]), &root, &errors);
delete reader;
mysql_free_result(res);
if (!parsingSuccessful) {
diag("JSON parsing failed: %s", errors.c_str());
return 0;
}
if (root.isMember("wait_timeout") && root["wait_timeout"].isUInt64()) {
wait_timeout_value = root["wait_timeout"].asUInt64();
return 1;
// Helper function to extract wait_timeout from JSON
int extract_wait_timeout_from_json(const json& j_session, unsigned long long &wait_timeout_value) {
try {
if (j_session.is_array() && !j_session.empty()) {
// If it's an array, get the first element
json session_data = j_session[0];
if (session_data.contains("wait_timeout") && session_data["wait_timeout"].is_number_unsigned()) {
wait_timeout_value = session_data["wait_timeout"].get<unsigned long long>();
return 1;
}
} else if (j_session.contains("wait_timeout") && j_session["wait_timeout"].is_number_unsigned()) {
// If it's a single object
wait_timeout_value = j_session["wait_timeout"].get<unsigned long long>();
return 1;
}
} catch (const std::exception& e) {
diag("Error accessing wait_timeout from JSON: %s", e.what());
}
return 0;
}
@ -80,12 +69,12 @@ int test_session_timeout(CommandLine *cl, MYSQL *admin) {
MYSQL_QUERY_T(proxy, "SET wait_timeout=10");
int rc = run_q(proxy, "DO 1");
int rc = run_q(proxy, "SET sql_mode=''");
ok(rc == 0, (rc == 0 ? "Connection alive" : "Connection killed"));
sleep(12);
rc = run_q(proxy, "DO 1");
rc = run_q(proxy, "SET sql_mode=''");
ok(rc != 0, (rc == 0 ? "Connection alive" : "Connection killed"));
mysql_close(proxy);
@ -107,12 +96,12 @@ int test_session_timeout_exceed_global_timeout(CommandLine *cl, MYSQL *admin) {
MYSQL_QUERY_T(proxy, "SET wait_timeout=20");
int rc = run_q(proxy, "DO 1");
int rc = run_q(proxy, "SET sql_mode=''");
ok(rc == 0, (rc == 0 ? "Connection alive" : "Connection killed"));
sleep(12);
rc = run_q(proxy, "DO 1");
rc = run_q(proxy, "SET sql_mode=''");
ok(rc != 0, (rc == 0 ? "Connection alive" : "Connection killed"));
mysql_close(proxy);
@ -156,15 +145,16 @@ int test_wait_timeout_json_values(CommandLine *cl, MYSQL *admin) {
// Set the wait_timeout value
MYSQL_QUERY_T(proxy, test_cases[i].set_query);
// Query PROXYSQL INTERNAL SESSION to get JSON
if (mysql_query(proxy, "PROXYSQL INTERNAL SESSION")) {
fprintf(stderr, "File %s, line %d, Error: %s\n", __FILE__, __LINE__, mysql_error(proxy));
// Query PROXYSQL INTERNAL SESSION using the utility function
json j_session = fetch_internal_session(proxy, false);
if (j_session.empty()) {
ok(false, "Failed to fetch PROXYSQL INTERNAL SESSION");
mysql_close(proxy);
return EXIT_FAILURE;
}
unsigned long long actual_wait_timeout;
int json_result = extract_wait_timeout_from_json(proxy, actual_wait_timeout);
int json_result = extract_wait_timeout_from_json(j_session, actual_wait_timeout);
if (json_result) {
ok(actual_wait_timeout == test_cases[i].expected_ms,
@ -172,7 +162,7 @@ int test_wait_timeout_json_values(CommandLine *cl, MYSQL *admin) {
actual_wait_timeout, test_cases[i].expected_ms);
diag("Expected: %llu ms, Got: %llu ms", test_cases[i].expected_ms, actual_wait_timeout);
} else {
fail("Failed to extract wait_timeout from JSON");
ok(false, "Failed to extract wait_timeout from JSON");
}
// Small delay between tests

Loading…
Cancel
Save