tests for refunds_by_coin and ready_deposit

This commit is contained in:
Joseph 2023-01-23 07:57:34 -05:00
parent a273b176da
commit 54fa07f5c7
No known key found for this signature in database
GPG Key ID: E709789D3076B5CC
9 changed files with 608 additions and 118 deletions

View File

@ -296,7 +296,7 @@ check_PROGRAMS = \
perf-exchangedb-reserves-in-insert-postgres\ perf-exchangedb-reserves-in-insert-postgres\
test-exchangedb-by-j-postgres\ test-exchangedb-by-j-postgres\
test-exchangedb-batch-reserves-in-insert-postgres\ test-exchangedb-batch-reserves-in-insert-postgres\
test-exchangedb-populate-table-postgres\ test-exchangedb-populate-select-refunds-by-coin-postgres\
test-exchangedb-populate-link-data-postgres\ test-exchangedb-populate-link-data-postgres\
test-exchangedb-populate-ready-deposit-postgres test-exchangedb-populate-ready-deposit-postgres
@ -306,7 +306,7 @@ TESTS = \
test-exchangedb-by-j-postgres\ test-exchangedb-by-j-postgres\
perf-exchangedb-reserves-in-insert-postgres\ perf-exchangedb-reserves-in-insert-postgres\
test-exchangedb-batch-reserves-in-insert-postgres\ test-exchangedb-batch-reserves-in-insert-postgres\
test-exchangedb-populate-table-postgres\ test-exchangedb-populate-select-refunds-by-coin-postgres\
test-exchangedb-populate-link-data-postgres\ test-exchangedb-populate-link-data-postgres\
test-exchangedb-populate-ready-deposit-postgres test-exchangedb-populate-ready-deposit-postgres
test_exchangedb_postgres_SOURCES = \ test_exchangedb_postgres_SOURCES = \
@ -369,9 +369,9 @@ test_exchangedb_batch_reserves_in_insert_postgres_LDADD = \
-lgnunetutil \ -lgnunetutil \
$(XLIB) $(XLIB)
test_exchangedb_populate_table_postgres_SOURCES = \ test_exchangedb_populate_select_refunds_by_coin_postgres_SOURCES = \
test_exchangedb_populate_table.c test_exchangedb_populate_select_refunds_by_coin.c
test_exchangedb_populate_table_postgres_LDADD = \ test_exchangedb_populate_select_refunds_by_coin_postgres_LDADD = \
libtalerexchangedb.la \ libtalerexchangedb.la \
$(top_builddir)/src/json/libtalerjson.la \ $(top_builddir)/src/json/libtalerjson.la \
$(top_builddir)/src/util/libtalerutil.la \ $(top_builddir)/src/util/libtalerutil.la \

View File

@ -0,0 +1,64 @@
--
-- This file is part of TALER
-- Copyright (C) 2014--2022 Taler Systems SA
--
-- 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, see <http://www.gnu.org/licenses/>
--
CREATE OR REPLACE FUNCTION exchange_do_get_ready_deposit(
IN in_now INT8,
IN in_start_shard_now INT8,
IN in_end_shard_now INT8,
OUT out_payto_uri VARCHAR,
OUT out_merchant_pub BYTEA
)
LANGUAGE plpgsql
AS $$
DECLARE
var_wire_target_h_payto BYTEA;
DECLARE
var_coin_pub BYTEA;
DECLARE
var_deposit_serial_id INT8;
BEGIN
SELECT
coin_pub
,deposit_serial_id
INTO
var_coin_pub
,var_deposit_serial_id
FROM deposits_by_ready
WHERE wire_deadline <= in_now
AND shard >= in_start_shard_now
AND shard <=in_end_shard_now
ORDER BY
wire_deadline ASC
,shard ASC;
SELECT
merchant_pub
,wire_target_h_payto
INTO
out_merchant_pub
,var_wire_target_h_payto
FROM deposits
WHERE coin_pub=var_coin_pub
AND deposit_serial_id=var_deposit_serial_id;
SELECT
payto_uri
INTO out_payto_uri
FROM wire_targets
WHERE wire_target_h_payto=var_wire_target_h_payto;
RETURN;
END $$;

View File

