db: Added testcase for reserves_in_insert()

This commit is contained in:
Sree Harsha Totakura 2015-03-06 01:15:46 +01:00
parent 0c4579085a
commit 0220c51bc9
2 changed files with 44 additions and 5 deletions

View File

@ -43,7 +43,7 @@ static pthread_key_t db_conn_threadlocal;
#define QUERY_ERR(result) \ #define QUERY_ERR(result) \
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "%s: query failed: %s\n", __FUNCTION__, PQresultErrorMessage (result)) GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Query failed at %s:%u: %s\n", __FILE__, __LINE__, PQresultErrorMessage (result))
/** /**
* Database connection string, as read from * Database connection string, as read from
@ -77,6 +77,12 @@ static char *TALER_MINT_db_connection_cfg_str;
PQclear (result); result = NULL; \ PQclear (result); result = NULL; \
} while (0) } while (0)
/**
* This the length of the currency strings (without 0-termination) we use. Note
* that we need to use this at the DB layer instead of TALER_CURRENCY_LEN as the
* DB only needs to store 3 bytes instead of 8 bytes.
*/
#define TALER_DB_CURRENCY_LEN 3
/** /**
* Set the given connection to use a temporary schema * Set the given connection to use a temporary schema
@ -737,7 +743,7 @@ TALER_MINT_DB_reserve_get (PGconn *db,
TALER_DB_extract_amount (result, 0, TALER_DB_extract_amount (result, 0,
"current_balance_value", "current_balance_value",
"current_balance_fraction", "current_balance_fraction",
"current_balance_currency", "balance_currency",
&reserve->balance)); &reserve->balance));
reserve->expiry.abs_value_us = GNUNET_ntohll (expiration_date_nbo); reserve->expiry.abs_value_us = GNUNET_ntohll (expiration_date_nbo);
PQclear (result); PQclear (result);
@ -837,11 +843,11 @@ TALER_MINT_DB_reserves_in_insert (PGconn *db,
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Reserve does not exist; creating a new one\n"); "Reserve does not exist; creating a new one\n");
struct TALER_DB_QueryParam params[] = { struct TALER_DB_QueryParam params[] = {
TALER_DB_QUERY_PARAM_PTR_SIZED (reserve->pub, sizeof (reserve->pub)), TALER_DB_QUERY_PARAM_PTR (reserve->pub),
TALER_DB_QUERY_PARAM_PTR (&balance_nbo.value), TALER_DB_QUERY_PARAM_PTR (&balance_nbo.value),
TALER_DB_QUERY_PARAM_PTR (&balance_nbo.fraction), TALER_DB_QUERY_PARAM_PTR (&balance_nbo.fraction),
TALER_DB_QUERY_PARAM_PTR_SIZED (balance_nbo.currency, TALER_DB_QUERY_PARAM_PTR_SIZED (balance_nbo.currency,
TALER_CURRENCY_LEN), TALER_DB_CURRENCY_LEN),
TALER_DB_QUERY_PARAM_PTR (&expiry_nbo), TALER_DB_QUERY_PARAM_PTR (&expiry_nbo),
TALER_DB_QUERY_PARAM_END TALER_DB_QUERY_PARAM_END
}; };
@ -866,7 +872,7 @@ TALER_MINT_DB_reserves_in_insert (PGconn *db,
result = TALER_DB_exec_prepared (db, result = TALER_DB_exec_prepared (db,
"create_reserves_in_transaction", "create_reserves_in_transaction",
params); params);
if (PGRES_COMMAND_OK != result) if (PGRES_COMMAND_OK != PQresultStatus(result))
{ {
QUERY_ERR (result); QUERY_ERR (result);
goto rollback; goto rollback;

View File

@ -25,6 +25,13 @@
static int result; static int result;
#define FAILIF(cond) \
do { \
if (!(cond)){ break;} \
GNUNET_break (0); \
goto drop; \
} while (0)
/** /**
* Main function that will be run by the scheduler. * Main function that will be run by the scheduler.
@ -39,6 +46,10 @@ run (void *cls, char *const *args, const char *cfgfile,
const struct GNUNET_CONFIGURATION_Handle *config) const struct GNUNET_CONFIGURATION_Handle *config)
{ {
PGconn *db; PGconn *db;
struct GNUNET_CRYPTO_EddsaPublicKey pub;
struct Reserve reserve;
struct GNUNET_TIME_Absolute expiry;
struct TALER_Amount amount;
db = NULL; db = NULL;
if (GNUNET_OK != TALER_MINT_DB_init ("postgres:///taler")) if (GNUNET_OK != TALER_MINT_DB_init ("postgres:///taler"))
@ -56,6 +67,28 @@ run (void *cls, char *const *args, const char *cfgfile,
result = 3; result = 3;
goto drop; goto drop;
} }
GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_WEAK,
&pub, sizeof (pub));
reserve.pub = &pub;
amount.value = 1;
amount.fraction = 1;
strcpy (amount.currency, "EUR");
expiry = GNUNET_TIME_absolute_add (GNUNET_TIME_absolute_get (),
GNUNET_TIME_UNIT_HOURS);
result = 4;
FAILIF (GNUNET_OK != TALER_MINT_DB_reserves_in_insert (db,
&reserve,
amount,
expiry));
{
struct Reserve g_reserve;
g_reserve.pub = &pub;
FAILIF (GNUNET_OK != TALER_MINT_DB_reserve_get (db, &g_reserve));
FAILIF (amount.value != g_reserve.balance.value);
FAILIF (amount.fraction != g_reserve.balance.fraction);
FAILIF (0 != strcmp (amount.currency, g_reserve.balance.currency));
FAILIF (expiry.abs_value_us != g_reserve.expiry.abs_value_us);
}
result = 0; result = 0;
drop: drop:
if (NULL != db) if (NULL != db)