/* This file is part of TALER (C) 2018-2023 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 */ /** * @file taler_merchant_testing_lib.h * @brief API for writing an interpreter to test Taler components * @author Christian Grothoff * @author Marcello Shtanisci * @author Priscilla HUANG */ #ifndef TALER_MERCHANT_TESTING_LIB_H #define TALER_MERCHANT_TESTING_LIB_H #include #include #include "taler_merchant_service.h" /* ********************* Helper functions ********************* */ #define MERCHANT_FAIL() \ do {GNUNET_break (0); return NULL; } while (0) /** * Extract hostname (and port) from merchant base URL. * * @param merchant_url full merchant URL (e.g. "http://host:8080/foo/bar/") * @return just the hostname and port ("hostname:8080") */ char * TALER_MERCHANT_TESTING_extract_host (const char *merchant_url); /* ************** Specific interpreter commands ************ */ /** * Define a "config" CMD. * * @param label command label. * @param merchant_url base URL of the merchant serving the * "config" request. * @param http_code expected HTTP response code. * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_config (const char *label, const char *merchant_url, unsigned int http_code); /** * Define a "GET /instances" CMD. * * @param label command label. * @param merchant_url base URL of the merchant serving the * GET /instances request. * @param http_status expected HTTP response code. * @param ... NULL-terminated list of labels (const char *) of * product (commands) we expect to be returned in the list * (assuming @a http_code is #MHD_HTTP_OK) * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_get_instances (const char *label, const char *merchant_url, unsigned int http_status, ...); /** * Define a "POST /instances" CMD, simple version * * @param label command label. * @param merchant_url base URL of the merchant serving the * POST /instances request. * @param instance_id the ID of the instance to create * @param http_status expected HTTP response code. * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_post_instances (const char *label, const char *merchant_url, const char *instance_id, unsigned int http_status); /** * Define a "POST /private/auth" CMD. * * @param label command label. * @param merchant_url base URL of the merchant serving the * POST /instances request. * @param instance_id the ID of the instance, or NULL * @param auth_token new auth token to use, can be NULL for no auth * @param http_status expected HTTP response code. * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_post_instance_auth (const char *label, const char *merchant_url, const char *instance_id, const char *auth_token, unsigned int http_status); /** * Define a "POST /instances" CMD. Comprehensive version. * * @param label command label. * @param merchant_url base URL of the merchant serving the * POST /instances request. * @param instance_id the ID of the instance to query * @param name name of the merchant instance * @param address physical address of the merchant instance * @param jurisdiction jurisdiction of the merchant instance * @param use_stefan enable STEFAN curve * @param default_wire_transfer_delay default wire transfer delay merchant will ask for * @param default_pay_delay default validity period for offers merchant makes * @param auth_token authorization token needed to access the instance, can be NULL * @param http_status expected HTTP response code. * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_post_instances2 ( const char *label, const char *merchant_url, const char *instance_id, const char *name, json_t *address, json_t *jurisdiction, bool use_stefan, struct GNUNET_TIME_Relative default_wire_transfer_delay, struct GNUNET_TIME_Relative default_pay_delay, const char *auth_token, unsigned int http_status); /** * Define a "POST /account" CMD. * * @param label command label. * @param merchant_url base URL of the merchant serving the * POST /instances request. * @param payto_uri URIs of the bank account to add to the merchant instance * @param credit_facade_url credit facade URL to configure, can be NULL * @param credit_facade_credentials credit facade credentials to use, can be NULL * @param http_status expected HTTP response code. * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_post_account ( const char *label, const char *merchant_url, struct TALER_FullPayto payto_uri, const char *credit_facade_url, const json_t *credit_facade_credentials, unsigned int http_status); /** * Define a "PATCH /account" CMD. * * @param label command label. * @param merchant_url base URL of the merchant serving the * POST /instances request. * @param create_account_ref reference to account setup command * @param credit_facade_url credit facade URL to configure, can be NULL * @param credit_facade_credentials credit facade credentials to use, can be NULL * @param http_status expected HTTP response code. * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_patch_account ( const char *label, const char *merchant_url, const char *create_account_ref, const char *credit_facade_url, const json_t *credit_facade_credentials, unsigned int http_status); /** * Define a "DELETE /account" CMD. * * @param label command label. * @param create_account_ref reference to account setup command * @param http_status expected HTTP response code. * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_delete_account ( const char *label, const char *create_account_ref, unsigned int http_status); /** * Define a "PATCH /instances/$ID" CMD. * * @param label command label. * @param merchant_url base URL of the merchant serving the * PATCH /instance request. * @param instance_id the ID of the instance to query * @param name name of the merchant instance * @param address physical address of the merchant instance * @param jurisdiction jurisdiction of the merchant instance * @param use_stefan use STEFAN curve * @param default_wire_transfer_delay default wire transfer delay merchant will ask for * @param default_pay_delay default validity period for offers merchant makes * @param http_status expected HTTP response code. * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_patch_instance ( const char *label, const char *merchant_url, const char *instance_id, const char *name, json_t *address, json_t *jurisdiction, bool use_stefan, struct GNUNET_TIME_Relative default_wire_transfer_delay, struct GNUNET_TIME_Relative default_pay_delay, unsigned int http_status); /** * Define a "GET instance" CMD. * * @param label command label. * @param merchant_url base URL of the merchant serving the * GET /instances/$ID request. * @param instance_id the ID of the instance to query * @param http_status expected HTTP response code. * @param instance_reference reference to a "POST /instances" or "PATCH /instances/$ID" CMD * that will provide what we expect the backend to return to us * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_get_instance (const char *label, const char *merchant_url, const char *instance_id, unsigned int http_status, const char *instance_reference); /** * Define a "PURGE instance" CMD. * * @param label command label. * @param merchant_url base URL of the merchant serving the * PURGE /instances/$ID request. * @param instance_id the ID of the instance to query * @param http_status expected HTTP response code. * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_purge_instance (const char *label, const char *merchant_url, const char *instance_id, unsigned int http_status); /** * Define a "DELETE instance" CMD. * * @param label command label. * @param merchant_url base URL of the merchant serving the * DELETE /instances/$ID request. * @param instance_id the ID of the instance to query * @param http_status expected HTTP response code. * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_delete_instance (const char *label, const char *merchant_url, const char *instance_id, unsigned int http_status); /* ******************* /products **************** */ /** * Define a "POST /products" CMD. * * @param label command label. * @param merchant_url base URL of the merchant serving the * POST /products request. * @param product_id the ID of the product to query * @param description description of the product * @param description_i18n Map from IETF BCP 47 language tags to localized descriptions * @param unit unit in which the product is measured (liters, kilograms, packages, etc.) * @param price the price for one @a unit of the product, zero is used to imply that * this product is not sold separately or that the price is not fixed and * must be supplied by the front-end. If non-zero, price must include * applicable taxes. * @param image base64-encoded product image * @param taxes list of taxes paid by the merchant * @param total_stock in @a units, -1 to indicate "infinite" (i.e. electronic books) * @param minimum_age minimum age required for buying this product * @param address where the product is in stock * @param next_restock when the next restocking is expected to happen, 0 for unknown, * #GNUNET_TIME_UNIT_FOREVER_TS for 'never'. * @param http_status expected HTTP response code. * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_post_products2 ( const char *label, const char *merchant_url, const char *product_id, const char *description, json_t *description_i18n, const char *unit, const char *price, const char *image, json_t *taxes, int64_t total_stock, uint32_t minimum_age, json_t *address, struct GNUNET_TIME_Timestamp next_restock, unsigned int http_status); /** * Define a "POST /products" CMD, simple version * * @param label command label. * @param merchant_url base URL of the merchant serving the * POST /products request. * @param product_id the ID of the product to create * @param description name of the product * @param price price of the product * @param http_status expected HTTP response code. * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_post_products (const char *label, const char *merchant_url, const char *product_id, const char *description, const char *price, unsigned int http_status); /** * Define a "PATCH /products/$ID" CMD. * * @param label command label. * @param merchant_url base URL of the merchant serving the * PATCH /product request. * @param product_id the ID of the product to query * @param description description of the product * @param description_i18n Map from IETF BCP 47 language tags to localized descriptions * @param unit unit in which the product is measured (liters, kilograms, packages, etc.) * @param price the price for one @a unit of the product, zero is used to imply that * this product is not sold separately or that the price is not fixed and * must be supplied by the front-end. If non-zero, price must include * applicable taxes. * @param image base64-encoded product image * @param taxes list of taxes paid by the merchant * @param total_stock in @a units, -1 to indicate "infinite" (i.e. electronic books) * @param total_lost in @a units, must be larger than previous values, and may * not exceed total_stock minus total_sold; if it does, the transaction * will fail with a #MHD_HTTP_CONFLICT HTTP status code * @param address where the product is in stock * @param next_restock when the next restocking is expected to happen, 0 for unknown, * #GNUNET_TIME_UNIT_FOREVER_ABS for 'never'. * @param http_status expected HTTP response code. * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_patch_product ( const char *label, const char *merchant_url, const char *product_id, const char *description, json_t *description_i18n, const char *unit, const char *price, const char *image, json_t *taxes, int64_t total_stock, uint64_t total_lost, json_t *address, struct GNUNET_TIME_Timestamp next_restock, unsigned int http_status); /** * Define a "GET /products" CMD. * * @param label command label. * @param merchant_url base URL of the merchant serving the * GET /products request. * @param http_status expected HTTP response code. * @param ... NULL-terminated list of labels (const char *) of * product (commands) we expect to be returned in the list * (assuming @a http_code is #MHD_HTTP_OK) * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_get_products (const char *label, const char *merchant_url, unsigned int http_status, ...); /** * Define a "GET product" CMD. * * @param label command label. * @param merchant_url base URL of the merchant serving the * GET /products/$ID request. * @param product_id the ID of the product to query * @param http_status expected HTTP response code. * @param product_reference reference to a "POST /products" or "PATCH /products/$ID" CMD * that will provide what we expect the backend to return to us * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_get_product (const char *label, const char *merchant_url, const char *product_id, unsigned int http_status, const char *product_reference); /** * Define a "LOCK /products/$ID" CMD. * * @param label command label. * @param merchant_url base URL of the merchant serving the * LOCK /product request. * @param product_id the ID of the product to lock. * @param duration how long the lock should last. * @param quantity how money units to lock. * @param http_status expected HTTP response code. * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_lock_product ( const char *label, const char *merchant_url, const char *product_id, struct GNUNET_TIME_Relative duration, uint32_t quantity, unsigned int http_status); /** * Define a "DELETE product" CMD. * * @param label command label. * @param merchant_url base URL of the merchant serving the * DELETE /products/$ID request. * @param product_id the ID of the product to query * @param http_status expected HTTP response code. * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_delete_product (const char *label, const char *merchant_url, const char *product_id, unsigned int http_status); /* ******************* /orders **************** */ /** * Make the "proposal" command. * * @param label command label * @param cfg configuration to use * @param merchant_url base URL of the merchant serving * the proposal request. * @param http_status expected HTTP status. * @param order_id the name of the order to add. * @param refund_deadline the deadline for refunds on this order. * @param pay_deadline the deadline for payment on this order. * @param amount the amount this order is for. * @return the command */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_post_orders ( const char *label, const struct GNUNET_CONFIGURATION_Handle *cfg, const char *merchant_url, unsigned int http_status, const char *order_id, struct GNUNET_TIME_Timestamp refund_deadline, struct GNUNET_TIME_Timestamp pay_deadline, const char *amount); /** * Make the "proposal" command AVOIDING claiming the order. * * @param label command label * @param merchant_url base URL of the merchant serving * the proposal request. * @param http_status expected HTTP status. * @param order_id the name of the order to add. * @param refund_deadline the deadline for refunds on this order. * @param pay_deadline the deadline for payment on this order. * @param amount the amount this order is for. * @return the command */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_post_orders_no_claim ( const char *label, const char *merchant_url, unsigned int http_status, const char *order_id, struct GNUNET_TIME_Timestamp refund_deadline, struct GNUNET_TIME_Timestamp pay_deadline, const char *amount); /** * Make the "proposal" command. * * @param label command label * @param cfg configuration to use * @param merchant_url base URL of the merchant serving * the proposal request. * @param http_status expected HTTP status. * @param order_id the name of the order to add. * @param refund_deadline the deadline for refunds on this order. * @param pay_deadline the deadline for payment on this order. * @param claim_token whether to generate a claim token. * @param amount the amount this order is for. * @param payment_target payment target for the order. * @param products a string indicating the products this order will be * purchasing. Should be formatted as * "[product_id]/[quantity];...". * @param locks a string of references to lock product commands that should * be formatted as "[lock_1];[lock_2];...". * @param duplicate_of if not NULL, a reference to a previous order command * that should be duplicated and checked for an identical response. * @return the command */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_post_orders2 ( const char *label, const struct GNUNET_CONFIGURATION_Handle *cfg, const char *merchant_url, unsigned int http_status, const char *order_id, struct GNUNET_TIME_Timestamp refund_deadline, struct GNUNET_TIME_Timestamp pay_deadline, bool claim_token, const char *amount, const char *payment_target, const char *products, const char *locks, const char *duplicate_of); /** * Create an order with a specific fulfillment URL. * Does not claim the order. * * @param label command label * @param cfg configuration to use * @param merchant_url base URL of the merchant serving * the proposal request * @param http_status expected HTTP status * @param order_id ID of the order to create * @param refund_deadline the deadline for refunds on this order * @param pay_deadline the deadline for payment on this order * @param fulfillment_url the fulfillment URL to use * @param amount the amount this order is for * @return the command */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_post_orders3 ( const char *label, const struct GNUNET_CONFIGURATION_Handle *cfg, const char *merchant_url, unsigned int http_status, const char *order_id, struct GNUNET_TIME_Timestamp refund_deadline, struct GNUNET_TIME_Timestamp pay_deadline, const char *fulfillment_url, const char *amount); /** * Create an order with a choices array with input and output tokens. * * @param label command label * @param cfg configuration to use * @param merchant_url base URL of the merchant serving * the proposal request. * @param http_status expected HTTP status. * @param token_family_reference label of the POST /tokenfamilies cmd. * @param num_inputs number of input tokens. * @param num_outputs number of output tokens. * @param order_id the name of the order to add. * @param refund_deadline the deadline for refunds on this order. * @param pay_deadline the deadline for payment on this order. * @param amount the amount this order is for. * @return the command */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_post_orders_choices ( const char *label, const struct GNUNET_CONFIGURATION_Handle *cfg, const char *merchant_url, unsigned int http_status, const char *token_family_reference, unsigned int num_inputs, unsigned int num_outputs, const char *order_id, struct GNUNET_TIME_Timestamp refund_deadline, struct GNUNET_TIME_Timestamp pay_deadline, const char *amount); /** * Define a "GET /orders" CMD. * * @param label command label. * @param merchant_url base URL of the merchant serving the * GET /orders request. * @param http_status expected HTTP response code. * @param ... NULL-terminated list of labels (const char *) of * order (commands) we expect to be returned in the list * (assuming @a http_code is #MHD_HTTP_OK) * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_get_orders (const char *label, const char *merchant_url, unsigned int http_status, ...); /** * Start a long poll for GET /private/orders. * * FIXME: needs additional arguments to specify range to long poll for! * * @param label the command label * @param merchant_url base URL of the merchant which will * serve the request. * @param timeout how long to wait for the request to complete */ struct TALER_TESTING_Command TALER_TESTING_cmd_poll_orders_start (const char *label, const char *merchant_url, struct GNUNET_TIME_Relative timeout); /** * Complete a long poll for GET /private/orders. * * @param label the command label * @param http_status expected HTTP response code * @param poll_start_reference reference to the #TALER_TESTING_cmd_poll_orders_start command */ struct TALER_TESTING_Command TALER_TESTING_cmd_poll_orders_conclude ( const char *label, unsigned int http_status, const char *poll_start_reference); /** * Define a GET /orders/$ORDER_ID CMD. * * @param label the command label * @param merchant_url base URL of the merchant which will * serve the request. * @param order_reference reference to a command that created an order. * @param paid whether the order has been paid for or not. * @param refunded whether the order has been refunded. * @param refund_pending whether the order has refunds that haven't been obtained. * @param http_status expected HTTP response code for the request. */ struct TALER_TESTING_Command TALER_TESTING_cmd_wallet_get_order ( const char *label, const char *merchant_url, const char *order_reference, bool paid, bool refunded, bool refund_pending, unsigned int http_status); /** * Define a GET /orders/$ORDER_ID CMD. * * @param label the command label * @param merchant_url base URL of the merchant which will * serve the request. * @param order_reference reference to a command that created an order. * @param session_id session ID to check for * @param paid whether the order has been paid for or not. * @param refunded whether the order has been refunded. * @param refund_pending whether the order has refunds that haven't been obtained. * @param repurchase_order_ref command of a paid equivalent order the merchant should be referring us to, or NULL * @param http_status expected HTTP response code for the request. */ struct TALER_TESTING_Command TALER_TESTING_cmd_wallet_get_order2 ( const char *label, const char *merchant_url, const char *order_reference, const char *session_id, bool paid, bool refunded, bool refund_pending, const char *repurchase_order_ref, unsigned int http_status); /** * Start a long poll for GET /orders/$ORDER_ID. * * @param label the command label * @param merchant_url base URL of the merchant which will * serve the request. * @param order_ref reference to a command that created an order. * @param timeout how long to wait for the request to complete * @param await_refund NULL to not wait for refund, amount of value * zero to wait for any refund amount, non-zero to poll * for refund exceeding the given amount */ struct TALER_TESTING_Command TALER_TESTING_cmd_wallet_poll_order_start ( const char *label, const char *merchant_url, const char *order_ref, struct GNUNET_TIME_Relative timeout, const char *await_refund); /** * Start a long poll for GET /orders/$ORDER_ID. * * @param label the command label * @param merchant_url base URL of the merchant which will * serve the request. * @param order_ref reference to a command that created an order. * @param timeout how long to wait for the request to complete * @param await_refund NULL to not wait for refund, amount of value * zero to wait for any refund amount, non-zero to poll * for refund exceeding the given amount * @param session_id which session ID to use */ struct TALER_TESTING_Command TALER_TESTING_cmd_wallet_poll_order_start2 ( const char *label, const char *merchant_url, const char *order_ref, struct GNUNET_TIME_Relative timeout, const char *await_refund, const char *session_id); /** * Complete a long poll for GET /orders/$ORDER_ID. * * @param label the command label * @param expected_http_status expected HTTP response code * @param expected_refund_amount refund expected, NULL for no refund expected * @param poll_start_reference reference to the #TALER_TESTING_cmd_wallet_poll_order_start command */ struct TALER_TESTING_Command TALER_TESTING_cmd_wallet_poll_order_conclude ( const char *label, unsigned int expected_http_status, const char *expected_refund_amount, const char *poll_start_reference); /** * Complete a long poll for GET /orders/$ORDER_ID. * * @param label the command label * @param expected_http_status expected HTTP response code * @param expected_refund_amount refund expected, NULL for no refund expected * @param poll_start_reference reference to the #TALER_TESTING_cmd_wallet_poll_order_start command * @param already_paid_order_id ID of an already paid order we expect to get returned */ struct TALER_TESTING_Command TALER_TESTING_cmd_wallet_poll_order_conclude2 ( const char *label, unsigned int expected_http_status, const char *expected_refund_amount, const char *poll_start_reference, const char *already_paid_order_id); /** * Define a GET /private/orders/$ORDER_ID CMD. * * @param label the command label * @param merchant_url base URL of the merchant which will * serve the request. * @param order_reference reference to a command that created an order. * @param osc expected order status * @param refunded whether the order has been refunded. * @param http_status expected HTTP response code for the request. * @param ... NULL-terminated list of labels (const char *) of * refunds (commands) we expect to be aggregated in the transfer * (assuming @a http_code is #MHD_HTTP_OK). If @e refunded is false, * this parameter is ignored. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_get_order ( const char *label, const char *merchant_url, const char *order_reference, enum TALER_MERCHANT_OrderStatusCode osc, bool refunded, unsigned int http_status, ...); /** * Define a GET /private/orders/$ORDER_ID CMD. * * @param label the command label * @param merchant_url base URL of the merchant which will * serve the request. * @param order_reference reference to a command that created an order. * @param osc expected order status * @param wired whether the order has been wired or not. * @param transfers NULL-terminated list of labels (const char *) of * wire transfers (commands) we expect to be aggregated in the order * (assuming @a http_code is #MHD_HTTP_OK). If @e paid is fale, this * parameter is ignored. * @param refunded whether the order has been refunded. * @param refunds NULL-terminated list of labels (const char *) of * refunds (commands) we expect to be aggregated in the order * (assuming @a http_code is #MHD_HTTP_OK). If @e refunded is false, * this parameter is ignored. * @param forgets a NULL-terminated list of references to forget commands * that apply to the order we are querying. If NULL, this is * interpreted as no forgets are expected. * @param http_status expected HTTP response code for the request. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_get_order2 ( const char *label, const char *merchant_url, const char *order_reference, enum TALER_MERCHANT_OrderStatusCode osc, bool wired, const char **transfers, bool refunded, const char **refunds, const char **forgets, unsigned int http_status); /** * Define a GET /private/orders/$ORDER_ID CMD. * * @param label the command label * @param merchant_url base URL of the merchant which will * serve the request. * @param order_reference reference to a command that created an order. * @param osc expected order status * @param session_id session ID the payment must be bound to * @param repurchase_order_ref command of a paid equivalent order the merchant should be referring us to, or NULL * @param expected_http_status expected HTTP response code for the request. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_get_order3 ( const char *label, const char *merchant_url, const char *order_reference, enum TALER_MERCHANT_OrderStatusCode osc, const char *session_id, const char *repurchase_order_ref, unsigned int expected_http_status); /** * Define a GET /private/orders/$ORDER_ID CMD. * * @param label the command label * @param merchant_url base URL of the merchant which will * serve the request. * @param order_reference reference to a command that created an order. * @param osc expected order status * @param expected_min_age expected minimum age for the contract * @param expected_http_status expected HTTP response code for the request. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_get_order4 ( const char *label, const char *merchant_url, const char *order_reference, enum TALER_MERCHANT_OrderStatusCode osc, uint32_t expected_min_age, unsigned int expected_http_status); /** * Start a long poll for GET /private/orders/$ORDER_ID. */ struct TALER_TESTING_Command TALER_TESTING_cmd_poll_order_start (const char *label, const char *merchant_url, const char *order_id, struct GNUNET_TIME_Relative timeout); /** * Complete a long poll for GET /private/orders/$ORDER_ID. */ struct TALER_TESTING_Command TALER_TESTING_cmd_poll_order_conclude (const char *label, unsigned int http_status, const char *poll_start_reference); /** * Make a "claim order" command. * * @param label command label. * @param merchant_url base URL of the merchant backend * serving the proposal lookup request. * @param http_status expected HTTP response code. * @param order_reference reference to a POST order CMD, can be NULL if @a order_id given * @param order_id order id to lookup, can be NULL (then we use @a order_reference) * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_claim_order (const char *label, const char *merchant_url, unsigned int http_status, const char *order_reference, const char *order_id); /** * Make a "pay" test command. * * @param label command label. * @param merchant_url merchant base url * @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 session_id the session id to use for the payment (can be NULL). * @return the command */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_pay_order ( const char *label, const char *merchant_url, unsigned int http_status, const char *proposal_reference, const char *coin_reference, const char *amount_with_fee, const char *amount_without_fee, const char *session_id); /** * Make a "pay" test command for an order with choices. * * @param label command label. * @param merchant_url merchant base url * @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 session_id the session id to use for the payment (can be NULL). * @param choice_index index of the selected choice for the payment. * @param input_reference reference to a previous pay command that issued some outputs to be used as inputs to this pay request. * @return the command */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_pay_order_choices ( const char *label, const char *merchant_url, unsigned int http_status, const char *proposal_reference, const char *coin_reference, const char *amount_with_fee, const char *amount_without_fee, const char *session_id, int choice_index, const char *input_reference); /** * Make an "order paid" test command. * * @param label command label * @param merchant_url merchant base URL * @param pay_reference reference to the payment to verify * @param session_id the session to use for the verification. * @param http_status expected HTTP response code * @return the command */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_post_orders_paid ( const char *label, const char *merchant_url, const char *pay_reference, const char *session_id, unsigned int http_status); /** * Make an "abort" test command. * * @param label command label * @param merchant_url merchant base URL * @param pay_reference reference to the payment to abort * @param http_status expected HTTP response code * @return the command */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_order_abort ( const char *label, const char *merchant_url, const char *pay_reference, unsigned int http_status); /** * Make a "order forget" command. * * @param label command label. * @param merchant_url base URL of the merchant backend * serving the order claim request. * @param http_status expected HTTP response code. * @param order_reference reference to a POST order CMD, can be NULL if @a order_id given * @param order_id order id to forget for, can be NULL (then we use @a order_reference) * @param ... NULL-terminated list of paths (const char *) to forget in * the contract terms. * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_forget_order ( const char *label, const char *merchant_url, unsigned int http_status, const char *order_reference, const char *order_id, ...); /** * Define a "refund" order 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 http_code expected HTTP response code. * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_order_refund ( const char *label, const char *merchant_url, const char *reason, const char *order_id, const char *refund_amount, unsigned int http_code); /** * Define a "refund order" CMD. * * @param label command label. * @param merchant_url base URL of the backend serving the * "refund increase" request. * @param order_ref order id of the contract to refund. * @param http_code expected HTTP response code. * @param ... NULL-terminated list of labels (const char *) of * refunds (commands) we expect to be aggregated in the transfer * (assuming @a http_code is #MHD_HTTP_OK). If @e refunded is false, * this parameter is ignored. * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_wallet_order_refund ( const char *label, const char *merchant_url, const char *order_ref, unsigned int http_code, ...); /** * Define a "DELETE order" CMD. * * @param label command label. * @param merchant_url base URL of the merchant serving the * DELETE /instances/$ID request. * @param order_id the ID of the instance to query * @param http_status expected HTTP response code. * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_delete_order ( const char *label, const char *merchant_url, const char *order_id, unsigned int http_status); /* ******************* /transfers *************** */ /** * Define a POST /transfers CMD. Details like the WTID and * other required parameters will be extracted from the bank * history, using the latest transfer of the specified * @a credit_amount to the @a merchant_url. * * @param label command label. * @param auth credentials to access the exchange's bank account * @param payto_uri URL of the exchange's bank account * @param merchant_url base URL of the backend serving the * "refund increase" request. * @param credit_amount amount credited * @param http_code expected HTTP response code * @param ... NULL-terminated list of labels (const char *) of * deposit (commands) we expect to be aggregated in the transfer * (assuming @a http_code is #MHD_HTTP_OK) * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_post_transfer ( const char *label, const struct TALER_BANK_AuthenticationData *auth, struct TALER_FullPayto payto_uri, const char *merchant_url, const char *credit_amount, unsigned int http_code, ...); /** * Define a POST /transfers CMD. Details like the WTID and * other required parameters are explicitly provided. * * @param label command label. * @param merchant_url base URL of the backend * @param payto_uri URL of the exchange's bank account * @param credit_amount amount credited * @param wtid wire transfer ID to use, NULL to pick one at random * @param exchange_url URL of the exchange to use * @param http_code expected HTTP response code * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_post_transfer2 ( const char *label, const char *merchant_url, struct TALER_FullPayto payto_uri, const char *credit_amount, const char *wtid, const char *exchange_url, unsigned int http_code); /** * We have discovered the @a serial for a POST transfer * command. Store it (for the bank row trait). * * @param cmd command to update * @param serial serial number to store (identifies the row) */ void TALER_TESTING_cmd_merchant_post_transfer_set_serial ( struct TALER_TESTING_Command *cmd, uint64_t serial); /** * Define a GET /transfers CMD. * * @param label command label. * @param merchant_url base URL of the backend serving the * "refund increase" request. * @param payto_uri payto URI to filter by, NULL for no filter * @param http_code expected HTTP response code * @param ... NULL-terminated list of labels (const char *) of * transfer (commands) we expect to be returned in the list * (assuming @a http_code is #MHD_HTTP_OK) * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_get_transfers ( const char *label, const char *merchant_url, struct TALER_FullPayto payto_uri, unsigned int http_code, ...); /** * Define a "DELETE transfer" CMD. * * @param label command label. * @param merchant_url base URL of the merchant for the * DELETE /transfers/$ID request. * @param transfer_ref reference to a command that * yields the transfer ID to delete * @param http_status expected HTTP response code. * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_delete_transfer (const char *label, const char *merchant_url, const char *transfer_ref, unsigned int http_status); /** * Run a command to fetch the KYC status of a merchant. * * @param label the command label * @param merchant_url base URL of the merchant * @param instance_id instance to use, NULL if instance is part of @a merchant_url * @param h_wire_ref label of command with a merchant wire hash trait * of the bank account to check KYC for; NULL to check all accounts * @param exchange_url base URL of the exchange to check KYC status for * @param lpt target for long polling * @param expected_http_status expected HTTP status * @param expected_kyc_state expected KYC state (only effective if @e expected_http_status is #MHD_HTTP_OK/#MHD_HTTP_ACCEPTED) * @return the command */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_kyc_get ( const char *label, const char *merchant_url, const char *instance_id, const char *h_wire_ref, const char *exchange_url, enum TALER_EXCHANGE_KycLongPollTarget lpt, unsigned int expected_http_status, bool expected_kyc_state); /* ****** OTP devices ******* */ /** * Define a "POST /otp-devices" CMD. * * @param label command label. * @param merchant_url base URL of the merchant serving the * POST /otps request. * @param otp_id the ID of the otp device to modify * @param otp_description description of the otp device * @param otp_key base32-encoded key to verify the payment * @param otp_alg is an option that show the amount of the order. it is linked with the @a otp_key * @param otp_ctr counter to use (if in counter mode) * @param http_status expected HTTP response code. * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_post_otp_devices ( const char *label, const char *merchant_url, const char *otp_id, const char *otp_description, const char *otp_key, enum TALER_MerchantConfirmationAlgorithm otp_alg, uint64_t otp_ctr, unsigned int http_status); /** * Define a "PATCH /otp-devices/$ID" CMD. * * @param label command label. * @param merchant_url base URL of the merchant serving the * PATCH /otp-devices request. * @param otp_id the ID of the otp device to modify * @param otp_description description of the otp device * @param otp_key base32-encoded key to verify the payment * @param otp_alg is an option that show the amount of the order. it is linked with the @a otp_key * @param otp_ctr counter to use (if in counter mode) * @param http_status expected HTTP response code. * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_patch_otp_device ( const char *label, const char *merchant_url, const char *otp_id, const char *otp_description, const char *otp_key, enum TALER_MerchantConfirmationAlgorithm otp_alg, uint64_t otp_ctr, unsigned int http_status); /** * Define a "GET /otp-devices" CMD. * * @param label command label. * @param merchant_url base URL of the merchant serving the * GET /otp-devices request. * @param http_status expected HTTP response code. * @param ... NULL-terminated list of labels (const char *) of * otp (commands) we expect to be returned in the list * (assuming @a http_code is #MHD_HTTP_OK) * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_get_otp_devices (const char *label, const char *merchant_url, unsigned int http_status, ...); /** * Define a "GET otp device" CMD. * * @param label command label. * @param merchant_url base URL of the merchant serving the * GET /otp-devices/$ID request. * @param otp_id the ID of the otp to query * @param http_status expected HTTP response code. * @param otp_reference reference to a "POST /otp-devices" or "PATCH /otp-devices/$ID" CMD * that will provide what we expect the backend to return to us * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_get_otp_device (const char *label, const char *merchant_url, const char *otp_id, unsigned int http_status, const char *otp_reference); /** * Define a "DELETE otp device" CMD. * * @param label command label. * @param merchant_url base URL of the merchant serving the * DELETE /otp-devices/$ID request. * @param otp_id the ID of the otp to query * @param http_status expected HTTP response code. * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_delete_otp_device (const char *label, const char *merchant_url, const char *otp_id, unsigned int http_status); /* ****** Templates ******* */ /** * Define a "POST /templates" CMD. * * @param label command label. * @param merchant_url base URL of the merchant serving the * POST /templates request. * @param template_id the ID of the template to query * @param template_description description of the template * @param otp_id OTP device ID, NULL for none * @param template_contract where the contract of the company is * @param http_status expected HTTP response code. * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_post_templates2 ( const char *label, const char *merchant_url, const char *template_id, const char *template_description, const char *otp_id, json_t *template_contract, unsigned int http_status); /** * Define a "POST /templates" CMD, simple version * * @param label command label. * @param merchant_url base URL of the merchant serving the * POST /templates request. * @param template_id the ID of the template to create * @param template_description description of the template * @param http_status expected HTTP response code. * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_post_templates (const char *label, const char *merchant_url, const char *template_id, const char *template_description, unsigned int http_status); /** * Define a "PATCH /templates/$ID" CMD. * * @param label command label. * @param merchant_url base URL of the merchant serving the * PATCH /template request. * @param template_id the ID of the template to query * @param template_description description of the template * @param otp_id OTP device to use * @param template_contract contract of the company * @param http_status expected HTTP response code. * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_patch_template ( const char *label, const char *merchant_url, const char *template_id, const char *template_description, const char *otp_id, json_t *template_contract, unsigned int http_status); /** * Define a "GET /templates" CMD. * * @param label command label. * @param merchant_url base URL of the merchant serving the * GET /templates request. * @param http_status expected HTTP response code. * @param ... NULL-terminated list of labels (const char *) of * template (commands) we expect to be returned in the list * (assuming @a http_code is #MHD_HTTP_OK) * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_get_templates (const char *label, const char *merchant_url, unsigned int http_status, ...); /** * Define a "GET template" CMD. * * @param label command label. * @param merchant_url base URL of the merchant serving the * GET /templates/$ID request. * @param template_id the ID of the template to query * @param http_status expected HTTP response code. * @param template_reference reference to a "POST /templates" or "PATCH /templates/$ID" CMD * that will provide what we expect the backend to return to us * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_get_template (const char *label, const char *merchant_url, const char *template_id, unsigned int http_status, const char *template_reference); /** * Define a "DELETE template" CMD. * * @param label command label. * @param merchant_url base URL of the merchant serving the * DELETE /templates/$ID request. * @param template_id the ID of the template to query * @param http_status expected HTTP response code. * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_delete_template (const char *label, const char *merchant_url, const char *template_id, unsigned int http_status); /** * Define a "POST /using-templates" CMD, simple version * * @param label command label. * @param template_ref label of command that created the template to use * @param otp_ref label of command that created OTP device we use (or NULL for no OTP) * @param merchant_url base URL of the merchant serving the * POST /using-templates request. * @param using_template_id template ID to use * @param summary given by the customer to know what they did pay * @param amount given by the customer to pay * @param refund_deadline refund deadline to use for the contract * @param pay_deadline pay deadline to use for the contract * @param http_status expected HTTP response code. * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_post_using_templates ( const char *label, const char *template_ref, const char *otp_ref, const char *merchant_url, const char *using_template_id, const char *summary, const char *amount, struct GNUNET_TIME_Timestamp refund_deadline, struct GNUNET_TIME_Timestamp pay_deadline, unsigned int http_status); /* ****** Token Families ******* */ /** * Define a "POST /tokenfamilies" CMD. * * @param label command label. * @param merchant_url base URL of the merchant serving the * POST /tokenfamilies request. * @param http_status expected HTTP response code. * @param slug slug of the token family. * @param name name of the token family. * @param description description of the token family. * @param description_i18n internationalized description of the token family. * @param valid_after start of the validity time of the token family. * @param valid_before end of the validity time of the token family. * @param duration validity duration of an issued token of the token family. * @param rounding to multiples of what duration should start times be rounded * @param kind kind of the token family. either "subscription" or "discount". * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_post_tokenfamilies ( const char *label, const char *merchant_url, unsigned int http_status, const char *slug, const char *name, const char *description, json_t *description_i18n, struct GNUNET_TIME_Timestamp valid_after, struct GNUNET_TIME_Timestamp valid_before, struct GNUNET_TIME_Relative duration, struct GNUNET_TIME_Relative rounding, const char *kind); /* ****** Webhooks ******* */ /** * Define a "POST /webhooks" CMD. * * @param label command label. * @param merchant_url base URL of the merchant serving the * POST /webhooks request. * @param webhook_id the ID of the webhook to query * @param event_type event of the webhook * @param url use by the customer * @param http_method use by the merchant * @param header_template of the webhook * @param body_template of the webhook * @param http_status expected HTTP response code. * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_post_webhooks2 ( const char *label, const char *merchant_url, const char *webhook_id, const char *event_type, const char *url, const char *http_method, const char *header_template, const char *body_template, unsigned int http_status); /** * Define a "POST /webhooks" CMD, simple version * * @param label command label. * @param merchant_url base URL of the merchant serving the * POST /webhooks request. * @param webhook_id the ID of the webhook to query * @param event_type event of the webhook * @param http_status expected HTTP response code. * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_post_webhooks (const char *label, const char *merchant_url, const char *webhook_id, const char *event_type, unsigned int http_status); /** * Define a "PATCH /webhooks/$ID" CMD. * * @param label command label. * @param merchant_url base URL of the merchant serving the * PATCH /webhook request. * @param webhook_id the ID of the webhook to query * @param event_type event of the webhook * @param url use by the customer * @param http_method use by the merchant * @param header_template of the webhook * @param body_template of the webhook * @param http_status expected HTTP response code. * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_patch_webhook ( const char *label, const char *merchant_url, const char *webhook_id, const char *event_type, const char *url, const char *http_method, const char *header_template, const char *body_template, unsigned int http_status); /** * Define a "GET /webhooks" CMD. * * @param label command label. * @param merchant_url base URL of the merchant serving the * GET /webhooks request. * @param http_status expected HTTP response code. * @param ... NULL-terminated list of labels (const char *) of * webhook (commands) we expect to be returned in the list * (assuming @a http_code is #MHD_HTTP_OK) * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_get_webhooks (const char *label, const char *merchant_url, unsigned int http_status, ...); /** * Define a "GET webhook" CMD. * * @param label command label. * @param merchant_url base URL of the merchant serving the * GET /templates/$ID request. * @param webhook_id the ID of the webhook to query * @param http_status expected HTTP response code. * @param webhook_reference reference to a "POST /webhooks" or "PATCH /webhooks/$ID" CMD * that will provide what we expect the backend to return to us * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_get_webhook (const char *label, const char *merchant_url, const char *webhook_id, unsigned int http_status, const char *webhook_reference); /** * Define a "DELETE webhook" CMD. * * @param label command label. * @param merchant_url base URL of the merchant serving the * DELETE /webhooks/$ID request. * @param webhook_id the ID of the webhook to query * @param http_status expected HTTP response code. * @return the command. */ struct TALER_TESTING_Command TALER_TESTING_cmd_merchant_delete_webhook (const char *label, const char *merchant_url, const char *webhook_id, unsigned int http_status); /** * Command to run the 'taler-merchant-webhook' program. * * @param label command label. * @param config_filename configuration file used by the webhook. */ struct TALER_TESTING_Command TALER_TESTING_cmd_webhook (const char *label, const char *config_filename); /** * Command to run the 'taler-merchant-depositcheck' program. * * @param label command label. * @param config_filename configuration file used by the deposit check helper. */ struct TALER_TESTING_Command TALER_TESTING_cmd_depositcheck (const char *label, const char *config_filename); /** * Command to run the 'taler-merchant-exchange' program. * * @param label command label. * @param config_filename configuration file used by the webhook. */ struct TALER_TESTING_Command TALER_TESTING_cmd_run_tme (const char *label, const char *config_filename); /** * This function is used to start the web server. * * @param label command label * @param port is the port of the web server */ struct TALER_TESTING_Command TALER_TESTING_cmd_testserver (const char *label, uint16_t port); /** * This function is used to check the web server got the * expected request from the web hook. * * @param label command label * @param ref_operation reference to command to the previous set server status operation. * @param index index to know which web server we check. */ struct TALER_TESTING_Command TALER_TESTING_cmd_checkserver (const char *label, const char *ref_operation, unsigned int index); /** * This function is used to check that the web server * got the expected request from the web hook. * * @param label command label * @param ref_operation reference to command to the previous set server status operation. * @param index index to know which web server we check. * @param expected_url url of the webhook * @param expected_method method of the webhook * @param expected_header header of the webhook * @param expected_body body of the webhook */ struct TALER_TESTING_Command TALER_TESTING_cmd_checkserver2 (const char *label, const char *ref_operation, unsigned int index, const char *expected_url, const char *expected_method, const char *expected_header, const char *expected_body); /* ****** Specific traits supported by this component ******* */ /** * Call @a op on all simple traits. * * @param op macro to call */ // FIXME: rename: refund_entry->refund_detail #define TALER_MERCHANT_TESTING_SIMPLE_TRAITS(op) \ op (claim_nonce, const struct GNUNET_CRYPTO_EddsaPublicKey) \ op (pickup_id, const struct TALER_PickupIdentifierP) \ op (instance_name, const char) \ op (instance_id, const char) \ op (address, const json_t) \ op (product_description, const char) \ op (product_image, const char) \ op (product_stock, const int64_t) \ op (product_unit, const char) \ op (product_id, const char) \ op (reason, const char) \ op (lock_uuid, const char) \ op (auth_token, const char) \ op (paths_length, const uint32_t) \ op (payto_length, const uint32_t) \ op (num_planchets, const uint32_t) \ op (i18n_description, const json_t) \ op (taxes, const json_t) \ op (fee, const struct TALER_Amount) \ op (use_stefan, const bool) \ op (jurisdiction, const json_t) \ op (wire_delay, const struct GNUNET_TIME_Relative) \ op (pay_delay, const struct GNUNET_TIME_Relative) \ op (refund_entry, const struct TALER_MERCHANT_RefundDetail) \ op (order_terms, const json_t) \ op (h_contract_terms, const struct TALER_PrivateContractHashP) \ op (h_wire, const struct TALER_MerchantWireHashP) \ op (proposal_reference, const char) \ op (template_description, const char) \ op (otp_device_description, const char) \ op (otp_id, const char) \ op (otp_key, const char) \ op (otp_alg, const enum TALER_MerchantConfirmationAlgorithm) \ op (template_id, const char) \ op (template_contract, const json_t) \ op (event_type, const char) \ op (webhook_id, const char) \ op (merchant_base_url, const char) \ op (url, const char) \ op (http_method, const char) \ op (header_template, const char) \ op (body_template, const char) \ op (summary, const char) \ op (token_family_slug, const char) \ op (token_family_duration, const struct GNUNET_TIME_Relative) \ op (token_family_kind, const char) /** * Call @a op on all indexed traits. * * @param op macro to call */ #define TALER_MERCHANT_TESTING_INDEXED_TRAITS(op) \ op (coin_reference, const char) \ op (paths, const char) \ op (payto_uris, const struct TALER_FullPayto) \ op (h_wires, const struct TALER_MerchantWireHashP) \ op (amounts, const struct TALER_Amount) \ op (urls, const char) \ op (http_methods, const char) \ op (http_header, const char) \ op (http_body, const void) \ op (http_body_size, const size_t) \ op (planchet_secrets, const struct TALER_PlanchetMasterSecretP) \ op (token_priv, const struct TALER_TokenUsePrivateKeyP) \ op (token_issue_sig, const struct TALER_TokenIssueSignatureP) \ op (token_issue_pub, const struct TALER_TokenIssuePublicKeyP) TALER_MERCHANT_TESTING_SIMPLE_TRAITS (TALER_TESTING_MAKE_DECL_SIMPLE_TRAIT) TALER_MERCHANT_TESTING_INDEXED_TRAITS (TALER_TESTING_MAKE_DECL_INDEXED_TRAIT) #endif