@ -0,0 +1,94 @@
--
-- This file is part of TALER
-- Copyright (C) 2014--2022 Taler Systems SA
--
-- 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, see <http://www.gnu.org/licenses/>
--
/*DROP FUNCTION exchange_do_refund_by_coin(
IN in_coin_pub BYTEA,
IN in_merchant_pub BYTEA,
IN in_h_contract BYTEA
);*/
CREATE OR REPLACE FUNCTION exchange_do_refund_by_coin(
IN in_coin_pub BYTEA,
IN in_merchant_pub BYTEA,
IN in_h_contract BYTEA
)
RETURNS SETOF record
LANGUAGE plpgsql
AS $$
DECLARE
curs CURSOR
FOR
SELECT
amount_with_fee_val
,amount_with_fee_frac
,deposit_serial_id
FROM refunds
WHERE coin_pub=in_coin_pub;
DECLARE
i RECORD;
BEGIN
OPEN curs;
LOOP
FETCH NEXT FROM curs INTO i;
EXIT WHEN NOT FOUND;
RETURN QUERY
SELECT
i.amount_with_fee_val
,i.amount_with_fee_frac
FROM deposits
WHERE
coin_pub=in_coin_pub
AND merchant_pub=in_merchant_pub
AND h_contract_terms=in_h_contract
AND i.deposit_serial_id = deposit_serial_id;
END LOOP;
CLOSE curs;
END $$;
/*RETURNS TABLE(amount_with_fee_val INT8, amount_with_fee_frac INT4)
LANGUAGE plpgsql
AS $$
DECLARE
curs CURSOR
FOR
SELECT
r.amount_with_fee_val
,r.amount_with_fee_frac
,r.deposit_serial_id
FROM refunds r
WHERE r.coin_pub=in_coin_pub;
DECLARE
i RECORD;
BEGIN
OPEN curs;
LOOP
FETCH NEXT FROM curs INTO i;
IF FOUND
THEN
RETURN QUERY
SELECT
i.amount_with_fee_val
,i.amount_with_fee_frac
FROM deposits
WHERE
merchant_pub=in_merchant_pub
AND h_contract_terms=in_h_contract
AND i.deposit_serial_id = deposit_serial_id;
END IF;
EXIT WHEN NOT FOUND;
END LOOP;
CLOSE curs;
END $$;
*/

View File

