You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
proxysql/test/tap/tests/unit/backend_sync_unit-t.cpp

88 lines
3.1 KiB

/**
* @file backend_sync_unit-t.cpp
* @brief Unit tests for backend variable sync decisions.
*
* @see Phase 3.6 (GitHub issue #5494)
*/
#include "tap.h"
#include "test_globals.h"
#include "test_init.h"
#include "proxysql.h"
#include "BackendSyncDecision.h"
static void test_no_sync_needed() {
int a = determine_backend_sync_actions("user", "user", "db", "db", true, true);
ok(a == SYNC_NONE, "no sync: all match");
a = determine_backend_sync_actions("user", "user", "db", "db", false, false);
ok(a == SYNC_NONE, "no sync: autocommit both false");
}
static void test_schema_mismatch() {
int a = determine_backend_sync_actions("user", "user", "app_db", "other_db", true, true);
ok((a & SYNC_SCHEMA) != 0, "schema mismatch: SYNC_SCHEMA set");
ok((a & SYNC_USER) == 0, "schema mismatch: SYNC_USER not set");
}
static void test_user_mismatch() {
int a = determine_backend_sync_actions("alice", "bob", "db", "db", true, true);
ok((a & SYNC_USER) != 0, "user mismatch: SYNC_USER set");
// Schema check skipped when user differs (CHANGE USER handles schema)
ok((a & SYNC_SCHEMA) == 0, "user mismatch: SYNC_SCHEMA not set (handled by CHANGE USER)");
}
static void test_user_and_schema_mismatch() {
int a = determine_backend_sync_actions("alice", "bob", "db1", "db2", true, true);
ok((a & SYNC_USER) != 0, "user+schema: SYNC_USER set");
ok((a & SYNC_SCHEMA) == 0, "user+schema: schema handled by user change");
}
static void test_autocommit_mismatch() {
int a = determine_backend_sync_actions("user", "user", "db", "db", true, false);
ok((a & SYNC_AUTOCOMMIT) != 0, "autocommit mismatch: SYNC_AUTOCOMMIT set");
ok((a & SYNC_SCHEMA) == 0, "autocommit mismatch: no other sync");
}
static void test_multiple_mismatches() {
int a = determine_backend_sync_actions("user", "user", "db1", "db2", true, false);
ok((a & SYNC_SCHEMA) != 0, "multi: SYNC_SCHEMA set");
ok((a & SYNC_AUTOCOMMIT) != 0, "multi: SYNC_AUTOCOMMIT set");
}
static void test_null_handling() {
// null users — no crash
// Asymmetric NULL: one side null, other not → mismatch
int a = determine_backend_sync_actions(nullptr, "user", "db", "db", true, true);
ok((a & SYNC_USER) != 0, "null client_user + non-null backend → SYNC_USER");
a = determine_backend_sync_actions("user", nullptr, "db", "db", true, true);
ok((a & SYNC_USER) != 0, "non-null client_user + null backend → SYNC_USER");
// Both null → no mismatch
a = determine_backend_sync_actions(nullptr, nullptr, "db", "db", true, true);
ok(a == SYNC_NONE, "both users null → no sync");
// Schema asymmetric null
a = determine_backend_sync_actions("user", "user", nullptr, "db", true, true);
ok((a & SYNC_SCHEMA) != 0, "null client_schema + non-null backend → SYNC_SCHEMA");
}
int main() {
plan(17);
int rc = test_init_minimal();
ok(rc == 0, "test_init_minimal() succeeds");
test_no_sync_needed(); // 2
test_schema_mismatch(); // 2
test_user_mismatch(); // 2
test_user_and_schema_mismatch(); // 2
test_autocommit_mismatch(); // 2
test_multiple_mismatches(); // 2
test_null_handling(); // 4
// Total: 1+2+2+2+2+2+2+4 = 17
test_cleanup_minimal();
return exit_status();
}