diff options
Diffstat (limited to 'src/mintdb/test_mintdb.c')
-rw-r--r-- | src/mintdb/test_mintdb.c | 907 |
1 files changed, 0 insertions, 907 deletions
diff --git a/src/mintdb/test_mintdb.c b/src/mintdb/test_mintdb.c deleted file mode 100644 index 0938f8fab..000000000 --- a/src/mintdb/test_mintdb.c +++ /dev/null @@ -1,907 +0,0 @@ -/* - This file is part of TALER - Copyright (C) 2014, 2015, 2016 GNUnet e.V. - - 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 mintdb/test_mintdb.c - * @brief test cases for DB interaction functions - * @author Sree Harsha Totakura <sreeharsha@totakura.in> - */ -#include "platform.h" -#include "taler_mintdb_lib.h" -#include "taler_mintdb_plugin.h" - -static int result; - -#define FAILIF(cond) \ - do { \ - if (!(cond)){ break;} \ - GNUNET_break (0); \ - goto drop; \ - } while (0) - - -#define RND_BLK(ptr) \ - GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_WEAK, ptr, sizeof (*ptr)) - -#define ZR_BLK(ptr) \ - memset (ptr, 0, sizeof (*ptr)) - - -#define CURRENCY "EUR" - -static struct TALER_MINTDB_Plugin *plugin; - -/** - * Checks if the given reserve has the given amount of balance and expiry - * - * @param session the database connection - * @param pub the public key of the reserve - * @param value balance value - * @param fraction balance fraction - * @param currency currency of the reserve - * @return #GNUNET_OK if the given reserve has the same balance and expiration - * as the given parameters; #GNUNET_SYSERR if not - */ -static int -check_reserve (struct TALER_MINTDB_Session *session, - const struct TALER_ReservePublicKeyP *pub, - uint64_t value, - uint32_t fraction, - const char *currency) -{ - struct TALER_MINTDB_Reserve reserve; - - reserve.pub = *pub; - - FAILIF (GNUNET_OK != - plugin->reserve_get (plugin->cls, - session, - &reserve)); - FAILIF (value != reserve.balance.value); - FAILIF (fraction != reserve.balance.fraction); - FAILIF (0 != strcmp (currency, reserve.balance.currency)); - - return GNUNET_OK; - drop: - return GNUNET_SYSERR; -} - - -struct DenomKeyPair -{ - struct TALER_DenominationPrivateKey priv; - struct TALER_DenominationPublicKey pub; -}; - - -/** - * Destroy a denomination key pair. The key is not necessarily removed from the DB. - * - * @param dkp the keypair to destroy - */ -static void -destroy_denom_key_pair (struct DenomKeyPair *dkp) -{ - GNUNET_CRYPTO_rsa_public_key_free (dkp->pub.rsa_public_key); - GNUNET_CRYPTO_rsa_private_key_free (dkp->priv.rsa_private_key); - GNUNET_free (dkp); -} - - -/** - * Create a denominaiton key pair by registering the denomination in the DB. - * - * @param size the size of the denomination key - * @param session the DB session - * @return the denominaiton key pair; NULL upon error - */ -static struct DenomKeyPair * -create_denom_key_pair (unsigned int size, - struct TALER_MINTDB_Session *session, - const struct TALER_Amount *value, - const struct TALER_Amount *fee_withdraw, - const struct TALER_Amount *fee_deposit, - const struct TALER_Amount *fee_refresh) -{ - struct DenomKeyPair *dkp; - struct TALER_MINTDB_DenominationKeyIssueInformation dki; - - dkp = GNUNET_new (struct DenomKeyPair); - dkp->priv.rsa_private_key = GNUNET_CRYPTO_rsa_private_key_create (size); - GNUNET_assert (NULL != dkp->priv.rsa_private_key); - dkp->pub.rsa_public_key - = GNUNET_CRYPTO_rsa_private_key_get_public (dkp->priv.rsa_private_key); - - /* Using memset() as fields like master key and signature - are not properly initialized for this test. */ - memset (&dki, - 0, - sizeof (struct TALER_MINTDB_DenominationKeyIssueInformation)); - dki.denom_pub = dkp->pub; - dki.issue.properties.start = GNUNET_TIME_absolute_hton (GNUNET_TIME_absolute_get ()); - dki.issue.properties.expire_withdraw = GNUNET_TIME_absolute_hton - (GNUNET_TIME_absolute_add (GNUNET_TIME_absolute_get (), - GNUNET_TIME_UNIT_HOURS)); - dki.issue.properties.expire_spend = GNUNET_TIME_absolute_hton - (GNUNET_TIME_absolute_add - (GNUNET_TIME_absolute_get (), - GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_HOURS, 2))); - dki.issue.properties.expire_legal = GNUNET_TIME_absolute_hton - (GNUNET_TIME_absolute_add - (GNUNET_TIME_absolute_get (), - GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_HOURS, 3))); - TALER_amount_hton (&dki.issue.properties.value, value); - TALER_amount_hton (&dki.issue.properties.fee_withdraw, fee_withdraw); - TALER_amount_hton (&dki.issue.properties.fee_deposit, fee_deposit); - TALER_amount_hton (&dki.issue.properties.fee_refresh, fee_refresh); - GNUNET_CRYPTO_rsa_public_key_hash (dkp->pub.rsa_public_key, - &dki.issue.properties.denom_hash); - if (GNUNET_OK != - plugin->insert_denomination_info (plugin->cls, - session, - &dki.denom_pub, - &dki.issue)) - { - GNUNET_break(0); - destroy_denom_key_pair (dkp); - return NULL; - } - return dkp; -} - -static struct TALER_Amount value; -static struct TALER_Amount fee_withdraw; -static struct TALER_Amount fee_deposit; -static struct TALER_Amount fee_refresh; -static struct TALER_Amount amount_with_fee; - -static void -free_refresh_commit_coins_array(struct TALER_MINTDB_RefreshCommitCoin - *commit_coins, - unsigned int size) -{ - unsigned int cnt; - struct TALER_MINTDB_RefreshCommitCoin *ccoin; - struct TALER_RefreshLinkEncrypted *rlink; - - for (cnt = 0; cnt < size; cnt++) - { - ccoin = &commit_coins[cnt]; - GNUNET_free_non_null (ccoin->coin_ev); - rlink = (struct TALER_RefreshLinkEncrypted *) ccoin->refresh_link; - GNUNET_free_non_null (rlink); - } - GNUNET_free (commit_coins); -} - -#define MELT_NEW_COINS 5 - -static int -test_refresh_commit_coins (struct TALER_MINTDB_Session *session, - struct TALER_MINTDB_RefreshSession *refresh_session, - const struct GNUNET_HashCode *session_hash) -{ - struct TALER_MINTDB_RefreshCommitCoin *commit_coins; - struct TALER_MINTDB_RefreshCommitCoin *ret_commit_coins; - struct TALER_MINTDB_RefreshCommitCoin *a_ccoin; - struct TALER_RefreshLinkEncrypted *a_rlink; - struct TALER_MINTDB_RefreshCommitCoin *b_ccoin; - struct TALER_RefreshLinkEncrypted *b_rlink; - size_t size; - unsigned int cnt; - uint16_t cnc_index; - int ret; - - #define COIN_ENC_MAX_SIZE 512 - ret = GNUNET_SYSERR; - ret_commit_coins = NULL; - commit_coins = GNUNET_new_array (MELT_NEW_COINS, - struct TALER_MINTDB_RefreshCommitCoin); - cnc_index = (uint16_t) GNUNET_CRYPTO_random_u32 - (GNUNET_CRYPTO_QUALITY_WEAK, GNUNET_MIN (MELT_NEW_COINS, UINT16_MAX)); - for (cnt=0; cnt < MELT_NEW_COINS; cnt++) - { - struct TALER_MINTDB_RefreshCommitCoin *ccoin; - struct TALER_RefreshLinkEncrypted *rlink; - ccoin = &commit_coins[cnt]; - size = GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK, - COIN_ENC_MAX_SIZE); - rlink = GNUNET_malloc (sizeof (struct TALER_RefreshLinkEncrypted) + size); - ccoin->refresh_link = rlink; - ccoin->coin_ev_size = GNUNET_CRYPTO_random_u64 - (GNUNET_CRYPTO_QUALITY_WEAK, COIN_ENC_MAX_SIZE); - ccoin->coin_ev = GNUNET_malloc (ccoin->coin_ev_size); - GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_WEAK, - ccoin->coin_ev, - ccoin->coin_ev_size); - rlink->blinding_key_enc_size = size; - RND_BLK (&rlink->coin_priv_enc); - rlink->blinding_key_enc = (const char *) &rlink[1]; - GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_WEAK, - (void *)rlink->blinding_key_enc, - rlink->blinding_key_enc_size); - } - FAILIF (GNUNET_OK != - plugin->insert_refresh_commit_coins (plugin->cls, - session, - session_hash, - cnc_index, - MELT_NEW_COINS, - commit_coins)); - ret_commit_coins = GNUNET_new_array (MELT_NEW_COINS, - struct TALER_MINTDB_RefreshCommitCoin); - FAILIF (GNUNET_OK != - plugin->get_refresh_commit_coins (plugin->cls, - session, - session_hash, - cnc_index, - MELT_NEW_COINS, - ret_commit_coins)); - /* compare the refresh commit coin arrays */ - for (cnt = 0; cnt < MELT_NEW_COINS; cnt++) - { - a_ccoin = &commit_coins[cnt]; - b_ccoin = &ret_commit_coins[cnt]; - FAILIF (a_ccoin->coin_ev_size != b_ccoin->coin_ev_size); - FAILIF (0 != memcmp (a_ccoin->coin_ev, - a_ccoin->coin_ev, - a_ccoin->coin_ev_size)); - a_rlink = a_ccoin->refresh_link; - b_rlink = b_ccoin->refresh_link; - FAILIF (a_rlink->blinding_key_enc_size != b_rlink->blinding_key_enc_size); - FAILIF (0 != memcmp (a_rlink->blinding_key_enc, - b_rlink->blinding_key_enc, - a_rlink->blinding_key_enc_size)); - FAILIF (0 != memcmp (a_rlink->coin_priv_enc, - b_rlink->coin_priv_enc, - sizeof (a_rlink->coin_priv_enc))); - } - ret = GNUNET_OK; - - drop: - if (NULL != ret_commit_coins) - free_refresh_commit_coins_array (ret_commit_coins, MELT_NEW_COINS); - if (NULL != commit_coins) - free_refresh_commit_coins_array (commit_coins, MELT_NEW_COINS); - return ret; -} - -/** - * Function to test melting of coins as part of a refresh session - * - * @param session the database session - * @param refresh_session the refresh session - * @return #GNUNET_OK if everything went well; #GNUNET_SYSERR if not - */ -static int -test_melting (struct TALER_MINTDB_Session *session) -{ -#define MELT_OLD_COINS 10 - struct TALER_MINTDB_RefreshSession refresh_session; - struct TALER_MINTDB_RefreshSession ret_refresh_session; - struct GNUNET_HashCode session_hash; - struct DenomKeyPair *dkp; - struct DenomKeyPair **new_dkp; - /* struct TALER_CoinPublicInfo *coins; */ - struct TALER_MINTDB_RefreshMelt *melts; - struct TALER_DenominationPublicKey *new_denom_pubs; - struct TALER_DenominationPublicKey *ret_denom_pubs; - unsigned int cnt; - int ret; - - ret = GNUNET_SYSERR; - RND_BLK (&refresh_session); - RND_BLK (&session_hash); - melts = NULL; - dkp = NULL; - new_dkp = NULL; - new_denom_pubs = NULL; - ret_denom_pubs = NULL; - /* create and test a refresh session */ - refresh_session.num_oldcoins = MELT_OLD_COINS; - refresh_session.num_newcoins = 1; - refresh_session.noreveal_index = 1; - FAILIF (GNUNET_OK != plugin->create_refresh_session (plugin->cls, - session, - &session_hash, - &refresh_session)); - FAILIF (GNUNET_OK != plugin->get_refresh_session (plugin->cls, - session, - &session_hash, - &ret_refresh_session)); - FAILIF (0 != memcmp (&ret_refresh_session, - &refresh_session, - sizeof (refresh_session))); - - /* create a denomination (value: 1; fraction: 100) */ - dkp = create_denom_key_pair (512, session, - &value, - &fee_withdraw, - &fee_deposit, - &fee_refresh); - /* create MELT_OLD_COINS number of refresh melts */ - melts = GNUNET_new_array (MELT_OLD_COINS, struct TALER_MINTDB_RefreshMelt); - for (cnt=0; cnt < MELT_OLD_COINS; cnt++) - { - RND_BLK (&melts[cnt].coin.coin_pub); - melts[cnt].coin.denom_sig.rsa_signature = - GNUNET_CRYPTO_rsa_sign (dkp->priv.rsa_private_key, - &melts[cnt].coin.coin_pub, - sizeof (melts[cnt].coin.coin_pub)); - melts[cnt].coin.denom_pub = dkp->pub; - RND_BLK (&melts[cnt].coin_sig); - 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])); - } - for (cnt = 0; cnt < MELT_OLD_COINS; cnt++) - { - struct TALER_MINTDB_RefreshMelt 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)); - FAILIF (0 != memcmp (&ret_melt.coin.coin_pub, - &melts[cnt].coin.coin_pub, - sizeof (ret_melt.coin.coin_pub))); - FAILIF (0 != GNUNET_CRYPTO_rsa_public_key_cmp - (ret_melt.coin.denom_pub.rsa_public_key, - melts[cnt].coin.denom_pub.rsa_public_key)); - FAILIF (0 != memcmp (&ret_melt.coin_sig, - &melts[cnt].coin_sig, - sizeof (ret_melt.coin_sig))); - FAILIF (0 != memcmp (&ret_melt.session_hash, - &melts[cnt].session_hash, - sizeof (ret_melt.session_hash))); - FAILIF (0 != TALER_amount_cmp (&ret_melt.amount_with_fee, - &melts[cnt].amount_with_fee)); - FAILIF (0 != TALER_amount_cmp (&ret_melt.melt_fee, - &melts[cnt].melt_fee)); - GNUNET_CRYPTO_rsa_signature_free (ret_melt.coin.denom_sig.rsa_signature); - GNUNET_CRYPTO_rsa_public_key_free (ret_melt.coin.denom_pub.rsa_public_key); - } - new_dkp = GNUNET_new_array (MELT_NEW_COINS, struct DenomKeyPair *); - new_denom_pubs = GNUNET_new_array (MELT_NEW_COINS, - struct TALER_DenominationPublicKey); - for (cnt=0; cnt < MELT_NEW_COINS; cnt++) - { - new_dkp[cnt] = create_denom_key_pair (128, session, - &value, - &fee_withdraw, - &fee_deposit, - &fee_refresh); - new_denom_pubs[cnt]=new_dkp[cnt]->pub; - } - FAILIF (GNUNET_OK != plugin->insert_refresh_order (plugin->cls, - session, - &session_hash, - MELT_NEW_COINS, - new_denom_pubs)); - ret_denom_pubs = GNUNET_new_array (MELT_NEW_COINS, - struct TALER_DenominationPublicKey); - FAILIF (GNUNET_OK != plugin->get_refresh_order (plugin->cls, - session, - &session_hash, - MELT_NEW_COINS, - ret_denom_pubs)); - for (cnt=0; cnt < MELT_NEW_COINS; cnt++) - { - FAILIF (0 != GNUNET_CRYPTO_rsa_public_key_cmp - (ret_denom_pubs[cnt].rsa_public_key, - new_denom_pubs[cnt].rsa_public_key)); - } - FAILIF (GNUNET_OK != - test_refresh_commit_coins (session, - &refresh_session, - &session_hash)); - - ret = GNUNET_OK; - - drop: - if (NULL != dkp) - destroy_denom_key_pair (dkp); - if (NULL != melts) - { - for (cnt = 0; cnt < MELT_OLD_COINS; cnt++) - GNUNET_CRYPTO_rsa_signature_free (melts[cnt].coin.denom_sig.rsa_signature); - GNUNET_free (melts); - } - for (cnt = 0; - (NULL != ret_denom_pubs) && (cnt < MELT_NEW_COINS) - && (NULL != ret_denom_pubs[cnt].rsa_public_key); - cnt++) - GNUNET_CRYPTO_rsa_public_key_free (ret_denom_pubs[cnt].rsa_public_key); - GNUNET_free_non_null (ret_denom_pubs); - GNUNET_free_non_null (new_denom_pubs); - for (cnt = 0; - (NULL != new_dkp) && (cnt < MELT_NEW_COINS) && (NULL != new_dkp[cnt]); - cnt++) - destroy_denom_key_pair (new_dkp[cnt]); - GNUNET_free_non_null (new_dkp); - return ret; -} - - -/** - * Callback that should never be called. - */ -static void -cb_wt_never (void *cls, - const struct TALER_MerchantPublicKeyP *merchant_pub, - const struct GNUNET_HashCode *h_wire, - const struct GNUNET_HashCode *h_contract, - uint64_t transaction_id, - const struct TALER_CoinSpendPublicKeyP *coin_pub, - const struct TALER_Amount *coin_value, - const struct TALER_Amount *coin_fee) -{ - GNUNET_assert (0); /* this statement should be unreachable */ -} - - -/** - * Callback that should never be called. - */ -static void -cb_wtid_never (void *cls, - const struct TALER_WireTransferIdentifierRawP *wtid, - const struct TALER_Amount *coin_contribution, - const struct TALER_Amount *coin_fee, - struct GNUNET_TIME_Absolute execution_time) -{ - GNUNET_assert (0); -} - - -static struct TALER_MerchantPublicKeyP merchant_pub_wt; -static struct GNUNET_HashCode h_wire_wt; -static struct GNUNET_HashCode h_contract_wt; -static uint64_t transaction_id_wt; -static struct TALER_CoinSpendPublicKeyP coin_pub_wt; -static struct TALER_Amount coin_value_wt; -static struct TALER_Amount coin_fee_wt; -static struct TALER_Amount transfer_value_wt; -static struct GNUNET_TIME_Absolute execution_time_wt; -static struct TALER_WireTransferIdentifierRawP wtid_wt; - - -/** - * Callback that should be called with the WT data. - */ -static void -cb_wt_check (void *cls, - const struct TALER_MerchantPublicKeyP *merchant_pub, - const struct GNUNET_HashCode *h_wire, - const struct GNUNET_HashCode *h_contract, - uint64_t transaction_id, - const struct TALER_CoinSpendPublicKeyP *coin_pub, - const struct TALER_Amount *coin_value, - const struct TALER_Amount *coin_fee) -{ - GNUNET_assert (cls == &cb_wt_never); - GNUNET_assert (0 == memcmp (merchant_pub, - &merchant_pub_wt, - sizeof (struct TALER_MerchantPublicKeyP))); - GNUNET_assert (0 == memcmp (h_wire, - &h_wire_wt, - sizeof (struct GNUNET_HashCode))); - GNUNET_assert (0 == memcmp (h_contract, - &h_contract_wt, - sizeof (struct GNUNET_HashCode))); - GNUNET_assert (transaction_id == transaction_id_wt); - GNUNET_assert (0 == memcmp (coin_pub, - &coin_pub_wt, - sizeof (struct TALER_CoinSpendPublicKeyP))); - GNUNET_assert (0 == TALER_amount_cmp (coin_value, - &coin_value_wt)); - GNUNET_assert (0 == TALER_amount_cmp (coin_fee, - &coin_fee_wt)); -} - - -/** - * Callback that should be called with the WT data. - */ -static void -cb_wtid_check (void *cls, - const struct TALER_WireTransferIdentifierRawP *wtid, - const struct TALER_Amount *coin_contribution, - const struct TALER_Amount *coin_fee, - struct GNUNET_TIME_Absolute execution_time) -{ - GNUNET_assert (cls == &cb_wtid_never); - GNUNET_assert (0 == memcmp (wtid, - &wtid_wt, - sizeof (struct TALER_WireTransferIdentifierRawP))); - GNUNET_assert (execution_time.abs_value_us == - execution_time_wt.abs_value_us); - GNUNET_assert (0 == TALER_amount_cmp (coin_contribution, - &coin_value_wt)); - GNUNET_assert (0 == TALER_amount_cmp (coin_fee, - &coin_fee_wt)); -} - - -/** - * Main function that will be run by the scheduler. - * - * @param cls closure - * @param args remaining command-line arguments - * @param cfgfile name of the configuration file used (for saving, can be NULL!) - * @param cfg configuration - */ -static void -run (void *cls, - char *const *args, - const char *cfgfile, - const struct GNUNET_CONFIGURATION_Handle *cfg) -{ - struct TALER_MINTDB_Session *session; - struct TALER_ReservePublicKeyP reserve_pub; - struct DenomKeyPair *dkp; - struct TALER_MINTDB_CollectableBlindcoin cbc; - struct TALER_MINTDB_CollectableBlindcoin cbc2; - struct TALER_MINTDB_ReserveHistory *rh; - struct TALER_MINTDB_ReserveHistory *rh_head; - struct TALER_MINTDB_BankTransfer *bt; - struct TALER_MINTDB_CollectableBlindcoin *withdraw; - struct TALER_MINTDB_Deposit deposit; - struct TALER_MINTDB_Deposit deposit2; - struct TALER_WireTransferIdentifierRawP wtid; - json_t *wire; - json_t *just; - const char * const json_wire_str = - "{ \"type\":\"SEPA\", \ -\"IBAN\":\"DE67830654080004822650\", \ -\"name\":\"GNUnet e.V.\", \ -\"bic\":\"GENODEF1SLR\", \ -\"edate\":\"1449930207000\", \ -\"r\":123456789, \ -\"address\": \"foobar\"}"; - unsigned int cnt; - - dkp = NULL; - rh = NULL; - wire = NULL; - session = NULL; - ZR_BLK (&cbc); - ZR_BLK (&cbc2); - if (NULL == - (plugin = TALER_MINTDB_plugin_load (cfg))) - { - result = 1; - return; - } - if (GNUNET_OK != - plugin->create_tables (plugin->cls, - GNUNET_YES)) - { - result = 2; - goto drop; - } - if (NULL == - (session = plugin->get_session (plugin->cls, - GNUNET_YES))) - { - result = 3; - goto drop; - } - RND_BLK (&reserve_pub); - GNUNET_assert (GNUNET_OK == - TALER_string_to_amount (CURRENCY ":1.000010", - &value)); - GNUNET_assert (GNUNET_OK == - TALER_string_to_amount (CURRENCY ":0.000010", - &fee_withdraw)); - GNUNET_assert (GNUNET_OK == - TALER_string_to_amount (CURRENCY ":0.000010", - &fee_deposit)); - GNUNET_assert (GNUNET_OK == - TALER_string_to_amount (CURRENCY ":0.000010", - &fee_refresh)); - GNUNET_assert (GNUNET_OK == - TALER_string_to_amount (CURRENCY ":1.000010", - &amount_with_fee)); - - result = 4; - just = json_loads ("{ \"justification\":\"1\" }", 0, NULL); - FAILIF (GNUNET_OK != - plugin->reserves_in_insert (plugin->cls, - session, - &reserve_pub, - &value, - GNUNET_TIME_absolute_get (), - just)); - json_decref (just); - FAILIF (GNUNET_OK != - check_reserve (session, - &reserve_pub, - value.value, - value.fraction, - value.currency)); - just = json_loads ("{ \"justification\":\"2\" }", 0, NULL); - FAILIF (GNUNET_OK != - plugin->reserves_in_insert (plugin->cls, - session, - &reserve_pub, - &value, - GNUNET_TIME_absolute_get (), - just)); - json_decref (just); - FAILIF (GNUNET_OK != - check_reserve (session, - &reserve_pub, - value.value * 2, - value.fraction * 2, - value.currency)); - dkp = create_denom_key_pair (1024, session, - &value, - &fee_withdraw, - &fee_deposit, - &fee_refresh); - RND_BLK(&cbc.h_coin_envelope); - RND_BLK(&cbc.reserve_sig); - cbc.denom_pub = dkp->pub; - cbc.sig.rsa_signature - = GNUNET_CRYPTO_rsa_sign (dkp->priv.rsa_private_key, - &cbc.h_coin_envelope, - sizeof (cbc.h_coin_envelope)); - cbc.reserve_pub = reserve_pub; - cbc.amount_with_fee = value; - GNUNET_assert (GNUNET_OK == - TALER_amount_get_zero (CURRENCY, &cbc.withdraw_fee)); - FAILIF (GNUNET_OK != - plugin->insert_withdraw_info (plugin->cls, - session, - &cbc)); - FAILIF (GNUNET_OK != - check_reserve (session, - &reserve_pub, - value.value, - value.fraction, - value.currency)); - FAILIF (GNUNET_YES != - plugin->get_withdraw_info (plugin->cls, - session, - &cbc.h_coin_envelope, - &cbc2)); - FAILIF (NULL == cbc2.denom_pub.rsa_public_key); - FAILIF (0 != memcmp (&cbc2.reserve_sig, - &cbc.reserve_sig, - sizeof (cbc2.reserve_sig))); - FAILIF (0 != memcmp (&cbc2.reserve_pub, - &cbc.reserve_pub, - sizeof (cbc2.reserve_pub))); - FAILIF (GNUNET_OK != - GNUNET_CRYPTO_rsa_verify (&cbc.h_coin_envelope, - cbc2.sig.rsa_signature, - dkp->pub.rsa_public_key)); - rh = plugin->get_reserve_history (plugin->cls, - session, - &reserve_pub); - FAILIF (NULL == rh); - rh_head = rh; - for (cnt=0; NULL != rh_head; rh_head=rh_head->next, cnt++) - { - switch (rh_head->type) - { - case TALER_MINTDB_RO_BANK_TO_MINT: - bt = rh_head->details.bank; - FAILIF (0 != memcmp (&bt->reserve_pub, - &reserve_pub, - sizeof (reserve_pub))); - /* this is the amount we trasferred twice*/ - FAILIF (1 != bt->amount.value); - FAILIF (10 != bt->amount.fraction); - FAILIF (0 != strcmp (CURRENCY, bt->amount.currency)); - FAILIF (NULL == bt->wire); - break; - case TALER_MINTDB_RO_WITHDRAW_COIN: - withdraw = rh_head->details.withdraw; - FAILIF (0 != memcmp (&withdraw->reserve_pub, - &reserve_pub, - sizeof (reserve_pub))); - FAILIF (0 != memcmp (&withdraw->h_coin_envelope, - &cbc.h_coin_envelope, - sizeof (cbc.h_coin_envelope))); - break; - } - } - FAILIF (3 != cnt); - /* Tests for deposits */ - memset (&deposit, 0, sizeof (deposit)); - RND_BLK (&deposit.coin.coin_pub); - deposit.coin.denom_pub = dkp->pub; - deposit.coin.denom_sig = cbc.sig; - RND_BLK (&deposit.csig); - RND_BLK (&deposit.merchant_pub); - RND_BLK (&deposit.h_contract); - RND_BLK (&deposit.h_wire); - wire = json_loads (json_wire_str, 0, NULL); - deposit.wire = wire; - deposit.transaction_id = - GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK, UINT64_MAX); - deposit.amount_with_fee = value; - GNUNET_assert (GNUNET_OK == - TALER_amount_get_zero (CURRENCY, &deposit.deposit_fee)); - FAILIF (GNUNET_OK != - plugin->insert_deposit (plugin->cls, - session, &deposit)); - FAILIF (GNUNET_YES != - plugin->have_deposit (plugin->cls, - session, - &deposit)); - deposit2 = deposit; - deposit2.transaction_id++; /* should fail if transaction id is different */ - FAILIF (GNUNET_NO != - plugin->have_deposit (plugin->cls, - session, - &deposit2)); - deposit2.transaction_id = deposit.transaction_id; - RND_BLK (&deposit2.merchant_pub); /* should fail if merchant is different */ - FAILIF (GNUNET_NO != - plugin->have_deposit (plugin->cls, - session, - &deposit2)); - deposit2.merchant_pub = deposit.merchant_pub; - RND_BLK (&deposit2.coin.coin_pub); /* should fail if coin is different */ - FAILIF (GNUNET_NO != - plugin->have_deposit (plugin->cls, - session, - &deposit2)); - FAILIF (GNUNET_OK != test_melting (session)); - - /* setup values for wire transfer aggregation data */ - memset (&wtid, 42, sizeof (wtid)); - memset (&merchant_pub_wt, 43, sizeof (merchant_pub_wt)); - memset (&h_wire_wt, 44, sizeof (h_wire_wt)); - memset (&h_contract_wt, 45, sizeof (h_contract_wt)); - memset (&coin_pub_wt, 46, sizeof (coin_pub_wt)); - transaction_id_wt = 47; - execution_time_wt = GNUNET_TIME_absolute_get (); - memset (&merchant_pub_wt, 48, sizeof (merchant_pub_wt)); - GNUNET_assert (GNUNET_OK == - TALER_string_to_amount (CURRENCY "KUDOS:1.000010", - &coin_value_wt)); - GNUNET_assert (GNUNET_OK == - TALER_string_to_amount (CURRENCY "KUDOS:0.000010", - &coin_fee_wt)); - GNUNET_assert (GNUNET_OK == - TALER_string_to_amount (CURRENCY "KUDOS:1.000000", - &transfer_value_wt)); - - FAILIF (GNUNET_NO != - plugin->lookup_wire_transfer (plugin->cls, - session, - &wtid_wt, - &cb_wt_never, - NULL)); - FAILIF (GNUNET_NO != - plugin->wire_lookup_deposit_wtid (plugin->cls, - session, - &h_contract_wt, - &h_wire_wt, - &coin_pub_wt, - &merchant_pub_wt, - transaction_id_wt, - &cb_wtid_never, - NULL)); - /* insert WT data */ - FAILIF (GNUNET_OK != - plugin->insert_aggregation_tracking (plugin->cls, - session, - &wtid_wt, - &merchant_pub_wt, - &h_wire_wt, - &h_contract_wt, - transaction_id_wt, - execution_time_wt, - &coin_pub_wt, - &coin_value_wt, - &coin_fee_wt)); - FAILIF (GNUNET_OK != - plugin->lookup_wire_transfer (plugin->cls, - session, - &wtid_wt, - &cb_wt_check, - &cb_wt_never)); - FAILIF (GNUNET_OK != - plugin->wire_lookup_deposit_wtid (plugin->cls, - session, - &h_contract_wt, - &h_wire_wt, - &coin_pub_wt, - &merchant_pub_wt, - transaction_id_wt, - &cb_wtid_check, - &cb_wtid_never)); - result = 0; - - drop: - if (NULL != wire) - json_decref (wire); - if (NULL != rh) - plugin->free_reserve_history (plugin->cls, - rh); - rh = NULL; - if (NULL != session) - GNUNET_break (GNUNET_OK == - plugin->drop_temporary (plugin->cls, - session)); - if (NULL != dkp) - destroy_denom_key_pair (dkp); - if (NULL != cbc.sig.rsa_signature) - GNUNET_CRYPTO_rsa_signature_free (cbc.sig.rsa_signature); - if (NULL != cbc2.denom_pub.rsa_public_key) - GNUNET_CRYPTO_rsa_public_key_free (cbc2.denom_pub.rsa_public_key); - if (NULL != cbc2.sig.rsa_signature) - GNUNET_CRYPTO_rsa_signature_free (cbc2.sig.rsa_signature); - dkp = NULL; - TALER_MINTDB_plugin_unload (plugin); - plugin = NULL; -} - - -int -main (int argc, - char *const argv[]) -{ - static const struct GNUNET_GETOPT_CommandLineOption options[] = { - GNUNET_GETOPT_OPTION_END - }; - char *argv2[] = { - "test-mint-db-<plugin_name>", /* will be replaced later */ - "-c", "test-mint-db-<plugin_name>.conf", /* will be replaced later */ - NULL, - }; - const char *plugin_name; - char *config_filename; - char *testname; - - result = -1; - if (NULL == (plugin_name = strrchr (argv[0], (int) '-'))) - { - GNUNET_break (0); - return -1; - } - plugin_name++; - (void) GNUNET_asprintf (&testname, - "test-mint-db-%s", plugin_name); - (void) GNUNET_asprintf (&config_filename, - "%s.conf", testname); - argv2[0] = argv[0]; - argv2[2] = config_filename; - if (GNUNET_OK != - GNUNET_PROGRAM_run ((sizeof (argv2)/sizeof (char *)) - 1, argv2, - testname, - "Test cases for mint database helper functions.", - options, &run, NULL)) - { - GNUNET_free (config_filename); - GNUNET_free (testname); - return 3; - } - GNUNET_free (config_filename); - GNUNET_free (testname); - return result; -} |