@ -41,6 +41,7 @@ TEH_PG_get_ready_deposit (void *cls,
GNUNET_PQ_query_param_uint64 (&end_shard_row), GNUNET_PQ_query_param_uint64 (&end_shard_row),
GNUNET_PQ_query_param_end GNUNET_PQ_query_param_end
}; };
struct GNUNET_PQ_ResultSpec rs[] = { struct GNUNET_PQ_ResultSpec rs[] = {
GNUNET_PQ_result_spec_auto_from_type ("merchant_pub", GNUNET_PQ_result_spec_auto_from_type ("merchant_pub",
merchant_pub), merchant_pub),
@ -57,26 +58,180 @@ TEH_PG_get_ready_deposit (void *cls,
"Finding ready deposits by deadline %s (%llu)\n", "Finding ready deposits by deadline %s (%llu)\n",
GNUNET_TIME_absolute2s (now), GNUNET_TIME_absolute2s (now),
(unsigned long long) now.abs_value_us); (unsigned long long) now.abs_value_us);
PREPARE (pg, int choose_mode =-2;
"deposits_get_ready", const char *query;
"SELECT"
" payto_uri" if (-2 == choose_mode)
",merchant_pub" {
" FROM deposits_by_ready dbr" const char *mode = getenv ("NEW_LOGIC");
" JOIN deposits dep" char dummy;
" ON (dbr.coin_pub = dep.coin_pub AND" if ( (NULL==mode) ||
" dbr.deposit_serial_id = dep.deposit_serial_id)" (1 != sscanf (mode,
" JOIN wire_targets wt" "%d%c",
" USING (wire_target_h_payto)" &choose_mode,
" WHERE dbr.wire_deadline<=$1" &dummy)) )
" AND dbr.shard >= $2" {
" AND dbr.shard <= $3" if (NULL != mode)
" ORDER BY " GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
" dbr.wire_deadline ASC" "Bad mode `%s' specified\n",
" ,dbr.shard ASC" mode);
" LIMIT 1;"); }
if (NULL==mode)
choose_mode=0;
}
switch (choose_mode)
{
case 0:
query="deposits_get_ready";
PREPARE (pg,
query,
"SELECT"
" payto_uri"
",merchant_pub"
" FROM deposits_by_ready dbr"
" JOIN deposits dep"
" ON (dbr.coin_pub = dep.coin_pub AND"
" dbr.deposit_serial_id = dep.deposit_serial_id)"
" JOIN wire_targets wt"
" USING (wire_target_h_payto)"
" WHERE dbr.wire_deadline<=$1"
" AND dbr.shard >= $2"
" AND dbr.shard <= $3"
" ORDER BY "
" dbr.wire_deadline ASC"
" ,dbr.shard ASC"
" LIMIT 1;");
break;
case 1:
query="deposits_get_ready_v1";
PREPARE (pg,
query,
"WITH rc AS MATERIALIZED ("
" SELECT"
" coin_pub"
",deposit_serial_id"
" FROM deposits_by_ready"
" WHERE"
" wire_deadline<=$1"
" AND shard >= $2"
" AND shard <= $3"
" ORDER BY "
" wire_deadline ASC"
" ,shard ASC"
" LIMIT 1"
")"
"SELECT"
" wt.payto_uri"
",dep.merchant_pub"
" FROM ("
" SELECT"
" wire_target_h_payto"
",merchant_pub"
" FROM deposits"
" WHERE coin_pub=(SELECT coin_pub FROM rc)"
" AND deposit_serial_id=(SELECT deposit_serial_id FROM rc)"
") dep"
" JOIN wire_targets wt"
" ON (dep.wire_target_h_payto = wt.wire_target_h_payto)"
);
break;
case 2:
query = "stored_procedure_get_ready_deposit";
PREPARE (pg,
query,
"SELECT"
" out_payto_uri AS payto_uri"
",out_merchant_pub AS merchant_pub"
" FROM"
" exchange_do_get_ready_deposit"
" ($1, $2, $3) ");
break;
case 3:
query="deposits_get_ready_v3";
PREPARE (pg,
query,
"WITH rc AS MATERIALIZED ("
" SELECT"
" coin_pub"
",deposit_serial_id"
" FROM deposits_by_ready"
" WHERE"
" wire_deadline<=$1"
" AND shard >= $2"
" AND shard <= $3"
" ORDER BY "
" wire_deadline ASC"
" ,shard ASC"
" LIMIT 1"
")"
"SELECT"
" wt.payto_uri"
",dep.merchant_pub"
" FROM ("
" SELECT"
" wire_target_h_payto"
",merchant_pub"
",coin_pub"
" FROM deposits"
" WHERE coin_pub=(SELECT coin_pub FROM rc)"
" AND deposit_serial_id=(SELECT deposit_serial_id FROM rc)"
") dep"
" JOIN wire_targets wt"
" ON (dep.wire_target_h_payto = wt.wire_target_h_payto)"
" JOIN rc"
" ON (dep.coin_pub=rc.coin_pub)"
);
break;
case 4:
query="deposits_get_ready_v4";
PREPARE (pg,
query,
"WITH rc AS MATERIALIZED ("
" SELECT"
" coin_pub"
",deposit_serial_id"
" FROM deposits_by_ready"
" WHERE"
" wire_deadline<=$1"
" AND shard >= $2"
" AND shard <= $3"
" ORDER BY "
" wire_deadline ASC"
" ,shard ASC"
" LIMIT 1"
"),"
"WITH rv AS MATERIALIZED ("
" SELECT"
" payto_uri"
",wire_target_h_payto"
" FROM wire_targets"
")"
"SELECT"
" rv.payto_uri"
",dep.merchant_pub"
" FROM ("
" SELECT"
" wire_target_h_payto"
",merchant_pub"
" FROM deposits"
" WHERE coin_pub=(SELECT coin_pub FROM rc)"
" AND deposit_serial_id=(SELECT deposit_serial_id FROM rc)"
") dep"
" JOIN rv"
" ON (rv.wire_target_h_payto=dep.wire_target_h_payto)"
);
break;
default:
GNUNET_break (0);
return GNUNET_DB_STATUS_HARD_ERROR;
}
return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, return GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
"deposits_get_ready", query,
params, params,
rs); rs);
} }

View File

