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_purse_delete.c (4634B)


      1 /*
      2   This file is part of TALER
      3   Copyright (C) 2020 Taler Systems SA
      4 
      5   TALER is free software; you can redistribute it and/or modify it
      6   under the terms of the GNU General Public License as published by
      7   the Free Software Foundation; either version 3, or (at your
      8   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 GNU
     13   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_purse_delete.c
     21  * @brief command for testing /management/purse/disable.
     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 #include "taler/taler_signatures.h"
     29 #include "taler/backoff.h"
     30 
     31 
     32 /**
     33  * State for a "purse_delete" CMD.
     34  */
     35 struct PurseDeleteState
     36 {
     37 
     38   /**
     39    * Purse delete handle while operation is running.
     40    */
     41   struct TALER_EXCHANGE_PurseDeleteHandle *pdh;
     42 
     43   /**
     44    * Our interpreter.
     45    */
     46   struct TALER_TESTING_Interpreter *is;
     47 
     48   /**
     49    * Expected HTTP response code.
     50    */
     51   unsigned int expected_response_code;
     52 
     53   /**
     54    * Command that created the purse we now want to
     55    * delete.
     56    */
     57   const char *purse_cmd;
     58 };
     59 
     60 
     61 /**
     62  * Callback to analyze the DELETE /purses/$PID response, just used to check if
     63  * the response code is acceptable.
     64  *
     65  * @param cls closure.
     66  * @param pdr HTTP response details
     67  */
     68 static void
     69 purse_delete_cb (void *cls,
     70                  const struct TALER_EXCHANGE_PurseDeleteResponse *pdr)
     71 {
     72   struct PurseDeleteState *pds = cls;
     73 
     74   pds->pdh = NULL;
     75   if (pds->expected_response_code != pdr->hr.http_status)
     76   {
     77     TALER_TESTING_unexpected_status (pds->is,
     78                                      pdr->hr.http_status,
     79                                      pds->expected_response_code);
     80     return;
     81   }
     82   TALER_TESTING_interpreter_next (pds->is);
     83 }
     84 
     85 
     86 /**
     87  * Run the command.
     88  *
     89  * @param cls closure.
     90  * @param cmd the command to execute.
     91  * @param is the interpreter state.
     92  */
     93 static void
     94 purse_delete_run (void *cls,
     95                   const struct TALER_TESTING_Command *cmd,
     96                   struct TALER_TESTING_Interpreter *is)
     97 {
     98   struct PurseDeleteState *pds = cls;
     99   const struct TALER_PurseContractPrivateKeyP *purse_priv;
    100   const struct TALER_TESTING_Command *ref;
    101   const char *exchange_url;
    102 
    103   (void) cmd;
    104   exchange_url = TALER_TESTING_get_exchange_url (is);
    105   if (NULL == exchange_url)
    106   {
    107     GNUNET_break (0);
    108     return;
    109   }
    110   ref = TALER_TESTING_interpreter_lookup_command (is,
    111                                                   pds->purse_cmd);
    112   if (NULL == ref)
    113   {
    114     GNUNET_break (0);
    115     TALER_TESTING_interpreter_fail (is);
    116     return;
    117   }
    118   if (GNUNET_OK !=
    119       TALER_TESTING_get_trait_purse_priv (ref,
    120                                           &purse_priv))
    121   {
    122     GNUNET_break (0);
    123     TALER_TESTING_interpreter_fail (is);
    124     return;
    125   }
    126   pds->is = is;
    127   pds->pdh = TALER_EXCHANGE_purse_delete (
    128     TALER_TESTING_interpreter_get_context (is),
    129     exchange_url,
    130     purse_priv,
    131     &purse_delete_cb,
    132     pds);
    133   if (NULL == pds->pdh)
    134   {
    135     GNUNET_break (0);
    136     TALER_TESTING_interpreter_fail (is);
    137     return;
    138   }
    139 }
    140 
    141 
    142 /**
    143  * Free the state of a "purse_delete" CMD, and possibly cancel a
    144  * pending operation thereof.
    145  *
    146  * @param cls closure, must be a `struct PurseDeleteState`.
    147  * @param cmd the command which is being cleaned up.
    148  */
    149 static void
    150 purse_delete_cleanup (void *cls,
    151                       const struct TALER_TESTING_Command *cmd)
    152 {
    153   struct PurseDeleteState *pds = cls;
    154 
    155   if (NULL != pds->pdh)
    156   {
    157     TALER_TESTING_command_incomplete (pds->is,
    158                                       cmd->label);
    159     TALER_EXCHANGE_purse_delete_cancel (pds->pdh);
    160     pds->pdh = NULL;
    161   }
    162   GNUNET_free (pds);
    163 }
    164 
    165 
    166 struct TALER_TESTING_Command
    167 TALER_TESTING_cmd_purse_delete (const char *label,
    168                                 unsigned int expected_http_status,
    169                                 const char *purse_cmd)
    170 {
    171   struct PurseDeleteState *ds;
    172 
    173   ds = GNUNET_new (struct PurseDeleteState);
    174   ds->expected_response_code = expected_http_status;
    175   ds->purse_cmd = purse_cmd;
    176   {
    177     struct TALER_TESTING_Command cmd = {
    178       .cls = ds,
    179       .label = label,
    180       .run = &purse_delete_run,
    181       .cleanup = &purse_delete_cleanup
    182     };
    183 
    184     return cmd;
    185   }
    186 }
    187 
    188 
    189 /* end of testing_api_cmd_purse_delete.c */