improve test case coverage for exchangedb

This commit is contained in:
Christian Grothoff 2017-04-09 21:28:45 +02:00
parent c298436020
commit 70517233c9
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
3 changed files with 148 additions and 8 deletions

View File

@ -3373,9 +3373,7 @@ static void
free_dpk_result (struct TALER_DenominationPublicKey *denom_pubs,
unsigned int denom_pubs_len)
{
unsigned int i;
for (i=0;i<denom_pubs_len;i++)
for (unsigned int i=0;i<denom_pubs_len;i++)
{
GNUNET_CRYPTO_rsa_public_key_free (denom_pubs[i].rsa_public_key);
denom_pubs[i].rsa_public_key = NULL;
@ -3724,10 +3722,9 @@ postgres_get_refresh_transfer_public_key (void *cls,
/**
* Insert signature of a new coin generated during refresh into
* Get signature of a new coin generated during refresh into
* the database indexed by the refresh session and the index
* of the coin. This data is later used should an old coin
* be used to try to obtain the private keys during "/refresh/link".
* of the coin.
*
* @param cls the `struct PostgresClosure` with the plugin-specific state
* @param session database connection
@ -5988,7 +5985,7 @@ postgres_get_reserve_by_h_blind (void *cls,
* @param denom_pub_hash hash of the revoked denomination key
* @param master_sig signature affirming the revocation
* @return #GNUNET_OK on success,
* #GNUNET_NO if the entry already exists
* #GNUNET_NO if the entry already exists (transaction must be rolled back!)
* #GNUNET_SYSERR on DB errors
*/
static int
@ -6010,6 +6007,21 @@ postgres_insert_denomination_revocation (void *cls,
params);
if (PGRES_COMMAND_OK != PQresultStatus (result))
{
const char *efield;
efield = PQresultErrorField (result,
PG_DIAG_SQLSTATE);
if ( (PGRES_FATAL_ERROR == PQresultStatus(result)) &&
(NULL != strstr ("23505", /* unique violation */
efield)) )
{
/* This means we had the same reserve/justification/details
before */
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Uniqueness violation, revocation details already known\n");
PQclear (result);
return GNUNET_NO;
}
ret = GNUNET_SYSERR;
BREAK_DB_ERR (result, session->conn);
}

View File

@ -663,18 +663,35 @@ test_melting (struct TALER_EXCHANGEDB_Session *session)
for (cnt=0; cnt < MELT_NEW_COINS; cnt++)
{
struct GNUNET_HashCode hc;
struct TALER_DenominationSignature test_sig;
RND_BLK (&hc);
ev_sigs[cnt].rsa_signature
= GNUNET_CRYPTO_rsa_sign_fdh (new_dkp[cnt]->priv.rsa_private_key,
&hc);
GNUNET_assert (NULL != ev_sigs[cnt].rsa_signature);
FAILIF (GNUNET_NO !=
plugin->get_refresh_out (plugin->cls,
session,
&session_hash,
cnt,
&test_sig));
FAILIF (GNUNET_OK !=
plugin->insert_refresh_out (plugin->cls,
session,
&session_hash,
cnt,
&ev_sigs[cnt]));
FAILIF (GNUNET_OK !=
plugin->get_refresh_out (plugin->cls,
session,
&session_hash,
cnt,
&test_sig));
FAILIF (0 !=
GNUNET_CRYPTO_rsa_signature_cmp (test_sig.rsa_signature,
ev_sigs[cnt].rsa_signature));
GNUNET_CRYPTO_rsa_signature_free (test_sig.rsa_signature);
}
ldl = plugin->get_link_data_list (plugin->cls,
@ -705,6 +722,18 @@ test_melting (struct TALER_EXCHANGEDB_Session *session)
plugin->free_link_data_list (plugin->cls,
ldl);
{
/* Just to test fetching a coin with melt history */
struct TALER_EXCHANGEDB_TransactionList *tl;
tl = plugin->get_coin_transactions (plugin->cls,
session,
&meltp->coin.coin_pub);
plugin->free_coin_transaction_list (plugin->cls,
tl);
}
{
int ok;
@ -1338,7 +1367,38 @@ test_wire_out (struct TALER_EXCHANGEDB_Session *session,
}
/**
* Function called about paybacks the exchange has to perform.
*
* @param cls closure with the expected value for @a coin_blind
* @param rowid row identifier used to uniquely identify the payback operation
* @param timestamp when did we receive the payback request
* @param amount how much should be added back to the reserve
* @param reserve_pub public key of the reserve
* @param coin public information about the coin
* @param coin_sig signature with @e coin_pub of type #TALER_SIGNATURE_WALLET_COIN_PAYBACK
* @param coin_blind blinding factor used to blind the coin
* @return #GNUNET_OK to continue to iterate, #GNUNET_SYSERR to stop
*/
static int
payback_cb (void *cls,
uint64_t rowid,
struct GNUNET_TIME_Absolute timestamp,
const struct TALER_Amount *amount,
const struct TALER_ReservePublicKeyP *reserve_pub,
const struct TALER_CoinPublicInfo *coin,
const struct TALER_CoinSpendSignatureP *coin_sig,
const struct TALER_DenominationBlindingKeyP *coin_blind)
{
const struct TALER_DenominationBlindingKeyP *cb = cls;
FAILIF (0 != memcmp (cb,
coin_blind,
sizeof (*cb)));
return GNUNET_OK;
drop:
return GNUNET_SYSERR;
}
/**
@ -1355,7 +1415,10 @@ run (void *cls)
struct GNUNET_TIME_Absolute deadline;
struct TALER_DenominationBlindingKeyP coin_blind;
struct TALER_ReservePublicKeyP reserve_pub;
struct TALER_ReservePublicKeyP reserve_pub2;
struct DenomKeyPair *dkp;
struct GNUNET_HashCode dkp_pub_hash;
struct TALER_MasterSignatureP master_sig;
struct TALER_EXCHANGEDB_CollectableBlindcoin cbc;
struct TALER_EXCHANGEDB_CollectableBlindcoin cbc2;
struct TALER_EXCHANGEDB_ReserveHistory *rh;
@ -1407,6 +1470,14 @@ run (void *cls)
result = 77;
goto drop;
}
/* test DB is empty */
FAILIF (GNUNET_NO !=
plugin->select_payback_above_serial_id (plugin->cls,
session,
0,
&payback_cb,
NULL));
RND_BLK (&reserve_pub);
GNUNET_assert (GNUNET_OK ==
TALER_string_to_amount (CURRENCY ":1.000010",
@ -1473,6 +1544,8 @@ run (void *cls)
&fee_deposit,
&fee_refresh,
&fee_refund);
GNUNET_CRYPTO_rsa_public_key_hash (dkp->pub.rsa_public_key,
&dkp_pub_hash);
RND_BLK(&cbc.h_coin_envelope);
RND_BLK(&cbc.reserve_sig);
cbc.denom_pub = dkp->pub;
@ -1493,6 +1566,16 @@ run (void *cls)
value.value,
value.fraction,
value.currency));
FAILIF (GNUNET_YES !=
plugin->get_reserve_by_h_blind (plugin->cls,
session,
&cbc.h_coin_envelope,
&reserve_pub2));
FAILIF (0 != memcmp (&reserve_pub,
&reserve_pub2,
sizeof (reserve_pub)));
FAILIF (GNUNET_YES !=
plugin->get_withdraw_info (plugin->cls,
session,
@ -1715,6 +1798,43 @@ run (void *cls)
&refund));
/* test payback / revocation */
RND_BLK (&master_sig);
FAILIF (GNUNET_OK !=
plugin->insert_denomination_revocation (plugin->cls,
session,
&dkp_pub_hash,
&master_sig));
FAILIF (GNUNET_OK !=
plugin->commit (plugin->cls,
session));
FAILIF (GNUNET_OK !=
plugin->start (plugin->cls,
session));
FAILIF (GNUNET_NO !=
plugin->insert_denomination_revocation (plugin->cls,
session,
&dkp_pub_hash,
&master_sig));
plugin->rollback (plugin->cls,
session);
FAILIF (GNUNET_OK !=
plugin->start (plugin->cls,
session));
{
struct TALER_MasterSignatureP msig;
FAILIF (GNUNET_OK !=
plugin->get_denomination_revocation (plugin->cls,
session,
&dkp_pub_hash,
&msig));
FAILIF (0 != memcmp (&msig,
&master_sig,
sizeof (msig)));
}
RND_BLK (&coin_sig);
RND_BLK (&coin_blind);
FAILIF (GNUNET_OK !=
@ -1728,6 +1848,13 @@ run (void *cls)
&cbc.h_coin_envelope,
deadline));
FAILIF (GNUNET_OK !=
plugin->select_payback_above_serial_id (plugin->cls,
session,
0,
&payback_cb,
&coin_blind));
auditor_row_cnt = 0;
FAILIF (GNUNET_OK !=
plugin->select_refunds_above_serial_id (plugin->cls,
@ -1856,6 +1983,7 @@ run (void *cls)
FAILIF (GNUNET_OK !=
test_wire_fees (session));
result = 0;
drop:

View File

@ -2022,7 +2022,7 @@ struct TALER_EXCHANGEDB_Plugin
* @param denom_pub_hash hash of the revoked denomination key
* @param master_sig signature affirming the revocation
* @return #GNUNET_OK on success,
* #GNUNET_NO if the entry already exists
* #GNUNET_NO if the entry already exists (transaction must be rolled back!)
* #GNUNET_SYSERR on DB errors
*/
int