summaryrefslogtreecommitdiff
path: root/src/include/taler_merchant_testing_lib.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/include/taler_merchant_testing_lib.h')
-rw-r--r--src/include/taler_merchant_testing_lib.h507
1 files changed, 507 insertions, 0 deletions
diff --git a/src/include/taler_merchant_testing_lib.h b/src/include/taler_merchant_testing_lib.h
new file mode 100644
index 00000000..53f04693
--- /dev/null
+++ b/src/include/taler_merchant_testing_lib.h
@@ -0,0 +1,507 @@
+/*
+ This file is part of TALER
+ (C) 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 include/taler_testing_lib.h
+ * @brief API for writing an interpreter to test Taler components
+ * @author Christian Grothoff <christian@grothoff.org>
+ * @author Marcello Stanisci
+ */
+#ifndef TALER_MERCHANT_TESTING_LIB_H
+#define TALER_MERCHANT_TESTING_LIB_H
+
+#include <taler/taler_testing_lib.h>
+#include "taler_merchant_service.h"
+
+/* ********************* Helper functions ********************* */
+
+
+#define MERCHANT_FAIL() \
+ do {GNUNET_break (0); return NULL; } while (0)
+
+
+#define CMD_NOT_FOUND "Command not found"
+#define TRAIT_NOT_FOUND "Trait not found"
+
+#define TALER_TESTING_FAIL(is) \
+ do \
+ {\
+ GNUNET_break (0); \
+ TALER_TESTING_interpreter_fail (is); \
+ return; \
+ } while (0)
+
+/**
+ * Prepare the merchant execution. Create tables and check if
+ * the port is available.
+ *
+ * @param config_filename configuration filename.
+ *
+ * @return the base url, or NULL upon errors. Must be freed
+ * by the caller.
+ */
+char *
+TALER_TESTING_prepare_merchant (const char *config_filename);
+
+/**
+ * Start the merchant backend process. Assume the port
+ * is available and the database is clean. Use the "prepare
+ * merchant" function to do such tasks.
+ *
+ * @param config_filename configuration filename.
+ *
+ * @return the process, or NULL if the process could not
+ * be started.
+ */
+struct GNUNET_OS_Process *
+TALER_TESTING_run_merchant (const char *config_filename);
+
+/* ******************* Generic interpreter logic ************ */
+
+/* ************** Specific interpreter commands ************ */
+
+/**
+ * Make the /proposal command.
+ *
+ * @param label command label
+ * @param merchant_url merchant base url.
+ * @param ctx context
+ * @param http_status HTTP status code.
+ * @param order the order
+ * @param instance the merchant instance
+ *
+ * @return the command
+ */
+struct TALER_TESTING_Command
+TALER_TESTING_cmd_proposal (const char *label,
+ const char *merchant_url,
+ struct GNUNET_CURL_Context *ctx,
+ unsigned int http_status,
+ const char *order,
+ const char *instance);
+
+/**
+ * Make a "proposal lookup" command.
+ *
+ * @param label command label
+ * @param http_status expected HTTP response code
+ * @param proposal_reference reference to a proposal command
+ *
+ * @return the command
+ */
+struct TALER_TESTING_Command
+TALER_TESTING_cmd_proposal_lookup
+ (const char *label,
+ struct GNUNET_CURL_Context *ctx,
+ const char *merchant_url,
+ unsigned int http_status,
+ const char *proposal_reference);
+
+/**
+ * Make a "check payment" test command.
+ *
+ * @param label command label.
+ * @param merchant_url merchant base url
+ * @param ctx CURL context.
+ * @param http_status expected HTTP response code.
+ * @param proposal_reference the proposal whose payment status
+ * is going to be checked.
+ * @param expect_paid GNUNET_YES if we expect the proposal to be
+ * paid, GNUNET_NO otherwise.
+ *
+ * @return the command
+ */
+struct TALER_TESTING_Command
+TALER_TESTING_cmd_check_payment (const char *label,
+ const char *merchant_url,
+ struct GNUNET_CURL_Context *ctx,
+ unsigned int http_status,
+ const char *proposal_reference,
+ unsigned int expect_paid);
+
+/**
+ * Make a "pay" test command.
+ *
+ * @param label command label.
+ * @param merchant_url merchant base url
+ * @param ctx CURL context.
+ * @param http_status expected HTTP response code.
+ * @param proposal_reference the proposal whose payment status
+ * is going to be checked.
+ * @param coin_reference reference to any command which is able
+ * to provide coins to use for paying.
+ * @param amount_with_fee amount to pay, including the deposit
+ * fee
+ * @param amount_without_fee amount to pay, no fees included.
+ * @param refund_fee fee for refunding this payment.
+ *
+ * @return the command
+ */
+struct TALER_TESTING_Command
+TALER_TESTING_cmd_pay (const char *label,
+ const char *merchant_url,
+ struct GNUNET_CURL_Context *ctx,
+ unsigned int http_status,
+ const char *proposal_reference,
+ const char *coin_reference,
+ const char *amount_with_fee,
+ const char *amount_without_fee,
+ const char *refund_fee);
+
+/**
+ * Make a "pay again" test command.
+ *
+ * @param label command label
+ * @param merchant_url merchant base URL
+ * @param pay_reference reference to the payment to replay
+ * @param coin_reference reference to the coins to use
+ * @param ctx main CURL context
+ * @param http_status expected HTTP response code
+ *
+ * @return the command
+ */
+struct TALER_TESTING_Command
+TALER_TESTING_cmd_pay_again (const char *label,
+ const char *merchant_url,
+ const char *pay_reference,
+ const char *coin_reference,
+ const char *refund_fee,
+ struct GNUNET_CURL_Context *ctx,
+ unsigned int http_status);
+/**
+ * Make a "pay abort" test command.
+ *
+ * @param label command label
+ * @param merchant_url merchant base URL
+ * @param pay_reference reference to the payment to abort
+ * @param ctx main CURL context
+ * @param http_status expected HTTP response code
+ *
+ * @return the command
+ */
+struct TALER_TESTING_Command
+TALER_TESTING_cmd_pay_abort (const char *label,
+ const char *merchant_url,
+ const char *pay_reference,
+ struct GNUNET_CURL_Context *ctx,
+ unsigned int http_status);
+
+/**
+ * FIXME.
+ */
+struct TALER_TESTING_Command
+TALER_TESTING_cmd_pay_abort_refund
+ (const char *label,
+ struct TALER_EXCHANGE_Handle *exchange,
+ const char *abort_reference,
+ unsigned int num_coins,
+ const char *refund_amount,
+ const char *refund_fee,
+ unsigned int http_status);
+
+/**
+ * FIXME
+ */
+struct TALER_TESTING_Command
+TALER_TESTING_cmd_refund_lookup
+ (const char *label,
+ const char *merchant_url,
+ struct GNUNET_CURL_Context *ctx,
+ const char *increase_reference,
+ const char *pay_reference,
+ const char *order_id);
+
+
+/**
+ * FIXME
+ */
+struct TALER_TESTING_Command
+TALER_TESTING_cmd_refund_increase
+ (const char *label,
+ const char *merchant_url,
+ struct GNUNET_CURL_Context *ctx,
+ const char *reason,
+ const char *order_id,
+ const char *refund_amount,
+ const char *refund_fee);
+
+
+/**
+ * Make a "history" command.
+ *
+ * @param label command label
+ * @param merchant_url merchant base URL
+ * @param ctx main CURL context
+ * @param http_status expected HTTP response code
+ * @param time FIXME
+ * @param nresult how many results are expected
+ * @param start FIXME.
+ * @param nrows how many row we want to receive, at most.
+ */
+struct TALER_TESTING_Command
+TALER_TESTING_cmd_history (const char *label,
+ const char *merchant_url,
+ struct GNUNET_CURL_Context *ctx,
+ unsigned int http_status,
+ struct GNUNET_TIME_Absolute time,
+ unsigned int nresult,
+ unsigned int start,
+ unsigned int nrows);
+
+/**
+ * FIXME
+ */
+struct TALER_TESTING_Command
+TALER_TESTING_cmd_merchant_track_transaction
+ (const char *label,
+ const char *merchant_url,
+ struct GNUNET_CURL_Context *ctx,
+ unsigned int http_status,
+ const char *transfer_reference,
+ const char *pay_reference,
+ const char *wire_fee);
+
+/**
+ * FIXME
+ */
+struct TALER_TESTING_Command
+TALER_TESTING_cmd_merchant_track_transfer
+ (const char *label,
+ const char *merchant_url,
+ struct GNUNET_CURL_Context *ctx,
+ unsigned int http_status,
+ const char *check_bank_reference,
+ const char *pay_reference);
+
+/* ****** Specific traits supported by this component ******* */
+
+/**
+ * Offer a merchant signature over a contract.
+ *
+ * @param index which signature to offer if there are multiple
+ * on offer
+ * @param merchant_sig set to the offered signature.
+ * @return the trait
+ */
+struct TALER_TESTING_Trait
+TALER_TESTING_make_trait_merchant_sig
+ (unsigned int index,
+ const struct TALER_MerchantSignatureP *merchant_sig);
+
+/**
+ * Obtain a merchant signature over a contract from a @a cmd.
+ *
+ * @param cmd command to extract trait from
+ * @param index which signature to pick if @a cmd has multiple
+ * on offer
+ * @param merchant_sig[out] set to the wanted signature.
+ * @return #GNUNET_OK on success
+ */
+int
+TALER_TESTING_get_trait_merchant_sig
+ (const struct TALER_TESTING_Command *cmd,
+ unsigned int index,
+ struct TALER_MerchantSignatureP **merchant_sig);
+
+
+/**
+ * Obtain a reference to a proposal command. Any command that
+ * works with proposals, might need to offer their reference to
+ * it. Notably, the "pay" command, offers its proposal reference
+ * to the "pay abort" command as the latter needs to reconstruct
+ * the same data needed by the former in order to use the "pay
+ * abort" API.
+ *
+ * @param cmd command to extract trait from
+ * @param index which reference to pick if @a cmd has multiple
+ * on offer
+ * @param proposal_reference[out] set to the wanted reference.
+ * @return #GNUNET_OK on success
+ */
+int
+TALER_TESTING_get_trait_proposal_reference
+ (const struct TALER_TESTING_Command *cmd,
+ unsigned int index,
+ const char **proposal_reference);
+
+/**
+ * Offer a proposal reference.
+ *
+ * @param index which reference to offer if there are
+ * multiple on offer
+ * @param proposal_reference set to the offered reference.
+ * @return the trait
+ */
+struct TALER_TESTING_Trait
+TALER_TESTING_make_trait_proposal_reference
+ (unsigned int index,
+ const char *proposal_reference);
+
+/**
+ * Offer a coin reference.
+ *
+ * @param index which reference to offer if there are
+ * multiple on offer
+ * @param coin_reference set to the offered reference.
+ * @return the trait
+ */
+struct TALER_TESTING_Trait
+TALER_TESTING_make_trait_coin_reference
+ (unsigned int index,
+ const char *coin_reference);
+
+/**
+ * Obtain a reference to any command that can provide coins as
+ * traits.
+ *
+ * @param cmd command to extract trait from
+ * @param index which reference to pick if @a cmd has multiple
+ * on offer
+ * @param coin_reference[out] set to the wanted reference. NOTE:
+ * a _single_ reference can contain _multiple_ token,
+ * using semi-colon as separator. For example, a _single_
+ * reference can be this: "coin-ref-1", or even this:
+ * "coin-ref-1;coin-ref-2". The "pay" command contains
+ * functions that can parse such format.
+ * @return #GNUNET_OK on success
+ */
+int
+TALER_TESTING_get_trait_coin_reference
+ (const struct TALER_TESTING_Command *cmd,
+ unsigned int index,
+ const char **coin_reference);
+
+
+/**
+ * Obtain planchet secrets from a @a cmd.
+ *
+ * @param cmd command to extract trait from
+ * @param index which signature to pick if @a cmd has multiple
+ * on offer
+ * @param planchet_secrets[out] set to the wanted secrets.
+ * @return #GNUNET_OK on success
+ */
+int
+TALER_TESTING_get_trait_planchet_secrets
+ (const struct TALER_TESTING_Command *cmd,
+ unsigned int index,
+ struct TALER_PlanchetSecretsP **planchet_secrets);
+
+
+/**
+ * Offer planchet secrets.
+ *
+ * @param index which secrets to offer if there are multiple
+ * on offer
+ * @param planchet_secrets set to the offered secrets.
+ * @return the trait
+ */
+struct TALER_TESTING_Trait
+TALER_TESTING_make_trait_planchet_secrets
+ (unsigned int index,
+ const struct TALER_PlanchetSecretsP *planchet_secrets);
+
+/**
+ * Offer tip id.
+ *
+ * @param index which tip id to offer if there are
+ * multiple on offer
+ * @param planchet_secrets set to the offered secrets.
+ * @return the trait
+ */
+struct TALER_TESTING_Trait
+TALER_TESTING_make_trait_tip_id
+ (unsigned int index,
+ const struct GNUNET_HashCode *tip_id);
+
+
+/**
+ * Obtain tip id from a @a cmd.
+ *
+ * @param cmd command to extract trait from
+ * @param index which signature to pick if @a cmd has multiple
+ * on offer
+ * @param tip_id[out] set to the wanted data.
+ * @return #GNUNET_OK on success
+ */
+int
+TALER_TESTING_get_trait_tip_id
+ (const struct TALER_TESTING_Command *cmd,
+ unsigned int index,
+ const struct GNUNET_HashCode **tip_id);
+
+/**
+ * Offer contract terms hash code.
+ *
+ * @param index which hash code to offer if there are
+ * multiple on offer
+ * @param h_contract_terms set to the offered hash code.
+ * @return the trait
+ */
+struct TALER_TESTING_Trait
+TALER_TESTING_make_trait_h_contract_terms
+ (unsigned int index,
+ const struct GNUNET_HashCode *h_contract_terms);
+
+/**
+ * Obtain contract terms hash from a @a cmd.
+ *
+ * @param cmd command to extract trait from
+ * @param index which hash code to pick if @a cmd has multiple
+ * on offer
+ * @param h_contract_terms[out] set to the wanted data.
+ * @return #GNUNET_OK on success
+ */
+int
+TALER_TESTING_get_trait_h_contract_terms
+ (const struct TALER_TESTING_Command *cmd,
+ unsigned int index,
+ const const struct GNUNET_HashCode **h_contract_terms);
+
+
+/**
+ * Offer refund entry.
+ *
+ * @param index which tip id to offer if there are
+ * multiple on offer
+ * @param refund_entry set to the offered refund entry.
+ * @return the trait
+ */
+struct TALER_TESTING_Trait
+TALER_TESTING_make_trait_refund_entry
+ (unsigned int index,
+ const struct TALER_MERCHANT_RefundEntry *refund_entry);
+
+
+/**
+ * Obtain refund entry from a @a cmd.
+ *
+ * @param cmd command to extract trait from
+ * @param index which signature to pick if @a cmd has multiple
+ * on offer
+ * @param refund_entry[out] set to the wanted data.
+ * @return #GNUNET_OK on success
+ */
+int
+TALER_TESTING_get_trait_refund_entry
+ (const struct TALER_TESTING_Command *cmd,
+ unsigned int index,
+ const struct TALER_MERCHANT_RefundEntry **refund_entry);
+
+#endif