@ -112,17 +112,47 @@ TEH_PG_select_refunds_by_coin (
GNUNET_PQ_query_param_auto_from_type (h_contract), GNUNET_PQ_query_param_auto_from_type (h_contract),
GNUNET_PQ_query_param_end GNUNET_PQ_query_param_end
}; };
struct GNUNET_PQ_QueryParam params5[] = {
GNUNET_PQ_query_param_auto_from_type (coin_pub),
GNUNET_PQ_query_param_end
};
struct SelectRefundContext srctx = { struct SelectRefundContext srctx = {
.cb = cb, .cb = cb,
.cb_cls = cb_cls, .cb_cls = cb_cls,
.pg = pg, .pg = pg,
.status = GNUNET_OK .status = GNUNET_OK
}; };
static int percent_refund = -2;
const char *query;
struct GNUNET_PQ_QueryParam *xparams = params;
if (NULL == getenv ("NEW_LOGIC")) if (-2 == percent_refund)
{ {
const char *mode = getenv ("NEW_LOGIC");
char dummy;
if ( (NULL==mode) ||
(1 != sscanf (mode,
"%d%c",
&percent_refund,
&dummy)) )
{
if (NULL != mode)
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Bad mode `%s' specified\n",
mode);
}
if (NULL==mode)
percent_refund=0;
}
switch (percent_refund)
{
case 0:
query = "get_refunds_by_coin_and_contract-v0";
PREPARE (pg, PREPARE (pg,
"get_refunds_by_coin_and_contract", query,
"SELECT" "SELECT"
" ref.amount_with_fee_val" " ref.amount_with_fee_val"
",ref.amount_with_fee_frac" ",ref.amount_with_fee_frac"
@ -132,12 +162,26 @@ TEH_PG_select_refunds_by_coin (
" WHERE ref.coin_pub=$1" " WHERE ref.coin_pub=$1"
" AND dep.merchant_pub=$2" " AND dep.merchant_pub=$2"
" AND dep.h_contract_terms=$3;"); " AND dep.h_contract_terms=$3;");
} break;
else case 1:
{ query = "get_refunds_by_coin_and_contract-v1";
// FIXME-Joseph
PREPARE (pg, PREPARE (pg,
"get_refunds_by_coin_and_contract", query,
"SELECT"
" ref.amount_with_fee_val"
",ref.amount_with_fee_frac"
" FROM refunds ref"
" LEFT JOIN deposits dep"
" ON dep.coin_pub = ref.coin_pub"
" AND ref.deposit_serial_id = dep.deposit_serial_id"
" WHERE ref.coin_pub=$1"
" AND dep.merchant_pub=$2"
" AND dep.h_contract_terms=$3;");
break;
case 2:
query = "get_refunds_by_coin_and_contract-v2";
PREPARE (pg,
query,
"WITH rc AS MATERIALIZED(" "WITH rc AS MATERIALIZED("
"SELECT" "SELECT"
" amount_with_fee_val" " amount_with_fee_val"
@ -149,21 +193,139 @@ TEH_PG_select_refunds_by_coin (
"SELECT" "SELECT"
" rc.amount_with_fee_val" " rc.amount_with_fee_val"
" ,rc.amount_with_fee_frac" " ,rc.amount_with_fee_frac"
" FROM " " FROM deposits dep"
"(SELECT" " JOIN rc"
" ON rc.deposit_serial_id = dep.deposit_serial_id"
" WHERE"
" dep.coin_pub = $1"
" AND dep.merchant_pub = $2"
" AND dep.h_contract_terms = $3");
break;
case 3:
query = "get_refunds_by_coin_and_contract-v3";
PREPARE (pg,
query,
"WITH rc AS MATERIALIZED("
"SELECT"
" amount_with_fee_val"
",amount_with_fee_frac"
",deposit_serial_id"
" FROM refunds"
" WHERE coin_pub=$1)"
"SELECT"
" rc.amount_with_fee_val" " rc.amount_with_fee_val"
" ,rc.amount_with_fee_frac" " ,rc.amount_with_fee_frac"
" FROM deposits dep" " FROM ("
"SELECT"
" amount_with_fee_val"
",amount_with_fee_frac"
" FROM deposits depos"
" WHERE" " WHERE"
" dep.coin_pub = $1" // optional... " depos.coin_pub = $1"
" AND dep.merchant_pub = $2" " AND depos.merchant_pub = $2"
" AND dep.h_contract_terms = $3) dep" " AND depos.h_contract_terms = $3) dep, rc;");
" JOIN rc" break;
" USING (coin_pub,deposit_serial_id)"); case 4:
query = "get_refunds_by_coin_and_contract-v4";
PREPARE (pg,
query,
"WITH rc AS MATERIALIZED("
"SELECT"
" amount_with_fee_val"
",amount_with_fee_frac"
",coin_pub"
",deposit_serial_id"
" FROM refunds ref"
" WHERE ref.coin_pub=$1)"
"SELECT"
" rc.amount_with_fee_val"
" ,rc.amount_with_fee_frac"
" ,deposit_serial_id"
" FROM ("
"SELECT"
" amount_with_fee_val"
",amount_with_fee_frac"
" FROM deposits depos"
" WHERE"
" depos.merchant_pub = $2"
" AND depos.h_contract_terms = $3) dep JOIN rc "
"USING(deposit_serial_id, coin_pub);");
break;
case 5:
query = "get_refunds_by_coin_and_contract-v-broken";
xparams = params5;
PREPARE (pg,
query,
"SELECT"
" amount_with_fee_val"
",amount_with_fee_frac"
",coin_pub"
",deposit_serial_id"
" FROM refunds"
" WHERE coin_pub=$1;");
break;
case 8:
query = "get_refunds_by_coin_and_contract-v8";
PREPARE (pg,
query,
"WITH"
" rc AS MATERIALIZED("
" SELECT"
" amount_with_fee_val"
" ,amount_with_fee_frac"
" ,coin_pub"
" ,deposit_serial_id"
" FROM refunds"
" WHERE coin_pub=$1),"
" dep AS MATERIALIZED("
" SELECT"
" deposit_serial_id"
" FROM deposits"
" WHERE coin_pub = $1"
" AND merchant_pub = $2"
" AND h_contract_terms = $3"
")"
"SELECT"
" rc.amount_with_fee_val"
" ,rc.amount_with_fee_frac"
" FROM "
" rc JOIN dep USING (deposit_serial_id);");
break;
case 9:
query = "get_refunds_by_coin_and_contract-v9-broken";
PREPARE (pg,
query,
"SELECT"
" ref.amount_with_fee_val"
" ,ref.amount_with_fee_frac"
" FROM deposits dep"
" JOIN refunds ref USING(deposit_serial_id)"
" WHERE dep.coin_pub IN ("
" SELECT coin_pub"
" FROM refunds"
" WHERE coin_pub=$1)"
" AND merchant_pub = $2"
" AND h_contract_terms = $3;");
break;
case 10:
query = "get_refunds_by_coin_and_contract-v10-broken";
PREPARE (pg,
query,
"SELECT"
" *"
" FROM"
" exchange_do_refund_by_coin"
" ($1, $2, $3) "
" AS (amount_with_fee_val INT8, amount_with_fee_frac INT4);");
break;
default:
GNUNET_break (0);
return GNUNET_DB_STATUS_HARD_ERROR;
} }
qs = GNUNET_PQ_eval_prepared_multi_select (pg->conn, qs = GNUNET_PQ_eval_prepared_multi_select (pg->conn,
"get_refunds_by_coin_and_contract", query,
params, xparams,
&get_refunds_cb, &get_refunds_cb,
&srctx); &srctx);
if (GNUNET_SYSERR == srctx.status) if (GNUNET_SYSERR == srctx.status)

View File

@ -44,5 +44,7 @@ SET search_path TO exchange;
#include "exchange_do_batch2_reserves_in_insert.sql" #include "exchange_do_batch2_reserves_in_insert.sql"
#include "exchange_do_batch4_reserves_in_insert.sql" #include "exchange_do_batch4_reserves_in_insert.sql"
#include "exchange_do_batch8_reserves_in_insert.sql" #include "exchange_do_batch8_reserves_in_insert.sql"
#include "exchange_do_refund_by_coin.sql"
#include "exchange_do_get_ready_deposit.sql"
COMMIT; COMMIT;

View File

@ -24,14 +24,6 @@
#include "taler_exchangedb_plugin.h" #include "taler_exchangedb_plugin.h"
#include "math.h" #include "math.h"
#define NUM_ROWS 1000
/**
* Global result from the testcase.
*/
static int result;
/** /**
* Report line of error if @a cond is true, and jump to label "drop". * Report line of error if @a cond is true, and jump to label "drop".
*/ */
@ -55,22 +47,10 @@ static int result;
#define ZR_BLK(ptr) \ #define ZR_BLK(ptr) \
memset (ptr, 0, sizeof (*ptr)) memset (ptr, 0, sizeof (*ptr))
/**
* Currency we use. Must match test-exchange-db-*.conf.
*/
#define CURRENCY "EUR" #define CURRENCY "EUR"
/**
* How big do we make the RSA keys?
*/
#define RSA_KEY_SIZE 1024 #define RSA_KEY_SIZE 1024
static struct TALER_EXCHANGEDB_RefreshRevealedCoin *revealed_coins;
static struct TALER_TransferPrivateKeyP tprivs[TALER_CNC_KAPPA];
static struct TALER_TransferPublicKeyP tpub;
#define ROUNDS 10 #define ROUNDS 10
#define NUM_ROWS 1000
#define MELT_NEW_COINS 5 #define MELT_NEW_COINS 5
#define MELT_NOREVEAL_INDEX 1 #define MELT_NOREVEAL_INDEX 1
/** /**
@ -82,7 +62,10 @@ static struct TALER_DenomFeeSet fees;
* Denomination keys used for fresh coins in melt test. * Denomination keys used for fresh coins in melt test.
*/ */
static struct DenomKeyPair **new_dkp; static struct DenomKeyPair **new_dkp;
static int result;
static struct TALER_EXCHANGEDB_RefreshRevealedCoin *revealed_coins;
static struct TALER_TransferPrivateKeyP tprivs[TALER_CNC_KAPPA];
static struct TALER_TransferPublicKeyP tpub;
struct DenomKeyPair struct DenomKeyPair
{ {
struct TALER_DenominationPrivateKey priv; struct TALER_DenominationPrivateKey priv;
@ -222,8 +205,6 @@ handle_link_data_cb (void *cls,
} }
} }
/** /**
* Main function that will be run by the scheduler. * Main function that will be run by the scheduler.
* *

View File

@ -24,9 +24,6 @@
#include "taler_exchangedb_plugin.h" #include "taler_exchangedb_plugin.h"
#include "math.h" #include "math.h"
#define NUM_ROWS 1000
/** /**
* Global result from the testcase. * Global result from the testcase.
*/ */
@ -55,20 +52,13 @@ static int result;
#define ZR_BLK(ptr) \ #define ZR_BLK(ptr) \
memset (ptr, 0, sizeof (*ptr)) memset (ptr, 0, sizeof (*ptr))
/** /**
* Currency we use. Must match test-exchange-db-*.conf. * Currency we use. Must match test-exchange-db-*.conf.
*/ */
#define CURRENCY "EUR" #define CURRENCY "EUR"
/**
* How big do we make the RSA keys?
*/
#define RSA_KEY_SIZE 1024 #define RSA_KEY_SIZE 1024
static struct TALER_EXCHANGEDB_RefreshRevealedCoin *revealed_coins; #define NUM_ROWS 1000000
#define ROUNDS 10000
#define ROUNDS 100
#define MELT_NEW_COINS 5 #define MELT_NEW_COINS 5
#define MELT_NOREVEAL_INDEX 1 #define MELT_NOREVEAL_INDEX 1
/** /**
@ -81,7 +71,7 @@ static struct TALER_MerchantWireHashP h_wire_wt;
* Denomination keys used for fresh coins in melt test. * Denomination keys used for fresh coins in melt test.
*/ */
static struct DenomKeyPair **new_dkp; static struct DenomKeyPair **new_dkp;
static struct TALER_EXCHANGEDB_RefreshRevealedCoin *revealed_coins;
struct DenomKeyPair struct DenomKeyPair
{ {
struct TALER_DenominationPrivateKey priv; struct TALER_DenominationPrivateKey priv;
@ -389,7 +379,6 @@ run (void *cls)
&nonce_ok, &nonce_ok,
&ruuid)); &ruuid));
} }
{ {
/* ENSURE_COIN_KNOWN */ /* ENSURE_COIN_KNOWN */
uint64_t known_coin_id; uint64_t known_coin_id;
@ -408,23 +397,23 @@ run (void *cls)
refresh.noreveal_index = MELT_NOREVEAL_INDEX; refresh.noreveal_index = MELT_NOREVEAL_INDEX;
} }
/*STORE INTO DEPOSIT*/ /*STORE INTO DEPOSIT*/
{ {
struct GNUNET_TIME_Timestamp now; struct GNUNET_TIME_Timestamp now;
now = GNUNET_TIME_timestamp_get (); now = GNUNET_TIME_timestamp_get ();
FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
plugin->insert_deposit (plugin->cls, plugin->insert_deposit (plugin->cls,
now, now,
&depos[i])); &depos[i]));
} }
if (ROUNDS == i) if (ROUNDS == i)
TALER_denom_sig_free (&depos[i].coin.denom_sig); TALER_denom_sig_free (&depos[i].coin.denom_sig);
} }
/* End of benchmark setup */ /* End of benchmark setup */
GNUNET_free(perm); GNUNET_free(perm);
// commit // commit
FAILIF (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS != FAILIF (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS !=
plugin->commit (plugin->cls)); plugin->commit (plugin->cls));
/**** CALL GET LINK DATA ****/ /**** CALL GET READY DEPOSIT ****/
for (unsigned int r=0; r< ROUNDS; r++) for (unsigned int r=0; r< ROUNDS; r++)
{ {
struct GNUNET_TIME_Absolute time; struct GNUNET_TIME_Absolute time;

View File

@ -24,8 +24,6 @@
#include "taler_exchangedb_plugin.h" #include "taler_exchangedb_plugin.h"
#include "math.h" #include "math.h"
#define NUM_ROWS 10000
/** /**
* Global result from the testcase. * Global result from the testcase.
*/ */
@ -41,7 +39,6 @@ static int result;
goto drop; \ goto drop; \
} while (0) } while (0)
/** /**
* Initializes @a ptr with random data. * Initializes @a ptr with random data.
*/ */
@ -54,16 +51,13 @@ static int result;
#define ZR_BLK(ptr) \ #define ZR_BLK(ptr) \
memset (ptr, 0, sizeof (*ptr)) memset (ptr, 0, sizeof (*ptr))
/** /**
* Currency we use. Must match test-exchange-db-*.conf. * Currency we use. Must match test-exchange-db-*.conf.
*/ */
#define CURRENCY "EUR" #define CURRENCY "EUR"
/**
* How big do we make the RSA keys?
*/
#define RSA_KEY_SIZE 1024 #define RSA_KEY_SIZE 1024
#define ROUNDS 1000 #define ROUNDS 10000
#define NUM_ROWS 1000000
#define MELT_NEW_COINS 5 #define MELT_NEW_COINS 5
#define MELT_NOREVEAL_INDEX 1 #define MELT_NOREVEAL_INDEX 1
/** /**
@ -72,14 +66,14 @@ static int result;
static struct TALER_EXCHANGEDB_Plugin *plugin; static struct TALER_EXCHANGEDB_Plugin *plugin;
static struct TALER_DenomFeeSet fees; static struct TALER_DenomFeeSet fees;
static struct TALER_MerchantWireHashP h_wire_wt; static struct TALER_MerchantWireHashP h_wire_wt;
static struct DenomKeyPair **new_dkp;
static struct TALER_EXCHANGEDB_RefreshRevealedCoin *revealed_coins;
struct DenomKeyPair struct DenomKeyPair
{ {
struct TALER_DenominationPrivateKey priv; struct TALER_DenominationPrivateKey priv;
struct TALER_DenominationPublicKey pub; struct TALER_DenominationPublicKey pub;
}; };
static struct DenomKeyPair **new_dkp;
static struct TALER_EXCHANGEDB_RefreshRevealedCoin *revealed_coins;
/** /**
* Destroy a denomination key pair. The key is not necessarily removed from the DB. * Destroy a denomination key pair. The key is not necessarily removed from the DB.
* *
@ -185,7 +179,6 @@ check_refund_cb (void *cls,
const struct TALER_Amount *amount_with_fee) const struct TALER_Amount *amount_with_fee)
{ {
const struct TALER_EXCHANGEDB_Refund *refund = cls; const struct TALER_EXCHANGEDB_Refund *refund = cls;
if (0 != TALER_amount_cmp (amount_with_fee, if (0 != TALER_amount_cmp (amount_with_fee,
&refund->details.refund_amount)) &refund->details.refund_amount))
{ {
@ -207,7 +200,6 @@ run (void *cls)
{ {
struct GNUNET_CONFIGURATION_Handle *cfg = cls; struct GNUNET_CONFIGURATION_Handle *cfg = cls;
const uint32_t num_partitions = 10; const uint32_t num_partitions = 10;
struct DenomKeyPair *dkp = NULL;
struct GNUNET_TIME_Timestamp ts; struct GNUNET_TIME_Timestamp ts;
struct TALER_EXCHANGEDB_Deposit *depos=NULL; struct TALER_EXCHANGEDB_Deposit *depos=NULL;
struct GNUNET_TIME_Timestamp deadline; struct GNUNET_TIME_Timestamp deadline;
@ -226,6 +218,8 @@ run (void *cls)
struct TALER_CoinSpendPublicKeyP coin_pub; struct TALER_CoinSpendPublicKeyP coin_pub;
struct TALER_EXCHANGEDB_RefreshRevealedCoin *ccoin; struct TALER_EXCHANGEDB_RefreshRevealedCoin *ccoin;
struct TALER_DenominationPublicKey *new_denom_pubs = NULL; struct TALER_DenominationPublicKey *new_denom_pubs = NULL;
unsigned int count=0;
ref = GNUNET_new_array (ROUNDS +1, ref = GNUNET_new_array (ROUNDS +1,
struct TALER_EXCHANGEDB_Refund); struct TALER_EXCHANGEDB_Refund);
depos = GNUNET_new_array (ROUNDS +1, depos = GNUNET_new_array (ROUNDS +1,
@ -400,18 +394,72 @@ run (void *cls)
now, now,
&depos[i])); &depos[i]));
} }
/* 100% Refund */
{ {
bool not_found; bool not_found;
bool refund_ok; bool refund_ok;
bool gone; bool gone;
bool conflict; bool conflict;
ref[i].coin = depos[i].coin; unsigned int refund_percent=0;
ref[i].details.merchant_pub = depos[i].merchant_pub; switch (refund_percent){
case 2 ://100% refund
ref[i].coin = depos[i].coin;
ref[i].details.merchant_pub = depos[i].merchant_pub;
RND_BLK(&ref[i].details.merchant_sig);
ref[i].details.h_contract_terms = depos[i].h_contract_terms;
ref[i].coin.coin_pub = depos[i].coin.coin_pub;
ref[i].details.rtransaction_id = i;
ref[i].details.refund_amount = value;
ref[i].details.refund_fee = fees.refund;
FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
plugin->do_refund (plugin->cls,
&ref[i],
&fees.deposit,
known_coin_id,
&not_found,
&refund_ok,
&gone,
&conflict));
break;
case 1 ://10% refund
if (count < (NUM_ROWS/10))
{
ref[i].coin = depos[i].coin;
ref[i].details.merchant_pub = depos[i].merchant_pub;
RND_BLK(&ref[i].details.merchant_sig);
ref[i].details.h_contract_terms = depos[i].h_contract_terms;
ref[i].coin.coin_pub = depos[i].coin.coin_pub;
ref[i].details.rtransaction_id = i;
ref[i].details.refund_amount = value;
ref[i].details.refund_fee = fees.refund;
}
else
{
ref[i].coin = depos[i].coin;
RND_BLK(&ref[i].details.merchant_pub);
RND_BLK(&ref[i].details.merchant_sig);
RND_BLK(&ref[i].details.h_contract_terms);
RND_BLK(&ref[i].coin.coin_pub);
ref[i].details.rtransaction_id = i;
ref[i].details.refund_amount = value;
ref[i].details.refund_fee = fees.refund;
}
FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
plugin->do_refund (plugin->cls,
&ref[i],
&fees.deposit,
known_coin_id,
&not_found,
&refund_ok,
&gone,
&conflict));
count++;
break;
case 0://no refund
ref[i].coin=depos[i].coin;
RND_BLK(&ref[i].details.merchant_pub);
RND_BLK(&ref[i].details.merchant_sig); RND_BLK(&ref[i].details.merchant_sig);
ref[i].details.h_contract_terms = depos[i].h_contract_terms; RND_BLK(&ref[i].details.h_contract_terms);
ref[i].coin.coin_pub = depos[i].coin.coin_pub; RND_BLK(&ref[i].coin.coin_pub);
ref[i].details.rtransaction_id = i; ref[i].details.rtransaction_id = i;
ref[i].details.refund_amount = value; ref[i].details.refund_amount = value;
ref[i].details.refund_fee = fees.refund; ref[i].details.refund_fee = fees.refund;
@ -424,10 +472,8 @@ run (void *cls)
&refund_ok, &refund_ok,
&gone, &gone,
&conflict)); &conflict));
break;
/* FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != }/* END OF SWITCH CASE */
plugin->insert_refund (plugin->cls,
&ref[i]));*/
} }
if (ROUNDS == i) if (ROUNDS == i)
TALER_denom_sig_free (&depos[i].coin.denom_sig); TALER_denom_sig_free (&depos[i].coin.denom_sig);
@ -443,7 +489,7 @@ run (void *cls)
struct GNUNET_TIME_Relative duration; struct GNUNET_TIME_Relative duration;
time = GNUNET_TIME_absolute_get (); time = GNUNET_TIME_absolute_get ();
FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != FAILIF (0 >
plugin->select_refunds_by_coin (plugin->cls, plugin->select_refunds_by_coin (plugin->cls,
&ref[r].coin.coin_pub, &ref[r].coin.coin_pub,
&ref[r].details.merchant_pub, &ref[r].details.merchant_pub,
@ -476,10 +522,8 @@ run (void *cls)
result = 0; result = 0;
drop: drop:
GNUNET_break (GNUNET_OK == GNUNET_break (GNUNET_OK ==
plugin->drop_tables (plugin->cls)); plugin->drop_tables (plugin->cls));
cleanup: cleanup:
if (NULL != dkp)
destroy_denom_key_pair (dkp);
if (NULL != revealed_coins) if (NULL != revealed_coins)
{ {
for (unsigned int cnt = 0; cnt < MELT_NEW_COINS; cnt++) for (unsigned int cnt = 0; cnt < MELT_NEW_COINS; cnt++)
@ -502,7 +546,6 @@ cleanup:
} }
GNUNET_free(depos); GNUNET_free(depos);
GNUNET_free(ref); GNUNET_free(ref);
dkp = NULL;
TALER_EXCHANGEDB_plugin_unload (plugin); TALER_EXCHANGEDB_plugin_unload (plugin);
plugin = NULL; plugin = NULL;
} }