1
0
mirror of https://github.com/pgbackrest/pgbackrest.git synced 2024-12-12 10:04:14 +02:00

Update postgres/client unit test to conform to current patterns.

This includes adding test titles and using constants for query and error values that repeat.
This commit is contained in:
David Steele 2022-04-18 11:53:31 -04:00
parent bc5f6fac34
commit 9751ddc4f8

View File

@ -28,9 +28,10 @@ testRun(void)
// ***************************************************************************************************************************** // *****************************************************************************************************************************
if (testBegin("pgClient")) if (testBegin("pgClient"))
{ {
// Create and start the test database
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
#ifdef HARNESS_PQ_REAL #ifdef HARNESS_PQ_REAL
TEST_TITLE("create/start test database");
#define TEST_PG_VERSION "14" #define TEST_PG_VERSION "14"
HRN_SYSTEM("sudo pg_createcluster " TEST_PG_VERSION " test"); HRN_SYSTEM("sudo pg_createcluster " TEST_PG_VERSION " test");
@ -38,8 +39,9 @@ testRun(void)
HRN_SYSTEM("cd /var/lib/postgresql && sudo -u postgres psql -c 'create user " TEST_USER " superuser'"); HRN_SYSTEM("cd /var/lib/postgresql && sudo -u postgres psql -c 'create user " TEST_USER " superuser'");
#endif #endif
// Test connection error
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
TEST_TITLE("connection error");
#define TEST_PQ_ERROR \ #define TEST_PQ_ERROR \
"connection to server on socket \"/var/run/postgresql/.s.PGSQL.5433\" failed: No such file or directory\n" \ "connection to server on socket \"/var/run/postgresql/.s.PGSQL.5433\" failed: No such file or directory\n" \
"\tIs the server running locally and accepting connections on that socket?" "\tIs the server running locally and accepting connections on that socket?"
@ -71,15 +73,19 @@ testRun(void)
#undef TEST_PQ_ERROR #undef TEST_PQ_ERROR
// Test send error
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
TEST_TITLE("send error");
#define TEST_PQ_ERROR "another command is already in progress"
#define TEST_QUERY "select bogus from pg_class"
#ifndef HARNESS_PQ_REAL #ifndef HARNESS_PQ_REAL
harnessPqScriptSet((HarnessPq []) harnessPqScriptSet((HarnessPq [])
{ {
{.function = HRNPQ_CONNECTDB, .param = "[\"dbname='postgres' port=5432\"]"}, {.function = HRNPQ_CONNECTDB, .param = "[\"dbname='postgres' port=5432\"]"},
{.function = HRNPQ_STATUS, .resultInt = CONNECTION_OK}, {.function = HRNPQ_STATUS, .resultInt = CONNECTION_OK},
{.function = HRNPQ_SENDQUERY, .param = "[\"select bogus from pg_class\"]", .resultInt = 0}, {.function = HRNPQ_SENDQUERY, .param = "[\"" TEST_QUERY "\"]", .resultInt = 0},
{.function = HRNPQ_ERRORMESSAGE, .resultZ = "another command is already in progress\n"}, {.function = HRNPQ_ERRORMESSAGE, .resultZ = TEST_PQ_ERROR "\n"},
{.function = HRNPQ_FINISH}, {.function = HRNPQ_FINISH},
{.function = NULL} {.function = NULL}
}); });
@ -88,19 +94,20 @@ testRun(void)
TEST_ASSIGN(client, pgClientOpen(pgClientNew(NULL, 5432, STRDEF("postgres"), NULL, 3000)), "new client"); TEST_ASSIGN(client, pgClientOpen(pgClientNew(NULL, 5432, STRDEF("postgres"), NULL, 3000)), "new client");
#ifdef HARNESS_PQ_REAL #ifdef HARNESS_PQ_REAL
PQsendQuery(client->connection, "select bogus from pg_class"); PQsendQuery(client->connection, TEST_QUERY);
#endif #endif
const String *query = STRDEF("select bogus from pg_class");
TEST_ERROR( TEST_ERROR(
pgClientQuery(client, query), DbQueryError, pgClientQuery(client, STRDEF(TEST_QUERY)), DbQueryError, "unable to send query '" TEST_QUERY "': " TEST_PQ_ERROR);
"unable to send query 'select bogus from pg_class': another command is already in progress");
TEST_RESULT_VOID(pgClientFree(client), "free client"); TEST_RESULT_VOID(pgClientFree(client), "free client");
// Connect #undef TEST_PQ_ERROR
#undef TEST_QUERY
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
TEST_TITLE("connect");
#ifndef HARNESS_PQ_REAL #ifndef HARNESS_PQ_REAL
harnessPqScriptSet((HarnessPq []) harnessPqScriptSet((HarnessPq [])
{ {
@ -115,40 +122,45 @@ testRun(void)
client, pgClientOpen(pgClientNew(STRDEF("/var/run/postgresql"), 5432, STRDEF("postgres"), TEST_USER_STR, 500)), client, pgClientOpen(pgClientNew(STRDEF("/var/run/postgresql"), 5432, STRDEF("postgres"), TEST_USER_STR, 500)),
"new client"); "new client");
// Invalid query
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
TEST_TITLE("invalid query");
#define TEST_PQ_ERROR \
"ERROR: column \"bogus\" does not exist\n" \
"LINE 1: select bogus from pg_class\n" \
" ^"
#define TEST_QUERY "select bogus from pg_class"
#ifndef HARNESS_PQ_REAL #ifndef HARNESS_PQ_REAL
harnessPqScriptSet((HarnessPq []) harnessPqScriptSet((HarnessPq [])
{ {
{.function = HRNPQ_SENDQUERY, .param = "[\"select bogus from pg_class\"]", .resultInt = 1}, {.function = HRNPQ_SENDQUERY, .param = "[\"" TEST_QUERY "\"]", .resultInt = 1},
{.function = HRNPQ_CONSUMEINPUT}, {.function = HRNPQ_CONSUMEINPUT},
{.function = HRNPQ_ISBUSY}, {.function = HRNPQ_ISBUSY},
{.function = HRNPQ_GETRESULT}, {.function = HRNPQ_GETRESULT},
{.function = HRNPQ_RESULTSTATUS, .resultInt = PGRES_FATAL_ERROR}, {.function = HRNPQ_RESULTSTATUS, .resultInt = PGRES_FATAL_ERROR},
{.function = HRNPQ_RESULTERRORMESSAGE, .resultZ = {.function = HRNPQ_RESULTERRORMESSAGE, .resultZ = TEST_PQ_ERROR " \n"},
"ERROR: column \"bogus\" does not exist\n"
"LINE 1: select bogus from pg_class\n"
" ^ \n"},
{.function = HRNPQ_CLEAR}, {.function = HRNPQ_CLEAR},
{.function = HRNPQ_GETRESULT, .resultNull = true}, {.function = HRNPQ_GETRESULT, .resultNull = true},
{.function = NULL} {.function = NULL}
}); });
#endif #endif
query = STRDEF("select bogus from pg_class");
TEST_ERROR( TEST_ERROR(
pgClientQuery(client, query), DbQueryError, pgClientQuery(client, STRDEF(TEST_QUERY)), DbQueryError, "unable to execute query '" TEST_QUERY "': " TEST_PQ_ERROR);
"unable to execute query 'select bogus from pg_class': ERROR: column \"bogus\" does not exist\n"
"LINE 1: select bogus from pg_class\n" #undef TEST_PQ_ERROR
" ^"); #undef TEST_QUERY
// Timeout query
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
TEST_TITLE("query timeout");
#define TEST_QUERY "select pg_sleep(3000)"
#ifndef HARNESS_PQ_REAL #ifndef HARNESS_PQ_REAL
harnessPqScriptSet((HarnessPq []) harnessPqScriptSet((HarnessPq [])
{ {
{.function = HRNPQ_SENDQUERY, .param = "[\"select pg_sleep(3000)\"]", .resultInt = 1}, {.function = HRNPQ_SENDQUERY, .param = "[\"" TEST_QUERY "\"]", .resultInt = 1},
{.function = HRNPQ_CONSUMEINPUT, .sleep = 600}, {.function = HRNPQ_CONSUMEINPUT, .sleep = 600},
{.function = HRNPQ_ISBUSY, .resultInt = 1}, {.function = HRNPQ_ISBUSY, .resultInt = 1},
{.function = HRNPQ_CONSUMEINPUT}, {.function = HRNPQ_CONSUMEINPUT},
@ -163,38 +175,46 @@ testRun(void)
}); });
#endif #endif
query = STRDEF("select pg_sleep(3000)"); TEST_ERROR(pgClientQuery(client, STRDEF(TEST_QUERY)), DbQueryError, "query '" TEST_QUERY "' timed out after 500ms");
TEST_ERROR(pgClientQuery(client, query), DbQueryError, "query 'select pg_sleep(3000)' timed out after 500ms"); #undef TEST_QUERY
// Cancel error (can only be run with the scripted tests
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
#ifndef HARNESS_PQ_REAL #ifndef HARNESS_PQ_REAL
TEST_TITLE("cancel error");
#define TEST_PQ_ERROR "test error"
#define TEST_QUERY "select pg_sleep(3000)"
harnessPqScriptSet((HarnessPq []) harnessPqScriptSet((HarnessPq [])
{ {
{.function = HRNPQ_SENDQUERY, .param = "[\"select pg_sleep(3000)\"]", .resultInt = 1}, {.function = HRNPQ_SENDQUERY, .param = "[\"" TEST_QUERY "\"]", .resultInt = 1},
{.function = HRNPQ_CONSUMEINPUT, .sleep = 600}, {.function = HRNPQ_CONSUMEINPUT, .sleep = 600},
{.function = HRNPQ_ISBUSY, .resultInt = 1}, {.function = HRNPQ_ISBUSY, .resultInt = 1},
{.function = HRNPQ_CONSUMEINPUT}, {.function = HRNPQ_CONSUMEINPUT},
{.function = HRNPQ_ISBUSY, .resultInt = 1}, {.function = HRNPQ_ISBUSY, .resultInt = 1},
{.function = HRNPQ_GETCANCEL}, {.function = HRNPQ_GETCANCEL},
{.function = HRNPQ_CANCEL, .resultInt = 0, .resultZ = "test error"}, {.function = HRNPQ_CANCEL, .resultInt = 0, .resultZ = TEST_PQ_ERROR},
{.function = HRNPQ_FREECANCEL}, {.function = HRNPQ_FREECANCEL},
{.function = NULL} {.function = NULL}
}); });
query = STRDEF("select pg_sleep(3000)"); TEST_ERROR(
pgClientQuery(client, STRDEF(TEST_QUERY)), DbQueryError, "unable to cancel query '" TEST_QUERY "': " TEST_PQ_ERROR);
TEST_ERROR(pgClientQuery(client, query), DbQueryError, "unable to cancel query 'select pg_sleep(3000)': test error"); #undef TEST_PQ_ERROR
#undef TEST_QUERY
#endif #endif
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
#ifndef HARNESS_PQ_REAL #ifndef HARNESS_PQ_REAL
TEST_TITLE("PQgetCancel() returns NULL"); TEST_TITLE("PQgetCancel() returns NULL");
#define TEST_QUERY "select 1"
harnessPqScriptSet((HarnessPq []) harnessPqScriptSet((HarnessPq [])
{ {
{.function = HRNPQ_SENDQUERY, .param = "[\"select 1\"]", .resultInt = 1}, {.function = HRNPQ_SENDQUERY, .param = "[\"" TEST_QUERY "\"]", .resultInt = 1},
{.function = HRNPQ_CONSUMEINPUT, .sleep = 600}, {.function = HRNPQ_CONSUMEINPUT, .sleep = 600},
{.function = HRNPQ_ISBUSY, .resultInt = 1}, {.function = HRNPQ_ISBUSY, .resultInt = 1},
{.function = HRNPQ_CONSUMEINPUT}, {.function = HRNPQ_CONSUMEINPUT},
@ -204,15 +224,21 @@ testRun(void)
}); });
TEST_ERROR( TEST_ERROR(
pgClientQuery(client, STRDEF("select 1")), DbQueryError, "unable to cancel query 'select 1': connection was lost"); pgClientQuery(client, STRDEF(TEST_QUERY)), DbQueryError,
"unable to cancel query '" TEST_QUERY "': connection was lost");
#undef TEST_QUERY
#endif #endif
// Execute do block and raise notice
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
TEST_TITLE("execute do block and raise notice");
#define TEST_QUERY "do $$ begin raise notice 'mememe'; end $$"
#ifndef HARNESS_PQ_REAL #ifndef HARNESS_PQ_REAL
harnessPqScriptSet((HarnessPq []) harnessPqScriptSet((HarnessPq [])
{ {
{.function = HRNPQ_SENDQUERY, .param = "[\"do $$ begin raise notice 'mememe'; end $$\"]", .resultInt = 1}, {.function = HRNPQ_SENDQUERY, .param = "[\"" TEST_QUERY "\"]", .resultInt = 1},
{.function = HRNPQ_CONSUMEINPUT}, {.function = HRNPQ_CONSUMEINPUT},
{.function = HRNPQ_ISBUSY}, {.function = HRNPQ_ISBUSY},
{.function = HRNPQ_GETRESULT}, {.function = HRNPQ_GETRESULT},
@ -223,16 +249,19 @@ testRun(void)
}); });
#endif #endif
query = STRDEF("do $$ begin raise notice 'mememe'; end $$"); TEST_RESULT_PTR(pgClientQuery(client, STRDEF(TEST_QUERY)), NULL, "execute do block");
TEST_RESULT_PTR(pgClientQuery(client, query), NULL, "execute do block"); #undef TEST_QUERY
// Unsupported type
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
TEST_TITLE("unsupported type");
#define TEST_QUERY "select clock_timestamp()"
#ifndef HARNESS_PQ_REAL #ifndef HARNESS_PQ_REAL
harnessPqScriptSet((HarnessPq []) harnessPqScriptSet((HarnessPq [])
{ {
{.function = HRNPQ_SENDQUERY, .param = "[\"select clock_timestamp()\"]", .resultInt = 1}, {.function = HRNPQ_SENDQUERY, .param = "[\"" TEST_QUERY "\"]", .resultInt = 1},
{.function = HRNPQ_CONSUMEINPUT}, {.function = HRNPQ_CONSUMEINPUT},
{.function = HRNPQ_ISBUSY}, {.function = HRNPQ_ISBUSY},
{.function = HRNPQ_GETRESULT}, {.function = HRNPQ_GETRESULT},
@ -247,22 +276,24 @@ testRun(void)
}); });
#endif #endif
query = STRDEF("select clock_timestamp()");
TEST_ERROR( TEST_ERROR(
pgClientQuery(client, query), FormatError, pgClientQuery(client, STRDEF(TEST_QUERY)), FormatError,
"unable to parse type 1184 in column 0 for query 'select clock_timestamp()'"); "unable to parse type 1184 in column 0 for query '" TEST_QUERY "'");
#undef TEST_QUERY
// Successful query
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
TEST_TITLE("successful query");
#define TEST_QUERY \
"select oid, case when relname = 'pg_class' then null::text else '' end, relname, relname = 'pg_class'" \
" from pg_class where relname in ('pg_class', 'pg_proc')" \
" order by relname"
#ifndef HARNESS_PQ_REAL #ifndef HARNESS_PQ_REAL
harnessPqScriptSet((HarnessPq []) harnessPqScriptSet((HarnessPq [])
{ {
{.function = HRNPQ_SENDQUERY, .param = {.function = HRNPQ_SENDQUERY, .param = "[\"" TEST_QUERY "\"]", .resultInt = 1},
"[\"select oid, case when relname = 'pg_class' then null::text else '' end, relname, relname = 'pg_class'"
" from pg_class where relname in ('pg_class', 'pg_proc')"
" order by relname\"]",
.resultInt = 1},
{.function = HRNPQ_CONSUMEINPUT}, {.function = HRNPQ_CONSUMEINPUT},
{.function = HRNPQ_ISBUSY}, {.function = HRNPQ_ISBUSY},
{.function = HRNPQ_GETRESULT}, {.function = HRNPQ_GETRESULT},
@ -293,17 +324,15 @@ testRun(void)
}); });
#endif #endif
query = STRDEF(
"select oid, case when relname = 'pg_class' then null::text else '' end, relname, relname = 'pg_class'"
" from pg_class where relname in ('pg_class', 'pg_proc')"
" order by relname");
TEST_RESULT_STR_Z( TEST_RESULT_STR_Z(
jsonFromVar(varNewVarLst(pgClientQuery(client, query))), jsonFromVar(varNewVarLst(pgClientQuery(client, STRDEF(TEST_QUERY)))),
"[[1259,null,\"pg_class\",true],[1255,\"\",\"pg_proc\",false]]", "simple query"); "[[1259,null,\"pg_class\",true],[1255,\"\",\"pg_proc\",false]]", "simple query");
// Close connection #undef TEST_QUERY
// ------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------
TEST_TITLE("close connection");
#ifndef HARNESS_PQ_REAL #ifndef HARNESS_PQ_REAL
harnessPqScriptSet((HarnessPq []) harnessPqScriptSet((HarnessPq [])
{ {