diff --git a/src/exchange-lib/test_exchange_api_new.c b/src/exchange-lib/test_exchange_api_new.c index a33f8d014..8d39ca087 100644 --- a/src/exchange-lib/test_exchange_api_new.c +++ b/src/exchange-lib/test_exchange_api_new.c @@ -290,7 +290,7 @@ run (void *cls, /** * Melt the rest of the coin's value * (EUR:4.00 = 3x EUR:1.03 + 7x EUR:0.13) */ - TALER_TESTING_cmd_refresh_melt + TALER_TESTING_cmd_refresh_melt_double ("refresh-melt-1", is->exchange, "EUR:4", "refresh-withdraw-coin-1", MHD_HTTP_OK), /** diff --git a/src/exchange-lib/test_exchange_api_twisted.c b/src/exchange-lib/test_exchange_api_twisted.c index 8c2492816..3b875cd5e 100644 --- a/src/exchange-lib/test_exchange_api_twisted.c +++ b/src/exchange-lib/test_exchange_api_twisted.c @@ -114,7 +114,7 @@ static struct GNUNET_OS_Process *twisterd; #define CMD_TRANSFER_TO_EXCHANGE(label,amount) \ TALER_TESTING_cmd_fakebank_transfer (label, amount, \ fakebank_url, USER_ACCOUNT_NO, EXCHANGE_ACCOUNT_NO, \ - USER_LOGIN_NAME, USER_LOGIN_PASS, EXCHANGE_URL) + USER_LOGIN_NAME, USER_LOGIN_PASS, exchange_url) /** * Run wire transfer of funds from some user's account to the @@ -142,6 +142,48 @@ run (void *cls, struct TALER_TESTING_Command commands[] = { + CMD_TRANSFER_TO_EXCHANGE ("refresh-create-reserve", + "EUR:5.01"), + + /** + * Make previous command effective. + */ + CMD_EXEC_WIREWATCH ("wirewatch"), + + /** + * Withdraw EUR:5. + */ + TALER_TESTING_cmd_withdraw_amount + ("refresh-withdraw-coin", + is->exchange, + "refresh-create-reserve", + "EUR:5", + MHD_HTTP_OK), + + TALER_TESTING_cmd_deposit + ("refresh-deposit-partial", + is->exchange, + "refresh-withdraw-coin", + 0, + TALER_TESTING_make_wire_details + (42, + fakebank_url), + "{\"items\":[{\"name\":\"ice cream\",\ + \"value\":\"EUR:1\"}]}", + GNUNET_TIME_UNIT_ZERO, + "EUR:1", + MHD_HTTP_OK), + + /** + * Melt the rest of the coin's value + * (EUR:4.00 = 3x EUR:1.03 + 7x EUR:0.13) */ + TALER_TESTING_cmd_refresh_melt + ("refresh-melt", + is->exchange, + "EUR:4", + "refresh-withdraw-coin", + MHD_HTTP_OK), + /** * End the suite. Fixme: better to have a label for this * too, as it shows a "(null)" token on logs. diff --git a/src/exchange-lib/test_exchange_api_twisted.conf b/src/exchange-lib/test_exchange_api_twisted.conf index 992e878c7..d64ea6596 100644 --- a/src/exchange-lib/test_exchange_api_twisted.conf +++ b/src/exchange-lib/test_exchange_api_twisted.conf @@ -33,6 +33,24 @@ TALER_TEST_HOME = test_exchange_api_home/ # Currency supported by the exchange (can only be one) CURRENCY = EUR +[exchange_keys] + +# how long is one signkey valid? +signkey_duration = 4 weeks + +# how long are the signatures with the signkey valid? +legal_duration = 2 years + +# how long do we generate denomination and signing keys +# ahead of time? +lookahead_sign = 32 weeks 1 day + +# how long do we provide to clients denomination and signing keys +# ahead of time? +lookahead_provide = 4 weeks 1 day + + + [exchange] # HTTP port the exchange listens to diff --git a/src/exchange-lib/testing_api_cmd_refresh.c b/src/exchange-lib/testing_api_cmd_refresh.c index 8233f673c..97f06cc30 100644 --- a/src/exchange-lib/testing_api_cmd_refresh.c +++ b/src/exchange-lib/testing_api_cmd_refresh.c @@ -56,6 +56,20 @@ struct MeltDetails */ struct RefreshMeltState { + + /** + * if set to GNUNET_YES, then two /refresh/melt operations + * will be performed. This is needed to trigger the code + * path that manages those already-made requests. Note: it + * is not possible to just copy-and-paste a test refresh melt + * CMD to have the same effect, because every data preparation + * generates new planchets that (in turn) make the whole "hash" + * different from any previous one, therefore NOT allowing the + * exchange to pick any previous /rerfesh/melt operation from + * the database. + */ + unsigned int double_melt; + /** * Fixme: figure out this data purpose. */ @@ -628,6 +642,18 @@ melt_cb (void *cls, return; } rms->noreveal_index = noreveal_index; + + if (GNUNET_YES == rms->double_melt) + { + TALER_LOG_DEBUG ("Doubling the melt (%s)\n", + rms->is->commands[rms->is->ip].label); + rms->rmh = TALER_EXCHANGE_refresh_melt + (rms->exchange, rms->refresh_data_length, + rms->refresh_data, &melt_cb, rms); + rms->double_melt = GNUNET_NO; + return; + } + TALER_TESTING_interpreter_next (rms->is); } @@ -866,6 +892,49 @@ TALER_TESTING_cmd_refresh_melt return cmd; } +/** + * Create a "refresh melt" command, that does TWO /refresh/melt + * requests. + * + * @param label command label + * @param exchange connection to the exchange + * @param amount Fixme + * @param coin_reference reference to a command that will provide + * a coin to refresh + * @param expected_response_code expected HTTP code + */ + +struct TALER_TESTING_Command +TALER_TESTING_cmd_refresh_melt_double + (const char *label, + struct TALER_EXCHANGE_Handle *exchange, + const char *amount, + const char *coin_reference, + unsigned int expected_response_code) +{ + struct RefreshMeltState *rms; + struct MeltDetails md; + struct TALER_TESTING_Command cmd; + + md.coin_reference = coin_reference; + md.amount = amount; + + rms = GNUNET_new (struct RefreshMeltState); + rms->amount = amount; + rms->melted_coin = md; + rms->expected_response_code = expected_response_code; + rms->exchange = exchange; + rms->double_melt = GNUNET_YES; + + cmd.label = label; + cmd.cls = rms; + cmd.run = &refresh_melt_run; + cmd.cleanup = &refresh_melt_cleanup; + cmd.traits = &refresh_melt_traits; + + return cmd; +} + /** * Extract information from a command that is useful for other * commands. diff --git a/src/exchange/taler-exchange-httpd_refresh_melt.c b/src/exchange/taler-exchange-httpd_refresh_melt.c index 384589df1..08ceaa868 100644 --- a/src/exchange/taler-exchange-httpd_refresh_melt.c +++ b/src/exchange/taler-exchange-httpd_refresh_melt.c @@ -259,9 +259,12 @@ refresh_melt_transaction (void *cls, &rm); if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT == qs) { + TALER_LOG_DEBUG ("Found already-melted coin\n"); *mhd_ret = reply_refresh_melt_success (connection, &rmc->refresh_session.rc, rm.session.noreveal_index); + /* FIXME: is it normal to return "hard error" upon + * _finding_ some data into the database? */ return GNUNET_DB_STATUS_HARD_ERROR; } if (0 > qs) diff --git a/src/include/taler_testing_lib.h b/src/include/taler_testing_lib.h index dce92ceae..910495e4b 100644 --- a/src/include/taler_testing_lib.h +++ b/src/include/taler_testing_lib.h @@ -660,6 +660,26 @@ TALER_TESTING_cmd_refresh_melt const char *coin_reference, unsigned int expected_response_code); +/** + * Create a "refresh melt" command, that does TWO /refresh/melt + * requests. + * + * @param label command label + * @param exchange connection to the exchange + * @param amount Fixme + * @param coin_reference reference to a command that will provide + * a coin to refresh + * @param expected_response_code expected HTTP code + */ + +struct TALER_TESTING_Command +TALER_TESTING_cmd_refresh_melt_double + (const char *label, + struct TALER_EXCHANGE_Handle *exchange, + const char *amount, + const char *coin_reference, + unsigned int expected_response_code); + /** * Create a "refresh reveal" command.