aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2016-05-08 15:44:44 +0200
committerChristian Grothoff <christian@grothoff.org>2016-05-08 15:44:44 +0200
commit966242341a8978de75c547f11e15b5ff55e93cfc (patch)
tree32d9bab0dbea2824066cdcb77035c8bb393767e0 /src
parent691c9a859f1c3e90b49645b9d9190116709b9cb4 (diff)
expand testcase to cover refund API, fix minor issues
Diffstat (limited to 'src')
-rw-r--r--src/exchange/taler-exchange-httpd_db.c1
-rw-r--r--src/exchangedb/plugin_exchangedb_common.c6
-rw-r--r--src/exchangedb/plugin_exchangedb_postgres.c269
-rw-r--r--src/exchangedb/test_exchangedb.c228
4 files changed, 335 insertions, 169 deletions
diff --git a/src/exchange/taler-exchange-httpd_db.c b/src/exchange/taler-exchange-httpd_db.c
index 499623e40..f01b72389 100644
--- a/src/exchange/taler-exchange-httpd_db.c
+++ b/src/exchange/taler-exchange-httpd_db.c
@@ -266,7 +266,6 @@ TMH_DB_execute_deposit (struct MHD_Connection *connection,
}
TMH_plugin->free_coin_transaction_list (TMH_plugin->cls,
tl);
-
if (GNUNET_OK !=
TMH_plugin->insert_deposit (TMH_plugin->cls,
session,
diff --git a/src/exchangedb/plugin_exchangedb_common.c b/src/exchangedb/plugin_exchangedb_common.c
index c18b958cf..631142e86 100644
--- a/src/exchangedb/plugin_exchangedb_common.c
+++ b/src/exchangedb/plugin_exchangedb_common.c
@@ -100,8 +100,10 @@ common_free_coin_transaction_list (void *cls,
{
case TALER_EXCHANGEDB_TT_DEPOSIT:
json_decref (list->details.deposit->wire);
- GNUNET_CRYPTO_rsa_public_key_free (list->details.deposit->coin.denom_pub.rsa_public_key);
- GNUNET_CRYPTO_rsa_signature_free (list->details.deposit->coin.denom_sig.rsa_signature);
+ if (NULL != list->details.deposit->coin.denom_pub.rsa_public_key)
+ GNUNET_CRYPTO_rsa_public_key_free (list->details.deposit->coin.denom_pub.rsa_public_key);
+ if (NULL != list->details.deposit->coin.denom_sig.rsa_signature)
+ GNUNET_CRYPTO_rsa_signature_free (list->details.deposit->coin.denom_sig.rsa_signature);
GNUNET_free (list->details.deposit);
break;
case TALER_EXCHANGEDB_TT_REFRESH_MELT:
diff --git a/src/exchangedb/plugin_exchangedb_postgres.c b/src/exchangedb/plugin_exchangedb_postgres.c
index ab47964c8..6f5599d6f 100644
--- a/src/exchangedb/plugin_exchangedb_postgres.c
+++ b/src/exchangedb/plugin_exchangedb_postgres.c
@@ -373,8 +373,8 @@ postgres_create_tables (void *cls)
SQLEXEC("CREATE TABLE IF NOT EXISTS refunds "
"(coin_pub BYTEA NOT NULL REFERENCES known_coins (coin_pub)"
",merchant_pub BYTEA NOT NULL CHECK(LENGTH(merchant_pub)=32)"
- ",merchant_sig BYTEA NOT NULL CHECK(LENGTH(merchant_pub)=64)"
- ",h_contract BYTEA NOT NULL CHECK(LENGTH(merchant_pub)=64)"
+ ",merchant_sig BYTEA NOT NULL CHECK(LENGTH(merchant_sig)=64)"
+ ",h_contract BYTEA NOT NULL CHECK(LENGTH(h_contract)=64)"
",transaction_id INT8 NOT NULL"
",rtransaction_id INT8 NOT NULL"
",amount_with_fee_val INT8 NOT NULL"
@@ -442,9 +442,7 @@ postgres_create_tables (void *cls)
execute to transmit funds to the merchants (and manage refunds). */
SQLEXEC("CREATE TABLE IF NOT EXISTS deposits "
"(serial_id BIGSERIAL PRIMARY KEY"
- ",coin_pub BYTEA NOT NULL CHECK (LENGTH(coin_pub)=32)"
- ",denom_pub BYTEA NOT NULL REFERENCES denominations (pub)"
- ",denom_sig BYTEA NOT NULL"
+ ",coin_pub BYTEA NOT NULL REFERENCES known_coins (coin_pub)"
",transaction_id INT8 NOT NULL"
",amount_with_fee_val INT8 NOT NULL"
",amount_with_fee_frac INT4 NOT NULL"
@@ -910,8 +908,6 @@ postgres_prepare (PGconn *db_conn)
PREPARE ("insert_deposit",
"INSERT INTO deposits "
"(coin_pub"
- ",denom_pub"
- ",denom_sig"
",transaction_id"
",amount_with_fee_val"
",amount_with_fee_frac"
@@ -929,8 +925,8 @@ postgres_prepare (PGconn *db_conn)
",wire"
") VALUES "
"($1, $2, $3, $4, $5, $6, $7, $8, $9, $10,"
- " $11, $12, $13, $14, $15, $16, $17, $18);",
- 18, NULL);
+ " $11, $12, $13, $14, $15, $16);",
+ 16, NULL);
/* Used in #postgres_insert_refund() to store refund information */
PREPARE ("insert_refund",
@@ -1070,9 +1066,7 @@ postgres_prepare (PGconn *db_conn)
about how a coin has been spend with /deposit requests. */
PREPARE ("get_deposit_with_coin_pub",
"SELECT"
- " denom_pub"
- ",denom_sig"
- ",transaction_id"
+ " transaction_id"
",amount_with_fee_val"
",amount_with_fee_frac"
",amount_with_fee_curr"
@@ -2552,6 +2546,106 @@ postgres_iterate_matching_deposits (void *cls,
/**
+ * Retrieve the record for a known coin.
+ *
+ * @param cls the plugin closure
+ * @param session the database session handle
+ * @param coin_pub the public key of the coin to search for
+ * @param coin_info place holder for the returned coin information object
+ * @return #GNUNET_SYSERR upon error; #GNUNET_NO if no coin is found; #GNUNET_OK
+ * if upon succesfullying retrieving the record data info @a
+ * coin_info
+ */
+static int
+get_known_coin (void *cls,
+ struct TALER_EXCHANGEDB_Session *session,
+ const struct TALER_CoinSpendPublicKeyP *coin_pub,
+ struct TALER_CoinPublicInfo *coin_info)
+{
+ PGresult *result;
+ struct GNUNET_PQ_QueryParam params[] = {
+ GNUNET_PQ_query_param_auto_from_type (coin_pub),
+ GNUNET_PQ_query_param_end
+ };
+ int nrows;
+
+ result = GNUNET_PQ_exec_prepared (session->conn,
+ "get_known_coin",
+ params);
+ if (PGRES_TUPLES_OK != PQresultStatus (result))
+ {
+ BREAK_DB_ERR (result);
+ PQclear (result);
+ return GNUNET_SYSERR;
+ }
+ nrows = PQntuples (result);
+ if (0 == nrows)
+ {
+ PQclear (result);
+ return GNUNET_NO;
+ }
+ GNUNET_assert (1 == nrows); /* due to primary key */
+ if (NULL == coin_info)
+ return GNUNET_YES;
+ {
+ struct GNUNET_PQ_ResultSpec rs[] = {
+ GNUNET_PQ_result_spec_rsa_public_key ("denom_pub",
+ &coin_info->denom_pub.rsa_public_key),
+ GNUNET_PQ_result_spec_rsa_signature ("denom_sig",
+ &coin_info->denom_sig.rsa_signature),
+ GNUNET_PQ_result_spec_end
+ };
+
+ if (GNUNET_OK !=
+ GNUNET_PQ_extract_result (result, rs, 0))
+ {
+ PQclear (result);
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+ }
+ PQclear (result);
+ coin_info->coin_pub = *coin_pub;
+ return GNUNET_OK;
+}
+
+
+/**
+ * Insert a coin we know of into the DB. The coin can then be referenced by
+ * tables for deposits, refresh and refund functionality.
+ *
+ * @param cls plugin closure
+ * @param session the shared database session
+ * @param coin_info the public coin info
+ * @return #GNUNET_SYSERR upon error; #GNUNET_OK upon success
+ */
+static int
+insert_known_coin (void *cls,
+ struct TALER_EXCHANGEDB_Session *session,
+ const struct TALER_CoinPublicInfo *coin_info)
+{
+ PGresult *result;
+ struct GNUNET_PQ_QueryParam params[] = {
+ GNUNET_PQ_query_param_auto_from_type (&coin_info->coin_pub),
+ GNUNET_PQ_query_param_rsa_public_key (coin_info->denom_pub.rsa_public_key),
+ GNUNET_PQ_query_param_rsa_signature (coin_info->denom_sig.rsa_signature),
+ GNUNET_PQ_query_param_end
+ };
+ result = GNUNET_PQ_exec_prepared (session->conn,
+ "insert_known_coin",
+ params);
+ if (PGRES_COMMAND_OK != PQresultStatus (result))
+ {
+ BREAK_DB_ERR (result);
+ PQclear (result);
+ return GNUNET_SYSERR;
+ }
+ PQclear (result);
+ return GNUNET_OK;
+}
+
+
+/**
* Insert information about deposited coin into the database.
*
* @param cls the `struct PostgresClosure` with the plugin-specific state
@@ -2568,8 +2662,6 @@ postgres_insert_deposit (void *cls,
int ret;
struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_auto_from_type (&deposit->coin.coin_pub),
- GNUNET_PQ_query_param_rsa_public_key (deposit->coin.denom_pub.rsa_public_key),
- GNUNET_PQ_query_param_rsa_signature (deposit->coin.denom_sig.rsa_signature),
GNUNET_PQ_query_param_uint64 (&deposit->transaction_id),
TALER_PQ_query_param_amount (&deposit->amount_with_fee),
TALER_PQ_query_param_amount (&deposit->deposit_fee),
@@ -2583,6 +2675,29 @@ postgres_insert_deposit (void *cls,
TALER_PQ_query_param_json (deposit->wire),
GNUNET_PQ_query_param_end
};
+
+ /* check if the coin is already known */
+ ret = get_known_coin (cls,
+ session,
+ &deposit->coin.coin_pub,
+ NULL);
+ if (GNUNET_SYSERR == ret)
+ {
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+ if (GNUNET_NO == ret) /* if not, insert it */
+ {
+ if (GNUNET_SYSERR ==
+ insert_known_coin (cls,
+ session,
+ &deposit->coin))
+ {
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
+ }
+ }
+
result = GNUNET_PQ_exec_prepared (session->conn,
"insert_deposit",
params);
@@ -2758,106 +2873,6 @@ postgres_create_refresh_session (void *cls,
/**
- * Insert a coin we know of into the DB. The coin can then be referenced by
- * tables for deposits, lock and refresh functionality.
- *
- * @param cls plugin closure
- * @param session the shared database session
- * @param coin_info the public coin info
- * @return #GNUNET_SYSERR upon error; #GNUNET_OK upon success
- */
-static int
-insert_known_coin (void *cls,
- struct TALER_EXCHANGEDB_Session *session,
- const struct TALER_CoinPublicInfo *coin_info)
-{
- PGresult *result;
- struct GNUNET_PQ_QueryParam params[] = {
- GNUNET_PQ_query_param_auto_from_type (&coin_info->coin_pub),
- GNUNET_PQ_query_param_rsa_public_key (coin_info->denom_pub.rsa_public_key),
- GNUNET_PQ_query_param_rsa_signature (coin_info->denom_sig.rsa_signature),
- GNUNET_PQ_query_param_end
- };
- result = GNUNET_PQ_exec_prepared (session->conn,
- "insert_known_coin",
- params);
- if (PGRES_COMMAND_OK != PQresultStatus (result))
- {
- BREAK_DB_ERR (result);
- PQclear (result);
- return GNUNET_SYSERR;
- }
- PQclear (result);
- return GNUNET_OK;
-}
-
-
-/**
- * Retrieve the record for a known coin.
- *
- * @param cls the plugin closure
- * @param session the database session handle
- * @param coin_pub the public key of the coin to search for
- * @param coin_info place holder for the returned coin information object
- * @return #GNUNET_SYSERR upon error; #GNUNET_NO if no coin is found; #GNUNET_OK
- * if upon succesfullying retrieving the record data info @a
- * coin_info
- */
-static int
-get_known_coin (void *cls,
- struct TALER_EXCHANGEDB_Session *session,
- const struct TALER_CoinSpendPublicKeyP *coin_pub,
- struct TALER_CoinPublicInfo *coin_info)
-{
- PGresult *result;
- struct GNUNET_PQ_QueryParam params[] = {
- GNUNET_PQ_query_param_auto_from_type (coin_pub),
- GNUNET_PQ_query_param_end
- };
- int nrows;
-
- result = GNUNET_PQ_exec_prepared (session->conn,
- "get_known_coin",
- params);
- if (PGRES_TUPLES_OK != PQresultStatus (result))
- {
- BREAK_DB_ERR (result);
- PQclear (result);
- return GNUNET_SYSERR;
- }
- nrows = PQntuples (result);
- if (0 == nrows)
- {
- PQclear (result);
- return GNUNET_NO;
- }
- GNUNET_assert (1 == nrows); /* due to primary key */
- if (NULL == coin_info)
- return GNUNET_YES;
- {
- struct GNUNET_PQ_ResultSpec rs[] = {
- GNUNET_PQ_result_spec_rsa_public_key ("denom_pub",
- &coin_info->denom_pub.rsa_public_key),
- GNUNET_PQ_result_spec_rsa_signature ("denom_sig",
- &coin_info->denom_sig.rsa_signature),
- GNUNET_PQ_result_spec_end
- };
-
- if (GNUNET_OK !=
- GNUNET_PQ_extract_result (result, rs, 0))
- {
- PQclear (result);
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- }
- PQclear (result);
- coin_info->coin_pub = *coin_pub;
- return GNUNET_OK;
-}
-
-
-/**
* Store the given /refresh/melt request in the database.
*
* @param cls the `struct PostgresClosure` with the plugin-specific state
@@ -2898,10 +2913,10 @@ postgres_insert_refresh_melt (void *cls,
}
if (GNUNET_NO == ret) /* if not, insert it */
{
- ret = insert_known_coin (cls,
- session,
- &melt->coin);
- if (ret == GNUNET_SYSERR)
+ if (GNUNET_SYSERR ==
+ insert_known_coin (cls,
+ session,
+ &melt->coin))
{
GNUNET_break (0);
return GNUNET_SYSERR;
@@ -2988,10 +3003,11 @@ postgres_get_refresh_melt (void *cls,
PQclear (result);
}
/* fetch the coin info and denomination info */
- if (GNUNET_OK != get_known_coin (cls,
- session,
- &coin.coin_pub,
- &coin))
+ if (GNUNET_OK !=
+ get_known_coin (cls,
+ session,
+ &coin.coin_pub,
+ &coin))
return GNUNET_SYSERR;
if (NULL == melt)
{
@@ -3803,15 +3819,6 @@ postgres_get_coin_transactions (void *cls,
deposit = GNUNET_new (struct TALER_EXCHANGEDB_Deposit);
{
struct GNUNET_PQ_ResultSpec rs[] = {
- /* FIXME: do we care about the denom_*s? We do not keep
- them for refresh/refund, and it's unclear why we'd
- bother with them here. (Kept for now, once we have
- the auditor done we should decide if we want to always
- take these along, or always drop them.) */
- GNUNET_PQ_result_spec_rsa_public_key ("denom_pub",
- &deposit->coin.denom_pub.rsa_public_key),
- GNUNET_PQ_result_spec_rsa_signature ("denom_sig",
- &deposit->coin.denom_sig.rsa_signature),
GNUNET_PQ_result_spec_uint64 ("transaction_id",
&deposit->transaction_id),
TALER_PQ_result_spec_amount ("amount_with_fee",
diff --git a/src/exchangedb/test_exchangedb.c b/src/exchangedb/test_exchangedb.c
index 4210930e7..fc92ab3d0 100644
--- a/src/exchangedb/test_exchangedb.c
+++ b/src/exchangedb/test_exchangedb.c
@@ -24,8 +24,14 @@
#include "taler_json_lib.h"
#include "taler_exchangedb_plugin.h"
+/**
+ * Global result from the testcase.
+ */
static int result;
+/**
+ * Report line of error if @a cond is true, and jump to label "drop".
+ */
#define FAILIF(cond) \
do { \
if (!(cond)){ break;} \
@@ -34,17 +40,48 @@ static int result;
} while (0)
+/**
+ * Initializes @a ptr with random data.
+ */
#define RND_BLK(ptr) \
GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_WEAK, ptr, sizeof (*ptr))
+/**
+ * Initializes @a ptr with zeros.
+ */
#define ZR_BLK(ptr) \
memset (ptr, 0, sizeof (*ptr))
+/**
+ * Currency we use.
+ */
#define CURRENCY "EUR"
+/**
+ * Database plugin under test.
+ */
static struct TALER_EXCHANGEDB_Plugin *plugin;
+
+/**
+ * Test API relating to persisting the wire plugins preparation data.
+ *
+ * @param session database session to use for the test
+ * @return #GNUNET_OK on success
+ */
+static int
+test_wire_prepare (struct TALER_EXCHANGEDB_Session *session)
+{
+ /*
+ FIXME #4401: test: wire_prepare_data_insert
+ FIXME #4401: test: wire_prepare_data_mark_finished
+ FIXME #4401: test: wire_prepare_data_get
+ */
+ return GNUNET_OK;
+}
+
+
/**
* Checks if the given reserve has the given amount of balance and expiry
*
@@ -198,6 +235,12 @@ static struct TALER_Amount fee_refund;
static struct TALER_Amount amount_with_fee;
+/**
+ * Free memory associated with @a commit_coins.
+ *
+ * @param commit_coins memory to release
+ * @param size size of the @a commit_coins array
+ */
static void
free_refresh_commit_coins_array (struct TALER_EXCHANGEDB_RefreshCommitCoin *commit_coins,
unsigned int size)
@@ -216,11 +259,21 @@ free_refresh_commit_coins_array (struct TALER_EXCHANGEDB_RefreshCommitCoin *comm
GNUNET_free (commit_coins);
}
+
+/**
+ * Number of newly minted coins to use in the test.
+ */
#define MELT_NEW_COINS 5
+/**
+ *
+ * @param session database sesison to use
+ * @param refresh_session details about the refresh session to use
+ * @param session_hash refresh melt session hash to use
+ */
static int
test_refresh_commit_coins (struct TALER_EXCHANGEDB_Session *session,
- struct TALER_EXCHANGEDB_RefreshSession *refresh_session,
+ const struct TALER_EXCHANGEDB_RefreshSession *refresh_session,
const struct GNUNET_HashCode *session_hash)
{
struct TALER_EXCHANGEDB_RefreshCommitCoin *commit_coins;
@@ -364,7 +417,8 @@ test_melting (struct TALER_EXCHANGEDB_Session *session)
&fee_refresh,
&fee_refund);
/* create MELT_OLD_COINS number of refresh melts */
- melts = GNUNET_new_array (MELT_OLD_COINS, struct TALER_EXCHANGEDB_RefreshMelt);
+ melts = GNUNET_new_array (MELT_OLD_COINS,
+ struct TALER_EXCHANGEDB_RefreshMelt);
for (cnt=0; cnt < MELT_OLD_COINS; cnt++)
{
struct GNUNET_HashCode hc;
@@ -381,19 +435,21 @@ test_melting (struct TALER_EXCHANGEDB_Session *session)
melts[cnt].session_hash = session_hash;
melts[cnt].amount_with_fee = amount_with_fee;
melts[cnt].melt_fee = fee_refresh;
- FAILIF (GNUNET_OK != plugin->insert_refresh_melt (plugin->cls,
- session,
- cnt,
- &melts[cnt]));
+ FAILIF (GNUNET_OK !=
+ plugin->insert_refresh_melt (plugin->cls,
+ session,
+ cnt,
+ &melts[cnt]));
}
for (cnt = 0; cnt < MELT_OLD_COINS; cnt++)
{
struct TALER_EXCHANGEDB_RefreshMelt ret_melt;
- FAILIF (GNUNET_OK != plugin->get_refresh_melt (plugin->cls,
- session,
- &session_hash,
- cnt,
- &ret_melt));
+ FAILIF (GNUNET_OK !=
+ plugin->get_refresh_melt (plugin->cls,
+ session,
+ &session_hash,
+ cnt,
+ &ret_melt));
FAILIF (0 != GNUNET_CRYPTO_rsa_signature_cmp
(ret_melt.coin.denom_sig.rsa_signature,
melts[cnt].coin.denom_sig.rsa_signature));
@@ -579,6 +635,9 @@ cb_wtid_check (void *cls,
}
+/**
+ * Here #deposit_cb() will store the row ID of the deposit.
+ */
static unsigned long long deposit_rowid;
@@ -647,7 +706,7 @@ deposit_cb (void *cls,
}
-static struct TALER_EXCHANGEDB_Refund refund;
+
/**
@@ -670,9 +729,13 @@ run (void *cls)
struct TALER_EXCHANGEDB_CollectableBlindcoin *withdraw;
struct TALER_EXCHANGEDB_Deposit deposit;
struct TALER_EXCHANGEDB_Deposit deposit2;
+ struct TALER_EXCHANGEDB_Refund refund;
+ struct TALER_EXCHANGEDB_TransactionList *tl;
+ struct TALER_EXCHANGEDB_TransactionList *tlp;
struct TALER_WireTransferIdentifierRawP wtid;
json_t *wire;
json_t *just;
+ unsigned int matched;
const char * const json_wire_str =
"{ \"type\":\"SEPA\", \
\"IBAN\":\"DE67830654080004822650\", \
@@ -929,7 +992,6 @@ run (void *cls)
session,
&deposit));
-
result = 10;
deposit2 = deposit;
deposit2.transaction_id++; /* should fail if transaction id is different */
@@ -951,6 +1013,124 @@ run (void *cls)
&deposit2));
FAILIF (GNUNET_OK != test_melting (session));
+
+ /* test insert_refund! */
+ refund.coin = deposit.coin;
+ refund.merchant_pub = deposit.merchant_pub;
+ RND_BLK (&refund.merchant_sig);
+ refund.h_contract = deposit.h_contract;
+ refund.transaction_id = deposit.transaction_id;
+ refund.rtransaction_id = GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK, UINT64_MAX);
+ refund.refund_amount = deposit.amount_with_fee;
+ GNUNET_assert (GNUNET_OK ==
+ TALER_amount_get_zero (CURRENCY, &refund.refund_fee));
+ FAILIF (GNUNET_OK !=
+ plugin->insert_refund (plugin->cls,
+ session,
+ &refund));
+
+ tl = plugin->get_coin_transactions (plugin->cls,
+ session,
+ &refund.coin.coin_pub);
+ GNUNET_assert (NULL != tl);
+ matched = 0;
+ for (tlp = tl; NULL != tlp; tlp = tlp->next)
+ {
+ switch (tlp->type)
+ {
+ case TALER_EXCHANGEDB_TT_DEPOSIT:
+ {
+ struct TALER_EXCHANGEDB_Deposit *have = tlp->details.deposit;
+
+ FAILIF (0 != memcmp (&have->coin.coin_pub,
+ &deposit.coin.coin_pub,
+ sizeof (struct TALER_CoinSpendPublicKeyP)));
+ /* Note: we're not comparing the denomination keys, as there is
+ still the question of whether we should even bother exporting
+ them here. */
+ FAILIF (0 != memcmp (&have->csig,
+ &deposit.csig,
+ sizeof (struct TALER_CoinSpendSignatureP)));
+ FAILIF (0 != memcmp (&have->merchant_pub,
+ &deposit.merchant_pub,
+ sizeof (struct TALER_MerchantPublicKeyP)));
+ FAILIF (0 != memcmp (&have->h_contract,
+ &deposit.h_contract,
+ sizeof (struct GNUNET_HashCode)));
+ FAILIF (0 != memcmp (&have->h_wire,
+ &deposit.h_wire,
+ sizeof (struct GNUNET_HashCode)));
+ /* Note: not comparing 'wire', seems truly redundant and would be tricky */
+ FAILIF (have->transaction_id != deposit.transaction_id);
+ FAILIF (have->timestamp.abs_value_us != deposit.timestamp.abs_value_us);
+ FAILIF (have->refund_deadline.abs_value_us != deposit.refund_deadline.abs_value_us);
+ FAILIF (have->wire_deadline.abs_value_us != deposit.wire_deadline.abs_value_us);
+ FAILIF (0 != TALER_amount_cmp (&have->amount_with_fee,
+ &deposit.amount_with_fee));
+ FAILIF (0 != TALER_amount_cmp (&have->deposit_fee,
+ &deposit.deposit_fee));
+ matched |= 1;
+ break;
+ }
+#if 0
+ /* this coin pub was actually never melted... */
+ case TALER_EXCHANGEDB_TT_REFRESH_MELT:
+ FAILIF (0 != memcmp (&melt,
+ &tlp->details.melt,
+ sizeof (struct TALER_EXCHANGEDB_RefreshMelt)));
+ matched |= 2;
+ break;
+#endif
+ case TALER_EXCHANGEDB_TT_REFUND:
+ {
+ struct TALER_EXCHANGEDB_Refund *have = tlp->details.refund;
+
+ FAILIF (0 != memcmp (&have->coin.coin_pub,
+ &refund.coin.coin_pub,
+ sizeof (struct TALER_CoinSpendPublicKeyP)));
+ /* Note: we're not comparing the denomination keys, as there is
+ still the question of whether we should even bother exporting
+ them here. */
+ FAILIF (0 != memcmp (&have->merchant_pub,
+ &refund.merchant_pub,
+ sizeof (struct TALER_MerchantPublicKeyP)));
+ FAILIF (0 != memcmp (&have->merchant_sig,
+ &refund.merchant_sig,
+ sizeof (struct TALER_MerchantSignatureP)));
+ FAILIF (0 != memcmp (&have->h_contract,
+ &refund.h_contract,
+ sizeof (struct GNUNET_HashCode)));
+ FAILIF (have->transaction_id != refund.transaction_id);
+ FAILIF (have->rtransaction_id != refund.rtransaction_id);
+ FAILIF (0 != TALER_amount_cmp (&have->refund_amount,
+ &refund.refund_amount));
+ FAILIF (0 != TALER_amount_cmp (&have->refund_fee,
+ &refund.refund_fee));
+ matched |= 4;
+ break;
+ }
+ default:
+ FAILIF (1);
+ break;
+ }
+ }
+ FAILIF (5 != matched);
+
+ plugin->free_coin_transaction_list (plugin->cls,
+ tl);
+
+ FAILIF (GNUNET_OK != test_wire_prepare (session));
+
+ /* FIXME #4401: test: insert_refresh_commit_links
+ FIXME #4401: test: get_refresh_commit_links
+ FIXME #4401: test: get_melt_commitment
+ FIXME #4401: test: free_melt_commitment
+ FIXME #4401: test: insert_refresh_out
+ FIXME #4401: test: get_link_data_list
+ FIXME #4401: test: free_link_data_list
+ FIXME #4401: test: get_transfer
+ */
+
/* setup values for wire transfer aggregation data */
memset (&wtid, 42, sizeof (wtid));
memset (&merchant_pub_wt, 43, sizeof (merchant_pub_wt));
@@ -969,29 +1149,7 @@ run (void *cls)
GNUNET_assert (GNUNET_OK ==
TALER_string_to_amount (CURRENCY "KUDOS:1.000000",
&transfer_value_wt));
-#if 0
- /* FIXME #4401: test insert_refund! */
- refund.FOO = bar;
- FAILIF (GNUNET_OK !=
- plugin->insert_refund (plugin->cls,
- session,
- &refund));
-#endif
- /* FIXME #4401: test: insert_refresh_commit_links
- FIXME #4401: test: get_refresh_commit_links
- FIXME #4401: test: get_melt_commitment
- FIXME #4401: test: free_melt_commitment
- FIXME #4401: test: insert_refresh_out
- FIXME #4401: test: get_link_data_list
- FIXME #4401: test: free_link_data_list
- FIXME #4401: test: get_transfer
- FIXME #4401: test: get_coin_transactions
- FIXME #4401: test: free_coin_transaction_list
- FIXME #4401: test: wire_prepare_data_insert
- FIXME #4401: test: wire_prepare_data_mark_finished
- FIXME #4401: test: wire_prepare_data_get
-*/
FAILIF (GNUNET_NO !=
plugin->lookup_wire_transfer (plugin->cls,