exchange

Base system with REST service to issue digital coins, run by the payment service provider
Log | Files | Refs | Submodules | README | LICENSE

testing_api_cmd_run_fakebank.c (5789B)


      1 /*
      2   This file is part of TALER
      3   (C) 2023, 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 testing/testing_api_cmd_run_fakebank.c
     21  * @brief Command to run fakebank in-process
     22  * @author Christian Grothoff
     23  */
     24 #include "taler/platform.h"
     25 #include "taler/taler_json_lib.h"
     26 #include <gnunet/gnunet_curl_lib.h>
     27 #include "taler/taler_testing_lib.h"
     28 
     29 /**
     30  * State for a "run fakebank" CMD.
     31  */
     32 struct RunFakebankState
     33 {
     34 
     35   /**
     36    * Our interpreter state.
     37    */
     38   struct TALER_TESTING_Interpreter *is;
     39 
     40   /**
     41    * Handle to the fakebank we are running.
     42    */
     43   struct TALER_FAKEBANK_Handle *fakebank;
     44 
     45   /**
     46    * URL of the bank.
     47    */
     48   char *bank_url;
     49 
     50   /**
     51    * Currency to use.
     52    */
     53   char *currency;
     54 
     55   /**
     56    * Data for access control.
     57    */
     58   struct TALER_BANK_AuthenticationData ba;
     59 
     60   /**
     61    * Port to use.
     62    */
     63   uint16_t port;
     64 };
     65 
     66 
     67 /**
     68  * Run the "get_exchange" command.
     69  *
     70  * @param cls closure.
     71  * @param cmd the command currently being executed.
     72  * @param is the interpreter state.
     73  */
     74 static void
     75 run_fakebank_run (void *cls,
     76                   const struct TALER_TESTING_Command *cmd,
     77                   struct TALER_TESTING_Interpreter *is)
     78 {
     79   struct RunFakebankState *rfs = cls;
     80 
     81   (void) cmd;
     82   rfs->fakebank = TALER_FAKEBANK_start (rfs->port,
     83                                         rfs->currency);
     84   if (NULL == rfs->fakebank)
     85   {
     86     GNUNET_break (0);
     87     TALER_TESTING_interpreter_fail (is);
     88     return;
     89   }
     90   TALER_TESTING_interpreter_next (is);
     91 }
     92 
     93 
     94 /**
     95  * Cleanup the state.
     96  *
     97  * @param cls closure.
     98  * @param cmd the command which is being cleaned up.
     99  */
    100 static void
    101 run_fakebank_cleanup (void *cls,
    102                       const struct TALER_TESTING_Command *cmd)
    103 {
    104   struct RunFakebankState *rfs = cls;
    105 
    106   if (NULL != rfs->fakebank)
    107   {
    108     TALER_FAKEBANK_stop (rfs->fakebank);
    109     rfs->fakebank = NULL;
    110   }
    111   GNUNET_free (rfs->ba.wire_gateway_url);
    112   GNUNET_free (rfs->bank_url);
    113   GNUNET_free (rfs->currency);
    114   GNUNET_free (rfs);
    115 }
    116 
    117 
    118 /**
    119  * Offer internal data to a "run_fakebank" CMD state to other commands.
    120  *
    121  * @param cls closure
    122  * @param[out] ret result (could be anything)
    123  * @param trait name of the trait
    124  * @param index index number of the object to offer.
    125  * @return #GNUNET_OK on success
    126  */
    127 static enum GNUNET_GenericReturnValue
    128 run_fakebank_traits (void *cls,
    129                      const void **ret,
    130                      const char *trait,
    131                      unsigned int index)
    132 {
    133   struct RunFakebankState *rfs = cls;
    134   struct TALER_TESTING_Trait traits[] = {
    135     TALER_TESTING_make_trait_bank_auth_data (&rfs->ba),
    136     TALER_TESTING_make_trait_fakebank (rfs->fakebank),
    137     TALER_TESTING_trait_end ()
    138   };
    139 
    140   return TALER_TESTING_get_trait (traits,
    141                                   ret,
    142                                   trait,
    143                                   index);
    144 }
    145 
    146 
    147 struct TALER_TESTING_Command
    148 TALER_TESTING_cmd_run_fakebank (
    149   const char *label,
    150   const struct GNUNET_CONFIGURATION_Handle *cfg,
    151   const char *exchange_account_section)
    152 {
    153   struct RunFakebankState *rfs;
    154   unsigned long long fakebank_port;
    155   struct TALER_FullPayto exchange_payto_uri;
    156 
    157   if (GNUNET_OK !=
    158       GNUNET_CONFIGURATION_get_value_number (cfg,
    159                                              "BANK",
    160                                              "HTTP_PORT",
    161                                              &fakebank_port))
    162   {
    163     GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
    164                                "BANK",
    165                                "HTTP_PORT");
    166     GNUNET_assert (0);
    167   }
    168   if (GNUNET_OK !=
    169       GNUNET_CONFIGURATION_get_value_string (cfg,
    170                                              exchange_account_section,
    171                                              "PAYTO_URI",
    172                                              &exchange_payto_uri.full_payto))
    173   {
    174     GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
    175                                exchange_account_section,
    176                                "PAYTO_URI");
    177     GNUNET_assert (0);
    178   }
    179   rfs = GNUNET_new (struct RunFakebankState);
    180   rfs->port = (uint16_t) fakebank_port;
    181   GNUNET_asprintf (&rfs->bank_url,
    182                    "http://localhost:%u/",
    183                    (unsigned int) rfs->port);
    184   GNUNET_assert (GNUNET_OK ==
    185                  TALER_config_get_currency (cfg,
    186                                             "exchange",
    187                                             &rfs->currency));
    188   {
    189     char *exchange_xtalerbank_account;
    190 
    191     exchange_xtalerbank_account
    192       = TALER_xtalerbank_account_from_payto (exchange_payto_uri);
    193     GNUNET_assert (NULL != exchange_xtalerbank_account);
    194     GNUNET_asprintf (&rfs->ba.wire_gateway_url,
    195                      "http://localhost:%u/%s/",
    196                      (unsigned int) fakebank_port,
    197                      exchange_xtalerbank_account);
    198     GNUNET_free (exchange_xtalerbank_account);
    199   }
    200   GNUNET_free (exchange_payto_uri.full_payto);
    201   rfs->ba.method = TALER_BANK_AUTH_NONE;
    202   {
    203     struct TALER_TESTING_Command cmd = {
    204       .cls = rfs,
    205       .label = label,
    206       .run = &run_fakebank_run,
    207       .cleanup = &run_fakebank_cleanup,
    208       .traits = &run_fakebank_traits,
    209       .name = "fakebank"
    210     };
    211 
    212     return cmd;
    213   }
    214 }