sync

Backup service to store encrypted wallet databases (experimental)
Log | Files | Refs | Submodules | README | LICENSE

test_sync_api.c (10062B)


      1 /*
      2   This file is part of TALER
      3   Copyright (C) 2014-2024 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 lib/test_sync_api.c
     21  * @brief testcase to test sync's HTTP API interface
     22  * @author Christian Grothoff
     23  */
     24 #include "platform.h"
     25 #include <taler/taler_util.h>
     26 #include <taler/taler_signatures.h>
     27 #include <taler/taler_exchange_service.h>
     28 #include <taler/taler_json_lib.h>
     29 #include <gnunet/gnunet_util_lib.h>
     30 #include <microhttpd.h>
     31 #include <taler/taler_bank_service.h>
     32 #include <taler/taler_fakebank_lib.h>
     33 #include <taler/taler_testing_lib.h>
     34 #include <taler/taler_merchant_testing_lib.h>
     35 #include <taler/taler_error_codes.h>
     36 #include "sync_service.h"
     37 #include "sync_testing_lib.h"
     38 
     39 /**
     40  * Configuration file we use.  One (big) configuration is used
     41  * for the various components for this test.
     42  */
     43 #define CONFIG_FILE "test_sync_api.conf"
     44 
     45 /**
     46  * Exchange base URL.  Could also be taken from config.
     47  */
     48 #define EXCHANGE_URL "http://localhost:8081/"
     49 
     50 /**
     51  * Account number of the exchange at the bank.
     52  */
     53 #define EXCHANGE_ACCOUNT_NAME "2"
     54 
     55 /**
     56  * Account number of some user.
     57  */
     58 #define USER_ACCOUNT_NAME "62"
     59 
     60 /**
     61  * Account number used by the merchant
     62  */
     63 #define MERCHANT_ACCOUNT_NAME "3"
     64 
     65 /**
     66  * Payto URI of the customer (payer).
     67  */
     68 static struct TALER_FullPayto payer_payto;
     69 
     70 /**
     71  * Payto URI of the exchange (escrow account).
     72  */
     73 static struct TALER_FullPayto exchange_payto;
     74 
     75 /**
     76  * Payto URI of the merchant (receiver).
     77  */
     78 static struct TALER_FullPayto merchant_payto;
     79 
     80 /**
     81  * Configuration of the bank.
     82  */
     83 static struct TALER_TESTING_Credentials cred;
     84 
     85 /**
     86  * Merchant base URL.
     87  */
     88 static const char *merchant_url = "http://localhost:8080/";
     89 
     90 /**
     91  * Sync base URL.
     92  */
     93 static const char *sync_url = "http://localhost:8084/";
     94 
     95 
     96 /**
     97  * Execute the taler-exchange-wirewatch command with
     98  * our configuration file.
     99  *
    100  * @param label label to use for the command.
    101  */
    102 static struct TALER_TESTING_Command
    103 cmd_exec_wirewatch (const char *label)
    104 {
    105   return TALER_TESTING_cmd_exec_wirewatch (label,
    106                                            CONFIG_FILE);
    107 }
    108 
    109 
    110 /**
    111  * Run wire transfer of funds from some user's account to the
    112  * exchange.
    113  *
    114  * @param label label to use for the command.
    115  * @param amount amount to transfer, i.e. "EUR:1"
    116  * @param url exchange_url
    117  */
    118 static struct TALER_TESTING_Command
    119 cmd_transfer_to_exchange (const char *label,
    120                           const char *amount)
    121 {
    122   return TALER_TESTING_cmd_admin_add_incoming (label,
    123                                                amount,
    124                                                &cred.ba,
    125                                                payer_payto);
    126 }
    127 
    128 
    129 /**
    130  * Main function that will tell the interpreter what commands to
    131  * run.
    132  *
    133  * @param cls closure
    134  */
    135 static void
    136 run (void *cls,
    137      struct TALER_TESTING_Interpreter *is)
    138 {
    139   struct TALER_TESTING_Command commands[] = {
    140     TALER_TESTING_cmd_system_start ("start-taler",
    141                                     CONFIG_FILE,
    142                                     "-efms",
    143                                     "-u", "exchange-account-exchange",
    144                                     "-r", "merchant-exchange-default",
    145                                     NULL),
    146     TALER_TESTING_cmd_get_exchange ("get-exchange",
    147                                     cred.cfg,
    148                                     NULL,
    149                                     true,
    150                                     true),
    151     TALER_TESTING_cmd_merchant_post_instances ("instance-create-admin",
    152                                                merchant_url,
    153                                                "admin",
    154                                                MHD_HTTP_NO_CONTENT),
    155     TALER_TESTING_cmd_merchant_post_account (
    156       "instance-create-default-account",
    157       merchant_url,
    158       merchant_payto,
    159       NULL, NULL,
    160       MHD_HTTP_OK),
    161 
    162     /**
    163      * Move money to the exchange's bank account.
    164      */
    165     cmd_transfer_to_exchange ("create-reserve-1",
    166                               "EUR:10.02"),
    167     /**
    168      * Make a reserve exist, according to the previous
    169      * transfer.
    170      */
    171     cmd_exec_wirewatch ("wirewatch-1"),
    172     TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-1",
    173                                        "create-reserve-1",
    174                                        "EUR:5",
    175                                        0,
    176                                        MHD_HTTP_OK),
    177     TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-2",
    178                                        "create-reserve-1",
    179                                        "EUR:5",
    180                                        0,
    181                                        MHD_HTTP_OK),
    182     /* Failed download: no backup exists */
    183     SYNC_TESTING_cmd_backup_nx ("backup-download-nx",
    184                                 sync_url),
    185     /* Failed upload: need to pay */
    186     SYNC_TESTING_cmd_backup_upload ("backup-upload-1",
    187                                     sync_url,
    188                                     NULL /* prev upload */,
    189                                     NULL /* last upload */,
    190                                     SYNC_TESTING_UO_NONE,
    191                                     MHD_HTTP_PAYMENT_REQUIRED,
    192                                     "Test-1",
    193                                     strlen ("Test-1")),
    194     /* what would we have to pay? */
    195     TALER_TESTING_cmd_merchant_claim_order ("fetch-proposal",
    196                                             merchant_url,
    197                                             MHD_HTTP_OK,
    198                                             "backup-upload-1",
    199                                             NULL),
    200     /* make the payment */
    201     TALER_TESTING_cmd_merchant_pay_order ("pay-account",
    202                                           merchant_url,
    203                                           MHD_HTTP_OK,
    204                                           "fetch-proposal",
    205                                           "withdraw-coin-1",
    206                                           "EUR:5",
    207                                           "EUR:4.99", /* must match ANNUAL_FEE in config! */
    208                                           "session-id"),
    209     /* now upload should succeed */
    210     SYNC_TESTING_cmd_backup_upload ("backup-upload-2",
    211                                     sync_url,
    212                                     "backup-upload-1",
    213                                     NULL,
    214                                     SYNC_TESTING_UO_NONE,
    215                                     MHD_HTTP_NO_CONTENT,
    216                                     "Test-1",
    217                                     strlen ("Test-1")),
    218     /* now updated upload should succeed */
    219     SYNC_TESTING_cmd_backup_upload ("backup-upload-3",
    220                                     sync_url,
    221                                     "backup-upload-2",
    222                                     NULL,
    223                                     SYNC_TESTING_UO_NONE,
    224                                     MHD_HTTP_NO_CONTENT,
    225                                     "Test-3",
    226                                     strlen ("Test-3")),
    227     /* Test download: succeeds! */
    228     SYNC_TESTING_cmd_backup_download ("download-3",
    229                                       sync_url,
    230                                       MHD_HTTP_OK,
    231                                       "backup-upload-3"),
    232     /* now updated upload should fail (conflict) */
    233     SYNC_TESTING_cmd_backup_upload ("backup-upload-3b",
    234                                     sync_url,
    235                                     "backup-upload-2",
    236                                     "backup-upload-3",
    237                                     SYNC_TESTING_UO_NONE,
    238                                     MHD_HTTP_CONFLICT,
    239                                     "Test-3b",
    240                                     strlen ("Test-3b")),
    241     /* now updated upload should fail (payment requested) */
    242     SYNC_TESTING_cmd_backup_upload ("backup-upload-4",
    243                                     sync_url,
    244                                     "backup-upload-3",
    245                                     "backup-upload-3",
    246                                     SYNC_TESTING_UO_REQUEST_PAYMENT,
    247                                     MHD_HTTP_PAYMENT_REQUIRED,
    248                                     "Test-4",
    249                                     strlen ("Test-4")),
    250     /* Test download: previous did NOT change the data on the server! */
    251     SYNC_TESTING_cmd_backup_download ("download-3b",
    252                                       sync_url,
    253                                       MHD_HTTP_OK,
    254                                       "backup-upload-3"),
    255 
    256     TALER_TESTING_cmd_end ()
    257   };
    258 
    259   TALER_TESTING_run (is,
    260                      commands);
    261 }
    262 
    263 
    264 int
    265 main (int argc,
    266       char *const *argv)
    267 {
    268   (void) argc;
    269   payer_payto.full_payto =
    270     (char *) "payto://x-taler-bank/localhost/" USER_ACCOUNT_NAME
    271     "?receiver-name=user";
    272   exchange_payto.full_payto =
    273     (char *) "payto://x-taler-bank/localhost/" EXCHANGE_ACCOUNT_NAME
    274     "?receiver-name=exchange";
    275   merchant_payto.full_payto =
    276     (char *) "payto://x-taler-bank/localhost/" MERCHANT_ACCOUNT_NAME
    277     "?receiver-name=merchant";
    278   return TALER_TESTING_main (argv,
    279                              "DEBUG",
    280                              CONFIG_FILE,
    281                              "exchange-account-exchange",
    282                              TALER_TESTING_BS_FAKEBANK,
    283                              &cred,
    284                              &run,
    285                              NULL);
    286 }
    287 
    288 
    289 /* end of test_sync_api.c */