diff options
-rw-r--r-- | src/backend/taler-merchant-httpd_private-post-reserves.c | 4 | ||||
-rw-r--r-- | src/backenddb/test_merchantdb.c | 11 | ||||
-rw-r--r-- | src/include/taler_merchant_testing_lib.h | 32 | ||||
-rw-r--r-- | src/testing/Makefile.am | 2 | ||||
-rw-r--r-- | src/testing/test_merchant_api.c | 10 | ||||
-rw-r--r-- | src/testing/testing_api_cmd_get_tips.c | 180 | ||||
-rw-r--r-- | src/testing/testing_api_cmd_post_reserves.c | 206 |
7 files changed, 445 insertions, 0 deletions
diff --git a/src/backend/taler-merchant-httpd_private-post-reserves.c b/src/backend/taler-merchant-httpd_private-post-reserves.c index 0c62ce7a..e561a464 100644 --- a/src/backend/taler-merchant-httpd_private-post-reserves.c +++ b/src/backend/taler-merchant-httpd_private-post-reserves.c @@ -189,6 +189,7 @@ handle_exchange (void *cls, { rc->ec = TALER_EC_TIMEOUT; rc->http_status = MHD_HTTP_REQUEST_TIMEOUT; + TMH_trigger_daemon (); /* we resumed, kick MHD */ return; } keys = TALER_EXCHANGE_get_keys (eh); @@ -196,17 +197,20 @@ handle_exchange (void *cls, { rc->ec = TALER_EC_KEYS_INVALID; rc->http_status = MHD_HTTP_FAILED_DEPENDENCY; + TMH_trigger_daemon (); /* we resumed, kick MHD */ return; } if (NULL == payto_uri) { rc->ec = TALER_EC_RESERVES_POST_UNSUPPORTED_WIRE_METHOD; rc->http_status = MHD_HTTP_CONFLICT; + TMH_trigger_daemon (); /* we resumed, kick MHD */ return; } rc->reserve_expiration = GNUNET_TIME_relative_to_absolute (keys->reserve_closing_delay); rc->payto_uri = GNUNET_strdup (payto_uri); + TMH_trigger_daemon (); /* we resumed, kick MHD */ } diff --git a/src/backenddb/test_merchantdb.c b/src/backenddb/test_merchantdb.c index 435182f6..658c4c62 100644 --- a/src/backenddb/test_merchantdb.c +++ b/src/backenddb/test_merchantdb.c @@ -4314,6 +4314,17 @@ run (void *cls) struct GNUNET_CONFIGURATION_Handle *cfg = cls; /* Data for 'store_payment()' */ + /* Drop the tables to cleanup anything that might cause issues */ + if (NULL == (plugin = TALER_MERCHANTDB_plugin_load (cfg))) + { + result = 77; + return; + } + + GNUNET_break (GNUNET_OK == + plugin->drop_tables (plugin->cls)); + TALER_MERCHANTDB_plugin_unload (plugin); + /* Load the plugin */ if (NULL == (plugin = TALER_MERCHANTDB_plugin_load (cfg))) { diff --git a/src/include/taler_merchant_testing_lib.h b/src/include/taler_merchant_testing_lib.h index 87c10a5d..c38ac880 100644 --- a/src/include/taler_merchant_testing_lib.h +++ b/src/include/taler_merchant_testing_lib.h @@ -562,6 +562,38 @@ TALER_TESTING_cmd_merchant_get_transfers (const char *label, /* ******************* /reserves *************** */ +/** + * Define a "POST /reserves" CMD + * + * @param label command label. + * @param merchant_url url to the murchant. + * @param initial_balance initial amount in the reserve. + * @param exchange_url url to the exchange + * @param wire_method wire transfer method to use for this reserve + * @param http_status expected HTTP response code. + * @return the command. + */ +struct TALER_TESTING_Command +TALER_TESTING_cmd_merchant_post_reserves (const char *label, + const char *merchant_url, + const char *initial_balance, + const char *exchange_url, + const char *wire_method, + unsigned int http_status); + +/** + * Define a get tips CMD. + * + * @param label the command label + * @param merchant_url base URL of the merchant which will + * server the /tip-query request. + * @param http_status expected HTTP response code for the + * /tip-query request. + */ +struct TALER_TESTING_Command +TALER_TESTING_cmd_get_tips (const char *label, + const char *merchant_url, + unsigned int http_status); /* ******************** OLD ******************* */ diff --git a/src/testing/Makefile.am b/src/testing/Makefile.am index 03c1008d..985db0cf 100644 --- a/src/testing/Makefile.am +++ b/src/testing/Makefile.am @@ -21,6 +21,7 @@ libtalermerchanttesting_la_SOURCES = \ testing_api_cmd_get_instances.c \ testing_api_cmd_get_product.c \ testing_api_cmd_get_products.c \ + testing_api_cmd_get_tips.c \ testing_api_cmd_get_transfers.c \ testing_api_cmd_delete_instance.c \ testing_api_cmd_delete_product.c \ @@ -29,6 +30,7 @@ libtalermerchanttesting_la_SOURCES = \ testing_api_cmd_post_instances.c \ testing_api_cmd_post_orders.c \ testing_api_cmd_post_products.c \ + testing_api_cmd_post_reserves.c \ testing_api_cmd_post_transfers.c \ testing_api_cmd_patch_instance.c \ testing_api_cmd_patch_product.c \ diff --git a/src/testing/test_merchant_api.c b/src/testing/test_merchant_api.c index ce181d1c..cb50314e 100644 --- a/src/testing/test_merchant_api.c +++ b/src/testing/test_merchant_api.c @@ -636,6 +636,13 @@ run (void *cls, }; struct TALER_TESTING_Command tip[] = { + TALER_TESTING_cmd_merchant_post_reserves ("create-reserve-tip-1", + merchant_url, + "EUR:20.04", + EXCHANGE_URL, + "x-taler-bank", + MHD_HTTP_OK), +#if 0 /* Test tipping. */ TALER_TESTING_cmd_admin_add_incoming_with_instance ("create-reserve-tip-1", "EUR:20.04", @@ -779,6 +786,7 @@ run (void *cls, exchange_payto, merchant_payto), TALER_TESTING_cmd_check_bank_empty ("check_bank_empty-at-tips"), +#endif TALER_TESTING_cmd_end () }; @@ -1057,8 +1065,10 @@ run (void *cls, 10), TALER_TESTING_cmd_batch ("refund", refund), +#endif TALER_TESTING_cmd_batch ("tip", tip), +#if 0 TALER_TESTING_cmd_batch ("pay-again", pay_again), TALER_TESTING_cmd_batch ("pay-abort", diff --git a/src/testing/testing_api_cmd_get_tips.c b/src/testing/testing_api_cmd_get_tips.c new file mode 100644 index 00000000..5e939848 --- /dev/null +++ b/src/testing/testing_api_cmd_get_tips.c @@ -0,0 +1,180 @@ +/* + This file is part of TALER + Copyright (C) 2020 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/> +*/ +/** + * @file lib/testing_api_cmd_get_tips.c + * @brief command to test GET /private/tips + * @author Jonathan Buchanan + */ +#include "platform.h" +#include <taler/taler_exchange_service.h> +#include <taler/taler_testing_lib.h> +#include "taler_merchant_service.h" +#include "taler_merchant_testing_lib.h" + + +/** + * State of a "GET tips" CMD. + */ +struct GetTipsState +{ + + /** + * Handle for a "GET tips" request. + */ + struct TALER_MERCHANT_TipsGetHandle *tgh; + + /** + * The interpreter state. + */ + struct TALER_TESTING_Interpreter *is; + + /** + * Base URL of the merchant serving the request. + */ + const char *merchant_url; + + /** + * Expected HTTP response code. + */ + unsigned int http_status; + +}; + +/** + * Callback for a GET /private/tips operation. + * + * @param cls closure for this function + * @param hr HTTP response details + * @param tips_length length of the @a tips array + * @param tips array of tips + */ +static void +get_tips_cb (void *cls, + const struct TALER_MERCHANT_HttpResponse *hr, + unsigned int tips_length, + const struct TALER_MERCHANT_TipEntry tips[]) +{ + /* FIXME, deeper checks should be implemented here. */ + struct GetTipsState *gts = cls; + + gts->tgh = NULL; + if (gts->http_status != hr->http_status) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Unexpected response code %u (%d) to command %s\n", + hr->http_status, + (int) hr->ec, + TALER_TESTING_interpreter_get_current_label (gts->is)); + TALER_TESTING_interpreter_fail (gts->is); + return; + } + switch (hr->http_status) + { + case MHD_HTTP_OK: + // FIXME: use gis->product_reference here to + // check if the data returned matches that from the POST / PATCH + break; + default: + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + "Unhandled HTTP status.\n"); + } + TALER_TESTING_interpreter_next (gts->is); +} + + +/** + * Run the "GET /private/tips" CMD. + * + * @param cls closure. + * @param cmd command being run now. + * @param is interpreter state. + */ +static void +get_tips_run (void *cls, + const struct TALER_TESTING_Command *cmd, + struct TALER_TESTING_Interpreter *is) +{ + struct GetTipsState *gts = cls; + + gts->is = is; + gts->tgh = TALER_MERCHANT_tips_get (is->ctx, + gts->merchant_url, + &get_tips_cb, + gts); + + GNUNET_assert (NULL != gts->tgh); +} + + +/** + * Free the state of a "GET tips" CMD, and possibly + * cancel a pending operation thereof. + * + * @param cls closure. + * @param cmd command being run. + */ +static void +get_tips_cleanup (void *cls, + const struct TALER_TESTING_Command *cmd) +{ + struct GetTipsState *gts = cls; + + if (NULL != gts->tgh) + { + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + "GET /private/tips operation did not complete\n"); + TALER_MERCHANT_tips_get_cancel (gts->tgh); + } + GNUNET_free (gts); +} + + +/** + * Define a get tips CMD. + * + * @param label the command label + * @param merchant_url base URL of the merchant which will + * server the /tip-query request. + * @param http_status expected HTTP response code for the + * /tip-query request. + */ +struct TALER_TESTING_Command +TALER_TESTING_cmd_get_tips (const char *label, + const char *merchant_url, + unsigned int http_status) +{ + struct GetTipsState *gts; + + gts = GNUNET_new (struct GetTipsState); + gts->merchant_url = merchant_url; + gts->http_status = http_status; + { + struct TALER_TESTING_Command cmd = { + .cls = gts, + .label = label, + .run = &get_tips_run, + .cleanup = &get_tips_cleanup + }; + + return cmd; + } +} + + +/* end of testing_api_cmd_get_tips.c */ diff --git a/src/testing/testing_api_cmd_post_reserves.c b/src/testing/testing_api_cmd_post_reserves.c new file mode 100644 index 00000000..573d0040 --- /dev/null +++ b/src/testing/testing_api_cmd_post_reserves.c @@ -0,0 +1,206 @@ +/* + This file is part of TALER + Copyright (C) 2020 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/> +*/ +/** + * @file lib/testing_api_cmd_post_reserves.c + * @brief command to test POST /reserves + * @author Jonathan Buchanan + */ +#include "platform.h" +#include <taler/taler_exchange_service.h> +#include <taler/taler_testing_lib.h> +#include "taler_merchant_service.h" +#include "taler_merchant_testing_lib.h" + +/** + * State of a "POST /reserves" CMD. + */ +struct PostReservesState +{ + /** + * Handle for a "POST /reserves" request. + */ + struct TALER_MERCHANT_PostReservesHandle *prh; + + /** + * The interpreter state. + */ + struct TALER_TESTING_Interpreter *is; + + /** + * Base URL of the merchant + */ + const char *merchant_url; + + /** + * Base URL of the exchange. + */ + const char *exchange_url; + + /** + * Wire method for the reserve. + */ + const char *wire_method; + + /** + * The initial balance of the reserve. + */ + struct TALER_Amount initial_balance; + + /** + * Expected HTTP response code. + */ + unsigned int http_status; +}; + +/** + * Callbacks of this type are used to work the result of submitting a + * POST /reserves request to a merchant + * + * @param cls closure + * @param hr HTTP response details + * @param reserve_pub public key of the created reserve, NULL on error + * @param payto_uri where to make the payment to for filling the reserve, NULL on error + */ +static void +post_reserves_cb (void *cls, + const struct TALER_MERCHANT_HttpResponse *hr, + const struct TALER_ReservePublicKeyP *reserve_pub, + const char *payto_uri) +{ + struct PostReservesState *prs = cls; + + prs->prh = NULL; + if (prs->http_status != hr->http_status) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Unexpected response code %u (%d) to command %s\n", + hr->http_status, + (int) hr->ec, + TALER_TESTING_interpreter_get_current_label (prs->is)); + TALER_TESTING_interpreter_fail (prs->is); + return; + } + switch (hr->http_status) + { + case MHD_HTTP_NO_CONTENT: + break; + case MHD_HTTP_CONFLICT: + break; + case MHD_HTTP_OK: + break; + // FIXME: add other legitimate states here... + default: + GNUNET_break (0); + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + "Unhandled HTTP status (%d).\n", + hr->http_status); + } + TALER_TESTING_interpreter_next (prs->is); +} + + +/** + * Run the "POST /reserves" CMD. + * + * @param cls closure. + * @param cmd command being run now. + * @param is interpreter state. + */ +static void +post_reserves_run (void *cls, + const struct TALER_TESTING_Command *cmd, + struct TALER_TESTING_Interpreter *is) +{ + struct PostReservesState *prs = cls; + + prs->is = is; + prs->prh = TALER_MERCHANT_reserves_post (is->ctx, + prs->merchant_url, + &prs->initial_balance, + prs->exchange_url, + prs->wire_method, + &post_reserves_cb, + prs); + GNUNET_assert (NULL != prs->prh); +} + + +/** + * Free the state of a "POST /reserves" CMD, and possibly + * cancel a pending operation thereof. + * + * @param cls closure. + * @param cmd command being run. + */ +static void +post_reserves_cleanup (void *cls, + const struct TALER_TESTING_Command *cmd) +{ + struct PostReservesState *prs = cls; + + if (NULL != prs->prh) + { + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + "POST /reserves operation did not complete\n"); + TALER_MERCHANT_reserves_post_cancel (prs->prh); + } + GNUNET_free (prs); +} + + +/** + * Define a "POST /reserves" CMD + * + * @param label command label. + * @param merchant_url url to the merchant. + * @param initial_balance initial amount in the reserve. + * @param exchange_url url to the exchange + * @param wire_method wire transfer method to use for this reserve + * @param http_status expected HTTP response code. + * @return the command. + */ +struct TALER_TESTING_Command +TALER_TESTING_cmd_merchant_post_reserves (const char *label, + const char *merchant_url, + const char *initial_balance, + const char *exchange_url, + const char *wire_method, + unsigned int http_status) +{ + struct PostReservesState *prs; + + prs = GNUNET_new (struct PostReservesState); + prs->merchant_url = merchant_url; + prs->exchange_url = exchange_url; + prs->wire_method = wire_method; + prs->http_status = http_status; + GNUNET_assert (GNUNET_OK == + TALER_string_to_amount (initial_balance, + &prs->initial_balance)); + { + struct TALER_TESTING_Command cmd = { + .cls = prs, + .label = label, + .run = &post_reserves_run, + .cleanup = &post_reserves_cleanup + }; + + return cmd; + } +} |