diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/Makefile.am | 13 | ||||
-rw-r--r-- | src/lib/testing_api_cmd_refund.c | 636 | ||||
-rw-r--r-- | src/lib/testing_api_cmd_refund_increase.c | 234 | ||||
-rw-r--r-- | src/lib/testing_api_cmd_tip_authorize.c | 375 | ||||
-rw-r--r-- | src/lib/testing_api_cmd_tip_pickup.c (renamed from src/lib/testing_api_cmd_tip.c) | 611 | ||||
-rw-r--r-- | src/lib/testing_api_cmd_tip_query.c | 297 |
6 files changed, 916 insertions, 1250 deletions
diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am index 1c967fe4..439a48ab 100644 --- a/src/lib/Makefile.am +++ b/src/lib/Makefile.am @@ -42,14 +42,17 @@ libtalermerchant_la_LIBADD = \ $(XLIB) libtalermerchanttesting_la_SOURCES = \ - testing_api_cmd_proposal.c \ + testing_api_cmd_history.c \ testing_api_cmd_pay.c \ - testing_api_cmd_refund.c \ - testing_api_cmd_tip.c \ + testing_api_cmd_proposal.c \ + testing_api_cmd_refund_increase.c \ + testing_api_cmd_refund_lookup.c \ + testing_api_cmd_rewind.c \ + testing_api_cmd_tip_authorize.c \ + testing_api_cmd_tip_pickup.c \ + testing_api_cmd_tip_query.c \ testing_api_cmd_track_transaction.c \ testing_api_cmd_track_transfer.c \ - testing_api_cmd_history.c \ - testing_api_cmd_rewind.c \ testing_api_helpers.c \ testing_api_trait_merchant_sig.c \ testing_api_trait_string.c \ diff --git a/src/lib/testing_api_cmd_refund.c b/src/lib/testing_api_cmd_refund.c deleted file mode 100644 index f592f6a1..00000000 --- a/src/lib/testing_api_cmd_refund.c +++ /dev/null @@ -1,636 +0,0 @@ -/* - This file is part of TALER - Copyright (C) 2014-2018 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_refund.c - * @brief command to test refunds. - * @author Marcello Stanisci - */ - -#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 for a "refund increase" CMD. - */ -struct RefundIncreaseState -{ - /** - * Operation handle for a POST /refund request. - */ - struct TALER_MERCHANT_RefundIncreaseOperation *rio; - - /** - * Base URL of the merchant serving the request. - */ - const char *merchant_url; - - /** - * Order id of the contract to refund. - */ - const char *order_id; - - /** - * The amount to refund. - */ - const char *refund_amount; - - /** - * Refund fee. - */ - const char *refund_fee; - - /** - * Human-readable justification for the refund. - */ - const char *reason; - - /** - * Interpreter state. - */ - struct TALER_TESTING_Interpreter *is; - - /** - * Expected HTTP response code. - */ - unsigned int http_code; -}; - - -/** - * State for a "refund lookup" CMD. - */ -struct RefundLookupState -{ - /** - * Operation handle for a GET /public/refund request. - */ - struct TALER_MERCHANT_RefundLookupOperation *rlo; - - /** - * Base URL of the merchant serving the request. - */ - const char *merchant_url; - - /** - * Order id to look up. - */ - const char *order_id; - - /** - * Reference to a "pay" CMD, used to double-check if - * refunded coins were actually spent: - */ - const char *pay_reference; - - /** - * Reference to a "refund increase" CMD that offer - * the expected amount to be refunded; can be NULL. - */ - const char *increase_reference; - - /** - * Expected HTTP response code. - */ - unsigned int http_code; - - /** - * Interpreter state. - */ - struct TALER_TESTING_Interpreter *is; - - /** - * Explicit amount to be refunded, must be defined if @a - * increase_reference is NULL. - */ - const char *refund_amount; -}; - - -/** - * Free the state of a "refund increase" CMD, and - * possibly cancel a pending "refund increase" operation. - * - * @param cls closure - * @param cmd command currently being freed. - */ -static void -refund_increase_cleanup (void *cls, - const struct TALER_TESTING_Command *cmd) -{ - struct RefundIncreaseState *ris = cls; - - if (NULL != ris->rio) - { - TALER_LOG_WARNING ("Refund-increase operation" - " did not complete\n"); - TALER_MERCHANT_refund_increase_cancel (ris->rio); - } - GNUNET_free (ris); -} - - -/** - * Free the state of a "refund lookup" CMD, and - * possibly cancel a pending "refund lookup" operation. - * - * @param cls closure - * @param cmd command currently being freed. - */ -static void -refund_lookup_cleanup (void *cls, - const struct TALER_TESTING_Command *cmd) -{ - struct RefundLookupState *rls = cls; - - if (NULL != rls->rlo) - { - TALER_LOG_WARNING ("Refund-lookup operation" - " did not complete\n"); - TALER_MERCHANT_refund_lookup_cancel (rls->rlo); - } - GNUNET_free (rls); -} - - -/** - * Process POST /refund (increase) response; just checking - * if the HTTP response code is the one expected. - * - * @param cls closure - * @param http_status HTTP status code - * @param ec taler-specific error object - * @param obj response body; is NULL on success. - */ -static void -refund_increase_cb (void *cls, - unsigned int http_status, - enum TALER_ErrorCode ec, - const json_t *obj) -{ - struct RefundIncreaseState *ris = cls; - - ris->rio = NULL; - if (ris->http_code != http_status) - TALER_TESTING_FAIL (ris->is); - - TALER_TESTING_interpreter_next (ris->is); -} - - -/** - * Run the "refund increase" CMD. - * - * @param cls closure. - * @param cmd command currently being run. - * @param is the interpreter state. - */ -static void -refund_increase_run (void *cls, - const struct TALER_TESTING_Command *cmd, - struct TALER_TESTING_Interpreter *is) -{ - struct RefundIncreaseState *ris = cls; - struct TALER_Amount refund_amount; - - ris->is = is; - if (GNUNET_OK != TALER_string_to_amount (ris->refund_amount, - &refund_amount)) - TALER_TESTING_FAIL (is); - ris->rio = TALER_MERCHANT_refund_increase (is->ctx, - ris->merchant_url, - ris->order_id, - &refund_amount, - ris->reason, - &refund_increase_cb, - ris); - GNUNET_assert (NULL != ris->rio); -} - - -/** - * Callback that frees all the elements in the hashmap - * - * @param cls closure, NULL - * @param key current key - * @param value a `struct TALER_Amount` - * - * @return always #GNUNET_YES (continue to iterate) - */ -static int -hashmap_free (void *cls, - const struct GNUNET_HashCode *key, - void *value) -{ - struct TALER_Amount *refund_amount = value; - - GNUNET_free (refund_amount); - return GNUNET_YES; -} - - -/** - * Process "GET /public/refund" (lookup) response; - * mainly checking if the refunded amount matches the - * expectation. - * - * @param cls closure - * @param http_status HTTP status code - * @param ec taler-specific error object - * @param obj response body; is NULL on error. - */ -static void -refund_lookup_cb (void *cls, - unsigned int http_status, - enum TALER_ErrorCode ec, - const json_t *obj) -{ - struct RefundLookupState *rls = cls; - struct GNUNET_CONTAINER_MultiHashMap *map; - size_t index; - json_t *elem; - const char *error_name; - unsigned int error_line; - struct GNUNET_HashCode h_coin_pub; - const char *coin_reference; - char *coin_reference_dup; - const char *icoin_reference; - const struct TALER_TESTING_Command *pay_cmd; - const struct TALER_TESTING_Command *increase_cmd; - const char *refund_amount; - struct TALER_Amount acc; - struct TALER_Amount ra; - const json_t *arr; - - rls->rlo = NULL; - if (rls->http_code != http_status) - TALER_TESTING_FAIL (rls->is); - - arr = json_object_get (obj, "refund_permissions"); - if (NULL == arr) - { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "Tolerating a refund permission not found\n"); - TALER_TESTING_interpreter_next (rls->is); - return; - } - map = GNUNET_CONTAINER_multihashmap_create (1, GNUNET_NO); - - /* Put in array every refunded coin. */ - json_array_foreach (arr, index, elem) - { - struct TALER_CoinSpendPublicKeyP coin_pub; - struct TALER_Amount *irefund_amount = GNUNET_new - (struct TALER_Amount); - struct GNUNET_JSON_Specification spec[] = { - GNUNET_JSON_spec_fixed_auto ("coin_pub", &coin_pub), - TALER_JSON_spec_amount ("refund_amount", irefund_amount), - GNUNET_JSON_spec_end () - }; - - GNUNET_assert (GNUNET_OK == GNUNET_JSON_parse (elem, - spec, - &error_name, - &error_line)); - GNUNET_CRYPTO_hash (&coin_pub, - sizeof (struct TALER_CoinSpendPublicKeyP), - &h_coin_pub); - GNUNET_assert (GNUNET_OK == GNUNET_CONTAINER_multihashmap_put - (map, - &h_coin_pub, // which - irefund_amount, // how much - GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); - }; - - /* Compare spent coins with refunded, and if they match, - * increase an accumulator. */ - if (NULL == - (pay_cmd = TALER_TESTING_interpreter_lookup_command - (rls->is, rls->pay_reference))) - TALER_TESTING_FAIL (rls->is); - - if (GNUNET_OK != TALER_TESTING_get_trait_coin_reference - (pay_cmd, 0, &coin_reference)) - TALER_TESTING_FAIL (rls->is); - - GNUNET_assert (GNUNET_OK == TALER_amount_get_zero ("EUR", - &acc)); - coin_reference_dup = GNUNET_strdup (coin_reference); - for (icoin_reference = strtok (coin_reference_dup, ";"); - NULL != icoin_reference; - icoin_reference = strtok (NULL, ";")) - { - const struct TALER_CoinSpendPrivateKeyP *icoin_priv; - struct TALER_CoinSpendPublicKeyP icoin_pub; - struct GNUNET_HashCode h_icoin_pub; - struct TALER_Amount *iamount; - const struct TALER_TESTING_Command *icoin_cmd; - - if (NULL == - (icoin_cmd = TALER_TESTING_interpreter_lookup_command - (rls->is, icoin_reference)) ) - { - GNUNET_break (0); - TALER_LOG_ERROR ("Bad reference `%s'\n", - icoin_reference); - TALER_TESTING_interpreter_fail (rls->is); - GNUNET_CONTAINER_multihashmap_destroy (map); - return; - } - - if (GNUNET_OK != TALER_TESTING_get_trait_coin_priv - (icoin_cmd, 0, &icoin_priv)) - { - GNUNET_break (0); - TALER_LOG_ERROR ("Command `%s' failed to give coin" - " priv trait\n", - icoin_reference); - TALER_TESTING_interpreter_fail (rls->is); - GNUNET_CONTAINER_multihashmap_destroy (map); - return; - } - - GNUNET_CRYPTO_eddsa_key_get_public (&icoin_priv->eddsa_priv, - &icoin_pub.eddsa_pub); - GNUNET_CRYPTO_hash (&icoin_pub, - sizeof (struct TALER_CoinSpendPublicKeyP), - &h_icoin_pub); - - iamount = GNUNET_CONTAINER_multihashmap_get - (map, &h_icoin_pub); - - /* Can be NULL: not all coins are involved in refund */ - if (NULL == iamount) - continue; - - GNUNET_assert (GNUNET_OK == TALER_amount_add (&acc, - &acc, - iamount)); - } - - GNUNET_free (coin_reference_dup); - - if (NULL != - (increase_cmd = TALER_TESTING_interpreter_lookup_command - (rls->is, rls->increase_reference))) - { - if (GNUNET_OK != TALER_TESTING_get_trait_amount - (increase_cmd, 0, &refund_amount)) - TALER_TESTING_FAIL (rls->is); - - if (GNUNET_OK != TALER_string_to_amount - (refund_amount, &ra)) - TALER_TESTING_FAIL (rls->is); - } - else - { - GNUNET_assert (NULL != rls->refund_amount); - - if (GNUNET_OK != TALER_string_to_amount - (rls->refund_amount, &ra)) - TALER_TESTING_FAIL (rls->is); - } - - GNUNET_CONTAINER_multihashmap_iterate (map, - &hashmap_free, - NULL); - GNUNET_CONTAINER_multihashmap_destroy (map); - - /* Check that what the backend claims to have been refunded - * actually matches _our_ refund expectation. */ - if (0 != TALER_amount_cmp (&acc, - &ra)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Incomplete refund: expected '%s', got '%s'\n", - TALER_amount_to_string (&ra), - TALER_amount_to_string (&acc)); - TALER_TESTING_interpreter_fail (rls->is); - return; - } - - TALER_TESTING_interpreter_next (rls->is); -} - - -/** - * Run the "refund lookup" CMD. - * - * @param cls closure. - * @param cmd command being currently run. - * @param is interpreter state. - */ -static void -refund_lookup_run (void *cls, - const struct TALER_TESTING_Command *cmd, - struct TALER_TESTING_Interpreter *is) -{ - struct RefundLookupState *rls = cls; - - rls->is = is; - rls->rlo = TALER_MERCHANT_refund_lookup (is->ctx, - rls->merchant_url, - rls->order_id, - &refund_lookup_cb, - rls); - GNUNET_assert (NULL != rls->rlo); -} - - -/** - * Offer internal data from the "refund increase" CMD - * state to other commands. - * - * @param cls closure - * @param ret[out] result (could be anything) - * @param trait name of the trait - * @param index index number of the object to extract. - * @return #GNUNET_OK on success - */ -static int -refund_increase_traits (void *cls, - const void **ret, - const char *trait, - unsigned int index) -{ - struct RefundIncreaseState *ris = cls; - - struct TALER_TESTING_Trait traits[] = { - TALER_TESTING_make_trait_amount (0, ris->refund_amount), - TALER_TESTING_trait_end () - }; - - return TALER_TESTING_get_trait (traits, - ret, - trait, - index); - - return GNUNET_SYSERR; -} - - -/** - * Define a "refund increase" CMD. - * - * @param label command label. - * @param merchant_url base URL of the backend serving the - * "refund increase" request. - * @param reason refund justification, human-readable. - * @param order_id order id of the contract to refund. - * @param refund_amount amount to be refund-increased. - * @param refund_fee refund fee. - * @param http_code expected HTTP response code. - * - * @return the command. - */ -struct TALER_TESTING_Command -TALER_TESTING_cmd_refund_increase - (const char *label, - const char *merchant_url, - const char *reason, - const char *order_id, - const char *refund_amount, - const char *refund_fee, - unsigned int http_code) -{ - struct RefundIncreaseState *ris; - - ris = GNUNET_new (struct RefundIncreaseState); - ris->merchant_url = merchant_url; - ris->order_id = order_id; - ris->refund_amount = refund_amount; - ris->refund_fee = refund_fee; - ris->reason = reason; - ris->http_code = http_code; - - struct TALER_TESTING_Command cmd = { - .cls = ris, - .label = label, - .run = &refund_increase_run, - .cleanup = &refund_increase_cleanup, - .traits = &refund_increase_traits - }; - - return cmd; -} - - -/** - * Define a "refund lookup" CMD. - * - * @param label command label. - * @param merchant_url base URL of the merchant serving the - * "refund lookup" request. - * @param increase_reference reference to a "refund increase" CMD - * that will offer the amount to check the looked up refund - * against. Must NOT be NULL. - * @param pay_reference reference to the "pay" CMD whose coins got - * refunded. It is used to double-check if the refunded - * coins were actually spent in the first place. - * @param order_id order id whose refund status is to be looked up. - * @param http_code expected HTTP response code. - * - * @return the command. - */ -struct TALER_TESTING_Command -TALER_TESTING_cmd_refund_lookup - (const char *label, - const char *merchant_url, - const char *increase_reference, - const char *pay_reference, - const char *order_id, - unsigned int http_code) -{ - struct RefundLookupState *rls; - - rls = GNUNET_new (struct RefundLookupState); - rls->merchant_url = merchant_url; - rls->order_id = order_id; - rls->pay_reference = pay_reference; - rls->increase_reference = increase_reference; - rls->http_code = http_code; - - struct TALER_TESTING_Command cmd = { - .cls = rls, - .label = label, - .run = &refund_lookup_run, - .cleanup = &refund_lookup_cleanup - }; - - return cmd; -} - - -/** - * Define a "refund lookup" CMD, equipped with a expected refund - * amount. - * - * @param label command label. - * @param merchant_url base URL of the merchant serving the - * "refund lookup" request. - * @param increase_reference reference to a "refund increase" CMD - * that will offer the amount to check the looked up refund - * against. Can be NULL, takes precedence over @a - * refund_amount. - * @param pay_reference reference to the "pay" CMD whose coins got - * refunded. It is used to double-check if the refunded - * coins were actually spent in the first place. - * @param order_id order id whose refund status is to be looked up. - * @param http_code expected HTTP response code. - * @param refund_amount expected refund amount. Must be defined - * if @a increase_reference is NULL. - * - * @return the command. - */ -struct TALER_TESTING_Command -TALER_TESTING_cmd_refund_lookup_with_amount - (const char *label, - const char *merchant_url, - const char *increase_reference, - const char *pay_reference, - const char *order_id, - unsigned int http_code, - const char *refund_amount) -{ - struct RefundLookupState *rls; - - rls = GNUNET_new (struct RefundLookupState); - rls->merchant_url = merchant_url; - rls->order_id = order_id; - rls->pay_reference = pay_reference; - rls->increase_reference = increase_reference; - rls->http_code = http_code; - rls->refund_amount = refund_amount; - - struct TALER_TESTING_Command cmd = { - .cls = rls, - .label = label, - .run = &refund_lookup_run, - .cleanup = &refund_lookup_cleanup - }; - - return cmd; -} - - -/* end of testing_api_cmd_refund.c */ diff --git a/src/lib/testing_api_cmd_refund_increase.c b/src/lib/testing_api_cmd_refund_increase.c new file mode 100644 index 00000000..18527450 --- /dev/null +++ b/src/lib/testing_api_cmd_refund_increase.c @@ -0,0 +1,234 @@ +/* + This file is part of TALER + Copyright (C) 2014-2018 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_refund_increase.c + * @brief command to test refunds. + * @author Marcello Stanisci + */ + +#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 for a "refund increase" CMD. + */ +struct RefundIncreaseState +{ + /** + * Operation handle for a POST /refund request. + */ + struct TALER_MERCHANT_RefundIncreaseOperation *rio; + + /** + * Base URL of the merchant serving the request. + */ + const char *merchant_url; + + /** + * Order id of the contract to refund. + */ + const char *order_id; + + /** + * The amount to refund. + */ + const char *refund_amount; + + /** + * Refund fee. + */ + const char *refund_fee; + + /** + * Human-readable justification for the refund. + */ + const char *reason; + + /** + * Interpreter state. + */ + struct TALER_TESTING_Interpreter *is; + + /** + * Expected HTTP response code. + */ + unsigned int http_code; +}; + + +/** + * Free the state of a "refund increase" CMD, and + * possibly cancel a pending "refund increase" operation. + * + * @param cls closure + * @param cmd command currently being freed. + */ +static void +refund_increase_cleanup (void *cls, + const struct TALER_TESTING_Command *cmd) +{ + struct RefundIncreaseState *ris = cls; + + if (NULL != ris->rio) + { + TALER_LOG_WARNING ("Refund-increase operation" + " did not complete\n"); + TALER_MERCHANT_refund_increase_cancel (ris->rio); + } + GNUNET_free (ris); +} + + +/** + * Process POST /refund (increase) response; just checking + * if the HTTP response code is the one expected. + * + * @param cls closure + * @param http_status HTTP status code + * @param ec taler-specific error object + * @param obj response body; is NULL on success. + */ +static void +refund_increase_cb (void *cls, + unsigned int http_status, + enum TALER_ErrorCode ec, + const json_t *obj) +{ + struct RefundIncreaseState *ris = cls; + + ris->rio = NULL; + if (ris->http_code != http_status) + TALER_TESTING_FAIL (ris->is); + + TALER_TESTING_interpreter_next (ris->is); +} + + +/** + * Run the "refund increase" CMD. + * + * @param cls closure. + * @param cmd command currently being run. + * @param is the interpreter state. + */ +static void +refund_increase_run (void *cls, + const struct TALER_TESTING_Command *cmd, + struct TALER_TESTING_Interpreter *is) +{ + struct RefundIncreaseState *ris = cls; + struct TALER_Amount refund_amount; + + ris->is = is; + if (GNUNET_OK != TALER_string_to_amount (ris->refund_amount, + &refund_amount)) + TALER_TESTING_FAIL (is); + ris->rio = TALER_MERCHANT_refund_increase (is->ctx, + ris->merchant_url, + ris->order_id, + &refund_amount, + ris->reason, + &refund_increase_cb, + ris); + GNUNET_assert (NULL != ris->rio); +} + + +/** + * Offer internal data from the "refund increase" CMD + * state to other commands. + * + * @param cls closure + * @param ret[out] result (could be anything) + * @param trait name of the trait + * @param index index number of the object to extract. + * @return #GNUNET_OK on success + */ +static int +refund_increase_traits (void *cls, + const void **ret, + const char *trait, + unsigned int index) +{ + struct RefundIncreaseState *ris = cls; + struct TALER_TESTING_Trait traits[] = { + TALER_TESTING_make_trait_amount (0, ris->refund_amount), + TALER_TESTING_trait_end () + }; + + return TALER_TESTING_get_trait (traits, + ret, + trait, + index); +} + + +/** + * Define a "refund increase" CMD. + * + * @param label command label. + * @param merchant_url base URL of the backend serving the + * "refund increase" request. + * @param reason refund justification, human-readable. + * @param order_id order id of the contract to refund. + * @param refund_amount amount to be refund-increased. + * @param refund_fee refund fee. + * @param http_code expected HTTP response code. + * + * @return the command. + */ +struct TALER_TESTING_Command +TALER_TESTING_cmd_refund_increase + (const char *label, + const char *merchant_url, + const char *reason, + const char *order_id, + const char *refund_amount, + const char *refund_fee, + unsigned int http_code) +{ + struct RefundIncreaseState *ris; + + ris = GNUNET_new (struct RefundIncreaseState); + ris->merchant_url = merchant_url; + ris->order_id = order_id; + ris->refund_amount = refund_amount; + ris->refund_fee = refund_fee; + ris->reason = reason; + ris->http_code = http_code; + { + struct TALER_TESTING_Command cmd = { + .cls = ris, + .label = label, + .run = &refund_increase_run, + .cleanup = &refund_increase_cleanup, + .traits = &refund_increase_traits + }; + + return cmd; + } +} + + +/* end of testing_api_cmd_refund_increase.c */ diff --git a/src/lib/testing_api_cmd_tip_authorize.c b/src/lib/testing_api_cmd_tip_authorize.c new file mode 100644 index 00000000..e10ecac0 --- /dev/null +++ b/src/lib/testing_api_cmd_tip_authorize.c @@ -0,0 +1,375 @@ +/* + This file is part of TALER + Copyright (C) 2014-2018 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_tip_authorize.c + * @brief command to test the tipping. + * @author Marcello Stanisci + */ + +#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 for a /tip-authorize CMD. + */ +struct TipAuthorizeState +{ + + /** + * Merchant base URL. + */ + const char *merchant_url; + + /** + * Expected HTTP response code. + */ + unsigned int http_status; + + /** + * Human-readable justification for the + * tip authorization carried on by this CMD. + */ + const char *justification; + + /** + * Amount that should be authorized for tipping. + */ + const char *amount; + + /** + * Expected Taler error code for this CMD. + */ + enum TALER_ErrorCode expected_ec; + + /** + * Tip taler:// URI. + */ + const char *tip_uri; + + /** + * The tip id; set when the CMD succeeds. + */ + struct GNUNET_HashCode tip_id; + + /** + * Expiration date for this tip. + */ + struct GNUNET_TIME_Absolute tip_expiration; + + /** + * Handle to the on-going /tip-authorize request. + */ + struct TALER_MERCHANT_TipAuthorizeOperation *tao; + + /** + * The interpreter state. + */ + struct TALER_TESTING_Interpreter *is; +}; + + +/** + * Callback for a /tip-authorize request. Set into the state + * what was returned from the backend (@a tip_id and @a + * tip_expiration). + * + * @param cls closure + * @param http_status HTTP status returned by the merchant backend + * @param ec taler-specific error code + * @param taler_tip_uri URI to let the wallet know about the tip + * @param tip_id unique identifier for the tip + */ +static void +tip_authorize_cb (void *cls, + unsigned int http_status, + enum TALER_ErrorCode ec, + const char *taler_tip_uri, + struct GNUNET_HashCode *tip_id) +{ + struct TipAuthorizeState *tas = cls; + + tas->tao = NULL; + if (tas->http_status != http_status) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Unexpected response code %u (%d)" + " to command %s\n", + http_status, + ec, + TALER_TESTING_interpreter_get_current_label + (tas->is)); + + TALER_TESTING_interpreter_fail (tas->is); + return; + } + + if (tas->expected_ec != ec) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Unexpected error code %d (%u) to command %s\n", + ec, + http_status, + TALER_TESTING_interpreter_get_current_label + (tas->is)); + TALER_TESTING_interpreter_fail (tas->is); + return; + } + if ( (MHD_HTTP_OK == http_status) && + (TALER_EC_NONE == ec) ) + { + tas->tip_uri = strdup (taler_tip_uri); + tas->tip_id = *tip_id; + } + + TALER_TESTING_interpreter_next (tas->is); +} + + +/** + * Offers information from the /tip-authorize CMD state to other + * commands. + * + * @param cls closure + * @param ret[out] result (could be anything) + * @param trait name of the trait + * @param index index number of the object to extract. + * @return #GNUNET_OK on success + */ +static int +tip_authorize_traits (void *cls, + const void **ret, + const char *trait, + unsigned int index) +{ + struct TipAuthorizeState *tas = cls; + struct TALER_TESTING_Trait traits[] = { + TALER_TESTING_make_trait_tip_id (0, &tas->tip_id), + TALER_TESTING_trait_end (), + }; + + return TALER_TESTING_get_trait (traits, + ret, + trait, + index); +} + + +/** + * Runs the /tip-authorize CMD + * + * @param cls closure + * @param cmd the CMD representing _this_ command + * @param is interpreter state + */ +static void +tip_authorize_run (void *cls, + const struct TALER_TESTING_Command *cmd, + struct TALER_TESTING_Interpreter *is) +{ + struct TipAuthorizeState *tas = cls; + struct TALER_Amount amount; + + tas->is = is; + if (GNUNET_OK != TALER_string_to_amount (tas->amount, + &amount)) + TALER_TESTING_FAIL (is); + + tas->tao = TALER_MERCHANT_tip_authorize + (is->ctx, + tas->merchant_url, + "http://merchant.com/pickup", + "http://merchant.com/continue", + &amount, + tas->justification, + tip_authorize_cb, + tas); + + GNUNET_assert (NULL != tas->tao); +} + + +/** + * Run the /tip-authorize CMD, the "fake" version of it. + * + * @param cls closure + * @param cmd the CMD representing _this_ command + * @param is interpreter state * + */ +static void +tip_authorize_fake_run (void *cls, + const struct TALER_TESTING_Command *cmd, + struct TALER_TESTING_Interpreter *is) +{ + struct TipAuthorizeState *tas = cls; + + /* Make up a tip id. */ + GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_WEAK, + &tas->tip_id, + sizeof (struct GNUNET_HashCode)); + + TALER_TESTING_interpreter_next (is); +} + + +/** + * Free the state from a /tip-authorize CMD, and possibly + * cancel any pending operation. + * + * @param cls closure + * @param cmd the /tip-authorize CMD that is about to be freed. + */ +static void +tip_authorize_cleanup (void *cls, + const struct TALER_TESTING_Command *cmd) +{ + struct TipAuthorizeState *tas = cls; + + if (NULL != tas->tao) + { + TALER_LOG_WARNING ("Tip-autorize operation" + " did not complete\n"); + TALER_MERCHANT_tip_authorize_cancel (tas->tao); + } + GNUNET_free (tas); +} + + +/** + * Create a /tip-authorize CMD, specifying the Taler error code + * that is expected to be returned by the backend. + * + * @param label this command label + * @param merchant_url the base URL of the merchant that will + * serve the /tip-authorize request. + * @param exchange_url the base URL of the exchange that owns + * the reserve from which the tip is going to be gotten. + * @param http_status the HTTP response code which is expected + * for this operation. + * @param justification human-readable justification for this + * tip authorization. + * @param amount the amount to authorize for tipping. + * @param ec expected Taler-defined error code. + */ +struct TALER_TESTING_Command +TALER_TESTING_cmd_tip_authorize_with_ec + (const char *label, + const char *merchant_url, + const char *exchange_url, + unsigned int http_status, + const char *justification, + const char *amount, + enum TALER_ErrorCode ec) +{ + struct TipAuthorizeState *tas; + + tas = GNUNET_new (struct TipAuthorizeState); + tas->merchant_url = merchant_url; + tas->justification = justification; + tas->amount = amount; + tas->http_status = http_status; + tas->expected_ec = ec; + + struct TALER_TESTING_Command cmd = { + .label = label, + .cls = tas, + .run = &tip_authorize_run, + .cleanup = &tip_authorize_cleanup, + .traits = &tip_authorize_traits + }; + + return cmd; +} + + +/** + * Create a /tip-authorize CMD. + * + * @param label this command label + * @param merchant_url the base URL of the merchant that will + * serve the /tip-authorize request. + * @param exchange_url the base URL of the exchange that owns + * the reserve from which the tip is going to be gotten. + * @param http_status the HTTP response code which is expected + * for this operation. + * @param justification human-readable justification for this + * tip authorization. + * @param amount the amount to authorize for tipping. + */ +struct TALER_TESTING_Command +TALER_TESTING_cmd_tip_authorize (const char *label, + const char *merchant_url, + const char *exchange_url, + unsigned int http_status, + const char *justification, + const char *amount) +{ + struct TipAuthorizeState *tas; + + tas = GNUNET_new (struct TipAuthorizeState); + tas->merchant_url = merchant_url; + tas->justification = justification; + tas->amount = amount; + tas->http_status = http_status; + + struct TALER_TESTING_Command cmd = { + .label = label, + .cls = tas, + .run = &tip_authorize_run, + .cleanup = &tip_authorize_cleanup, + .traits = &tip_authorize_traits + }; + + return cmd; +} + + +/** + * This commands does not query the backend at all, + * but just makes up a fake authorization id that will + * be subsequently used by the "pick up" CMD in order + * to test against such a case. + * + * @param label command label. + * @return the command. + */ +struct TALER_TESTING_Command +TALER_TESTING_cmd_tip_authorize_fake (const char *label) +{ + struct TipAuthorizeState *tas; + + tas = GNUNET_new (struct TipAuthorizeState); + + struct TALER_TESTING_Command cmd = { + .label = label, + .cls = tas, + .run = &tip_authorize_fake_run, + .cleanup = &tip_authorize_cleanup, + .traits = &tip_authorize_traits + }; + + return cmd; +} + + +/* end of testing_api_cmd_tip_authorize.c */ diff --git a/src/lib/testing_api_cmd_tip.c b/src/lib/testing_api_cmd_tip_pickup.c index 41757b6f..4a537f99 100644 --- a/src/lib/testing_api_cmd_tip.c +++ b/src/lib/testing_api_cmd_tip_pickup.c @@ -95,7 +95,6 @@ struct TipPickupState */ const struct TALER_EXCHANGE_DenomPublicKey **dks; - /** * The array of planchet secrets, in the same order of @a * amounts. @@ -123,583 +122,6 @@ struct TipPickupState /** - * State for a /tip-query CMD. - */ -struct TipQueryState -{ - - /** - * The merchant base URL. - */ - const char *merchant_url; - - /** - * Expected HTTP response code for this CMD. - */ - unsigned int http_status; - - /** - * The handle to the current /tip-query request. - */ - struct TALER_MERCHANT_TipQueryOperation *tqo; - - /** - * The interpreter state. - */ - struct TALER_TESTING_Interpreter *is; - - /** - * Expected amount to be picked up. - */ - const char *expected_amount_picked_up; - - /** - * Expected amount to be tip-authorized. - */ - const char *expected_amount_authorized; - - /** - * Amount that is expected to be still available - * from the tip reserve. - */ - const char *expected_amount_available; -}; - - -/** - * State for a /tip-authorize CMD. - */ -struct TipAuthorizeState -{ - - /** - * Merchant base URL. - */ - const char *merchant_url; - - /** - * Expected HTTP response code. - */ - unsigned int http_status; - - /** - * Human-readable justification for the - * tip authorization carried on by this CMD. - */ - const char *justification; - - /** - * Amount that should be authorized for tipping. - */ - const char *amount; - - /** - * Expected Taler error code for this CMD. - */ - enum TALER_ErrorCode expected_ec; - - /** - * Tip taler:// URI. - */ - const char *tip_uri; - - /** - * The tip id; set when the CMD succeeds. - */ - struct GNUNET_HashCode tip_id; - - /** - * Expiration date for this tip. - */ - struct GNUNET_TIME_Absolute tip_expiration; - - /** - * Handle to the on-going /tip-authorize request. - */ - struct TALER_MERCHANT_TipAuthorizeOperation *tao; - - /** - * The interpreter state. - */ - struct TALER_TESTING_Interpreter *is; -}; - -/** - * Callback for a /tip-authorize request. Set into the state - * what was returned from the backend (@a tip_id and @a - * tip_expiration). - * - * @param cls closure - * @param http_status HTTP status returned by the merchant backend - * @param ec taler-specific error code - * @param taler_tip_uri URI to let the wallet know about the tip - * @param tip_id unique identifier for the tip - */ -static void -tip_authorize_cb (void *cls, - unsigned int http_status, - enum TALER_ErrorCode ec, - const char *taler_tip_uri, - struct GNUNET_HashCode *tip_id) -{ - struct TipAuthorizeState *tas = cls; - - tas->tao = NULL; - if (tas->http_status != http_status) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Unexpected response code %u (%d)" - " to command %s\n", - http_status, - ec, - TALER_TESTING_interpreter_get_current_label - (tas->is)); - - TALER_TESTING_interpreter_fail (tas->is); - return; - } - - if (tas->expected_ec != ec) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Unexpected error code %d (%u) to command %s\n", - ec, - http_status, - TALER_TESTING_interpreter_get_current_label - (tas->is)); - TALER_TESTING_interpreter_fail (tas->is); - return; - } - if ( (MHD_HTTP_OK == http_status) && - (TALER_EC_NONE == ec) ) - { - tas->tip_uri = strdup (taler_tip_uri); - tas->tip_id = *tip_id; - } - - TALER_TESTING_interpreter_next (tas->is); -} - - -/** - * Offers information from the /tip-authorize CMD state to other - * commands. - * - * @param cls closure - * @param ret[out] result (could be anything) - * @param trait name of the trait - * @param index index number of the object to extract. - * @return #GNUNET_OK on success - */ -static int -tip_authorize_traits (void *cls, - const void **ret, - const char *trait, - unsigned int index) -{ - struct TipAuthorizeState *tas = cls; - struct TALER_TESTING_Trait traits[] = { - TALER_TESTING_make_trait_tip_id (0, &tas->tip_id), - TALER_TESTING_trait_end (), - }; - - return TALER_TESTING_get_trait (traits, - ret, - trait, - index); -} - - -/** - * Runs the /tip-authorize CMD - * - * @param cls closure - * @param cmd the CMD representing _this_ command - * @param is interpreter state - */ -static void -tip_authorize_run (void *cls, - const struct TALER_TESTING_Command *cmd, - struct TALER_TESTING_Interpreter *is) -{ - struct TipAuthorizeState *tas = cls; - struct TALER_Amount amount; - - tas->is = is; - if (GNUNET_OK != TALER_string_to_amount (tas->amount, - &amount)) - TALER_TESTING_FAIL (is); - - tas->tao = TALER_MERCHANT_tip_authorize - (is->ctx, - tas->merchant_url, - "http://merchant.com/pickup", - "http://merchant.com/continue", - &amount, - tas->justification, - tip_authorize_cb, - tas); - - GNUNET_assert (NULL != tas->tao); -} - - -/** - * Run the /tip-authorize CMD, the "fake" version of it. - * - * @param cls closure - * @param cmd the CMD representing _this_ command - * @param is interpreter state * - */ -static void -tip_authorize_fake_run (void *cls, - const struct TALER_TESTING_Command *cmd, - struct TALER_TESTING_Interpreter *is) -{ - struct TipAuthorizeState *tas = cls; - - /* Make up a tip id. */ - GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_WEAK, - &tas->tip_id, - sizeof (struct GNUNET_HashCode)); - - TALER_TESTING_interpreter_next (is); -} - - -/** - * Free the state from a /tip-authorize CMD, and possibly - * cancel any pending operation. - * - * @param cls closure - * @param cmd the /tip-authorize CMD that is about to be freed. - */ -static void -tip_authorize_cleanup (void *cls, - const struct TALER_TESTING_Command *cmd) -{ - struct TipAuthorizeState *tas = cls; - - if (NULL != tas->tao) - { - TALER_LOG_WARNING ("Tip-autorize operation" - " did not complete\n"); - TALER_MERCHANT_tip_authorize_cancel (tas->tao); - } - GNUNET_free (tas); -} - - -/** - * Create a /tip-authorize CMD, specifying the Taler error code - * that is expected to be returned by the backend. - * - * @param label this command label - * @param merchant_url the base URL of the merchant that will - * serve the /tip-authorize request. - * @param exchange_url the base URL of the exchange that owns - * the reserve from which the tip is going to be gotten. - * @param http_status the HTTP response code which is expected - * for this operation. - * @param justification human-readable justification for this - * tip authorization. - * @param amount the amount to authorize for tipping. - * @param ec expected Taler-defined error code. - */ -struct TALER_TESTING_Command -TALER_TESTING_cmd_tip_authorize_with_ec - (const char *label, - const char *merchant_url, - const char *exchange_url, - unsigned int http_status, - const char *justification, - const char *amount, - enum TALER_ErrorCode ec) -{ - struct TipAuthorizeState *tas; - - tas = GNUNET_new (struct TipAuthorizeState); - tas->merchant_url = merchant_url; - tas->justification = justification; - tas->amount = amount; - tas->http_status = http_status; - tas->expected_ec = ec; - - struct TALER_TESTING_Command cmd = { - .label = label, - .cls = tas, - .run = &tip_authorize_run, - .cleanup = &tip_authorize_cleanup, - .traits = &tip_authorize_traits - }; - - return cmd; -} - - -/** - * Create a /tip-authorize CMD. - * - * @param label this command label - * @param merchant_url the base URL of the merchant that will - * serve the /tip-authorize request. - * @param exchange_url the base URL of the exchange that owns - * the reserve from which the tip is going to be gotten. - * @param http_status the HTTP response code which is expected - * for this operation. - * @param justification human-readable justification for this - * tip authorization. - * @param amount the amount to authorize for tipping. - */ -struct TALER_TESTING_Command -TALER_TESTING_cmd_tip_authorize (const char *label, - const char *merchant_url, - const char *exchange_url, - unsigned int http_status, - const char *justification, - const char *amount) -{ - struct TipAuthorizeState *tas; - - tas = GNUNET_new (struct TipAuthorizeState); - tas->merchant_url = merchant_url; - tas->justification = justification; - tas->amount = amount; - tas->http_status = http_status; - - struct TALER_TESTING_Command cmd = { - .label = label, - .cls = tas, - .run = &tip_authorize_run, - .cleanup = &tip_authorize_cleanup, - .traits = &tip_authorize_traits - }; - - return cmd; -} - - -/** - * Callback to process a GET /tip-query request, it mainly - * checks that what the backend returned matches the command's - * expectations. - * - * @param cls closure - * @param http_status HTTP status code for this request - * @param ec Taler-specific error code - * @param raw raw response body - * @param reserve_expiration when the tip reserve will expire - * @param reserve_pub tip reserve public key - * @param amount_authorized total amount authorized on tip reserve - * @param amount_available total amount still available on - * tip reserve - * @param amount_picked_up total amount picked up from tip reserve - */ -static void -tip_query_cb (void *cls, - unsigned int http_status, - enum TALER_ErrorCode ec, - const json_t *raw, - struct GNUNET_TIME_Absolute reserve_expiration, - struct TALER_ReservePublicKeyP *reserve_pub, - struct TALER_Amount *amount_authorized, - struct TALER_Amount *amount_available, - struct TALER_Amount *amount_picked_up) -{ - struct TipQueryState *tqs = cls; - struct TALER_Amount a; - - tqs->tqo = NULL; - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "Tip query callback at command `%s'\n", - TALER_TESTING_interpreter_get_current_label - (tqs->is)); - - GNUNET_assert (NULL != reserve_pub); - GNUNET_assert (NULL != amount_authorized); - GNUNET_assert (NULL != amount_available); - GNUNET_assert (NULL != amount_picked_up); - - if (tqs->expected_amount_available) - { - GNUNET_assert (GNUNET_OK == TALER_string_to_amount - (tqs->expected_amount_available, &a)); - { - char *str; - - str = TALER_amount_to_string (amount_available); - TALER_LOG_INFO ("expected available %s, actual %s\n", - TALER_amount2s (&a), - str); - GNUNET_free (str); - } - if (0 != TALER_amount_cmp (amount_available, &a)) - TALER_TESTING_FAIL (tqs->is); - } - - if (tqs->expected_amount_authorized) - { - GNUNET_assert (GNUNET_OK == TALER_string_to_amount - (tqs->expected_amount_authorized, &a)); - { - char *str; - - str = TALER_amount_to_string (amount_authorized); - TALER_LOG_INFO ("expected authorized %s, actual %s\n", - TALER_amount2s (&a), - str); - GNUNET_free (str); - } - if (0 != TALER_amount_cmp (amount_authorized, &a)) - TALER_TESTING_FAIL (tqs->is); - } - - if (tqs->expected_amount_picked_up) - { - GNUNET_assert (GNUNET_OK == TALER_string_to_amount - (tqs->expected_amount_picked_up, &a)); - { - char *str; - str = TALER_amount_to_string (amount_picked_up); - TALER_LOG_INFO ("expected picked_up %s, actual %s\n", - TALER_amount2s (&a), - str); - GNUNET_free (str); - } - if (0 != TALER_amount_cmp (amount_picked_up, &a)) - TALER_TESTING_FAIL (tqs->is); - } - - if (tqs->http_status != http_status) - TALER_TESTING_FAIL (tqs->is); - - TALER_TESTING_interpreter_next (tqs->is); -} - - -/** - * Free the state from a /tip-query CMD, and possibly cancel - * a pending /tip-query request. - * - * @param cls closure. - * @param cmd the /tip-query CMD to free. - */ -static void -tip_query_cleanup (void *cls, - const struct TALER_TESTING_Command *cmd) -{ - struct TipQueryState *tqs = cls; - - if (NULL != tqs->tqo) - { - TALER_LOG_WARNING ("Tip-query operation" - " did not complete\n"); - TALER_MERCHANT_tip_query_cancel (tqs->tqo); - } - GNUNET_free (tqs); -} - - -/** - * Run a /tip-query CMD. - * - * @param cls closure. - * @param cmd the current /tip-query CMD. - * @param is the interpreter state. - */ -static void -tip_query_run (void *cls, - const struct TALER_TESTING_Command *cmd, - struct TALER_TESTING_Interpreter *is) -{ - struct TipQueryState *tqs = cls; - - tqs->is = is; - tqs->tqo = TALER_MERCHANT_tip_query (is->ctx, - tqs->merchant_url, - &tip_query_cb, - tqs); - GNUNET_assert (NULL != tqs->tqo); -} - - -/** - * Define a /tip-query CMD equipped with a expected amount. - * - * @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. - * @param expected_amount_picked_up expected amount already - * picked up. - * @param expected_amount_authorized expected amount that was - * authorized in the first place. - * @param expected_amount_available expected amount which is - * still available from the tip reserve - * @return the command - */ -struct TALER_TESTING_Command -TALER_TESTING_cmd_tip_query_with_amounts - (const char *label, - const char *merchant_url, - unsigned int http_status, - const char *expected_amount_picked_up, - const char *expected_amount_authorized, - const char *expected_amount_available) -{ - struct TipQueryState *tqs; - - tqs = GNUNET_new (struct TipQueryState); - tqs->merchant_url = merchant_url; - tqs->http_status = http_status; - tqs->expected_amount_picked_up = expected_amount_picked_up; - tqs->expected_amount_authorized = expected_amount_authorized; - tqs->expected_amount_available = expected_amount_available; - - struct TALER_TESTING_Command cmd = { - .cls = tqs, - .label = label, - .run = &tip_query_run, - .cleanup = &tip_query_cleanup - }; - - return cmd; -} - - -/** - * Define a /tip-query 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_tip_query (const char *label, - const char *merchant_url, - unsigned int http_status) -{ - struct TipQueryState *tqs; - - tqs = GNUNET_new (struct TipQueryState); - tqs->merchant_url = merchant_url; - tqs->http_status = http_status; - - struct TALER_TESTING_Command cmd = { - .cls = tqs, - .label = label, - .run = &tip_query_run, - .cleanup = &tip_query_cleanup - }; - - return cmd; -} - - -/** * Internal withdraw handle used when withdrawing tips. */ struct WithdrawHandle @@ -720,13 +142,13 @@ struct WithdrawHandle */ unsigned int off; - /** * Internal state of the "pickup" CMD. */ struct TipPickupState *tps; }; + /** * This callback handles the response of a withdraw operation * from the exchange, that is the final step in getting the tip. @@ -1173,33 +595,4 @@ TALER_TESTING_cmd_tip_pickup } -/** - * This commands does not query the backend at all, - * but just makes up a fake authorization id that will - * be subsequently used by the "pick up" CMD in order - * to test against such a case. - * - * @param label command label. - * - * @return the command. - */ -struct TALER_TESTING_Command -TALER_TESTING_cmd_tip_authorize_fake (const char *label) -{ - struct TipAuthorizeState *tas; - - tas = GNUNET_new (struct TipAuthorizeState); - - struct TALER_TESTING_Command cmd = { - .label = label, - .cls = tas, - .run = &tip_authorize_fake_run, - .cleanup = &tip_authorize_cleanup, - .traits = &tip_authorize_traits - }; - - return cmd; -} - - -/* end of testing_api_cmd_tip.c */ +/* end of testing_api_cmd_tip_pickup.c */ diff --git a/src/lib/testing_api_cmd_tip_query.c b/src/lib/testing_api_cmd_tip_query.c new file mode 100644 index 00000000..114bde79 --- /dev/null +++ b/src/lib/testing_api_cmd_tip_query.c @@ -0,0 +1,297 @@ +/* + This file is part of TALER + Copyright (C) 2014-2018 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_tip_query.c + * @brief command to test the tipping. + * @author Marcello Stanisci + */ + +#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 for a /tip-query CMD. + */ +struct TipQueryState +{ + + /** + * The merchant base URL. + */ + const char *merchant_url; + + /** + * Expected HTTP response code for this CMD. + */ + unsigned int http_status; + + /** + * The handle to the current /tip-query request. + */ + struct TALER_MERCHANT_TipQueryOperation *tqo; + + /** + * The interpreter state. + */ + struct TALER_TESTING_Interpreter *is; + + /** + * Expected amount to be picked up. + */ + const char *expected_amount_picked_up; + + /** + * Expected amount to be tip-authorized. + */ + const char *expected_amount_authorized; + + /** + * Amount that is expected to be still available + * from the tip reserve. + */ + const char *expected_amount_available; +}; + + +/** + * Callback to process a GET /tip-query request, it mainly + * checks that what the backend returned matches the command's + * expectations. + * + * @param cls closure + * @param http_status HTTP status code for this request + * @param ec Taler-specific error code + * @param raw raw response body + * @param reserve_expiration when the tip reserve will expire + * @param reserve_pub tip reserve public key + * @param amount_authorized total amount authorized on tip reserve + * @param amount_available total amount still available on + * tip reserve + * @param amount_picked_up total amount picked up from tip reserve + */ +static void +tip_query_cb (void *cls, + unsigned int http_status, + enum TALER_ErrorCode ec, + const json_t *raw, + struct GNUNET_TIME_Absolute reserve_expiration, + struct TALER_ReservePublicKeyP *reserve_pub, + struct TALER_Amount *amount_authorized, + struct TALER_Amount *amount_available, + struct TALER_Amount *amount_picked_up) +{ + struct TipQueryState *tqs = cls; + struct TALER_Amount a; + + tqs->tqo = NULL; + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Tip query callback at command `%s'\n", + TALER_TESTING_interpreter_get_current_label + (tqs->is)); + + GNUNET_assert (NULL != reserve_pub); + GNUNET_assert (NULL != amount_authorized); + GNUNET_assert (NULL != amount_available); + GNUNET_assert (NULL != amount_picked_up); + + if (tqs->expected_amount_available) + { + GNUNET_assert (GNUNET_OK == TALER_string_to_amount + (tqs->expected_amount_available, &a)); + { + char *str; + + str = TALER_amount_to_string (amount_available); + TALER_LOG_INFO ("expected available %s, actual %s\n", + TALER_amount2s (&a), + str); + GNUNET_free (str); + } + if (0 != TALER_amount_cmp (amount_available, &a)) + TALER_TESTING_FAIL (tqs->is); + } + + if (tqs->expected_amount_authorized) + { + GNUNET_assert (GNUNET_OK == TALER_string_to_amount + (tqs->expected_amount_authorized, &a)); + { + char *str; + + str = TALER_amount_to_string (amount_authorized); + TALER_LOG_INFO ("expected authorized %s, actual %s\n", + TALER_amount2s (&a), + str); + GNUNET_free (str); + } + if (0 != TALER_amount_cmp (amount_authorized, &a)) + TALER_TESTING_FAIL (tqs->is); + } + + if (tqs->expected_amount_picked_up) + { + GNUNET_assert (GNUNET_OK == TALER_string_to_amount + (tqs->expected_amount_picked_up, &a)); + { + char *str; + str = TALER_amount_to_string (amount_picked_up); + TALER_LOG_INFO ("expected picked_up %s, actual %s\n", + TALER_amount2s (&a), + str); + GNUNET_free (str); + } + if (0 != TALER_amount_cmp (amount_picked_up, &a)) + TALER_TESTING_FAIL (tqs->is); + } + + if (tqs->http_status != http_status) + TALER_TESTING_FAIL (tqs->is); + + TALER_TESTING_interpreter_next (tqs->is); +} + + +/** + * Free the state from a /tip-query CMD, and possibly cancel + * a pending /tip-query request. + * + * @param cls closure. + * @param cmd the /tip-query CMD to free. + */ +static void +tip_query_cleanup (void *cls, + const struct TALER_TESTING_Command *cmd) +{ + struct TipQueryState *tqs = cls; + + if (NULL != tqs->tqo) + { + TALER_LOG_WARNING ("Tip-query operation" + " did not complete\n"); + TALER_MERCHANT_tip_query_cancel (tqs->tqo); + } + GNUNET_free (tqs); +} + + +/** + * Run a /tip-query CMD. + * + * @param cls closure. + * @param cmd the current /tip-query CMD. + * @param is the interpreter state. + */ +static void +tip_query_run (void *cls, + const struct TALER_TESTING_Command *cmd, + struct TALER_TESTING_Interpreter *is) +{ + struct TipQueryState *tqs = cls; + + tqs->is = is; + tqs->tqo = TALER_MERCHANT_tip_query (is->ctx, + tqs->merchant_url, + &tip_query_cb, + tqs); + GNUNET_assert (NULL != tqs->tqo); +} + + +/** + * Define a /tip-query CMD equipped with a expected amount. + * + * @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. + * @param expected_amount_picked_up expected amount already + * picked up. + * @param expected_amount_authorized expected amount that was + * authorized in the first place. + * @param expected_amount_available expected amount which is + * still available from the tip reserve + * @return the command + */ +struct TALER_TESTING_Command +TALER_TESTING_cmd_tip_query_with_amounts + (const char *label, + const char *merchant_url, + unsigned int http_status, + const char *expected_amount_picked_up, + const char *expected_amount_authorized, + const char *expected_amount_available) +{ + struct TipQueryState *tqs; + + tqs = GNUNET_new (struct TipQueryState); + tqs->merchant_url = merchant_url; + tqs->http_status = http_status; + tqs->expected_amount_picked_up = expected_amount_picked_up; + tqs->expected_amount_authorized = expected_amount_authorized; + tqs->expected_amount_available = expected_amount_available; + + struct TALER_TESTING_Command cmd = { + .cls = tqs, + .label = label, + .run = &tip_query_run, + .cleanup = &tip_query_cleanup + }; + + return cmd; +} + + +/** + * Define a /tip-query 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_tip_query (const char *label, + const char *merchant_url, + unsigned int http_status) +{ + struct TipQueryState *tqs; + + tqs = GNUNET_new (struct TipQueryState); + tqs->merchant_url = merchant_url; + tqs->http_status = http_status; + + struct TALER_TESTING_Command cmd = { + .cls = tqs, + .label = label, + .run = &tip_query_run, + .cleanup = &tip_query_cleanup + }; + + return cmd; +} + + +/* end of testing_api_cmd_tip_query.c */ |