LCOV - code coverage report
Current view: top level - testing - test_merchant_api.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 100.0 % 488 488
Test Date: 2025-12-10 19:49:57 Functions: 100.0 % 5 5

            Line data    Source code
       1              : /*
       2              :   This file is part of TALER
       3              :   Copyright (C) 2014-2023 Taler Systems SA
       4              : 
       5              :   TALER is free software; you can redistribute it and/or modify
       6              :   it under the terms of the GNU General Public License as
       7              :   published by the Free Software Foundation; either version 3, or
       8              :   (at your option) any later version.
       9              : 
      10              :   TALER is distributed in the hope that it will be useful, but
      11              :   WITHOUT ANY WARRANTY; without even the implied warranty of
      12              :   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      13              :   GNU General Public License for more details.
      14              : 
      15              :   You should have received a copy of the GNU General Public
      16              :   License along with TALER; see the file COPYING.  If not, see
      17              :   <http://www.gnu.org/licenses/>
      18              : */
      19              : /**
      20              :  * @file test_merchant_api.c
      21              :  * @brief testcase to test exchange's HTTP API interface
      22              :  * @author Sree Harsha Totakura <sreeharsha@totakura.in>
      23              :  * @author Christian Grothoff
      24              :  * @author Marcello Stanisci
      25              :  */
      26              : #include "platform.h"
      27              : #include <gnunet/gnunet_time_lib.h>
      28              : #include <taler/taler_util.h>
      29              : #include <taler/taler_signatures.h>
      30              : #include <taler/taler_exchange_service.h>
      31              : #include <taler/taler_json_lib.h>
      32              : #include <gnunet/gnunet_util_lib.h>
      33              : #include <gnunet/gnunet_testing_lib.h>
      34              : #include <microhttpd.h>
      35              : #include <taler/taler_bank_service.h>
      36              : #include <taler/taler_fakebank_lib.h>
      37              : #include <taler/taler_testing_lib.h>
      38              : #include <taler/taler_error_codes.h>
      39              : #include "taler_merchant_util.h"
      40              : #include "taler_merchant_testing_lib.h"
      41              : 
      42              : #ifdef HAVE_DONAU_DONAU_SERVICE_H
      43              : #include <donau/donau_testing_lib.h>
      44              : #endif
      45              : 
      46              : 
      47              : /**
      48              :  * The 'poll-orders-conclude-1' and other 'conclude'
      49              :  * commands should NOT wait for this timeout!
      50              :  */
      51              : #define POLL_ORDER_TIMEOUT \
      52              :   GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 60)
      53              : 
      54              : /**
      55              :  * The 'poll-orders-conclude-1x' and other 'conclude'
      56              :  * commands that should (!) wait for this timeout! Hence,
      57              :  * here we use a short value!
      58              :  */
      59              : #define POLL_ORDER_SHORT_TIMEOUT \
      60              :   GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 2)
      61              : 
      62              : /**
      63              :  * Configuration file we use.  One (big) configuration is used
      64              :  * for the various components for this test.
      65              :  */
      66              : static char *config_file;
      67              : 
      68              : /**
      69              :  * Exchange base URL.  Could also be taken from config.
      70              :  */
      71              : #define EXCHANGE_URL "http://localhost:8081/"
      72              : 
      73              : /**
      74              :  * Payto URI of the customer (payer).
      75              :  */
      76              : static struct TALER_FullPayto payer_payto;
      77              : 
      78              : /**
      79              :  * Payto URI of the exchange (escrow account).
      80              :  */
      81              : static struct TALER_FullPayto exchange_payto;
      82              : 
      83              : /**
      84              :  * Payto URI of the merchant (receiver).
      85              :  */
      86              : static struct TALER_FullPayto merchant_payto;
      87              : 
      88              : /**
      89              :  * Credentials for the test.
      90              :  */
      91              : static struct TALER_TESTING_Credentials cred;
      92              : 
      93              : /**
      94              :  * Merchant base URL.
      95              :  */
      96              : static const char *merchant_url;
      97              : 
      98              : /**
      99              :  * Merchant instance "i1a" base URL.
     100              :  */
     101              : static char *merchant_url_i1a;
     102              : 
     103              : /**
     104              :  * Account number of the exchange at the bank.
     105              :  */
     106              : #define EXCHANGE_ACCOUNT_NAME "2"
     107              : 
     108              : /**
     109              :  * Account number of some user.
     110              :  */
     111              : #define USER_ACCOUNT_NAME "62"
     112              : 
     113              : /**
     114              :  * Account number of some other user.
     115              :  */
     116              : #define USER_ACCOUNT_NAME2 "63"
     117              : 
     118              : /**
     119              :  * Account number used by the merchant
     120              :  */
     121              : #define MERCHANT_ACCOUNT_NAME "3"
     122              : 
     123              : static const char *order_1_transfers[] = {
     124              :   "post-transfer-1",
     125              :   NULL
     126              : };
     127              : 
     128              : static const char *order_1_forgets_1[] = {
     129              :   "forget-1",
     130              :   NULL
     131              : };
     132              : 
     133              : static const char *order_1_forgets_2[] = {
     134              :   "forget-1",
     135              :   "forget-order-array-elem",
     136              :   NULL
     137              : };
     138              : 
     139              : static const char *order_1_forgets_3[] = {
     140              :   "forget-1",
     141              :   "forget-order-array-elem",
     142              :   "forget-order-array-wc",
     143              :   NULL
     144              : };
     145              : 
     146              : static const struct TALER_TESTING_ProductUnitExpectations
     147              :   expect_unicorn_defaults = {
     148              :   .have_unit_allow_fraction = true,
     149              :   .unit_allow_fraction = true,
     150              :   .have_unit_precision_level = true,
     151              :   .unit_precision_level = 1
     152              : };
     153              : 
     154              : static const struct TALER_TESTING_ProductUnitExpectations
     155              :   expect_unicorn_patched = {
     156              :   .have_unit_allow_fraction = true,
     157              :   .unit_allow_fraction = false,
     158              :   .have_unit_precision_level = true,
     159              :   .unit_precision_level = 0
     160              : };
     161              : 
     162              : /**
     163              :  * Execute the taler-merchant-webhook command with
     164              :  * our configuration file.
     165              :  *
     166              :  * @param label label to use for the command.
     167              :  */
     168              : static struct TALER_TESTING_Command
     169            2 : cmd_webhook (const char *label)
     170              : {
     171            2 :   return TALER_TESTING_cmd_webhook (label, config_file);
     172              : }
     173              : 
     174              : 
     175              : /**
     176              :  * Execute the taler-exchange-wirewatch command with
     177              :  * our configuration file.
     178              :  *
     179              :  * @param label label to use for the command.
     180              :  */
     181              : static struct TALER_TESTING_Command
     182           18 : cmd_exec_wirewatch (const char *label)
     183              : {
     184           18 :   return TALER_TESTING_cmd_exec_wirewatch (label,
     185              :                                            config_file);
     186              : }
     187              : 
     188              : 
     189              : /**
     190              :  * Execute the taler-exchange-aggregator, closer and transfer commands with
     191              :  * our configuration file.
     192              :  *
     193              :  * @param label label to use for the command.
     194              :  */
     195              : #define CMD_EXEC_AGGREGATOR(label) \
     196              :   TALER_TESTING_cmd_exec_aggregator (label "-aggregator", config_file), \
     197              :   TALER_TESTING_cmd_exec_transfer (label "-transfer", config_file)
     198              : 
     199              : 
     200              : /**
     201              :  * Run wire transfer of funds from some user's account to the
     202              :  * exchange.
     203              :  *
     204              :  * @param label label to use for the command.
     205              :  * @param amount amount to transfer, i.e. "EUR:1"
     206              :  * @param url exchange_url
     207              :  */
     208              : static struct TALER_TESTING_Command
     209           18 : cmd_transfer_to_exchange (const char *label,
     210              :                           const char *amount)
     211              : {
     212           18 :   return TALER_TESTING_cmd_admin_add_incoming (label,
     213              :                                                amount,
     214              :                                                &cred.ba,
     215              :                                                payer_payto);
     216              : }
     217              : 
     218              : 
     219              : /**
     220              :  * Main function that will tell the interpreter what commands to
     221              :  * run.
     222              :  *
     223              :  * @param cls closure
     224              :  */
     225              : static void
     226            2 : run (void *cls,
     227              :      struct TALER_TESTING_Interpreter *is)
     228              : {
     229              :   struct TALER_TESTING_Command get_private_order_id[] = {
     230            2 :     TALER_TESTING_cmd_merchant_post_instances (
     231              :       "instance-create-admin",
     232              :       merchant_url,
     233              :       "admin",
     234              :       MHD_HTTP_NO_CONTENT),
     235            2 :     TALER_TESTING_cmd_merchant_post_account (
     236              :       "instance-create-default-account",
     237              :       merchant_url,
     238              :       merchant_payto,
     239              :       NULL, NULL,
     240              :       MHD_HTTP_OK),
     241            2 :     TALER_TESTING_cmd_merchant_kyc_get (
     242              :       "instance-create-kyc-0",
     243              :       merchant_url,
     244              :       NULL,
     245              :       NULL,
     246              :       EXCHANGE_URL,
     247              :       TALER_EXCHANGE_KLPT_NONE,
     248              :       MHD_HTTP_NO_CONTENT,
     249              :       false),
     250            2 :     TALER_TESTING_cmd_merchant_post_orders_no_claim (
     251              :       "create-proposal-bad-currency",
     252              :       merchant_url,
     253              :       MHD_HTTP_CONFLICT,
     254              :       "4",
     255            2 :       GNUNET_TIME_UNIT_ZERO_TS,
     256            2 :       GNUNET_TIME_UNIT_FOREVER_TS,
     257              :       "XXX:5.0"),
     258            2 :     TALER_TESTING_cmd_merchant_post_orders_no_claim (
     259              :       "create-proposal-4",
     260              :       merchant_url,
     261              :       MHD_HTTP_OK,
     262              :       "4",
     263            2 :       GNUNET_TIME_UNIT_ZERO_TS,
     264            2 :       GNUNET_TIME_UNIT_FOREVER_TS,
     265              :       "EUR:5.0"),
     266            2 :     TALER_TESTING_cmd_merchant_get_order (
     267              :       "get-order-4",
     268              :       merchant_url,
     269              :       "create-proposal-4",
     270              :       TALER_MERCHANT_OSC_UNPAID,
     271              :       false,
     272              :       MHD_HTTP_OK,
     273              :       NULL),
     274            2 :     TALER_TESTING_cmd_merchant_delete_order (
     275              :       "delete-order-4",
     276              :       merchant_url,
     277              :       "4",
     278              :       MHD_HTTP_NO_CONTENT),
     279            2 :     TALER_TESTING_cmd_merchant_purge_instance (
     280              :       "purge-admin",
     281              :       merchant_url,
     282              :       "admin",
     283              :       MHD_HTTP_NO_CONTENT),
     284            2 :     TALER_TESTING_cmd_end ()
     285              :   };
     286              : 
     287              :   struct TALER_TESTING_Command pay[] = {
     288              :     /**
     289              :      * Move money to the exchange's bank account.
     290              :      */
     291            2 :     cmd_transfer_to_exchange ("create-reserve-1",
     292              :                               "EUR:10.02"),
     293              :     /**
     294              :      * Make a reserve exist, according to the previous transfer.
     295              :      */
     296            2 :     cmd_exec_wirewatch ("wirewatch-1"),
     297            2 :     TALER_TESTING_cmd_check_bank_admin_transfer ("check_bank_transfer-2",
     298              :                                                  "EUR:10.02",
     299              :                                                  payer_payto,
     300              :                                                  exchange_payto,
     301              :                                                  "create-reserve-1"),
     302            2 :     TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-1",
     303              :                                        "create-reserve-1",
     304              :                                        "EUR:5",
     305              :                                        0,
     306              :                                        MHD_HTTP_OK),
     307            2 :     TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-2",
     308              :                                        "create-reserve-1",
     309              :                                        "EUR:5",
     310              :                                        0,
     311              :                                        MHD_HTTP_OK),
     312            2 :     TALER_TESTING_cmd_merchant_get_orders ("get-orders-empty",
     313              :                                            merchant_url,
     314              :                                            MHD_HTTP_OK,
     315              :                                            NULL),
     316              :     /**
     317              :      * Check the reserve is depleted.
     318              :      */
     319            2 :     TALER_TESTING_cmd_status ("withdraw-status-1",
     320              :                               "create-reserve-1",
     321              :                               "EUR:0",
     322              :                               MHD_HTTP_OK),
     323            2 :     TALER_TESTING_cmd_merchant_delete_order ("delete-order-nx",
     324              :                                              merchant_url,
     325              :                                              "1",
     326              :                                              MHD_HTTP_NOT_FOUND),
     327            2 :     TALER_TESTING_cmd_poll_orders_start ("poll-orders-1-start",
     328              :                                          merchant_url,
     329              :                                          POLL_ORDER_TIMEOUT),
     330            2 :     TALER_TESTING_cmd_merchant_claim_order ("claim-order-nx",
     331              :                                             merchant_url,
     332              :                                             MHD_HTTP_NOT_FOUND,
     333              :                                             NULL,
     334              :                                             "1"),
     335            2 :     TALER_TESTING_cmd_merchant_post_orders2 ("create-proposal-1",
     336            2 :                                              cred.cfg,
     337              :                                              merchant_url,
     338              :                                              MHD_HTTP_OK,
     339              :                                              "1",
     340            2 :                                              GNUNET_TIME_UNIT_ZERO_TS,
     341            2 :                                              GNUNET_TIME_UNIT_FOREVER_TS,
     342              :                                              true,
     343              :                                              "EUR:5.0",
     344              :                                              "x-taler-bank",
     345              :                                              "",
     346              :                                              "",
     347              :                                              NULL),
     348            2 :     TALER_TESTING_cmd_merchant_post_webhooks ("post-webhooks-pay-w1",
     349              :                                               merchant_url,
     350              :                                               "webhook-pay-1",
     351              :                                               "pay",
     352              :                                               MHD_HTTP_NO_CONTENT),
     353            2 :     TALER_TESTING_cmd_testserver ("launch-http-server-for-webhooks",
     354              :                                   12345),
     355            2 :     TALER_TESTING_cmd_merchant_post_orders2 ("create-proposal-1-idem",
     356            2 :                                              cred.cfg,
     357              :                                              merchant_url,
     358              :                                              MHD_HTTP_OK,
     359              :                                              "1",
     360            2 :                                              GNUNET_TIME_UNIT_ZERO_TS,
     361            2 :                                              GNUNET_TIME_UNIT_FOREVER_TS,
     362              :                                              true,
     363              :                                              "EUR:5.0",
     364              :                                              "x-taler-bank",
     365              :                                              "",
     366              :                                              "",
     367              :                                              "create-proposal-1"),
     368            2 :     TALER_TESTING_cmd_merchant_post_orders2 ("create-proposal-1x",
     369            2 :                                              cred.cfg,
     370              :                                              merchant_url,
     371              :                                              MHD_HTTP_OK,
     372              :                                              "1x",
     373            2 :                                              GNUNET_TIME_UNIT_ZERO_TS,
     374            2 :                                              GNUNET_TIME_UNIT_FOREVER_TS,
     375              :                                              true,
     376              :                                              "EUR:5.0",
     377              :                                              "x-taler-bank",
     378              :                                              "",
     379              :                                              "",
     380              :                                              NULL),
     381            2 :     TALER_TESTING_cmd_merchant_claim_order ("reclaim-1",
     382              :                                             merchant_url,
     383              :                                             MHD_HTTP_OK,
     384              :                                             "create-proposal-1",
     385              :                                             NULL),
     386            2 :     TALER_TESTING_cmd_merchant_claim_order ("reclaim-1-bad-nonce",
     387              :                                             merchant_url,
     388              :                                             MHD_HTTP_CONFLICT,
     389              :                                             NULL,
     390              :                                             "1"),
     391            2 :     TALER_TESTING_cmd_merchant_claim_order ("reclaim-1x",
     392              :                                             merchant_url,
     393              :                                             MHD_HTTP_OK,
     394              :                                             "create-proposal-1x",
     395              :                                             NULL),
     396            2 :     TALER_TESTING_cmd_merchant_post_orders ("create-proposal-1-pre-exists",
     397            2 :                                             cred.cfg,
     398              :                                             merchant_url,
     399              :                                             MHD_HTTP_CONFLICT,
     400              :                                             "1",
     401            2 :                                             GNUNET_TIME_UNIT_ZERO_TS,
     402            2 :                                             GNUNET_TIME_UNIT_FOREVER_TS,
     403              :                                             "EUR:5.0"),
     404            2 :     TALER_TESTING_cmd_poll_orders_conclude ("poll-orders-1-conclude",
     405              :                                             MHD_HTTP_OK,
     406              :                                             "poll-orders-1-start"),
     407            2 :     TALER_TESTING_cmd_merchant_get_orders ("get-orders-1",
     408              :                                            merchant_url,
     409              :                                            MHD_HTTP_OK,
     410              :                                            "create-proposal-1x",
     411              :                                            "create-proposal-1",
     412              :                                            NULL),
     413            2 :     TALER_TESTING_cmd_wallet_get_order ("get-order-wallet-1",
     414              :                                         merchant_url,
     415              :                                         "create-proposal-1",
     416              :                                         false,
     417              :                                         false,
     418              :                                         false,
     419              :                                         MHD_HTTP_PAYMENT_REQUIRED),
     420            2 :     TALER_TESTING_cmd_merchant_get_order ("get-order-merchant-1",
     421              :                                           merchant_url,
     422              :                                           "create-proposal-1",
     423              :                                           TALER_MERCHANT_OSC_CLAIMED,
     424              :                                           false,
     425              :                                           MHD_HTTP_OK,
     426              :                                           NULL),
     427            2 :     TALER_TESTING_cmd_wallet_poll_order_start ("poll-order-wallet-start-1",
     428              :                                                merchant_url,
     429              :                                                "create-proposal-1",
     430              :                                                POLL_ORDER_TIMEOUT,
     431              :                                                NULL),
     432            2 :     TALER_TESTING_cmd_wallet_poll_order_start2 ("poll-order-wallet-start-1x",
     433              :                                                 merchant_url,
     434              :                                                 "create-proposal-1x",
     435              :                                                 POLL_ORDER_SHORT_TIMEOUT,
     436              :                                                 NULL, /* no refund */
     437              :                                                 "session-0"),
     438            2 :     TALER_TESTING_cmd_poll_order_start ("poll-order-merchant-1-start",
     439              :                                         merchant_url,
     440              :                                         "1",
     441              :                                         POLL_ORDER_TIMEOUT),
     442            2 :     TALER_TESTING_cmd_merchant_pay_order ("deposit-simple",
     443              :                                           merchant_url,
     444              :                                           MHD_HTTP_OK,
     445              :                                           "create-proposal-1",
     446              :                                           "withdraw-coin-1",
     447              :                                           "EUR:5",
     448              :                                           "EUR:4.99",
     449              :                                           "session-0"),
     450            2 :     TALER_TESTING_cmd_poll_order_conclude ("poll-order-merchant-1-conclude",
     451              :                                            MHD_HTTP_OK,
     452              :                                            "poll-order-merchant-1-start"),
     453            2 :     TALER_TESTING_cmd_wallet_poll_order_conclude ("poll-order-1-conclude",
     454              :                                                   MHD_HTTP_OK,
     455              :                                                   NULL,
     456              :                                                   "poll-order-wallet-start-1"),
     457              :     /* Check for webhook */
     458            2 :     cmd_webhook ("pending-webhooks-pay-w1"),
     459              :     /* Check webhook did anything: have a command that inspects traits of the testserver
     460              :        and check if the traits have the right values set! */
     461            2 :     TALER_TESTING_cmd_checkserver ("check-http-server-for-webhooks",
     462              :                                    "launch-http-server-for-webhooks",
     463              :                                    0),
     464              :     /* Here we expect to run into a timeout, as we do not pay this one */
     465            2 :     TALER_TESTING_cmd_wallet_poll_order_conclude2 ("poll-order-1x-conclude",
     466              :                                                    MHD_HTTP_PAYMENT_REQUIRED,
     467              :                                                    NULL,
     468              :                                                    "poll-order-wallet-start-1x",
     469              :                                                    "1"),
     470            2 :     TALER_TESTING_cmd_merchant_post_orders_paid ("verify-order-1-paid",
     471              :                                                  merchant_url,
     472              :                                                  "deposit-simple",
     473              :                                                  "session-1",
     474              :                                                  MHD_HTTP_OK),
     475            2 :     TALER_TESTING_cmd_wallet_get_order ("get-order-wallet-1-2",
     476              :                                         merchant_url,
     477              :                                         "create-proposal-1",
     478              :                                         true,
     479              :                                         false,
     480              :                                         false,
     481              :                                         MHD_HTTP_OK),
     482            2 :     TALER_TESTING_cmd_merchant_get_order ("get-order-merchant-1-2a",
     483              :                                           merchant_url,
     484              :                                           "create-proposal-1",
     485              :                                           TALER_MERCHANT_OSC_PAID,
     486              :                                           false,
     487              :                                           MHD_HTTP_OK,
     488              :                                           NULL),
     489            2 :     TALER_TESTING_cmd_merchant_get_orders ("get-orders-1-paid",
     490              :                                            merchant_url,
     491              :                                            MHD_HTTP_OK,
     492              :                                            "create-proposal-1x",
     493              :                                            "create-proposal-1",
     494              :                                            NULL),
     495            2 :     TALER_TESTING_cmd_merchant_pay_order ("replay-simple",
     496              :                                           merchant_url,
     497              :                                           MHD_HTTP_OK,
     498              :                                           "create-proposal-1",
     499              :                                           "withdraw-coin-1",
     500              :                                           "EUR:5",
     501              :                                           "EUR:4.99",
     502              :                                           "session-0"),
     503            2 :     TALER_TESTING_cmd_check_bank_empty ("check_bank_empty-1"),
     504            2 :     TALER_TESTING_cmd_sleep (
     505              :       "Wait for wire transfer deadline",
     506              :       3),
     507            2 :     CMD_EXEC_AGGREGATOR ("run-aggregator"),
     508            2 :     TALER_TESTING_cmd_check_bank_transfer ("check_bank_transfer-498c",
     509              :                                            EXCHANGE_URL,
     510              :                                            "EUR:4.98",
     511              :                                            exchange_payto,
     512              :                                            merchant_payto),
     513            2 :     TALER_TESTING_cmd_merchant_post_transfer ("post-transfer-1",
     514              :                                               &cred.ba,
     515              :                                               merchant_payto,
     516              :                                               merchant_url,
     517              :                                               "EUR:4.98",
     518              :                                               MHD_HTTP_NO_CONTENT,
     519              :                                               "deposit-simple",
     520              :                                               NULL),
     521            2 :     TALER_TESTING_cmd_depositcheck ("run taler-merchant-depositcheck-1",
     522              :                                     config_file),
     523            2 :     TALER_TESTING_cmd_run_tme ("run taler-merchant-reconciliation-1",
     524              :                                config_file),
     525            2 :     TALER_TESTING_cmd_merchant_post_transfer2 ("post-transfer-bad",
     526              :                                                merchant_url,
     527              :                                                merchant_payto,
     528              :                                                "EUR:4.98",
     529              :                                                NULL,
     530              :                                                /*non-routable IP address
     531              :                                                so we are sure to not get
     532              :                                                any reply*/
     533              :                                                "http://192.0.2.1/404/",
     534              :                                                MHD_HTTP_NO_CONTENT),
     535            2 :     TALER_TESTING_cmd_merchant_get_transfers ("get-transfers-1",
     536              :                                               merchant_url,
     537              :                                               merchant_payto,
     538              :                                               MHD_HTTP_OK,
     539              :                                               "post-transfer-1",
     540              :                                               "post-transfer-bad",
     541              :                                               NULL),
     542            2 :     TALER_TESTING_cmd_merchant_delete_transfer ("delete-transfer-1",
     543              :                                                 merchant_url,
     544              :                                                 "post-transfer-bad",
     545              :                                                 MHD_HTTP_NO_CONTENT),
     546            2 :     TALER_TESTING_cmd_merchant_get_order2 ("get-order-merchant-1-2b",
     547              :                                            merchant_url,
     548              :                                            "create-proposal-1",
     549              :                                            TALER_MERCHANT_OSC_PAID,
     550              :                                            true,
     551              :                                            order_1_transfers, /* "post-transfer-1" */
     552              :                                            false,
     553              :                                            NULL,
     554              :                                            NULL,
     555              :                                            MHD_HTTP_OK),
     556            2 :     TALER_TESTING_cmd_merchant_forget_order ("forget-1",
     557              :                                              merchant_url,
     558              :                                              MHD_HTTP_NO_CONTENT,
     559              :                                              "create-proposal-1",
     560              :                                              NULL,
     561              :                                              "$.dummy_obj",
     562              :                                              NULL),
     563            2 :     TALER_TESTING_cmd_merchant_get_order2 ("get-order-merchant-1-forget-1",
     564              :                                            merchant_url,
     565              :                                            "create-proposal-1",
     566              :                                            TALER_MERCHANT_OSC_PAID,
     567              :                                            true,
     568              :                                            order_1_transfers,
     569              :                                            false,
     570              :                                            NULL,
     571              :                                            order_1_forgets_1,
     572              :                                            MHD_HTTP_OK),
     573            2 :     TALER_TESTING_cmd_merchant_forget_order ("forget-unforgettable",
     574              :                                              merchant_url,
     575              :                                              MHD_HTTP_CONFLICT,
     576              :                                              "create-proposal-1",
     577              :                                              NULL,
     578              :                                              "$.amount",
     579              :                                              NULL),
     580            2 :     TALER_TESTING_cmd_merchant_forget_order ("forget-order-nx",
     581              :                                              merchant_url,
     582              :                                              MHD_HTTP_NOT_FOUND,
     583              :                                              NULL,
     584              :                                              "nx-order",
     585              :                                              "$.dummy_obj",
     586              :                                              NULL),
     587            2 :     TALER_TESTING_cmd_merchant_forget_order ("forget-order-array-elem",
     588              :                                              merchant_url,
     589              :                                              MHD_HTTP_NO_CONTENT,
     590              :                                              "create-proposal-1",
     591              :                                              NULL,
     592              :                                              "$.dummy_array[0].item",
     593              :                                              NULL),
     594            2 :     TALER_TESTING_cmd_merchant_get_order2 ("get-order-merchant-1-forget-2",
     595              :                                            merchant_url,
     596              :                                            "create-proposal-1",
     597              :                                            TALER_MERCHANT_OSC_PAID,
     598              :                                            true,
     599              :                                            order_1_transfers,
     600              :                                            false,
     601              :                                            NULL,
     602              :                                            order_1_forgets_2,
     603              :                                            MHD_HTTP_OK),
     604            2 :     TALER_TESTING_cmd_merchant_forget_order ("forget-order-array-wc",
     605              :                                              merchant_url,
     606              :                                              MHD_HTTP_NO_CONTENT,
     607              :                                              "create-proposal-1",
     608              :                                              NULL,
     609              :                                              "$.dummy_array[*].item",
     610              :                                              NULL),
     611            2 :     TALER_TESTING_cmd_merchant_get_order2 ("get-order-merchant-1-forget-3",
     612              :                                            merchant_url,
     613              :                                            "create-proposal-1",
     614              :                                            TALER_MERCHANT_OSC_PAID,
     615              :                                            true,
     616              :                                            order_1_transfers,
     617              :                                            false,
     618              :                                            NULL,
     619              :                                            order_1_forgets_3,
     620              :                                            MHD_HTTP_OK),
     621            2 :     TALER_TESTING_cmd_merchant_forget_order ("forget-order-malformed",
     622              :                                              merchant_url,
     623              :                                              MHD_HTTP_BAD_REQUEST,
     624              :                                              "create-proposal-1",
     625              :                                              NULL,
     626              :                                              "$.dummy_array[abc].item",
     627              :                                              NULL),
     628            2 :     TALER_TESTING_cmd_merchant_post_products ("post-products-p3",
     629              :                                               merchant_url,
     630              :                                               "product-3",
     631              :                                               "a product",
     632              :                                               "EUR:1",
     633              :                                               MHD_HTTP_NO_CONTENT),
     634            2 :     TALER_TESTING_cmd_merchant_post_products2 ("post-products-p4",
     635              :                                                merchant_url,
     636              :                                                "product-4age",
     637              :                                                "an age-restricted product",
     638              :                                                NULL,
     639              :                                                "unit",
     640              :                                                "EUR:1",
     641              :                                                "", /* image */
     642              :                                                NULL,
     643              :                                                4,
     644              :                                                16 /* minimum age */,
     645              :                                                NULL,
     646            2 :                                                GNUNET_TIME_UNIT_FOREVER_TS,
     647              :                                                MHD_HTTP_NO_CONTENT),
     648            2 :     TALER_TESTING_cmd_merchant_post_products3 ("post-products-frac",
     649              :                                                merchant_url,
     650              :                                                "product-frac",
     651              :                                                "fractional product",
     652              :                                                json_pack ("{s:s}",
     653              :                                                           "en",
     654              :                                                           "fractional product"),
     655              :                                                "kg",
     656              :                                                "EUR:1.5",
     657              :                                                "",
     658              :                                                json_array (),
     659              :                                                1,
     660              :                                                (MERCHANT_UNIT_FRAC_BASE * 3)
     661              :                                                / 4,
     662              :                                                true,
     663              :                                                0,
     664              :                                                NULL,
     665            2 :                                                GNUNET_TIME_UNIT_ZERO_TS,
     666              :                                                MHD_HTTP_NO_CONTENT),
     667            2 :     TALER_TESTING_cmd_merchant_get_product ("get-product-frac-post",
     668              :                                             merchant_url,
     669              :                                             "product-frac",
     670              :                                             MHD_HTTP_OK,
     671              :                                             "post-products-frac"),
     672            2 :     TALER_TESTING_cmd_merchant_patch_product ("patch-products-p3",
     673              :                                               merchant_url,
     674              :                                               "product-3",
     675              :                                               "a product",
     676              :                                               json_object (),
     677              :                                               "can",
     678              :                                               "EUR:1",
     679              :                                               "data:image/jpeg;base64,RAWDATA",
     680              :                                               json_array (),
     681              :                                               5,
     682              :                                               0,
     683              :                                               json_object (),
     684              :                                               GNUNET_TIME_relative_to_timestamp
     685              :                                               (
     686              :                                                 GNUNET_TIME_UNIT_MINUTES),
     687              :                                               MHD_HTTP_NO_CONTENT),
     688            2 :     TALER_TESTING_cmd_merchant_patch_product2 ("patch-product-frac",
     689              :                                                merchant_url,
     690              :                                                "product-frac",
     691              :                                                "fractional product patched",
     692              :                                                json_pack ("{s:s}",
     693              :                                                           "en",
     694              :                                                           "fractional product patched"),
     695              :                                                "kg",
     696              :                                                "EUR:1.6",
     697              :                                                "",
     698              :                                                json_array (),
     699              :                                                2,
     700              :                                                MERCHANT_UNIT_FRAC_BASE / 4,
     701              :                                                true,
     702              :                                                0,
     703              :                                                json_object (),
     704              :                                                GNUNET_TIME_relative_to_timestamp (
     705              :                                                  GNUNET_TIME_UNIT_MINUTES),
     706              :                                                MHD_HTTP_NO_CONTENT),
     707            2 :     TALER_TESTING_cmd_merchant_get_product ("get-product-frac-patched",
     708              :                                             merchant_url,
     709              :                                             "product-frac",
     710              :                                             MHD_HTTP_OK,
     711              :                                             "patch-product-frac"),
     712            2 :     TALER_TESTING_cmd_merchant_delete_unit ("delete-unit-piece-denied",
     713              :                                             merchant_url,
     714              :                                             "Piece",
     715              :                                             MHD_HTTP_CONFLICT),
     716            2 :     TALER_TESTING_cmd_merchant_post_units ("post-unit-piece-conflict",
     717              :                                            merchant_url,
     718              :                                            "Piece",
     719              :                                            "piece",
     720              :                                            "pc",
     721              :                                            false,
     722              :                                            0,
     723              :                                            true,
     724              :                                            NULL,
     725              :                                            NULL,
     726              :                                            MHD_HTTP_CONFLICT),
     727            2 :     TALER_TESTING_cmd_merchant_post_units ("post-unit-bucket",
     728              :                                            merchant_url,
     729              :                                            "BucketCustomUnit",
     730              :                                            "bucket",
     731              :                                            "bkt",
     732              :                                            false,
     733              :                                            0,
     734              :                                            true,
     735              :                                            json_pack ("{s:s}", "en", "bucket"),
     736              :                                            json_pack ("{s:s}", "en", "bkt"),
     737              :                                            MHD_HTTP_NO_CONTENT),
     738            2 :     TALER_TESTING_cmd_merchant_get_unit ("get-unit-bucket",
     739              :                                          merchant_url,
     740              :                                          "BucketCustomUnit",
     741              :                                          MHD_HTTP_OK,
     742              :                                          "post-unit-bucket"),
     743            2 :     TALER_TESTING_cmd_merchant_get_units ("get-units-bucket-list",
     744              :                                           merchant_url,
     745              :                                           MHD_HTTP_OK,
     746              :                                           "post-unit-bucket",
     747              :                                           NULL),
     748            2 :     TALER_TESTING_cmd_merchant_patch_unit ("patch-unit-bucket",
     749              :                                            merchant_url,
     750              :                                            "BucketCustomUnit",
     751              :                                            "bucket-updated",
     752              :                                            "bkt-upd",
     753              :                                            json_pack ("{s:s}", "en",
     754              :                                                       "bucket-updated"),
     755              :                                            json_pack ("{s:s}", "en", "bkt-upd"),
     756              :                                            true,
     757              :                                            0,
     758              :                                            false,
     759              :                                            MHD_HTTP_NO_CONTENT),
     760            2 :     TALER_TESTING_cmd_merchant_get_unit ("get-unit-bucket-patched",
     761              :                                          merchant_url,
     762              :                                          "BucketCustomUnit",
     763              :                                          MHD_HTTP_OK,
     764              :                                          "patch-unit-bucket"),
     765            2 :     TALER_TESTING_cmd_merchant_get_units ("get-units-bucket-updated",
     766              :                                           merchant_url,
     767              :                                           MHD_HTTP_OK,
     768              :                                           "patch-unit-bucket",
     769              :                                           NULL),
     770            2 :     TALER_TESTING_cmd_merchant_delete_unit ("delete-unit-bucket",
     771              :                                             merchant_url,
     772              :                                             "BucketCustomUnit",
     773              :                                             MHD_HTTP_NO_CONTENT),
     774            2 :     TALER_TESTING_cmd_merchant_get_unit ("get-unit-bucket-deleted",
     775              :                                          merchant_url,
     776              :                                          "BucketCustomUnit",
     777              :                                          MHD_HTTP_NOT_FOUND,
     778              :                                          NULL),
     779            2 :     TALER_TESTING_cmd_merchant_post_units ("post-unit-unicorn",
     780              :                                            merchant_url,
     781              :                                            "UnitUnicorn",
     782              :                                            "unicorn",
     783              :                                            "uni",
     784              :                                            true,
     785              :                                            1,
     786              :                                            true,
     787              :                                            json_pack ("{s:s}", "en", "unicorn"),
     788              :                                            json_pack ("{s:s}", "en", "uni"),
     789              :                                            MHD_HTTP_NO_CONTENT),
     790            2 :     TALER_TESTING_cmd_merchant_post_products2 ("post-product-unicorn",
     791              :                                                merchant_url,
     792              :                                                "product-unicorn",
     793              :                                                "a unicorn snack",
     794              :                                                json_pack ("{s:s}",
     795              :                                                           "en",
     796              :                                                           "a unicorn snack"),
     797              :                                                "UnitUnicorn",
     798              :                                                "EUR:3.5",
     799              :                                                "",
     800              :                                                json_array (),
     801              :                                                7,
     802              :                                                0,
     803              :                                                json_object (),
     804            2 :                                                GNUNET_TIME_UNIT_ZERO_TS,
     805              :                                                MHD_HTTP_NO_CONTENT),
     806            2 :     TALER_TESTING_cmd_merchant_get_product2 ("get-product-unicorn-default",
     807              :                                              merchant_url,
     808              :                                              "product-unicorn",
     809              :                                              MHD_HTTP_OK,
     810              :                                              "post-product-unicorn",
     811              :                                              &expect_unicorn_defaults),
     812            2 :     TALER_TESTING_cmd_merchant_patch_unit ("patch-unit-unicorn",
     813              :                                            merchant_url,
     814              :                                            "UnitUnicorn",
     815              :                                            NULL,
     816              :                                            NULL,
     817              :                                            NULL,
     818              :                                            NULL,
     819              :                                            false,
     820              :                                            0,
     821              :                                            true,
     822              :                                            MHD_HTTP_NO_CONTENT),
     823            2 :     TALER_TESTING_cmd_merchant_get_product2 ("get-product-unicorn-patched",
     824              :                                              merchant_url,
     825              :                                              "product-unicorn",
     826              :                                              MHD_HTTP_OK,
     827              :                                              "post-product-unicorn",
     828              :                                              &expect_unicorn_patched),
     829            2 :     TALER_TESTING_cmd_merchant_delete_product ("delete-product-unicorn",
     830              :                                                merchant_url,
     831              :                                                "product-unicorn",
     832              :                                                MHD_HTTP_NO_CONTENT),
     833            2 :     TALER_TESTING_cmd_merchant_delete_unit ("delete-unit-unicorn",
     834              :                                             merchant_url,
     835              :                                             "UnitUnicorn",
     836              :                                             MHD_HTTP_NO_CONTENT),
     837            2 :     TALER_TESTING_cmd_merchant_lock_product ("lock-product-p3",
     838              :                                              merchant_url,
     839              :                                              "product-3",
     840              :                                              GNUNET_TIME_UNIT_MINUTES,
     841              :                                              2,
     842              :                                              MHD_HTTP_NO_CONTENT),
     843            2 :     TALER_TESTING_cmd_merchant_lock_product2 (
     844              :       "lock-product-p3-float-denied",
     845              :       merchant_url,
     846              :       "product-3",
     847              :       GNUNET_TIME_UNIT_MINUTES,
     848              :       1,
     849              :       MERCHANT_UNIT_FRAC_BASE / 2,
     850              :       true,
     851              :       MHD_HTTP_BAD_REQUEST),
     852            2 :     TALER_TESTING_cmd_merchant_post_orders2 ("create-proposal-p3-float-denied",
     853            2 :                                              cred.cfg,
     854              :                                              merchant_url,
     855              :                                              MHD_HTTP_BAD_REQUEST,
     856              :                                              "order-p3-float-denied",
     857            2 :                                              GNUNET_TIME_UNIT_ZERO_TS,
     858            2 :                                              GNUNET_TIME_UNIT_FOREVER_TS,
     859              :                                              true,
     860              :                                              "EUR:5.0",
     861              :                                              "x-taler-bank",
     862              :                                              "product-3/1.5",
     863              :                                              "",
     864              :                                              NULL),
     865            2 :     TALER_TESTING_cmd_merchant_patch_product2 (
     866              :       "patch-product-3-allow-float",
     867              :       merchant_url,
     868              :       "product-3",
     869              :       "a product allow fractional",
     870              :       json_pack ("{s:s}",
     871              :                  "en",
     872              :                  "a product allow fractional"),
     873              :       "can",
     874              :       "EUR:1",
     875              :       "data:image/jpeg;base64,RAWDATA",
     876              :       json_array (),
     877              :       5,
     878              :       0,
     879              :       true,
     880              :       0,
     881              :       json_object (),
     882              :       GNUNET_TIME_relative_to_timestamp (GNUNET_TIME_UNIT_MINUTES),
     883              :       MHD_HTTP_NO_CONTENT),
     884            2 :     cmd_transfer_to_exchange ("create-reserve-p3-float",
     885              :                               "EUR:5.01"),
     886            2 :     cmd_exec_wirewatch ("wirewatch-p3-float"),
     887            2 :     TALER_TESTING_cmd_check_bank_admin_transfer (
     888              :       "check_bank_transfer-p3-float",
     889              :       "EUR:5.01",
     890              :       payer_payto,
     891              :       exchange_payto,
     892              :       "create-reserve-p3-float"),
     893            2 :     TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-p3-float",
     894              :                                        "create-reserve-p3-float",
     895              :                                        "EUR:5",
     896              :                                        0,
     897              :                                        MHD_HTTP_OK),
     898            2 :     TALER_TESTING_cmd_merchant_lock_product2 (
     899              :       "lock-product-p3-float",
     900              :       merchant_url,
     901              :       "product-3",
     902              :       GNUNET_TIME_UNIT_MINUTES,
     903              :       1,
     904              :       MERCHANT_UNIT_FRAC_BASE / 2,
     905              :       true,
     906              :       MHD_HTTP_NO_CONTENT),
     907            2 :     TALER_TESTING_cmd_merchant_post_orders2 ("create-proposal-p3-float",
     908            2 :                                              cred.cfg,
     909              :                                              merchant_url,
     910              :                                              MHD_HTTP_OK,
     911              :                                              "order-p3-float",
     912            2 :                                              GNUNET_TIME_UNIT_ZERO_TS,
     913            2 :                                              GNUNET_TIME_UNIT_FOREVER_TS,
     914              :                                              true,
     915              :                                              "EUR:5.0",
     916              :                                              "x-taler-bank",
     917              :                                              "product-3/1.5",
     918              :                                              "",
     919              :                                              NULL),
     920            2 :     TALER_TESTING_cmd_merchant_claim_order ("claim-order-p3-float",
     921              :                                             merchant_url,
     922              :                                             MHD_HTTP_OK,
     923              :                                             "create-proposal-p3-float",
     924              :                                             NULL),
     925            2 :     TALER_TESTING_cmd_merchant_pay_order ("pay-order-p3-float",
     926              :                                           merchant_url,
     927              :                                           MHD_HTTP_OK,
     928              :                                           "create-proposal-p3-float",
     929              :                                           "withdraw-coin-p3-float",
     930              :                                           "EUR:5",
     931              :                                           "EUR:4.99",
     932              :                                           "session-p3-float"),
     933            2 :     TALER_TESTING_cmd_sleep (
     934              :       "Wait for wire transfer deadline-p3-float",
     935              :       3),
     936            2 :     CMD_EXEC_AGGREGATOR ("run-aggregator-p3-float"),
     937            2 :     TALER_TESTING_cmd_check_bank_transfer ("check_bank_transfer-p3-float",
     938              :                                            EXCHANGE_URL,
     939              :                                            "EUR:4.98",
     940              :                                            exchange_payto,
     941              :                                            merchant_payto),
     942            2 :     TALER_TESTING_cmd_merchant_get_order ("get-order-merchant-p3-float-paid",
     943              :                                           merchant_url,
     944              :                                           "create-proposal-p3-float",
     945              :                                           TALER_MERCHANT_OSC_PAID,
     946              :                                           false,
     947              :                                           MHD_HTTP_OK,
     948              :                                           NULL),
     949            2 :     TALER_TESTING_cmd_merchant_patch_product2 (
     950              :       "patch-product-3-restore",
     951              :       merchant_url,
     952              :       "product-3",
     953              :       "a product",
     954              :       json_pack ("{s:s}",
     955              :                  "en",
     956              :                  "a product"),
     957              :       "can",
     958              :       "EUR:1",
     959              :       "data:image/jpeg;base64,RAWDATA",
     960              :       json_array (),
     961              :       5,
     962              :       0,
     963              :       false,
     964              :       0,
     965              :       json_object (),
     966              :       GNUNET_TIME_relative_to_timestamp (GNUNET_TIME_UNIT_MINUTES),
     967              :       MHD_HTTP_NO_CONTENT),
     968            2 :     TALER_TESTING_cmd_merchant_post_orders2 ("create-proposal-p3-wm-nx",
     969            2 :                                              cred.cfg,
     970              :                                              merchant_url,
     971              :                                              MHD_HTTP_NOT_FOUND,
     972              :                                              "order-p3",
     973            2 :                                              GNUNET_TIME_UNIT_ZERO_TS,
     974            2 :                                              GNUNET_TIME_UNIT_FOREVER_TS,
     975              :                                              true,
     976              :                                              "EUR:5.0",
     977              :                                              "unsupported-wire-method",
     978              :                                              "product-3/2",
     979              :                                              "", /* locks */
     980              :                                              NULL),
     981            2 :     TALER_TESTING_cmd_merchant_post_orders2 ("create-proposal-p3-pd-nx",
     982            2 :                                              cred.cfg,
     983              :                                              merchant_url,
     984              :                                              MHD_HTTP_NOT_FOUND,
     985              :                                              "order-p3",
     986            2 :                                              GNUNET_TIME_UNIT_ZERO_TS,
     987            2 :                                              GNUNET_TIME_UNIT_FOREVER_TS,
     988              :                                              true,
     989              :                                              "EUR:5.0",
     990              :                                              "x-taler-bank",
     991              :                                              "unknown-product/2",
     992              :                                              "",
     993              :                                              NULL),
     994            2 :     TALER_TESTING_cmd_merchant_post_orders2 (
     995              :       "create-proposal-p3-not-enough-stock",
     996            2 :       cred.cfg,
     997              :       merchant_url,
     998              :       MHD_HTTP_GONE,
     999              :       "order-p3",
    1000            2 :       GNUNET_TIME_UNIT_ZERO_TS,
    1001            2 :       GNUNET_TIME_UNIT_FOREVER_TS,
    1002              :       true,
    1003              :       "EUR:5.0",
    1004              :       "x-taler-bank",
    1005              :       "product-3/24",
    1006              :       "",
    1007              :       NULL),
    1008            2 :     TALER_TESTING_cmd_merchant_post_orders2 ("create-proposal-p3",
    1009            2 :                                              cred.cfg,
    1010              :                                              merchant_url,
    1011              :                                              MHD_HTTP_OK,
    1012              :                                              "order-p3",
    1013            2 :                                              GNUNET_TIME_UNIT_ZERO_TS,
    1014            2 :                                              GNUNET_TIME_UNIT_FOREVER_TS,
    1015              :                                              false,
    1016              :                                              "EUR:5.0",
    1017              :                                              "x-taler-bank",
    1018              :                                              "product-3/3",
    1019              :                                              "lock-product-p3",
    1020              :                                              NULL),
    1021            2 :     TALER_TESTING_cmd_merchant_post_orders2 ("create-proposal-p4-age",
    1022            2 :                                              cred.cfg,
    1023              :                                              merchant_url,
    1024              :                                              MHD_HTTP_OK,
    1025              :                                              "order-p4-age",
    1026            2 :                                              GNUNET_TIME_UNIT_ZERO_TS,
    1027            2 :                                              GNUNET_TIME_UNIT_FOREVER_TS,
    1028              :                                              false,
    1029              :                                              "EUR:5.0",
    1030              :                                              "x-taler-bank",
    1031              :                                              "product-4age",
    1032              :                                              "", /* locks */
    1033              :                                              NULL),
    1034            2 :     TALER_TESTING_cmd_merchant_get_order4 ("get-order-merchant-p4-age",
    1035              :                                            merchant_url,
    1036              :                                            "create-proposal-p4-age",
    1037              :                                            TALER_MERCHANT_OSC_CLAIMED,
    1038              :                                            16,
    1039              :                                            MHD_HTTP_OK),
    1040            2 :     TALER_TESTING_cmd_merchant_delete_order ("delete-order-paid",
    1041              :                                              merchant_url,
    1042              :                                              "1",
    1043              :                                              MHD_HTTP_CONFLICT),
    1044            2 :     TALER_TESTING_cmd_merchant_post_orders ("create-proposal-no-id",
    1045            2 :                                             cred.cfg,
    1046              :                                             merchant_url,
    1047              :                                             MHD_HTTP_OK,
    1048              :                                             NULL,
    1049            2 :                                             GNUNET_TIME_UNIT_ZERO_TS,
    1050            2 :                                             GNUNET_TIME_UNIT_FOREVER_TS,
    1051              :                                             "EUR:5.0"),
    1052            2 :     TALER_TESTING_cmd_merchant_delete_webhook ("post-webhooks-pay-w1",
    1053              :                                                merchant_url,
    1054              :                                                "webhook-pay-1",
    1055              :                                                MHD_HTTP_NO_CONTENT),
    1056            2 :     TALER_TESTING_cmd_check_bank_empty ("check_bank_empty-2"),
    1057            2 :     TALER_TESTING_cmd_end ()
    1058              :   };
    1059              :   struct TALER_TESTING_Command double_spending[] = {
    1060            2 :     TALER_TESTING_cmd_merchant_post_orders ("create-proposal-2",
    1061            2 :                                             cred.cfg,
    1062              :                                             merchant_url,
    1063              :                                             MHD_HTTP_OK,
    1064              :                                             "2",
    1065            2 :                                             GNUNET_TIME_UNIT_ZERO_TS,
    1066            2 :                                             GNUNET_TIME_UNIT_FOREVER_TS,
    1067              :                                             "EUR:5.0"),
    1068            2 :     TALER_TESTING_cmd_merchant_claim_order ("fetch-proposal-2",
    1069              :                                             merchant_url,
    1070              :                                             MHD_HTTP_OK,
    1071              :                                             "create-proposal-2",
    1072              :                                             NULL),
    1073            2 :     TALER_TESTING_cmd_merchant_pay_order ("deposit-double-2",
    1074              :                                           merchant_url,
    1075              :                                           MHD_HTTP_CONFLICT,
    1076              :                                           "create-proposal-2",
    1077              :                                           "withdraw-coin-1",
    1078              :                                           "EUR:5",
    1079              :                                           "EUR:4.99",
    1080              :                                           NULL),
    1081            2 :     TALER_TESTING_cmd_end ()
    1082              :   };
    1083              : 
    1084            2 :   const char *order_1r_refunds[] = {
    1085              :     "refund-increase-1r",
    1086              :     "refund-increase-1r-2",
    1087              :     NULL
    1088              :   };
    1089              :   struct TALER_TESTING_Command refund[] = {
    1090            2 :     cmd_transfer_to_exchange ("create-reserve-1r",
    1091              :                               "EUR:10.02"),
    1092              :     /**
    1093              :      * Make a reserve exist, according to the previous transfer.
    1094              :      */
    1095            2 :     cmd_exec_wirewatch ("wirewatch-1r"),
    1096            2 :     TALER_TESTING_cmd_check_bank_admin_transfer ("check_bank_transfer-2r",
    1097              :                                                  "EUR:10.02",
    1098              :                                                  payer_payto,
    1099              :                                                  exchange_payto,
    1100              :                                                  "create-reserve-1r"),
    1101            2 :     TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-1r",
    1102              :                                        "create-reserve-1r",
    1103              :                                        "EUR:5",
    1104              :                                        0,
    1105              :                                        MHD_HTTP_OK),
    1106            2 :     TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-2r",
    1107              :                                        "create-reserve-1r",
    1108              :                                        "EUR:5",
    1109              :                                        0,
    1110              :                                        MHD_HTTP_OK),
    1111              :     /**
    1112              :      * Check the reserve is depleted.
    1113              :      */
    1114            2 :     TALER_TESTING_cmd_status ("withdraw-status-1r",
    1115              :                               "create-reserve-1r",
    1116              :                               "EUR:0",
    1117              :                               MHD_HTTP_OK),
    1118            2 :     TALER_TESTING_cmd_merchant_post_orders ("create-proposal-1r",
    1119            2 :                                             cred.cfg,
    1120              :                                             merchant_url,
    1121              :                                             MHD_HTTP_OK,
    1122              :                                             "1r",
    1123            2 :                                             GNUNET_TIME_UNIT_ZERO_TS,
    1124            2 :                                             GNUNET_TIME_UNIT_FOREVER_TS,
    1125              :                                             "EUR:5.0"),
    1126            2 :     TALER_TESTING_cmd_wallet_poll_order_start ("poll-order-wallet-refund-1-low",
    1127              :                                                merchant_url,
    1128              :                                                "create-proposal-1r",
    1129              :                                                POLL_ORDER_TIMEOUT,
    1130              :                                                "EUR:0.01"),
    1131            2 :     TALER_TESTING_cmd_wallet_poll_order_start (
    1132              :       "poll-order-wallet-refund-1-high",
    1133              :       merchant_url,
    1134              :       "create-proposal-1r",
    1135              :       POLL_ORDER_TIMEOUT,
    1136              :       "EUR:0.2"),
    1137            2 :     TALER_TESTING_cmd_merchant_pay_order ("pay-for-refund-1r",
    1138              :                                           merchant_url,
    1139              :                                           MHD_HTTP_OK,
    1140              :                                           "create-proposal-1r",
    1141              :                                           "withdraw-coin-1r",
    1142              :                                           "EUR:5",
    1143              :                                           "EUR:4.99",
    1144              :                                           NULL),
    1145            2 :     TALER_TESTING_cmd_poll_order_start ("poll-payment-refund-1",
    1146              :                                         merchant_url,
    1147              :                                         "1r", /* proposal name, not cmd ref! */
    1148              :                                         POLL_ORDER_TIMEOUT),
    1149            2 :     TALER_TESTING_cmd_merchant_order_refund ("refund-increase-1r",
    1150              :                                              merchant_url,
    1151              :                                              "refund test",
    1152              :                                              "1r", /* order ID */
    1153              :                                              "EUR:0.1",
    1154              :                                              MHD_HTTP_OK),
    1155            2 :     TALER_TESTING_cmd_wallet_poll_order_conclude ("poll-order-1-conclude-low",
    1156              :                                                   MHD_HTTP_OK,
    1157              :                                                   "EUR:0.1",
    1158              :                                                   "poll-order-wallet-refund-1-low"),
    1159            2 :     TALER_TESTING_cmd_wallet_get_order ("get-order-wallet-1r",
    1160              :                                         merchant_url,
    1161              :                                         "create-proposal-1r",
    1162              :                                         true,
    1163              :                                         true,
    1164              :                                         true,
    1165              :                                         MHD_HTTP_OK),
    1166            2 :     TALER_TESTING_cmd_merchant_order_refund ("refund-increase-1r-2",
    1167              :                                              merchant_url,
    1168              :                                              "refund test 2",
    1169              :                                              "1r", /* order ID */
    1170              :                                              "EUR:1.0",
    1171              :                                              MHD_HTTP_OK),
    1172            2 :     TALER_TESTING_cmd_wallet_poll_order_conclude ("poll-order-1-conclude-high",
    1173              :                                                   MHD_HTTP_OK,
    1174              :                                                   "EUR:1.0",
    1175              :                                                   "poll-order-wallet-refund-1-high"),
    1176            2 :     TALER_TESTING_cmd_wallet_get_order ("get-order-wallet-1r-2",
    1177              :                                         merchant_url,
    1178              :                                         "create-proposal-1r",
    1179              :                                         true,
    1180              :                                         true,
    1181              :                                         true,
    1182              :                                         MHD_HTTP_OK),
    1183            2 :     TALER_TESTING_cmd_wallet_order_refund ("obtain-refund-1r",
    1184              :                                            merchant_url,
    1185              :                                            "create-proposal-1r",
    1186              :                                            MHD_HTTP_OK,
    1187              :                                            "refund-increase-1r",
    1188              :                                            "refund-increase-1r-2",
    1189              :                                            NULL),
    1190            2 :     TALER_TESTING_cmd_wallet_get_order ("get-order-wallet-1r-3",
    1191              :                                         merchant_url,
    1192              :                                         "create-proposal-1r",
    1193              :                                         true,
    1194              :                                         true,
    1195              :                                         false,
    1196              :                                         MHD_HTTP_OK),
    1197            2 :     TALER_TESTING_cmd_merchant_get_order ("get-order-merchant-1r",
    1198              :                                           merchant_url,
    1199              :                                           "create-proposal-1r",
    1200              :                                           TALER_MERCHANT_OSC_PAID,
    1201              :                                           true,
    1202              :                                           MHD_HTTP_OK,
    1203              :                                           "refund-increase-1r",
    1204              :                                           "refund-increase-1r-2",
    1205              :                                           NULL),
    1206            2 :     TALER_TESTING_cmd_merchant_get_order2 ("get-order-merchant-1r-2",
    1207              :                                            merchant_url,
    1208              :                                            "create-proposal-1r",
    1209              :                                            TALER_MERCHANT_OSC_PAID,
    1210              :                                            false,
    1211              :                                            NULL,
    1212              :                                            true,
    1213              :                                            order_1r_refunds,
    1214              :                                            NULL,
    1215              :                                            MHD_HTTP_OK),
    1216            2 :     TALER_TESTING_cmd_poll_order_conclude ("poll-payment-refund-conclude-1",
    1217              :                                            MHD_HTTP_OK,
    1218              :                                            "poll-payment-refund-1"),
    1219              : 
    1220              :     /* Test /refund on a contract that was never paid.  */
    1221            2 :     TALER_TESTING_cmd_merchant_post_orders ("create-proposal-not-to-be-paid",
    1222            2 :                                             cred.cfg,
    1223              :                                             merchant_url,
    1224              :                                             MHD_HTTP_OK,
    1225              :                                             "1-unpaid",
    1226            2 :                                             GNUNET_TIME_UNIT_ZERO_TS,
    1227            2 :                                             GNUNET_TIME_UNIT_FOREVER_TS,
    1228              :                                             "EUR:5.0"),
    1229              :     /* Try to increase an unpaid proposal.  */
    1230            2 :     TALER_TESTING_cmd_merchant_order_refund ("refund-increase-unpaid-proposal",
    1231              :                                              merchant_url,
    1232              :                                              "refund test",
    1233              :                                              "1-unpaid",
    1234              :                                              "EUR:0.1",
    1235              :                                              MHD_HTTP_CONFLICT),
    1236              :     /* Try to increase a non existent proposal.  */
    1237            2 :     TALER_TESTING_cmd_merchant_order_refund (
    1238              :       "refund-increase-nonexistent-proposal",
    1239              :       merchant_url,
    1240              :       "refund test",
    1241              :       "non-existent-id",
    1242              :       "EUR:0.1",
    1243              :       MHD_HTTP_NOT_FOUND),
    1244              :     /*
    1245              :        The following block will (1) create a new
    1246              :        reserve, then (2) a proposal, then (3) pay for
    1247              :        it, and finally (4) attempt to pick up a refund
    1248              :        from it without any increasing taking place
    1249              :        in the first place.
    1250              :     */
    1251            2 :     cmd_transfer_to_exchange ("create-reserve-unincreased-refund",
    1252              :                               "EUR:5.01"),
    1253            2 :     cmd_exec_wirewatch ("wirewatch-unincreased-refund"),
    1254            2 :     TALER_TESTING_cmd_check_bank_admin_transfer (
    1255              :       "check_bank_transfer-unincreased-refund",
    1256              :       "EUR:5.01",
    1257              :       payer_payto,
    1258              :       exchange_payto,
    1259              :       "create-reserve-unincreased-refund"),
    1260            2 :     TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-unincreased-refund",
    1261              :                                        "create-reserve-unincreased-refund",
    1262              :                                        "EUR:5",
    1263              :                                        0,
    1264              :                                        MHD_HTTP_OK),
    1265            2 :     TALER_TESTING_cmd_merchant_post_orders (
    1266              :       "create-proposal-unincreased-refund",
    1267            2 :       cred.cfg,
    1268              :       merchant_url,
    1269              :       MHD_HTTP_OK,
    1270              :       "unincreased-proposal",
    1271            2 :       GNUNET_TIME_UNIT_ZERO_TS,
    1272            2 :       GNUNET_TIME_UNIT_FOREVER_TS,
    1273              :       "EUR:5.0"),
    1274            2 :     TALER_TESTING_cmd_merchant_pay_order ("pay-unincreased-proposal",
    1275              :                                           merchant_url,
    1276              :                                           MHD_HTTP_OK,
    1277              :                                           "create-proposal-unincreased-refund",
    1278              :                                           "withdraw-coin-unincreased-refund",
    1279              :                                           "EUR:5",
    1280              :                                           "EUR:4.99",
    1281              :                                           NULL),
    1282            2 :     TALER_TESTING_cmd_sleep (
    1283              :       "Wait for wire transfer deadline",
    1284              :       3),
    1285            2 :     CMD_EXEC_AGGREGATOR ("run-aggregator-unincreased-refund"),
    1286            2 :     TALER_TESTING_cmd_check_bank_transfer (
    1287              :       "check_bank_transfer-paid-unincreased-refund",
    1288              :       EXCHANGE_URL,
    1289              :       "EUR:8.97", /* '4.98 from above', plus 4.99 from 'pay-for-refund-1r'
    1290              :                      and MINUS 0.1 MINUS 0.9 from
    1291              :                      'refund-increase-1r' and 'refund-increase-1r-2' */
    1292              :       exchange_payto,
    1293              :       merchant_payto),
    1294            2 :     TALER_TESTING_cmd_end ()
    1295              :   };
    1296              : 
    1297              :   struct TALER_TESTING_Command auth[] = {
    1298            2 :     TALER_TESTING_cmd_merchant_post_instances ("instance-create-i1a",
    1299              :                                                merchant_url,
    1300              :                                                "i1a",
    1301              :                                                MHD_HTTP_NO_CONTENT),
    1302            2 :     TALER_TESTING_cmd_merchant_post_account (
    1303              :       "instance-create-i1a-account",
    1304              :       merchant_url_i1a,
    1305              :       merchant_payto,
    1306              :       NULL, NULL,
    1307              :       MHD_HTTP_OK),
    1308            2 :     TALER_TESTING_cmd_merchant_get_product ("get-nx-product-i1a-1",
    1309              :                                             merchant_url_i1a,
    1310              :                                             "nx-product",
    1311              :                                             MHD_HTTP_NOT_FOUND,
    1312              :                                             NULL),
    1313            2 :     TALER_TESTING_cmd_merchant_get_products ("get-i1a-products-empty-1",
    1314              :                                              merchant_url_i1a,
    1315              :                                              MHD_HTTP_OK,
    1316              :                                              NULL),
    1317            2 :     TALER_TESTING_cmd_merchant_get_product ("get-nx-product-i1a-2",
    1318              :                                             merchant_url_i1a,
    1319              :                                             "nx-product",
    1320              :                                             MHD_HTTP_NOT_FOUND,
    1321              :                                             NULL),
    1322            2 :     TALER_TESTING_cmd_merchant_get_products ("get-i1a-products-empty-2",
    1323              :                                              merchant_url_i1a,
    1324              :                                              MHD_HTTP_OK,
    1325              :                                              NULL),
    1326            2 :     TALER_TESTING_cmd_merchant_post_instance_auth (
    1327              :       "instance-create-i1a-auth-ok",
    1328              :       merchant_url,
    1329              :       "i1a",
    1330              :       "my-secret",
    1331              :       MHD_HTTP_NO_CONTENT),
    1332            2 :     TALER_TESTING_cmd_merchant_get_product ("get-nx-product-i1a-3",
    1333              :                                             merchant_url_i1a,
    1334              :                                             "nx-product",
    1335              :                                             MHD_HTTP_UNAUTHORIZED,
    1336              :                                             NULL),
    1337            2 :     TALER_TESTING_cmd_merchant_get_products ("get-i1a-products-empty-3",
    1338              :                                              merchant_url_i1a,
    1339              :                                              MHD_HTTP_UNAUTHORIZED,
    1340              :                                              NULL),
    1341            2 :     TALER_TESTING_cmd_set_authorization ("set-auth-valid",
    1342              :                                          "Basic aTFhOm15LXNlY3JldA=="),
    1343            2 :     TALER_TESTING_cmd_merchant_post_instance_token (
    1344              :       "instance-create-i1a-token-ok",
    1345              :       merchant_url,
    1346              :       "i1a",
    1347              :       "write", /* scope */
    1348              :       GNUNET_TIME_UNIT_DAYS, /* duration */
    1349              :       GNUNET_YES, /* refreshable */
    1350              :       MHD_HTTP_OK),
    1351            2 :     TALER_TESTING_cmd_set_authorization ("unset-auth-valid",
    1352              :                                          NULL), // Unset header
    1353            2 :     TALER_TESTING_cmd_merchant_set_instance_token (
    1354              :       "instance-create-i1a-token-set",
    1355              :       "instance-create-i1a-token-ok"),
    1356            2 :     TALER_TESTING_cmd_merchant_get_product ("get-nx-product-i1a-4",
    1357              :                                             merchant_url_i1a,
    1358              :                                             "nx-product",
    1359              :                                             MHD_HTTP_NOT_FOUND,
    1360              :                                             NULL),
    1361            2 :     TALER_TESTING_cmd_merchant_get_products ("get-i1a-products-empty-4",
    1362              :                                              merchant_url_i1a,
    1363              :                                              MHD_HTTP_OK,
    1364              :                                              NULL),
    1365            2 :     TALER_TESTING_cmd_merchant_delete_instance_token (
    1366              :       "instance-create-i1a-token-delete",
    1367              :       merchant_url,
    1368              :       "i1a",
    1369              :       MHD_HTTP_NO_CONTENT),
    1370            2 :     TALER_TESTING_cmd_merchant_get_product ("get-nx-product-i1a-5",
    1371              :                                             merchant_url_i1a,
    1372              :                                             "nx-product",
    1373              :                                             MHD_HTTP_UNAUTHORIZED,
    1374              :                                             NULL),
    1375            2 :     TALER_TESTING_cmd_merchant_get_products ("get-i1a-products-empty-5",
    1376              :                                              merchant_url_i1a,
    1377              :                                              MHD_HTTP_UNAUTHORIZED,
    1378              :                                              NULL),
    1379            2 :     TALER_TESTING_cmd_merchant_purge_instance ("instance-delete-i1a-fail",
    1380              :                                                merchant_url_i1a,
    1381              :                                                NULL,
    1382              :                                                MHD_HTTP_UNAUTHORIZED),
    1383            2 :     TALER_TESTING_cmd_set_authorization ("set-token-auth-valid-again",
    1384              :                                          "Basic aTFhOm15LXNlY3JldA=="),
    1385            2 :     TALER_TESTING_cmd_merchant_post_instance_token (
    1386              :       "set-auth-valid-again",
    1387              :       merchant_url,
    1388              :       "i1a",
    1389              :       "write", /* scope */
    1390              :       GNUNET_TIME_UNIT_DAYS, /* duration */
    1391              :       GNUNET_YES, /* refreshable */
    1392              :       MHD_HTTP_OK),
    1393            2 :     TALER_TESTING_cmd_set_authorization ("unset-auth-valid2",
    1394              :                                          NULL), // Unset header
    1395            2 :     TALER_TESTING_cmd_merchant_set_instance_token (
    1396              :       "instance-create-i1a-token-set-again",
    1397              :       "set-auth-valid-again"),
    1398            2 :     TALER_TESTING_cmd_merchant_post_instance_auth (
    1399              :       "instance-create-i1a-auth-ok-idempotent",
    1400              :       merchant_url_i1a,
    1401              :       NULL,
    1402              :       RFC_8959_PREFIX "my-other-secret",
    1403              :       MHD_HTTP_NO_CONTENT),
    1404            2 :     TALER_TESTING_cmd_merchant_post_instance_auth (
    1405              :       "instance-create-i1a-clear-auth",
    1406              :       merchant_url_i1a,
    1407              :       NULL,
    1408              :       NULL,
    1409              :       MHD_HTTP_NO_CONTENT),
    1410            2 :     TALER_TESTING_cmd_set_authorization ("set-auth-none",
    1411              :                                          NULL),
    1412            2 :     TALER_TESTING_cmd_merchant_purge_instance ("instance-delete-i1a",
    1413              :                                                merchant_url_i1a,
    1414              :                                                NULL,
    1415              :                                                MHD_HTTP_NO_CONTENT),
    1416            2 :     TALER_TESTING_cmd_end ()
    1417              :   };
    1418              : 
    1419              :   struct TALER_TESTING_Command pay_again[] = {
    1420            2 :     cmd_transfer_to_exchange ("create-reserve-20",
    1421              :                               "EUR:20.04"),
    1422            2 :     cmd_exec_wirewatch ("wirewatch-20"),
    1423            2 :     TALER_TESTING_cmd_check_bank_admin_transfer ("check_bank_transfer-10",
    1424              :                                                  "EUR:20.04",
    1425              :                                                  payer_payto,
    1426              :                                                  exchange_payto,
    1427              :                                                  "create-reserve-20"),
    1428            2 :     TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-10a",
    1429              :                                        "create-reserve-20",
    1430              :                                        "EUR:5",
    1431              :                                        0,
    1432              :                                        MHD_HTTP_OK),
    1433            2 :     TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-10b",
    1434              :                                        "create-reserve-20",
    1435              :                                        "EUR:5",
    1436              :                                        0,
    1437              :                                        MHD_HTTP_OK),
    1438            2 :     TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-10c",
    1439              :                                        "create-reserve-20",
    1440              :                                        "EUR:5",
    1441              :                                        0,
    1442              :                                        MHD_HTTP_OK),
    1443            2 :     TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-10d",
    1444              :                                        "create-reserve-20",
    1445              :                                        "EUR:5",
    1446              :                                        0,
    1447              :                                        MHD_HTTP_OK),
    1448            2 :     TALER_TESTING_cmd_status ("withdraw-status-20",
    1449              :                               "create-reserve-20",
    1450              :                               "EUR:0",
    1451              :                               MHD_HTTP_OK),
    1452            2 :     TALER_TESTING_cmd_merchant_post_orders ("create-proposal-10",
    1453            2 :                                             cred.cfg,
    1454              :                                             merchant_url,
    1455              :                                             MHD_HTTP_OK,
    1456              :                                             "10",
    1457            2 :                                             GNUNET_TIME_UNIT_ZERO_TS,
    1458            2 :                                             GNUNET_TIME_UNIT_FOREVER_TS,
    1459              :                                             "EUR:10.0"),
    1460            2 :     TALER_TESTING_cmd_merchant_pay_order ("pay-fail-partial-double-10",
    1461              :                                           merchant_url,
    1462              :                                           MHD_HTTP_CONFLICT,
    1463              :                                           "create-proposal-10",
    1464              :                                           "withdraw-coin-10a;withdraw-coin-1",
    1465              :                                           "EUR:5",
    1466              :                                           "EUR:4.99",
    1467              :                                           NULL),
    1468            2 :     TALER_TESTING_cmd_merchant_pay_order ("pay-again-10",
    1469              :                                           merchant_url,
    1470              :                                           MHD_HTTP_OK,
    1471              :                                           "create-proposal-10",
    1472              :                                           "withdraw-coin-10a;withdraw-coin-10b",
    1473              :                                           "EUR:5",
    1474              :                                           "EUR:4.99",
    1475              :                                           NULL),
    1476            2 :     TALER_TESTING_cmd_merchant_pay_order ("pay-too-much-10",
    1477              :                                           merchant_url,
    1478              :                                           MHD_HTTP_CONFLICT,
    1479              :                                           "create-proposal-10",
    1480              :                                           "withdraw-coin-10c;withdraw-coin-10d",
    1481              :                                           "EUR:5",
    1482              :                                           "EUR:4.99",
    1483              :                                           NULL),
    1484            2 :     TALER_TESTING_cmd_sleep (
    1485              :       "Wait for wire transfer deadline",
    1486              :       3),
    1487            2 :     CMD_EXEC_AGGREGATOR ("run-aggregator-10"),
    1488            2 :     TALER_TESTING_cmd_check_bank_transfer ("check_bank_transfer-9.97-10",
    1489              :                                            EXCHANGE_URL,
    1490              :                                            "EUR:9.97",
    1491              :                                            exchange_payto,
    1492              :                                            merchant_payto),
    1493            2 :     TALER_TESTING_cmd_check_bank_empty ("check_bank_empty-10"),
    1494            2 :     TALER_TESTING_cmd_end ()
    1495              :   };
    1496              : 
    1497              :   struct TALER_TESTING_Command pay_abort[] = {
    1498            2 :     cmd_transfer_to_exchange ("create-reserve-11",
    1499              :                               "EUR:10.02"),
    1500            2 :     cmd_exec_wirewatch ("wirewatch-11"),
    1501            2 :     TALER_TESTING_cmd_check_bank_admin_transfer ("check_bank_transfer-11",
    1502              :                                                  "EUR:10.02",
    1503              :                                                  payer_payto,
    1504              :                                                  exchange_payto,
    1505              :                                                  "create-reserve-11"),
    1506            2 :     TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-11a",
    1507              :                                        "create-reserve-11",
    1508              :                                        "EUR:5",
    1509              :                                        0,
    1510              :                                        MHD_HTTP_OK),
    1511            2 :     TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-11b",
    1512              :                                        "create-reserve-11",
    1513              :                                        "EUR:5",
    1514              :                                        0,
    1515              :                                        MHD_HTTP_OK),
    1516            2 :     TALER_TESTING_cmd_status ("withdraw-status-11",
    1517              :                               "create-reserve-11",
    1518              :                               "EUR:0",
    1519              :                               MHD_HTTP_OK),
    1520            2 :     TALER_TESTING_cmd_merchant_post_orders ("create-proposal-11",
    1521            2 :                                             cred.cfg,
    1522              :                                             merchant_url,
    1523              :                                             MHD_HTTP_OK,
    1524              :                                             "11",
    1525            2 :                                             GNUNET_TIME_UNIT_ZERO_TS,
    1526            2 :                                             GNUNET_TIME_UNIT_FOREVER_TS,
    1527              :                                             "EUR:10.0"),
    1528            2 :     TALER_TESTING_cmd_merchant_pay_order ("pay-fail-partial-double-11-good",
    1529              :                                           merchant_url,
    1530              :                                           MHD_HTTP_BAD_REQUEST,
    1531              :                                           "create-proposal-11",
    1532              :                                           "withdraw-coin-11a",
    1533              :                                           "EUR:5",
    1534              :                                           "EUR:4.99",
    1535              :                                           NULL),
    1536            2 :     TALER_TESTING_cmd_merchant_pay_order ("pay-fail-partial-double-11-bad",
    1537              :                                           merchant_url,
    1538              :                                           MHD_HTTP_CONFLICT,
    1539              :                                           "create-proposal-11",
    1540              :                                           "withdraw-coin-1",
    1541              :                                           "EUR:5",
    1542              :                                           "EUR:4.99",
    1543              :                                           NULL),
    1544            2 :     TALER_TESTING_cmd_merchant_order_abort ("pay-abort-11",
    1545              :                                             merchant_url,
    1546              :                                             "pay-fail-partial-double-11-good",
    1547              :                                             MHD_HTTP_OK),
    1548            2 :     TALER_TESTING_cmd_sleep (
    1549              :       "Wait for wire transfer deadline",
    1550              :       3),
    1551            2 :     CMD_EXEC_AGGREGATOR ("run-aggregator-11"),
    1552            2 :     TALER_TESTING_cmd_check_bank_empty ("check_bank_empty-11"),
    1553            2 :     TALER_TESTING_cmd_end ()
    1554              :   };
    1555              : 
    1556              :   struct TALER_TESTING_Command templates[] = {
    1557            2 :     cmd_transfer_to_exchange ("create-reserve-20x",
    1558              :                               "EUR:20.04"),
    1559            2 :     cmd_exec_wirewatch ("wirewatch-20x"),
    1560            2 :     TALER_TESTING_cmd_check_bank_admin_transfer ("check_bank_transfer-20x",
    1561              :                                                  "EUR:20.04",
    1562              :                                                  payer_payto,
    1563              :                                                  exchange_payto,
    1564              :                                                  "create-reserve-20x"),
    1565            2 :     TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-xa",
    1566              :                                        "create-reserve-20x",
    1567              :                                        "EUR:5",
    1568              :                                        0,
    1569              :                                        MHD_HTTP_OK),
    1570            2 :     TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-xb",
    1571              :                                        "create-reserve-20x",
    1572              :                                        "EUR:5",
    1573              :                                        0,
    1574              :                                        MHD_HTTP_OK),
    1575            2 :     TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-xc",
    1576              :                                        "create-reserve-20x",
    1577              :                                        "EUR:5",
    1578              :                                        0,
    1579              :                                        MHD_HTTP_OK),
    1580            2 :     TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-xd",
    1581              :                                        "create-reserve-20x",
    1582              :                                        "EUR:5",
    1583              :                                        0,
    1584              :                                        MHD_HTTP_OK),
    1585            2 :     TALER_TESTING_cmd_status ("withdraw-status-20x",
    1586              :                               "create-reserve-20x",
    1587              :                               "EUR:0",
    1588              :                               MHD_HTTP_OK),
    1589            2 :     TALER_TESTING_cmd_merchant_get_templates ("get-templates-empty",
    1590              :                                               merchant_url,
    1591              :                                               MHD_HTTP_OK,
    1592              :                                               NULL),
    1593            2 :     TALER_TESTING_cmd_merchant_post_templates ("post-templates-t1",
    1594              :                                                merchant_url,
    1595              :                                                "template-1",
    1596              :                                                "a template",
    1597              :                                                MHD_HTTP_NO_CONTENT),
    1598            2 :     TALER_TESTING_cmd_merchant_post_templates ("post-templates-t1-idem",
    1599              :                                                merchant_url,
    1600              :                                                "template-1",
    1601              :                                                "a template",
    1602              :                                                MHD_HTTP_NO_CONTENT),
    1603            2 :     TALER_TESTING_cmd_merchant_post_templates ("post-templates-t1-non-idem",
    1604              :                                                merchant_url,
    1605              :                                                "template-1",
    1606              :                                                "a different template",
    1607              :                                                MHD_HTTP_CONFLICT),
    1608            2 :     TALER_TESTING_cmd_merchant_get_templates ("get-templates-t1",
    1609              :                                               merchant_url,
    1610              :                                               MHD_HTTP_OK,
    1611              :                                               "post-templates-t1",
    1612              :                                               NULL),
    1613            2 :     TALER_TESTING_cmd_merchant_get_template ("get-template-t1",
    1614              :                                              merchant_url,
    1615              :                                              "template-1",
    1616              :                                              MHD_HTTP_OK,
    1617              :                                              "post-templates-t1"),
    1618            2 :     TALER_TESTING_cmd_merchant_post_templates ("post-templates-t2",
    1619              :                                                merchant_url,
    1620              :                                                "template-2",
    1621              :                                                "a template",
    1622              :                                                MHD_HTTP_NO_CONTENT),
    1623            2 :     TALER_TESTING_cmd_merchant_patch_template (
    1624              :       "patch-templates-t2",
    1625              :       merchant_url,
    1626              :       "template-2",
    1627              :       "another template",
    1628              :       NULL,
    1629            2 :       GNUNET_JSON_PACK (
    1630              :         GNUNET_JSON_pack_uint64 ("minimum_age", 0),
    1631              :         GNUNET_JSON_pack_time_rel ("pay_duration",
    1632              :                                    GNUNET_TIME_UNIT_MINUTES)),
    1633              :       MHD_HTTP_NO_CONTENT),
    1634            2 :     TALER_TESTING_cmd_merchant_get_template ("get-template-t2",
    1635              :                                              merchant_url,
    1636              :                                              "template-2",
    1637              :                                              MHD_HTTP_OK,
    1638              :                                              "patch-templates-t2"),
    1639            2 :     TALER_TESTING_cmd_merchant_get_template ("get-template-nx",
    1640              :                                              merchant_url,
    1641              :                                              "template-nx",
    1642              :                                              MHD_HTTP_NOT_FOUND,
    1643              :                                              NULL),
    1644            2 :     TALER_TESTING_cmd_merchant_post_otp_devices (
    1645              :       "post-otp-device",
    1646              :       merchant_url,
    1647              :       "otp-dev",
    1648              :       "my OTP device",
    1649              :       "FEE4P2J",
    1650              :       TALER_MCA_WITH_PRICE,
    1651              :       0,
    1652              :       MHD_HTTP_NO_CONTENT),
    1653            2 :     TALER_TESTING_cmd_merchant_patch_template (
    1654              :       "patch-templates-t3-nx",
    1655              :       merchant_url,
    1656              :       "template-3",
    1657              :       "updated template",
    1658              :       "otp-dev",
    1659            2 :       GNUNET_JSON_PACK (
    1660              :         GNUNET_JSON_pack_uint64 ("minimum_age", 0),
    1661              :         GNUNET_JSON_pack_time_rel ("pay_duration",
    1662              :                                    GNUNET_TIME_UNIT_MINUTES)),
    1663              :       MHD_HTTP_NOT_FOUND),
    1664            2 :     TALER_TESTING_cmd_merchant_post_templates2 (
    1665              :       "post-templates-t3-amount",
    1666              :       merchant_url,
    1667              :       "template-amount",
    1668              :       "a different template with an amount",
    1669              :       NULL,
    1670            2 :       GNUNET_JSON_PACK (
    1671              :         GNUNET_JSON_pack_uint64 ("minimum_age", 0),
    1672              :         GNUNET_JSON_pack_time_rel ("pay_duration",
    1673              :                                    GNUNET_TIME_UNIT_MINUTES),
    1674              :         GNUNET_JSON_pack_string ("amount",
    1675              :                                  "EUR:4")),
    1676              :       MHD_HTTP_NO_CONTENT),
    1677            2 :     TALER_TESTING_cmd_merchant_post_using_templates (
    1678              :       "using-templates-t1",
    1679              :       "post-templates-t1",
    1680              :       NULL,
    1681              :       merchant_url,
    1682              :       "1",
    1683              :       "summary-1",
    1684              :       "EUR:9.98",
    1685            2 :       GNUNET_TIME_UNIT_ZERO_TS,
    1686            2 :       GNUNET_TIME_UNIT_FOREVER_TS,
    1687              :       MHD_HTTP_OK),
    1688            2 :     TALER_TESTING_cmd_merchant_post_using_templates (
    1689              :       "using-templates-t1-amount-missing",
    1690              :       "post-templates-t1",
    1691              :       NULL,
    1692              :       merchant_url,
    1693              :       "2",
    1694              :       "summary-1",
    1695              :       NULL,
    1696            2 :       GNUNET_TIME_UNIT_ZERO_TS,
    1697            2 :       GNUNET_TIME_UNIT_FOREVER_TS,
    1698              :       MHD_HTTP_CONFLICT),
    1699            2 :     TALER_TESTING_cmd_merchant_post_using_templates (
    1700              :       "using-templates-t1-summary-missing",
    1701              :       "post-templates-t1",
    1702              :       NULL,
    1703              :       merchant_url,
    1704              :       "3",
    1705              :       NULL,
    1706              :       "EUR:10",
    1707            2 :       GNUNET_TIME_UNIT_ZERO_TS,
    1708            2 :       GNUNET_TIME_UNIT_FOREVER_TS,
    1709              :       MHD_HTTP_CONFLICT),
    1710            2 :     TALER_TESTING_cmd_merchant_post_using_templates (
    1711              :       "using-templates-t1-amount-conflict",
    1712              :       "post-templates-t3-amount",
    1713              :       NULL,
    1714              :       merchant_url,
    1715              :       "4",
    1716              :       "summary-1",
    1717              :       "EUR:10",
    1718            2 :       GNUNET_TIME_UNIT_ZERO_TS,
    1719            2 :       GNUNET_TIME_UNIT_FOREVER_TS,
    1720              :       MHD_HTTP_CONFLICT),
    1721            2 :     TALER_TESTING_cmd_merchant_post_using_templates (
    1722              :       "using-templates-t1-amount-duplicate",
    1723              :       "post-templates-t3-amount",
    1724              :       NULL,
    1725              :       merchant_url,
    1726              :       "4",
    1727              :       "summary-1",
    1728              :       "EUR:4",
    1729            2 :       GNUNET_TIME_UNIT_ZERO_TS,
    1730            2 :       GNUNET_TIME_UNIT_FOREVER_TS,
    1731              :       MHD_HTTP_CONFLICT),
    1732            2 :     TALER_TESTING_cmd_merchant_pay_order ("pay-100",
    1733              :                                           merchant_url,
    1734              :                                           MHD_HTTP_OK,
    1735              :                                           "using-templates-t1",
    1736              :                                           "withdraw-coin-xa;withdraw-coin-xb",
    1737              :                                           "EUR:4.99",
    1738              :                                           "EUR:4.99",
    1739              :                                           NULL),
    1740            2 :     TALER_TESTING_cmd_merchant_delete_template ("get-templates-empty",
    1741              :                                                 merchant_url,
    1742              :                                                 "t1",
    1743              :                                                 MHD_HTTP_NOT_FOUND),
    1744            2 :     TALER_TESTING_cmd_merchant_delete_template ("get-templates-empty",
    1745              :                                                 merchant_url,
    1746              :                                                 "template-1",
    1747              :                                                 MHD_HTTP_NO_CONTENT),
    1748            2 :     TALER_TESTING_cmd_merchant_post_using_templates (
    1749              :       "post-templates-t1-deleted",
    1750              :       "post-templates-t1",
    1751              :       NULL,
    1752              :       merchant_url,
    1753              :       "0",
    1754              :       "summary-1",
    1755              :       "EUR:5",
    1756            2 :       GNUNET_TIME_UNIT_ZERO_TS,
    1757            2 :       GNUNET_TIME_UNIT_FOREVER_TS,
    1758              :       MHD_HTTP_NOT_FOUND),
    1759            2 :     TALER_TESTING_cmd_merchant_post_otp_devices (
    1760              :       "post-otp-device",
    1761              :       merchant_url,
    1762              :       "otp-dev-2",
    1763              :       "my OTP device",
    1764              :       "secret",
    1765              :       TALER_MCA_WITH_PRICE,
    1766              :       0,
    1767              :       MHD_HTTP_NO_CONTENT),
    1768            2 :     TALER_TESTING_cmd_merchant_post_templates2 (
    1769              :       "post-templates-with-pos-key",
    1770              :       merchant_url,
    1771              :       "template-key",
    1772              :       "a different template with POS KEY",
    1773              :       "otp-dev-2",
    1774            2 :       GNUNET_JSON_PACK (
    1775              :         GNUNET_JSON_pack_uint64 ("minimum_age", 0),
    1776              :         GNUNET_JSON_pack_time_rel ("pay_duration",
    1777              :                                    GNUNET_TIME_UNIT_MINUTES)),
    1778              :       MHD_HTTP_NO_CONTENT),
    1779              : 
    1780            2 :     TALER_TESTING_cmd_merchant_post_using_templates (
    1781              :       "using-templates-pos-key",
    1782              :       "post-templates-with-pos-key",
    1783              :       "post-otp-device",
    1784              :       merchant_url,
    1785              :       "1",
    1786              :       "summary-1-pos",
    1787              :       "EUR:9.98",
    1788            2 :       GNUNET_TIME_UNIT_ZERO_TS,
    1789            2 :       GNUNET_TIME_UNIT_FOREVER_TS,
    1790              :       MHD_HTTP_OK),
    1791            2 :     TALER_TESTING_cmd_merchant_pay_order ("pay-with-pos",
    1792              :                                           merchant_url,
    1793              :                                           MHD_HTTP_OK,
    1794              :                                           "using-templates-pos-key",
    1795              :                                           "withdraw-coin-xc;withdraw-coin-xd",
    1796              :                                           "EUR:4.99",
    1797              :                                           "EUR:4.99",
    1798              :                                           NULL),
    1799              : 
    1800              : 
    1801            2 :     TALER_TESTING_cmd_end ()
    1802              :   };
    1803              : 
    1804              :   struct TALER_TESTING_Command webhooks[] = {
    1805            2 :     TALER_TESTING_cmd_merchant_get_webhooks ("get-webhooks-empty",
    1806              :                                              merchant_url,
    1807              :                                              MHD_HTTP_OK,
    1808              :                                              NULL),
    1809            2 :     TALER_TESTING_cmd_merchant_post_webhooks ("post-webhooks-w1",
    1810              :                                               merchant_url,
    1811              :                                               "webhook-1",
    1812              :                                               "Paid",
    1813              :                                               MHD_HTTP_NO_CONTENT),
    1814            2 :     TALER_TESTING_cmd_merchant_post_webhooks ("post-webhooks-w1-idem",
    1815              :                                               merchant_url,
    1816              :                                               "webhook-1",
    1817              :                                               "Paid",
    1818              :                                               MHD_HTTP_NO_CONTENT),
    1819            2 :     TALER_TESTING_cmd_merchant_post_webhooks ("post-webhooks-w1-non-idem",
    1820              :                                               merchant_url,
    1821              :                                               "webhook-1",
    1822              :                                               "Refund",
    1823              :                                               MHD_HTTP_CONFLICT),
    1824            2 :     TALER_TESTING_cmd_merchant_get_webhooks ("get-webhooks-w1",
    1825              :                                              merchant_url,
    1826              :                                              MHD_HTTP_OK,
    1827              :                                              "post-webhooks-w1",
    1828              :                                              NULL),
    1829            2 :     TALER_TESTING_cmd_merchant_get_webhook ("get-webhook-w1",
    1830              :                                             merchant_url,
    1831              :                                             "webhook-1",
    1832              :                                             MHD_HTTP_OK,
    1833              :                                             "post-webhooks-w1"),
    1834            2 :     TALER_TESTING_cmd_merchant_post_webhooks ("post-webhooks-w2",
    1835              :                                               merchant_url,
    1836              :                                               "webhook-2",
    1837              :                                               "Paid",
    1838              :                                               MHD_HTTP_NO_CONTENT),
    1839            2 :     TALER_TESTING_cmd_merchant_patch_webhook ("patch-webhooks-w2",
    1840              :                                               merchant_url,
    1841              :                                               "webhook-2",
    1842              :                                               "Refund2",
    1843              :                                               "http://localhost:38188/",
    1844              :                                               "POST",
    1845              :                                               "Authorization:WHWOXZXPLL",
    1846              :                                               "Amount",
    1847              :                                               MHD_HTTP_NO_CONTENT),
    1848            2 :     TALER_TESTING_cmd_merchant_get_webhook ("get-webhook-w2",
    1849              :                                             merchant_url,
    1850              :                                             "webhook-2",
    1851              :                                             MHD_HTTP_OK,
    1852              :                                             "patch-webhooks-w2"),
    1853            2 :     TALER_TESTING_cmd_merchant_get_webhook ("get-webhook-nx",
    1854              :                                             merchant_url,
    1855              :                                             "webhook-nx",
    1856              :                                             MHD_HTTP_NOT_FOUND,
    1857              :                                             NULL),
    1858            2 :     TALER_TESTING_cmd_merchant_patch_webhook ("patch-webhooks-w3-nx",
    1859              :                                               merchant_url,
    1860              :                                               "webhook-3",
    1861              :                                               "Paid2",
    1862              :                                               "https://example.com",
    1863              :                                               "POST",
    1864              :                                               "Authorization:WHWOXZXPLL",
    1865              :                                               "Amount",
    1866              :                                               MHD_HTTP_NOT_FOUND),
    1867            2 :     TALER_TESTING_cmd_merchant_delete_webhook ("get-webhooks-empty",
    1868              :                                                merchant_url,
    1869              :                                                "w1",
    1870              :                                                MHD_HTTP_NOT_FOUND),
    1871            2 :     TALER_TESTING_cmd_merchant_delete_webhook ("get-webhooks-empty",
    1872              :                                                merchant_url,
    1873              :                                                "webhook-1",
    1874              :                                                MHD_HTTP_NO_CONTENT),
    1875            2 :     TALER_TESTING_cmd_end ()
    1876              :   };
    1877              :   struct TALER_TESTING_Command repurchase[] = {
    1878            2 :     cmd_transfer_to_exchange (
    1879              :       "create-reserve-30x",
    1880              :       "EUR:30.06"),
    1881            2 :     cmd_exec_wirewatch (
    1882              :       "wirewatch-30x"),
    1883            2 :     TALER_TESTING_cmd_check_bank_admin_transfer (
    1884              :       "check_bank_transfer-30x",
    1885              :       "EUR:30.06",
    1886              :       payer_payto,
    1887              :       exchange_payto,
    1888              :       "create-reserve-30x"),
    1889            2 :     TALER_TESTING_cmd_withdraw_amount (
    1890              :       "withdraw-coin-rep",
    1891              :       "create-reserve-30x",
    1892              :       "EUR:5",
    1893              :       0,
    1894              :       MHD_HTTP_OK),
    1895            2 :     TALER_TESTING_cmd_merchant_post_orders3 (
    1896              :       "post-order-repurchase-original",
    1897            2 :       cred.cfg,
    1898              :       merchant_url,
    1899              :       MHD_HTTP_OK,
    1900              :       "repurchase-original",
    1901              :       GNUNET_TIME_relative_to_timestamp (GNUNET_TIME_UNIT_MINUTES),
    1902            2 :       GNUNET_TIME_UNIT_FOREVER_TS,
    1903              :       "https://fulfillment.example.com/",
    1904              :       "EUR:1.0"),
    1905            2 :     TALER_TESTING_cmd_merchant_pay_order (
    1906              :       "repurchase-pay-first",
    1907              :       merchant_url,
    1908              :       MHD_HTTP_OK,
    1909              :       "post-order-repurchase-original",
    1910              :       "withdraw-coin-rep",
    1911              :       "EUR:1.00",
    1912              :       "EUR:0.99",
    1913              :       "repurchase-session"),
    1914            2 :     TALER_TESTING_cmd_wallet_get_order (
    1915              :       "repurchase-wallet-check-primary-order",
    1916              :       merchant_url,
    1917              :       "post-order-repurchase-original",
    1918              :       true,
    1919              :       false,
    1920              :       false,
    1921              :       MHD_HTTP_OK),
    1922            2 :     TALER_TESTING_cmd_merchant_get_order3 (
    1923              :       "repurchase-check-primary-payment",
    1924              :       merchant_url,
    1925              :       "post-order-repurchase-original",
    1926              :       TALER_MERCHANT_OSC_PAID,
    1927              :       "repurchase-session",
    1928              :       NULL,
    1929              :       MHD_HTTP_OK),
    1930            2 :     TALER_TESTING_cmd_merchant_get_order3 (
    1931              :       "repurchase-check-primary-payment-bad-binding",
    1932              :       merchant_url,
    1933              :       "post-order-repurchase-original",
    1934              :       TALER_MERCHANT_OSC_CLAIMED, /* someone else has it! */
    1935              :       "wrong-session",
    1936              :       NULL,
    1937              :       MHD_HTTP_OK),
    1938            2 :     TALER_TESTING_cmd_merchant_post_orders3 (
    1939              :       "post-order-repurchase-secondary",
    1940            2 :       cred.cfg,
    1941              :       merchant_url,
    1942              :       MHD_HTTP_OK,
    1943              :       "repurchase-secondary",
    1944              :       GNUNET_TIME_relative_to_timestamp (GNUNET_TIME_UNIT_MINUTES),
    1945            2 :       GNUNET_TIME_UNIT_FOREVER_TS,
    1946              :       "https://fulfillment.example.com/",
    1947              :       "EUR:1.0"),
    1948            2 :     TALER_TESTING_cmd_merchant_get_order3 (
    1949              :       "repurchase-check-secondary-payment",
    1950              :       merchant_url,
    1951              :       "post-order-repurchase-secondary",
    1952              :       TALER_MERCHANT_OSC_UNPAID,
    1953              :       "repurchase-session",
    1954              :       NULL,
    1955              :       MHD_HTTP_OK),
    1956            2 :     TALER_TESTING_cmd_merchant_get_order3 (
    1957              :       "repurchase-check-secondary-payment",
    1958              :       merchant_url,
    1959              :       "post-order-repurchase-secondary",
    1960              :       TALER_MERCHANT_OSC_UNPAID,
    1961              :       "repurchase-session",
    1962              :       "post-order-repurchase-original",
    1963              :       MHD_HTTP_OK),
    1964            2 :     TALER_TESTING_cmd_wallet_get_order2 (
    1965              :       "repurchase-wallet-check-order-secondary",
    1966              :       merchant_url,
    1967              :       "post-order-repurchase-secondary",
    1968              :       "repurchase-session",
    1969              :       false,
    1970              :       false,
    1971              :       false,
    1972              :       "post-order-repurchase-original",
    1973              :       MHD_HTTP_PAYMENT_REQUIRED),
    1974            2 :     TALER_TESTING_cmd_wallet_get_order2 (
    1975              :       "repurchase-wallet-check-order-secondary-bad-session",
    1976              :       merchant_url,
    1977              :       "post-order-repurchase-secondary",
    1978              :       "wrong-session",
    1979              :       false,
    1980              :       false,
    1981              :       false,
    1982              :       NULL,
    1983              :       MHD_HTTP_PAYMENT_REQUIRED),
    1984            2 :     TALER_TESTING_cmd_merchant_order_refund (
    1985              :       "refund-repurchased",
    1986              :       merchant_url,
    1987              :       "refund repurchase",
    1988              :       "repurchase-original",
    1989              :       "EUR:1.0",
    1990              :       MHD_HTTP_OK),
    1991            2 :     TALER_TESTING_cmd_wallet_get_order2 (
    1992              :       "repurchase-wallet-check-primary-order-refunded-no-session",
    1993              :       merchant_url,
    1994              :       "post-order-repurchase-original",
    1995              :       NULL,
    1996              :       true,
    1997              :       true,
    1998              :       true,
    1999              :       "post-order-repurchase-original",
    2000              :       MHD_HTTP_OK),
    2001            2 :     TALER_TESTING_cmd_wallet_get_order2 (
    2002              :       "repurchase-wallet-check-primary-order-refunded",
    2003              :       merchant_url,
    2004              :       "post-order-repurchase-original",
    2005              :       "repurchase-session",
    2006              :       true,
    2007              :       true,
    2008              :       true,
    2009              :       "post-order-repurchase-original",
    2010              :       MHD_HTTP_OK),
    2011            2 :     TALER_TESTING_cmd_merchant_get_order3 (
    2012              :       "repurchase-check-refunded",
    2013              :       merchant_url,
    2014              :       "post-order-repurchase-secondary",
    2015              :       TALER_MERCHANT_OSC_CLAIMED,
    2016              :       "repurchase-session",
    2017              :       NULL,
    2018              :       MHD_HTTP_OK),
    2019              : 
    2020            2 :     TALER_TESTING_cmd_end ()
    2021              :   };
    2022              : 
    2023              :   struct TALER_TESTING_Command tokens[] = {
    2024              :     /**
    2025              :      * Move money to the exchange's bank account.
    2026              :      */
    2027            2 :     cmd_transfer_to_exchange ("create-reserve-tokens",
    2028              :                               "EUR:20.03"),
    2029              :     /**
    2030              :      * Make a reserve exist, according to the previous transfer.
    2031              :      */
    2032            2 :     cmd_exec_wirewatch ("wirewatch-1"),
    2033            2 :     TALER_TESTING_cmd_check_bank_admin_transfer ("check_bank_transfer-tokens",
    2034              :                                                  "EUR:20.03",
    2035              :                                                  payer_payto,
    2036              :                                                  exchange_payto,
    2037              :                                                  "create-reserve-tokens"),
    2038            2 :     TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-1",
    2039              :                                        "create-reserve-tokens",
    2040              :                                        "EUR:5",
    2041              :                                        0,
    2042              :                                        MHD_HTTP_OK),
    2043            2 :     TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-2",
    2044              :                                        "create-reserve-tokens",
    2045              :                                        "EUR:5",
    2046              :                                        0,
    2047              :                                        MHD_HTTP_OK),
    2048            2 :     TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-3",
    2049              :                                        "create-reserve-tokens",
    2050              :                                        "EUR:5",
    2051              :                                        0,
    2052              :                                        MHD_HTTP_OK),
    2053            6 :     TALER_TESTING_cmd_merchant_post_tokenfamilies (
    2054              :       "create-upcoming-tokenfamily",
    2055              :       merchant_url,
    2056              :       MHD_HTTP_NO_CONTENT,
    2057              :       "subscription-upcoming",
    2058              :       "Upcoming Subscription",
    2059              :       "An upcoming subscription that is not valid yet.",
    2060              :       NULL,
    2061              :       /* In one day */
    2062              :       GNUNET_TIME_absolute_to_timestamp (
    2063              :         GNUNET_TIME_absolute_add (
    2064            2 :           GNUNET_TIME_timestamp_get ().abs_time,
    2065              :           GNUNET_TIME_UNIT_DAYS)),
    2066              :       /* In a year */
    2067              :       GNUNET_TIME_absolute_to_timestamp (
    2068              :         GNUNET_TIME_absolute_add (
    2069            2 :           GNUNET_TIME_timestamp_get ().abs_time,
    2070              :           GNUNET_TIME_UNIT_YEARS)),
    2071              :       GNUNET_TIME_UNIT_MONTHS,
    2072              :       GNUNET_TIME_UNIT_MONTHS,
    2073              :       "subscription"),
    2074            2 :     TALER_TESTING_cmd_merchant_post_orders_choices (
    2075              :       "create-order-with-upcoming-output",
    2076            2 :       cred.cfg,
    2077              :       merchant_url,
    2078              :       MHD_HTTP_OK,
    2079              :       "subscription-upcoming",
    2080              :       "A choice in the contract",
    2081              :       NULL,
    2082              :       0,
    2083              :       1,
    2084              :       "5-upcoming-output",
    2085            2 :       GNUNET_TIME_UNIT_ZERO_TS,
    2086            2 :       GNUNET_TIME_UNIT_FOREVER_TS,
    2087              :       "EUR:5.0"),
    2088            2 :     TALER_TESTING_cmd_merchant_post_tokenfamilies (
    2089              :       "create-tokenfamily",
    2090              :       merchant_url,
    2091              :       MHD_HTTP_NO_CONTENT,
    2092              :       "subscription-1",
    2093              :       "Subscription",
    2094              :       "A subscription.",
    2095              :       NULL,
    2096            2 :       GNUNET_TIME_UNIT_ZERO_TS,
    2097              :       GNUNET_TIME_relative_to_timestamp
    2098              :         (GNUNET_TIME_UNIT_YEARS),
    2099              :       GNUNET_TIME_UNIT_MONTHS,
    2100              :       GNUNET_TIME_UNIT_MONTHS,
    2101              :       "subscription"),
    2102            2 :     TALER_TESTING_cmd_merchant_post_orders_choices (
    2103              :       "create-order-with-output",
    2104            2 :       cred.cfg,
    2105              :       merchant_url,
    2106              :       MHD_HTTP_OK,
    2107              :       "subscription-1",
    2108              :       "A choice in the contract",
    2109              :       NULL,
    2110              :       0,
    2111              :       1,
    2112              :       "5-output",
    2113            2 :       GNUNET_TIME_UNIT_ZERO_TS,
    2114            2 :       GNUNET_TIME_UNIT_FOREVER_TS,
    2115              :       "EUR:5.0"),
    2116            2 :     TALER_TESTING_cmd_merchant_pay_order_choices (
    2117              :       "pay-order-with-output",
    2118              :       merchant_url,
    2119              :       MHD_HTTP_OK,
    2120              :       "create-order-with-output",
    2121              :       "withdraw-coin-1",
    2122              :       "EUR:5",
    2123              :       "EUR:4.99",
    2124              :       NULL,
    2125              :       0,
    2126              :       NULL),
    2127            2 :     TALER_TESTING_cmd_merchant_post_orders_choices (
    2128              :       "create-order-with-input-and-output",
    2129            2 :       cred.cfg,
    2130              :       merchant_url,
    2131              :       MHD_HTTP_OK,
    2132              :       "subscription-1",
    2133              :       "A choice in the contract",
    2134              :       NULL,
    2135              :       1,
    2136              :       1,
    2137              :       "5-input-output",
    2138            2 :       GNUNET_TIME_UNIT_ZERO_TS,
    2139            2 :       GNUNET_TIME_UNIT_FOREVER_TS,
    2140              :       "EUR:0.0"),
    2141            2 :     TALER_TESTING_cmd_merchant_pay_order_choices (
    2142              :       "pay-order-with-input-and-output",
    2143              :       merchant_url,
    2144              :       MHD_HTTP_OK,
    2145              :       "create-order-with-input-and-output",
    2146              :       "",
    2147              :       "EUR:0",
    2148              :       "EUR:0",
    2149              :       NULL,
    2150              :       0,
    2151              :       "pay-order-with-output"),
    2152              :     // TALER_TESTING_cmd_merchant_pay_order_choices ("idempotent-pay-order-with-input-and-output",
    2153              :     //                                               merchant_url,
    2154              :     //                                               MHD_HTTP_OK,
    2155              :     //                                               "create-order-with-input-and-output",
    2156              :     //                                               "",
    2157              :     //                                               "EUR:0",
    2158              :     //                                               "EUR:0",
    2159              :     //                                               NULL,
    2160              :     //                                               0,
    2161              :     //                                               "pay-order-with-output"),
    2162            2 :     TALER_TESTING_cmd_merchant_post_orders_choices (
    2163              :       "create-another-order-with-input-and-output",
    2164            2 :       cred.cfg,
    2165              :       merchant_url,
    2166              :       MHD_HTTP_OK,
    2167              :       "subscription-1",
    2168              :       "A choice in the contract",
    2169              :       NULL,
    2170              :       1,
    2171              :       1,
    2172              :       "5-input-output-2",
    2173            2 :       GNUNET_TIME_UNIT_ZERO_TS,
    2174            2 :       GNUNET_TIME_UNIT_FOREVER_TS,
    2175              :       "EUR:0.0"),
    2176            2 :     TALER_TESTING_cmd_merchant_pay_order_choices ("double-spend-token",
    2177              :                                                   merchant_url,
    2178              :                                                   MHD_HTTP_CONFLICT,
    2179              :                                                   "create-another-order-with-input-and-output",
    2180              :                                                   "",
    2181              :                                                   "EUR:0",
    2182              :                                                   "EUR:0",
    2183              :                                                   NULL,
    2184              :                                                   0,
    2185              :                                                   "pay-order-with-output"),
    2186            2 :     TALER_TESTING_cmd_end ()
    2187              :   };
    2188              : 
    2189              :   #ifdef HAVE_DONAU_DONAU_SERVICE_H
    2190              :   const struct DONAU_BearerToken bearer = {
    2191              :     .token = NULL
    2192              :   };
    2193              : 
    2194              :   struct TALER_TESTING_Command donau[] = {
    2195              :     TALER_TESTING_cmd_set_var (
    2196              :       "donau",
    2197              :       TALER_TESTING_cmd_get_donau ("get-donau",
    2198              :                                    cred.cfg,
    2199              :                                    true)),
    2200              :     TALER_TESTING_cmd_charity_post_merchant ("post-charity",
    2201              :                                              "example",
    2202              :                                              "example.com",
    2203              :                                              "EUR:50", // max_per_year
    2204              :                                              &bearer,
    2205              :                                              "create-another-order-with-input-and-output",
    2206              :                                              // reusing the merchant_reference for merchant_pub
    2207              :                                              MHD_HTTP_CREATED),
    2208              :     TALER_TESTING_cmd_charity_post_merchant ("post-charity-idempotent",
    2209              :                                              "example",
    2210              :                                              "example.com",
    2211              :                                              "EUR:50", // max_per_year
    2212              :                                              &bearer,
    2213              :                                              "create-another-order-with-input-and-output",
    2214              :                                              // reusing the merchant_reference for merchant_pub
    2215              :                                              MHD_HTTP_CREATED),
    2216              :     TALER_TESTING_cmd_merchant_post_donau_instance (
    2217              :       "post-donau-instance",
    2218              :       merchant_url,
    2219              :       "create-another-order-with-input-and-output",
    2220              :       MHD_HTTP_NO_CONTENT),
    2221              :     TALER_TESTING_cmd_merchant_post_donau_instance (
    2222              :       "post-donau-instance-idempotent",
    2223              :       merchant_url,
    2224              :       "create-another-order-with-input-and-output",
    2225              :       MHD_HTTP_NO_CONTENT),
    2226              :     TALER_TESTING_cmd_merchant_get_donau_instances (
    2227              :       "get-donau-instances-after-insert",
    2228              :       merchant_url,
    2229              :       1,
    2230              :       MHD_HTTP_OK),
    2231              :     TALER_TESTING_cmd_sleep (
    2232              :       "In this time donaukeyupdate must fetch the keys from the donau",
    2233              :       1),
    2234              :     TALER_TESTING_cmd_merchant_get_donau_instances (
    2235              :       "get-donau-instance",
    2236              :       merchant_url,
    2237              :       1,
    2238              :       MHD_HTTP_OK),
    2239              :     TALER_TESTING_cmd_merchant_post_orders_donau (
    2240              :       "create-donau-order",
    2241              :       cred.cfg,
    2242              :       merchant_url,
    2243              :       MHD_HTTP_OK,
    2244              :       "donau",
    2245              :       GNUNET_TIME_UNIT_ZERO_TS,
    2246              :       GNUNET_TIME_UNIT_FOREVER_TS,
    2247              :       "EUR:1"),
    2248              :     TALER_TESTING_cmd_merchant_pay_order_donau (
    2249              :       "pay-donau-order",
    2250              :       merchant_url,
    2251              :       MHD_HTTP_OK,
    2252              :       "create-donau-order",
    2253              :       "withdraw-coin-3",
    2254              :       "EUR:1", /* full amount */
    2255              :       "EUR:0.99", /* amount without fees */
    2256              :       "EUR:1", /* donation amount */
    2257              :       NULL,
    2258              :       0,
    2259              :       "post-charity",
    2260              :       2025,
    2261              :       "7560001010000",
    2262              :       "1234"
    2263              :       ),
    2264              :     TALER_TESTING_cmd_merchant_delete_donau_instance (
    2265              :       "delete-donau-instance",
    2266              :       merchant_url,
    2267              :       1,
    2268              :       MHD_HTTP_NO_CONTENT),
    2269              :     TALER_TESTING_cmd_merchant_get_donau_instances (
    2270              :       "get-donau-instances-after-delete",
    2271              :       merchant_url,
    2272              :       0,
    2273              :       MHD_HTTP_OK),
    2274              :     TALER_TESTING_cmd_end ()
    2275              :   };
    2276              :   #endif
    2277              : 
    2278              :   struct TALER_TESTING_Command commands[] = {
    2279              :     /* general setup */
    2280            2 :     TALER_TESTING_cmd_run_fakebank (
    2281              :       "run-fakebank",
    2282            2 :       cred.cfg,
    2283              :       "exchange-account-exchange"),
    2284              :     #ifdef HAVE_DONAU_DONAU_SERVICE_H
    2285              :     TALER_TESTING_cmd_system_start (
    2286              :       "start-taler",
    2287              :       config_file,
    2288              :       "-emaDZ",
    2289              :       "-u", "exchange-account-exchange",
    2290              :       "-r", "merchant-exchange-test",
    2291              :       NULL),
    2292              :     #else
    2293            2 :     TALER_TESTING_cmd_system_start (
    2294              :       "start-taler",
    2295              :       config_file,
    2296              :       "-ema",
    2297              :       "-u", "exchange-account-exchange",
    2298              :       "-r", "merchant-exchange-test",
    2299              :       NULL),
    2300              :     #endif
    2301            2 :     TALER_TESTING_cmd_get_exchange (
    2302              :       "get-exchange",
    2303            2 :       cred.cfg,
    2304              :       NULL,
    2305              :       true,
    2306              :       true),
    2307            2 :     TALER_TESTING_cmd_batch (
    2308              :       "orders-id",
    2309              :       get_private_order_id),
    2310            2 :     TALER_TESTING_cmd_config (
    2311              :       "config",
    2312              :       merchant_url,
    2313              :       MHD_HTTP_OK),
    2314            2 :     TALER_TESTING_cmd_merchant_get_instances (
    2315              :       "instances-empty",
    2316              :       merchant_url,
    2317              :       MHD_HTTP_OK,
    2318              :       NULL),
    2319            2 :     TALER_TESTING_cmd_merchant_post_instances (
    2320              :       "instance-create-default-setup",
    2321              :       merchant_url,
    2322              :       "admin",
    2323              :       MHD_HTTP_NO_CONTENT),
    2324            2 :     TALER_TESTING_cmd_merchant_post_account (
    2325              :       "instance-create-default-account",
    2326              :       merchant_url,
    2327              :       merchant_payto,
    2328              :       NULL, NULL,
    2329              :       MHD_HTTP_OK),
    2330            2 :     TALER_TESTING_cmd_merchant_post_instances (
    2331              :       "instance-create-i1",
    2332              :       merchant_url,
    2333              :       "i1",
    2334              :       MHD_HTTP_NO_CONTENT),
    2335            2 :     TALER_TESTING_cmd_merchant_get_instances (
    2336              :       "instances-get-i1",
    2337              :       merchant_url,
    2338              :       MHD_HTTP_OK,
    2339              :       "instance-create-i1",
    2340              :       "instance-create-default-setup",
    2341              :       NULL),
    2342            2 :     TALER_TESTING_cmd_merchant_get_instance (
    2343              :       "instances-get-i1",
    2344              :       merchant_url,
    2345              :       "i1",
    2346              :       MHD_HTTP_OK,
    2347              :       "instance-create-i1"),
    2348            4 :     TALER_TESTING_cmd_merchant_patch_instance (
    2349              :       "instance-patch-i1",
    2350              :       merchant_url,
    2351              :       "i1",
    2352              :       "bob-the-merchant",
    2353              :       json_pack ("{s:s}",
    2354              :                  "street",
    2355              :                  "bobstreet"),
    2356              :       json_pack ("{s:s}",
    2357              :                  "street",
    2358              :                  "bobjuryst"),
    2359              :       true,
    2360            2 :       GNUNET_TIME_UNIT_ZERO, /* wire transfer */
    2361              :       GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS,
    2362              :                                      2), /* small pay delay */
    2363              :       MHD_HTTP_NO_CONTENT),
    2364            2 :     TALER_TESTING_cmd_merchant_get_instance (
    2365              :       "instances-get-i1-2",
    2366              :       merchant_url,
    2367              :       "i1",
    2368              :       MHD_HTTP_OK,
    2369              :       "instance-patch-i1"),
    2370            2 :     TALER_TESTING_cmd_merchant_get_instance (
    2371              :       "instances-get-i2-nx",
    2372              :       merchant_url,
    2373              :       "i2",
    2374              :       MHD_HTTP_NOT_FOUND,
    2375              :       NULL),
    2376            4 :     TALER_TESTING_cmd_merchant_post_instances2 (
    2377              :       "instance-create-ACL",
    2378              :       merchant_url,
    2379              :       "i-acl",
    2380              :       "controlled instance",
    2381              :       json_pack ("{s:s}", "city",
    2382              :                  "shopcity"),
    2383              :       json_pack ("{s:s}", "city",
    2384              :                  "lawyercity"),
    2385              :       true,
    2386            2 :       GNUNET_TIME_UNIT_ZERO, /* wire transfer */
    2387              :       GNUNET_TIME_UNIT_SECONDS, /* pay delay */
    2388              :       // FIXME: change this back once
    2389              :       // we have a update auth test CMD
    2390              :       // RFC_8959_PREFIX "EXAMPLE",
    2391              :       NULL,
    2392              :       MHD_HTTP_NO_CONTENT),
    2393            4 :     TALER_TESTING_cmd_merchant_patch_instance (
    2394              :       "instance-patch-ACL",
    2395              :       merchant_url,
    2396              :       "i-acl",
    2397              :       "controlled instance",
    2398              :       json_pack ("{s:s}",
    2399              :                  "street",
    2400              :                  "bobstreet"),
    2401              :       json_pack ("{s:s}",
    2402              :                  "street",
    2403              :                  "bobjuryst"),
    2404              :       true,
    2405            2 :       GNUNET_TIME_UNIT_ZERO, /* wire transfer */
    2406              :       GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS,
    2407              :                                      2), /* small pay delay */
    2408              :       MHD_HTTP_NO_CONTENT),
    2409            2 :     TALER_TESTING_cmd_merchant_post_instances (
    2410              :       "instance-create-i2",
    2411              :       merchant_url,
    2412              :       "i2",
    2413              :       MHD_HTTP_NO_CONTENT),
    2414            2 :     TALER_TESTING_cmd_merchant_post_instances (
    2415              :       "instance-create-i2-idem",
    2416              :       merchant_url,
    2417              :       "i2",
    2418              :       MHD_HTTP_NO_CONTENT),
    2419            2 :     TALER_TESTING_cmd_merchant_delete_instance (
    2420              :       "instance-delete-i2",
    2421              :       merchant_url,
    2422              :       "i2",
    2423              :       MHD_HTTP_NO_CONTENT),
    2424            2 :     TALER_TESTING_cmd_merchant_get_instance (
    2425              :       "instances-get-i2-post-deletion",
    2426              :       merchant_url,
    2427              :       "i2",
    2428              :       MHD_HTTP_NOT_FOUND,
    2429              :       NULL),
    2430            2 :     TALER_TESTING_cmd_merchant_purge_instance (
    2431              :       "instance-delete-then-purge-i2",
    2432              :       merchant_url,
    2433              :       "i2",
    2434              :       MHD_HTTP_NO_CONTENT),
    2435            2 :     TALER_TESTING_cmd_merchant_purge_instance (
    2436              :       "instance-purge-i1",
    2437              :       merchant_url,
    2438              :       "i1",
    2439              :       MHD_HTTP_NO_CONTENT),
    2440            2 :     TALER_TESTING_cmd_merchant_delete_instance (
    2441              :       "instance-purge-then-delete-i1",
    2442              :       merchant_url,
    2443              :       "i1",
    2444              :       MHD_HTTP_NOT_FOUND),
    2445            2 :     TALER_TESTING_cmd_merchant_purge_instance (
    2446              :       "instance-purge-i-acl-middle",
    2447              :       merchant_url,
    2448              :       "i-acl",
    2449              :       MHD_HTTP_NO_CONTENT),
    2450            2 :     TALER_TESTING_cmd_merchant_purge_instance (
    2451              :       "instance-purge-default-middle",
    2452              :       merchant_url,
    2453              :       "admin",
    2454              :       MHD_HTTP_NO_CONTENT),
    2455            2 :     TALER_TESTING_cmd_merchant_post_instances (
    2456              :       "instance-create-default-after-purge",
    2457              :       merchant_url,
    2458              :       "admin",
    2459              :       MHD_HTTP_NO_CONTENT),
    2460            2 :     TALER_TESTING_cmd_merchant_post_account (
    2461              :       "instance-create-default-account-after-purge",
    2462              :       merchant_url,
    2463              :       merchant_payto,
    2464              :       NULL, NULL,
    2465              :       MHD_HTTP_OK),
    2466            2 :     TALER_TESTING_cmd_merchant_get_products (
    2467              :       "get-products-empty",
    2468              :       merchant_url,
    2469              :       MHD_HTTP_OK,
    2470              :       NULL),
    2471            2 :     TALER_TESTING_cmd_merchant_post_products (
    2472              :       "post-products-p1",
    2473              :       merchant_url,
    2474              :       "product-1",
    2475              :       "a product",
    2476              :       "EUR:1",
    2477              :       MHD_HTTP_NO_CONTENT),
    2478            2 :     TALER_TESTING_cmd_merchant_post_products (
    2479              :       "post-products-p1-idem",
    2480              :       merchant_url,
    2481              :       "product-1",
    2482              :       "a product",
    2483              :       "EUR:1",
    2484              :       MHD_HTTP_NO_CONTENT),
    2485            2 :     TALER_TESTING_cmd_merchant_post_products (
    2486              :       "post-products-p1-non-idem",
    2487              :       merchant_url,
    2488              :       "product-1",
    2489              :       "a different product",
    2490              :       "EUR:1",
    2491              :       MHD_HTTP_CONFLICT),
    2492            2 :     TALER_TESTING_cmd_merchant_get_products (
    2493              :       "get-products-p1",
    2494              :       merchant_url,
    2495              :       MHD_HTTP_OK,
    2496              :       "post-products-p1",
    2497              :       NULL),
    2498            2 :     TALER_TESTING_cmd_merchant_get_product (
    2499              :       "get-product-p1",
    2500              :       merchant_url,
    2501              :       "product-1",
    2502              :       MHD_HTTP_OK,
    2503              :       "post-products-p1"),
    2504            2 :     TALER_TESTING_cmd_merchant_post_products2 (
    2505              :       "post-products-img",
    2506              :       merchant_url,
    2507              :       "product-img",
    2508              :       "product with image",
    2509              :       json_pack ("{s:s}", "en", "product with image"),
    2510              :       "test-unit",
    2511              :       "EUR:1",
    2512              :       "data:image/jpeg;base64,RAWDATA",
    2513              :       json_array (),
    2514              :       4,
    2515              :       0,
    2516              :       json_pack ("{s:s}", "street", "my street"),
    2517            2 :       GNUNET_TIME_UNIT_ZERO_TS,
    2518              :       MHD_HTTP_NO_CONTENT),
    2519            2 :     TALER_TESTING_cmd_get_product_image (
    2520              :       "get-product-image-img",
    2521              :       merchant_url,
    2522              :       "post-products-img",
    2523              :       "5831ca012639a29df949c3b1e5cd436bac0a5b26a5340ccd95df394b7a8742d6",
    2524              :       MHD_HTTP_OK),
    2525            2 :     TALER_TESTING_cmd_get_product_image (
    2526              :       "get-product-image-invalid",
    2527              :       merchant_url,
    2528              :       NULL,
    2529              :       "not-a-valid-hash",
    2530              :       MHD_HTTP_BAD_REQUEST),
    2531            2 :     TALER_TESTING_cmd_get_product_image (
    2532              :       "get-product-image-empty",
    2533              :       merchant_url,
    2534              :       NULL,
    2535              :       "",
    2536              :       MHD_HTTP_BAD_REQUEST),
    2537            2 :     TALER_TESTING_cmd_get_product_image (
    2538              :       "get-product-image-not-found",
    2539              :       merchant_url,
    2540              :       NULL,
    2541              :       "5831ca012639a29df949c3b1e5cd436bac0a5b26a5340ccd95df394b7a8742d7",
    2542              :       MHD_HTTP_NOT_FOUND),
    2543            2 :     TALER_TESTING_cmd_merchant_post_products (
    2544              :       "post-products-p2",
    2545              :       merchant_url,
    2546              :       "product-2",
    2547              :       "a product",
    2548              :       "EUR:1",
    2549              :       MHD_HTTP_NO_CONTENT),
    2550            2 :     TALER_TESTING_cmd_merchant_patch_product (
    2551              :       "patch-products-p2",
    2552              :       merchant_url,
    2553              :       "product-2",
    2554              :       "another product",
    2555              :       json_pack ("{s:s}", "en", "text"),
    2556              :       "kg",
    2557              :       "EUR:1",
    2558              :       "data:image/jpeg;base64,RAWDATA",
    2559              :       json_array (),
    2560              :       40,
    2561              :       0,
    2562              :       json_pack ("{s:s}",
    2563              :                  "street",
    2564              :                  "pstreet"),
    2565              :       GNUNET_TIME_relative_to_timestamp (
    2566              :         GNUNET_TIME_UNIT_MINUTES),
    2567              :       MHD_HTTP_NO_CONTENT),
    2568            2 :     TALER_TESTING_cmd_merchant_get_product (
    2569              :       "get-product-p2",
    2570              :       merchant_url,
    2571              :       "product-2",
    2572              :       MHD_HTTP_OK,
    2573              :       "patch-products-p2"),
    2574            2 :     TALER_TESTING_cmd_merchant_get_product (
    2575              :       "get-product-nx",
    2576              :       merchant_url,
    2577              :       "product-nx",
    2578              :       MHD_HTTP_NOT_FOUND,
    2579              :       NULL),
    2580            2 :     TALER_TESTING_cmd_merchant_patch_product (
    2581              :       "patch-products-p3-nx",
    2582              :       merchant_url,
    2583              :       "product-3",
    2584              :       "nx updated product",
    2585              :       json_pack ("{s:s}", "en", "text"),
    2586              :       "kg",
    2587              :       "EUR:1",
    2588              :       "data:image/jpeg;base64,RAWDATA",
    2589              :       json_array (),
    2590              :       40,
    2591              :       0,
    2592              :       json_pack ("{s:s}",
    2593              :                  "street",
    2594              :                  "pstreet"),
    2595              :       GNUNET_TIME_relative_to_timestamp (
    2596              :         GNUNET_TIME_UNIT_MINUTES),
    2597              :       MHD_HTTP_NOT_FOUND),
    2598            2 :     TALER_TESTING_cmd_merchant_delete_product (
    2599              :       "get-products-empty",
    2600              :       merchant_url,
    2601              :       "p1",
    2602              :       MHD_HTTP_NOT_FOUND),
    2603            2 :     TALER_TESTING_cmd_merchant_delete_product (
    2604              :       "get-products-empty",
    2605              :       merchant_url,
    2606              :       "product-1",
    2607              :       MHD_HTTP_NO_CONTENT),
    2608            2 :     TALER_TESTING_cmd_merchant_lock_product (
    2609              :       "lock-product-p2",
    2610              :       merchant_url,
    2611              :       "product-2",
    2612              :       GNUNET_TIME_UNIT_MINUTES,
    2613              :       2,
    2614              :       MHD_HTTP_NO_CONTENT),
    2615            2 :     TALER_TESTING_cmd_merchant_lock_product (
    2616              :       "lock-product-nx",
    2617              :       merchant_url,
    2618              :       "product-nx",
    2619              :       GNUNET_TIME_UNIT_MINUTES,
    2620              :       2,
    2621              :       MHD_HTTP_NOT_FOUND),
    2622            2 :     TALER_TESTING_cmd_merchant_lock_product (
    2623              :       "lock-product-too-much",
    2624              :       merchant_url,
    2625              :       "product-2",
    2626              :       GNUNET_TIME_UNIT_MINUTES,
    2627              :       39,
    2628              :       MHD_HTTP_GONE),
    2629            2 :     TALER_TESTING_cmd_merchant_delete_product (
    2630              :       "delete-product-locked",
    2631              :       merchant_url,
    2632              :       "product-2",
    2633              :       MHD_HTTP_CONFLICT),
    2634            2 :     TALER_TESTING_cmd_batch ("pay",
    2635              :                              pay),
    2636            2 :     TALER_TESTING_cmd_batch ("double-spending",
    2637              :                              double_spending),
    2638            2 :     TALER_TESTING_cmd_batch ("pay-again",
    2639              :                              pay_again),
    2640            2 :     TALER_TESTING_cmd_batch ("pay-abort",
    2641              :                              pay_abort),
    2642            2 :     TALER_TESTING_cmd_batch ("refund",
    2643              :                              refund),
    2644            2 :     TALER_TESTING_cmd_batch ("templates",
    2645              :                              templates),
    2646            2 :     TALER_TESTING_cmd_batch ("webhooks",
    2647              :                              webhooks),
    2648            2 :     TALER_TESTING_cmd_batch ("auth",
    2649              :                              auth),
    2650            2 :     TALER_TESTING_cmd_batch ("repurchase",
    2651              :                              repurchase),
    2652            2 :     TALER_TESTING_cmd_batch ("tokens",
    2653              :                              tokens),
    2654              : 
    2655              :     #ifdef HAVE_DONAU_DONAU_SERVICE_H
    2656              :     TALER_TESTING_cmd_batch ("donau",
    2657              :                              donau),
    2658              :     #endif
    2659              : 
    2660            2 :     TALER_TESTING_cmd_merchant_get_statisticsamount ("stats-refund",
    2661              :                                                      merchant_url,
    2662              :                                                      "refunds-granted", 6, 0,
    2663              :                                                      MHD_HTTP_OK),
    2664            2 :     TALER_TESTING_cmd_merchant_get_statisticscounter ("stats-tokens-issued",
    2665              :                                                       merchant_url,
    2666              :                                                       "tokens-issued", 6, 0,
    2667              :                                                       MHD_HTTP_OK),
    2668            2 :     TALER_TESTING_cmd_merchant_get_statisticscounter ("stats-tokens-used",
    2669              :                                                       merchant_url,
    2670              :                                                       "tokens-used", 6, 0,
    2671              :                                                       MHD_HTTP_OK),
    2672              : 
    2673              :     /**
    2674              :      * End the suite.
    2675              :      */
    2676            2 :     TALER_TESTING_cmd_end ()
    2677              :   };
    2678              : 
    2679            2 :   TALER_TESTING_run (is,
    2680              :                      commands);
    2681            2 : }
    2682              : 
    2683              : 
    2684              : int
    2685            2 : main (int argc,
    2686              :       char *const *argv)
    2687              : {
    2688              :   {
    2689              :     char *cipher;
    2690              : 
    2691            2 :     cipher = GNUNET_STRINGS_get_suffix_from_binary_name (argv[0]);
    2692            2 :     GNUNET_assert (NULL != cipher);
    2693            2 :     GNUNET_asprintf (&config_file,
    2694              :                      "test_merchant_api-%s.conf",
    2695              :                      cipher);
    2696            2 :     GNUNET_free (cipher);
    2697              :   }
    2698            2 :   payer_payto.full_payto =
    2699              :     (char *) "payto://x-taler-bank/localhost/" USER_ACCOUNT_NAME
    2700              :     "?receiver-name=" USER_ACCOUNT_NAME;
    2701            2 :   exchange_payto.full_payto =
    2702              :     (char *) "payto://x-taler-bank/localhost/" EXCHANGE_ACCOUNT_NAME
    2703              :     "?receiver-name="
    2704              :     EXCHANGE_ACCOUNT_NAME;
    2705            2 :   merchant_payto.full_payto =
    2706              :     (char *) "payto://x-taler-bank/localhost/" MERCHANT_ACCOUNT_NAME
    2707              :     "?receiver-name=" MERCHANT_ACCOUNT_NAME;
    2708            2 :   merchant_url = "http://localhost:8080/";
    2709            2 :   GNUNET_asprintf (&merchant_url_i1a,
    2710              :                    "%sinstances/i1a/",
    2711              :                    merchant_url);
    2712            2 :   return TALER_TESTING_main (argv,
    2713              :                              "INFO",
    2714              :                              config_file,
    2715              :                              "exchange-account-exchange",
    2716              :                              TALER_TESTING_BS_FAKEBANK,
    2717              :                              &cred,
    2718              :                              &run,
    2719              :                              NULL);
    2720              : }
    2721              : 
    2722              : 
    2723              : /* end of test_merchant_api.c */
        

Generated by: LCOV version 2.0-1