diff options
author | Christian Grothoff <christian@grothoff.org> | 2015-05-07 14:36:49 +0200 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2015-05-07 14:36:49 +0200 |
commit | f7780b52f11c953966fab654bb5aa72634a2ff3b (patch) | |
tree | fd02855c07cd2f0cbe12f7a75aef12405d2e241d | |
parent | 292b6cf265ab2699c53796de1a2b89348202e184 (diff) |
pq test skeleton, not finished
-rw-r--r-- | src/mintdb/plugin_mintdb_postgres.c | 1 | ||||
-rw-r--r-- | src/pq/Makefile.am | 15 | ||||
-rw-r--r-- | src/pq/test_pq.c | 229 |
3 files changed, 245 insertions, 0 deletions
diff --git a/src/mintdb/plugin_mintdb_postgres.c b/src/mintdb/plugin_mintdb_postgres.c index 2f61211a5..7b89673e2 100644 --- a/src/mintdb/plugin_mintdb_postgres.c +++ b/src/mintdb/plugin_mintdb_postgres.c @@ -162,6 +162,7 @@ postgres_create_tables (void *cls, TALER_LOG_ERROR ("Database connection failed: %s\n", PQerrorMessage (conn)); GNUNET_break (0); + PQfinish (conn); return GNUNET_SYSERR; } if ( (GNUNET_YES == temporary) && diff --git a/src/pq/Makefile.am b/src/pq/Makefile.am index 341baa53c..8a5399fb1 100644 --- a/src/pq/Makefile.am +++ b/src/pq/Makefile.am @@ -15,6 +15,7 @@ libtalerpq_la_SOURCES = \ db_pq.c libtalerpq_la_LIBADD = \ + $(top_builddir)/src/util/libtalerutil.la \ -lgnunetutil \ -lpq $(XLIB) @@ -22,3 +23,17 @@ libtalerpq_la_LDFLAGS = \ $(POSTGRESQL_LDFLAGS) \ -version-info 0:0:0 \ -export-dynamic -no-undefined + +TESTS = \ + test_pq + +check_PROGRAMS= \ + test_pq + +test_pq_SOURCES = \ + test_pq.c +test_pq_LDADD = \ + libtalerpq.la \ + $(top_builddir)/src/util/libtalerutil.la \ + -lgnunetutil \ + -lpq $(XLIB) diff --git a/src/pq/test_pq.c b/src/pq/test_pq.c new file mode 100644 index 000000000..2d56e11e7 --- /dev/null +++ b/src/pq/test_pq.c @@ -0,0 +1,229 @@ +/* + This file is part of TALER + (C) 2015 Christian Grothoff (and other contributing authors) + + TALER is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + TALER is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + TALER; see the file COPYING. If not, If not, see <http://www.gnu.org/licenses/> +*/ + +/** + * @file pq/test_pq.c + * @brief Tests for Postgres convenience API + * @author Christian Grothoff <christian@grothoff.org> + */ +#include "platform.h" +#include "taler_util.h" +#include "taler_pq_lib.h" + + +/** + * Setup prepared statements. + * + * @param db_conn connection handle to initialize + * @return #GNUNET_OK on success, #GNUNET_SYSERR on failure + */ +static int +postgres_prepare (PGconn *db_conn) +{ + PGresult *result; + +#define PREPARE(name, sql, ...) \ + do { \ + result = PQprepare (db_conn, name, sql, __VA_ARGS__); \ + if (PGRES_COMMAND_OK != PQresultStatus (result)) \ + { \ + GNUNET_break (0); \ + PQclear (result); result = NULL; \ + return GNUNET_SYSERR; \ + } \ + PQclear (result); result = NULL; \ + } while (0); + + PREPARE ("test_insert", + "INSERT INTO test_pq (" + " pub" + ",sig" + ",abs_time" + ",forever" + ",hash" + ",hamount_val" + ",hamount_frac" + ",hamount_curr" + ",namount_val" + ",namount_frac" + ",namount_curr" + ") VALUES " + "($1, $2, $3, $4, $5, $6," + "$7, $8, $9, $10, $11);", + 11, NULL); + PREPARE ("test_select", + "SELECT" + " pub" + ",sig" + ",abs_time" + ",forever" + ",hash" + ",hamount_val" + ",hamount_frac" + ",hamount_curr" + ",namount_val" + ",namount_frac" + ",namount_curr" + "FROM test_pq" + "ORDER BY abs_time DESC " + "LIMIT 1;", + 0, NULL); + return GNUNET_OK; +#undef PREPARE +} + + +/** + * Run actual test queries. + * + * @return 0 on success + */ +static int +run_queries (PGconn *conn) +{ + struct GNUNET_CRYPTO_rsa_PublicKey *pub; + struct GNUNET_CRYPTO_rsa_PublicKey *pub2 = NULL; + struct GNUNET_CRYPTO_rsa_Signature *sig; + struct GNUNET_CRYPTO_rsa_Signature *sig2 = NULL; + struct GNUNET_TIME_Absolute abs_time = GNUNET_TIME_absolute_get (); + struct GNUNET_TIME_Absolute abs_time2; + struct GNUNET_TIME_Absolute forever = GNUNET_TIME_UNIT_FOREVER_ABS; + struct GNUNET_TIME_Absolute forever2; + struct GNUNET_HashCode hc; + struct GNUNET_HashCode hc2; + struct TALER_Amount hamount; + struct TALER_Amount hamount2; + struct TALER_AmountNBO namount; + struct TALER_AmountNBO namount2; + struct TALER_PQ_QueryParam params_insert[] = { + TALER_PQ_QUERY_PARAM_RSA_PUBLIC_KEY (pub), + TALER_PQ_QUERY_PARAM_RSA_SIGNATURE (sig), + TALER_PQ_QUERY_PARAM_ABSOLUTE_TIME (abs_time), + TALER_PQ_QUERY_PARAM_ABSOLUTE_TIME (forever), + TALER_PQ_QUERY_PARAM_PTR (&hc), + TALER_PQ_QUERY_PARAM_AMOUNT (hamount), + TALER_PQ_QUERY_PARAM_AMOUNT_NBO (namount), + TALER_PQ_QUERY_PARAM_END + }; + struct TALER_PQ_QueryParam params_select[] = { + TALER_PQ_QUERY_PARAM_END + }; + struct TALER_PQ_ResultSpec results_select[] = { + TALER_PQ_RESULT_SPEC_RSA_PUBLIC_KEY ("pub", pub2), + TALER_PQ_RESULT_SPEC_RSA_SIGNATURE ("sig", sig2), + TALER_PQ_RESULT_SPEC_ABSOLUTE_TIME ("abs_time", abs_time2), + TALER_PQ_RESULT_SPEC_ABSOLUTE_TIME ("forever", forever2), + TALER_PQ_RESULT_SPEC ("hash", &hc2), + TALER_PQ_RESULT_SPEC_AMOUNT ("hamount", hamount2), + TALER_PQ_RESULT_SPEC_AMOUNT_NBO ("namount", namount2), + TALER_PQ_RESULT_SPEC_END + }; + PGresult *result; + int ret; + + // FIXME: init pub, sig + result = TALER_PQ_exec_prepared (conn, + "test_insert", + params_insert); + PQclear (result); + result = TALER_PQ_exec_prepared (conn, + "test_select", + params_select); + ret = TALER_PQ_extract_result (result, + results_select, + 0); + // FIXME: cmp results! + TALER_PQ_cleanup_result (results_select); + PQclear (result); + + if (GNUNET_OK != ret) + return 1; + + return 0; +} + + +int +main(int argc, + const char *const argv[]) +{ + PGconn *conn; + PGresult *result; + int ret; + + // FIXME: pass valid connect string for tests... + conn = PQconnectdb (""); + if (CONNECTION_OK != PQstatus (conn)) + { + fprintf (stderr, + "Cannot run test, database connection failed: %s\n", + PQerrorMessage (conn)); + GNUNET_break (0); + PQfinish (conn); + return 0; /* We ignore this type of error... */ + } + + result = PQexec (conn, + "CREATE TABLE test_pq (" + " pub BYTEA NOT NULL" + ",sig BYTEA NOT NULL" + ",abs_time INT8 NOT NULL" + ",forever INT8 NOT NULL" + ",hash BYTEA NOT NULL CHECK(LENGTH(hash)=64)" + ",hamount_val INT8 NOT NULL" + ",hamount_frac INT4 NOT NULL" + ",hamount_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL" + ",namount_val INT8 NOT NULL" + ",namount_frac INT4 NOT NULL" + ",namount_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL" + ")"); + if (PGRES_COMMAND_OK != PQresultStatus (result)) + { + fprintf (stderr, + "Failed to create table: %s\n", + PQerrorMessage (conn)); + PQclear (result); + PQfinish (conn); + return 1; + } + PQclear (result); + if (GNUNET_OK != + postgres_prepare (conn)) + { + GNUNET_break (0); + PQclear (result); + PQfinish (conn); + return 1; + } + ret = run_queries (conn); + result = PQexec (conn, + "DROP TABLE test_pq"); + if (PGRES_COMMAND_OK != PQresultStatus (result)) + { + fprintf (stderr, + "Failed to create table: %s\n", + PQerrorMessage (conn)); + PQclear (result); + PQfinish (conn); + return 1; + } + PQclear (result); + PQfinish (conn); + return ret; +} + + +/* end of test_pq.c */ |