diff options
| -rw-r--r-- | src/lib/test_bank_api.c | 106 | ||||
| -rw-r--r-- | src/lib/testing_api_cmd_bank_history_credit.c | 212 | ||||
| -rw-r--r-- | src/lib/testing_api_cmd_bank_history_debit.c | 191 | 
3 files changed, 200 insertions, 309 deletions
diff --git a/src/lib/test_bank_api.c b/src/lib/test_bank_api.c index 0ae77353..21dbe74b 100644 --- a/src/lib/test_bank_api.c +++ b/src/lib/test_bank_api.c @@ -63,58 +63,62 @@ run (void *cls,       struct TALER_TESTING_Interpreter *is)  {    struct TALER_WireTransferIdentifierRawP wtid; +    memset (&wtid, 42, sizeof (wtid)); -  struct TALER_TESTING_Command commands[] = { -    TALER_TESTING_cmd_bank_credits ("history-0", -                                    bc.exchange_account_url, -                                    &bc.exchange_auth, -                                    NULL, -                                    1), -    TALER_TESTING_cmd_admin_add_incoming ("debit-1", -                                          "KUDOS:5.01", -                                          bc.exchange_account_url, -                                          &bc.exchange_auth, -                                          bc.user42_payto), -    TALER_TESTING_cmd_bank_credits ("history-1c", -                                    bc.exchange_account_url, -                                    &bc.exchange_auth, -                                    NULL, -                                    5), -    TALER_TESTING_cmd_bank_debits ("history-1d", -                                   bc.exchange_account_url, -                                   &bc.exchange_auth, -                                   NULL, -                                   5), -    TALER_TESTING_cmd_admin_add_incoming ("debit-2", -                                          "KUDOS:3.21", -                                          bc.exchange_account_url, -                                          &bc.exchange_auth, -                                          bc.user42_payto), -    TALER_TESTING_cmd_transfer ("credit-2", -                                "KUDOS:3.22", -                                bc.exchange_account_url, -                                &bc.exchange_auth, -                                bc.user42_payto, -                                &wtid, -                                "http://exchange.example.com/"), -    TALER_TESTING_cmd_bank_debits ("history-2b", -                                   bc.exchange_account_url, -                                   &bc.exchange_auth, -                                   NULL, -                                   5), -    TALER_TESTING_cmd_end () -  }; - -  GNUNET_log (GNUNET_ERROR_TYPE_INFO, -              "Bank serves at `%s'\n", -              bc.bank_url); -  if (GNUNET_YES == with_fakebank) -    TALER_TESTING_run_with_fakebank (is, -                                     commands, -                                     bc.bank_url); -  else -    TALER_TESTING_run (is, -                       commands); + +  { +    struct TALER_TESTING_Command commands[] = { +      TALER_TESTING_cmd_bank_credits ("history-0", +                                      bc.exchange_account_url, +                                      &bc.exchange_auth, +                                      NULL, +                                      1), +      TALER_TESTING_cmd_admin_add_incoming ("debit-1", +                                            "KUDOS:5.01", +                                            bc.exchange_account_url, +                                            &bc.exchange_auth, +                                            bc.user42_payto), +      TALER_TESTING_cmd_bank_credits ("history-1c", +                                      bc.exchange_account_url, +                                      &bc.exchange_auth, +                                      NULL, +                                      5), +      TALER_TESTING_cmd_bank_debits ("history-1d", +                                     bc.exchange_account_url, +                                     &bc.exchange_auth, +                                     NULL, +                                     5), +      TALER_TESTING_cmd_admin_add_incoming ("debit-2", +                                            "KUDOS:3.21", +                                            bc.exchange_account_url, +                                            &bc.exchange_auth, +                                            bc.user42_payto), +      TALER_TESTING_cmd_transfer ("credit-2", +                                  "KUDOS:3.22", +                                  bc.exchange_account_url, +                                  &bc.exchange_auth, +                                  bc.user42_payto, +                                  &wtid, +                                  "http://exchange.example.com/"), +      TALER_TESTING_cmd_bank_debits ("history-2b", +                                     bc.exchange_account_url, +                                     &bc.exchange_auth, +                                     NULL, +                                     5), +      TALER_TESTING_cmd_end () +    }; + +    GNUNET_log (GNUNET_ERROR_TYPE_INFO, +                "Bank serves at `%s'\n", +                bc.bank_url); +    if (GNUNET_YES == with_fakebank) +      TALER_TESTING_run_with_fakebank (is, +                                       commands, +                                       bc.bank_url); +    else +      TALER_TESTING_run (is, +                         commands); +  }  } diff --git a/src/lib/testing_api_cmd_bank_history_credit.c b/src/lib/testing_api_cmd_bank_history_credit.c index d2f962e2..be820ab4 100644 --- a/src/lib/testing_api_cmd_bank_history_credit.c +++ b/src/lib/testing_api_cmd_bank_history_credit.c @@ -32,6 +32,30 @@  /** + * Item in the transaction history, as reconstructed from the + * command history. + */ +struct History +{ + +  /** +   * Wire details. +   */ +  struct TALER_BANK_CreditDetails details; + +  /** +   * Serial ID of the wire transfer. +   */ +  uint64_t row_id; + +  /** +   * URL to free. +   */ +  char *url; +}; + + +/**   * State for a "history" CMD.   */  struct HistoryState @@ -74,30 +98,16 @@ struct HistoryState     */    int failed; -}; - - -/** - * Item in the transaction history, as reconstructed from the - * command history. - */ -struct History -{ -    /** -   * Wire details. +   * Expected history.     */ -  struct TALER_BANK_CreditDetails details; +  struct History *h;    /** -   * Serial ID of the wire transfer. +   * Length of @e h     */ -  uint64_t row_id; +  unsigned int total; -  /** -   * URL to free. -   */ -  char *url;  }; @@ -128,22 +138,6 @@ history_traits (void *cls,  /** - * Free history @a h of length @a h_len. - * - * @param h history array to free. - * @param h_len number of entries in @a h. - */ -static void -free_history (struct History *h, -              uint64_t h_len) -{ -  for (uint64_t off = 0; off<h_len; off++) -    GNUNET_free (h[off].url); -  GNUNET_free_non_null (h); -} - - -/**   * Log which history we expected.  Called when an error occurs.   *   * @param h what we expected. @@ -152,7 +146,7 @@ free_history (struct History *h,   */  static void  print_expected (struct History *h, -                uint64_t h_len, +                unsigned int h_len,                  unsigned int off)  {    GNUNET_log (GNUNET_ERROR_TYPE_ERROR, @@ -161,12 +155,12 @@ print_expected (struct History *h,                (unsigned long long) h_len);    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,                "Expected history:\n"); -  for (uint64_t i = 0; i<h_len; i++) +  for (unsigned int i = 0; i<h_len; i++)    {      GNUNET_log (GNUNET_ERROR_TYPE_ERROR, -                "H(%llu): %s (serial: %llu, subject: %s," +                "H(%u): %s (serial: %llu, subject: %s,"                  " counterpart: %s)\n", -                (unsigned long long) i, +                i,                  TALER_amount2s (&h[i].details.amount),                  (unsigned long long) h[i].row_id,                  TALER_B2S (&h[i].details.reserve_pub), @@ -176,26 +170,6 @@ print_expected (struct History *h,  /** - * Tell if the current item is beyond the allowed limit. - * - * @param total current number of items in the built history list. - *        Note, this is the list we build locally and compare with - *        what the server returned. - * @param hs the history CMD state. - * @param pos current item to be evaluated or not (if the list - *        has already enough elements). - * @return GNUNET_OK / GNUNET_NO. - */ -static int -build_history_hit_limit (uint64_t total, -                         const struct HistoryState *hs, -                         const struct TALER_TESTING_Command *pos) -{ -  return total >= hs->num_results; -} - - -/**   * This function constructs the list of history elements that   * interest the account number of the caller.  It has two main   * loops: the first to figure out how many history elements have @@ -205,50 +179,49 @@ build_history_hit_limit (uint64_t total,   * @param is interpreter state (supposedly having the   *        current CMD pointing at a "history" CMD).   * @param[out] rh history array to initialize. - *   * @return number of entries in @a rh.   */ -static uint64_t +static unsigned int  build_history (struct TALER_TESTING_Interpreter *is,                 struct History **rh)  {    struct HistoryState *hs = is->commands[is->ip].cls; -  uint64_t total; +  unsigned int total;    struct History *h;    const struct TALER_TESTING_Command *add_incoming_cmd;    int inc;    unsigned int start;    unsigned int end; -  /** -   * @var turns GNUNET_YES whenever either no 'start' value was +  /* @var turns GNUNET_YES whenever either no 'start' value was     *      given for the history query, or the given value is found -   *      in the list of all the CMDs. -   */int ok; +   *      in the list of all the CMDs. */// +  int ok;    const uint64_t *row_id_start = NULL;    if (NULL != hs->start_row_reference)    { -    TALER_LOG_INFO -      ("`%s': start row given via reference `%s'\n", -      TALER_TESTING_interpreter_get_current_label  (is), -      hs->start_row_reference); -    add_incoming_cmd = TALER_TESTING_interpreter_lookup_command -                         (is, hs->start_row_reference); +    TALER_LOG_INFO ("`%s': start row given via reference `%s'\n", +                    TALER_TESTING_interpreter_get_current_label (is), +                    hs->start_row_reference); +    add_incoming_cmd +      = TALER_TESTING_interpreter_lookup_command (is, +                                                  hs->start_row_reference);      GNUNET_assert (NULL != add_incoming_cmd); -    GNUNET_assert (GNUNET_OK == TALER_TESTING_get_trait_uint64 -                     (add_incoming_cmd, 0, &row_id_start)); +    GNUNET_assert (GNUNET_OK == +                   TALER_TESTING_get_trait_uint64 (add_incoming_cmd, +                                                   0, +                                                   &row_id_start));    }    GNUNET_assert (0 != hs->num_results);    if (0 == is->ip)    { -    TALER_LOG_DEBUG ("Checking history at first CMD..\n"); +    TALER_LOG_DEBUG ("Checking history at first CMD (empty history)\n");      *rh = NULL;      return 0;    } -  /* AKA 'delta'.  */    if (hs->num_results > 0)    {      inc = 1;  /* _inc_rement */ @@ -304,9 +277,8 @@ build_history (struct TALER_TESTING_Interpreter *is,        continue; /* skip until we find the marker */      TALER_LOG_DEBUG ("Found first row\n"); -    if (build_history_hit_limit (total, -                                 hs, -                                 pos)) +    if (total >= GNUNET_MAX (hs->num_results, +                             -hs->num_results) )      {        TALER_LOG_DEBUG ("Hit history limit\n");        break; @@ -343,8 +315,7 @@ build_history (struct TALER_TESTING_Interpreter *is,    } -  GNUNET_assert (total < UINT_MAX); -  h = GNUNET_new_array ((unsigned int) total, +  h = GNUNET_new_array (total,                          struct History);    total = 0;    ok = GNUNET_NO; @@ -391,9 +362,8 @@ build_history (struct TALER_TESTING_Interpreter *is,        continue; /* skip until we find the marker */      } -    if (build_history_hit_limit (total, -                                 hs, -                                 pos)) +    if (total >= GNUNET_MAX (hs->num_results, +                             -hs->num_results) )      {        TALER_LOG_INFO ("Hit history limit (2)\n");        break; @@ -454,51 +424,31 @@ build_history (struct TALER_TESTING_Interpreter *is,  /** - * Compute how many results we expect to be returned for - * the current command at @a is. - * - * @param is the interpreter state to inspect. - * @return number of results expected. - */ -static uint64_t -compute_result_count (struct TALER_TESTING_Interpreter *is) -{ -  uint64_t total; -  struct History *h; - -  total = build_history (is, &h); -  free_history (h, total); -  return total; -} - - -/**   * Check that the "/history" response matches the   * CMD whose offset in the list of CMDs is @a off.   *   * @param is the interpreter state. + * @param h expected history (array) + * @param total length of @a h   * @param off the offset (of the CMD list) where the command   *        to check is.   * @param dir the expected direction of the transaction.   * @param details the expected transaction details. - *   * @return #GNUNET_OK if the transaction is what we expect.   */  static int  check_result (struct TALER_TESTING_Interpreter *is, +              struct History *h, +              unsigned int total,                unsigned int off,                const struct TALER_BANK_CreditDetails *details)  { -  uint64_t total; -  struct History *h; - -  total = build_history (is, &h);    if (off >= total)    {      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,                  "Test says history has at most %u"                  " results, but got result #%u to check\n", -                (unsigned int) total, +                total,                  off);      print_expected (h,                      total, @@ -516,12 +466,8 @@ check_result (struct TALER_TESTING_Interpreter *is,      print_expected (h,                      total,                      off); -    free_history (h, -                  total);      return GNUNET_SYSERR;    } -  free_history (h, -                total);    return GNUNET_OK;  } @@ -561,31 +507,34 @@ history_cb (void *cls,    struct HistoryState *hs = is->commands[is->ip].cls;    (void) row_id; +  if (MHD_HTTP_OK != http_status) +  { +    hs->hh = NULL; +    GNUNET_log (GNUNET_ERROR_TYPE_ERROR, +                "Unwanted response code from /history: %u\n", +                http_status); +    TALER_TESTING_interpreter_fail (is); +    return GNUNET_SYSERR; +  }    if (NULL == details)    {      hs->hh = NULL; -    if ( (hs->results_obtained != compute_result_count (is)) || +    if ( (hs->results_obtained != hs->total) ||           (GNUNET_YES == hs->failed) ||           (MHD_HTTP_NO_CONTENT != http_status) )      { -      uint64_t total; -      struct History *h; -        GNUNET_break (0); -      total = build_history (is, &h);        GNUNET_log (GNUNET_ERROR_TYPE_ERROR, -                  "Expected history of length %llu, got %llu;" +                  "Expected history of length %u, got %llu;"                    " HTTP status code: %u/%d, failed: %d\n", -                  (unsigned long long) total, +                  hs->total,                    (unsigned long long) hs->results_obtained,                    http_status,                    (int) ec,                    hs->failed); -      print_expected (h, -                      total, +      print_expected (hs->h, +                      hs->total,                        UINT_MAX); -      free_history (h, -                    total);        TALER_TESTING_interpreter_fail (is);        return GNUNET_SYSERR;      } @@ -593,17 +542,10 @@ history_cb (void *cls,      return GNUNET_OK;    } -  if (MHD_HTTP_OK != http_status) -  { -    hs->hh = NULL; -    GNUNET_log (GNUNET_ERROR_TYPE_ERROR, -                "Unwanted response code from /history: %u\n", -                http_status); -    TALER_TESTING_interpreter_fail (is); -    return GNUNET_SYSERR; -  }    /* check current element */    if (GNUNET_OK != check_result (is, +                                 hs->h, +                                 hs->total,                                   hs->results_obtained,                                   details))    { @@ -664,7 +606,8 @@ history_run (void *cls,      TALER_LOG_DEBUG ("row id (from trait) is %llu\n",                       (unsigned long long) row_id);    } - +  hs->total = build_history (is, +                             &hs->h);    hs->hh = TALER_BANK_credit_history (is->ctx,                                        hs->account_url,                                        &hs->auth, @@ -696,6 +639,9 @@ history_cleanup (void *cls,      TALER_BANK_credit_history_cancel (hs->hh);    }    GNUNET_free (hs->account_url); +  for (unsigned int off = 0; off<hs->total; off++) +    GNUNET_free (hs->h[off].url); +  GNUNET_free_non_null (hs->h);    GNUNET_free (hs);  } diff --git a/src/lib/testing_api_cmd_bank_history_debit.c b/src/lib/testing_api_cmd_bank_history_debit.c index 8459c977..267ea143 100644 --- a/src/lib/testing_api_cmd_bank_history_debit.c +++ b/src/lib/testing_api_cmd_bank_history_debit.c @@ -17,7 +17,7 @@    <http://www.gnu.org/licenses/>  */  /** - * @file bank-lib/testing_api_cmd_history.c + * @file lib/testing_api_cmd_bank_history_debit.c   * @brief command to check the /history API from the bank.   * @author Marcello Stanisci   */ @@ -30,6 +30,29 @@  #include "taler_bank_service.h"  #include "taler_fakebank_lib.h" +/** + * Item in the transaction history, as reconstructed from the + * command history. + */ +struct History +{ + +  /** +   * Wire details. +   */ +  struct TALER_BANK_DebitDetails details; + +  /** +   * Serial ID of the wire transfer. +   */ +  uint64_t row_id; + +  /** +   * URL to free. +   */ +  char *url; +}; +  /**   * State for a "history" CMD. @@ -74,30 +97,16 @@ struct HistoryState     */    int failed; -}; - - -/** - * Item in the transaction history, as reconstructed from the - * command history. - */ -struct History -{ -    /** -   * Wire details. +   * Expected history.     */ -  struct TALER_BANK_DebitDetails details; +  struct History *h;    /** -   * Serial ID of the wire transfer. +   * Length of @e h     */ -  uint64_t row_id; +  unsigned int total; -  /** -   * URL to free. -   */ -  char *url;  }; @@ -128,22 +137,6 @@ history_traits (void *cls,  /** - * Free history @a h of length @a h_len. - * - * @param h history array to free. - * @param h_len number of entries in @a h. - */ -static void -free_history (struct History *h, -              uint64_t h_len) -{ -  for (uint64_t off = 0; off<h_len; off++) -    GNUNET_free (h[off].url); -  GNUNET_free_non_null (h); -} - - -/**   * Log which history we expected.  Called when an error occurs.   *   * @param h what we expected. @@ -152,7 +145,7 @@ free_history (struct History *h,   */  static void  print_expected (struct History *h, -                uint64_t h_len, +                unsigned int h_len,                  unsigned int off)  {    GNUNET_log (GNUNET_ERROR_TYPE_ERROR, @@ -161,12 +154,11 @@ print_expected (struct History *h,                (unsigned long long) h_len);    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,                "Expected history:\n"); -  for (uint64_t i = 0; i<h_len; i++) +  for (unsigned int i = 0; i<h_len; i++)    {      GNUNET_log (GNUNET_ERROR_TYPE_ERROR, -                "H(%llu): %s (serial: %llu, subject: %s," -                " counterpart: %s)\n", -                (unsigned long long) i, +                "H(%u): %s (serial: %llu, subject: %s, counterpart: %s)\n", +                i,                  TALER_amount2s (&h[i].details.amount),                  (unsigned long long) h[i].row_id,                  TALER_B2S (&h[i].details.wtid), @@ -176,26 +168,6 @@ print_expected (struct History *h,  /** - * Tell if the current item is beyond the allowed limit. - * - * @param total current number of items in the built history list. - *        Note, this is the list we build locally and compare with - *        what the server returned. - * @param hs the history CMD state. - * @param pos current item to be evaluated or not (if the list - *        has already enough elements). - * @return GNUNET_OK / GNUNET_NO. - */ -static int -build_history_hit_limit (uint64_t total, -                         const struct HistoryState *hs, -                         const struct TALER_TESTING_Command *pos) -{ -  return total >= hs->num_results; -} - - -/**   * This function constructs the list of history elements that   * interest the account number of the caller.  It has two main   * loops: the first to figure out how many history elements have @@ -205,15 +177,14 @@ build_history_hit_limit (uint64_t total,   * @param is interpreter state (supposedly having the   *        current CMD pointing at a "history" CMD).   * @param[out] rh history array to initialize. - *   * @return number of entries in @a rh.   */ -static uint64_t +static unsigned int  build_history (struct TALER_TESTING_Interpreter *is,                 struct History **rh)  {    struct HistoryState *hs = is->commands[is->ip].cls; -  uint64_t total; +  unsigned int total;    struct History *h;    const struct TALER_TESTING_Command *add_incoming_cmd;    int inc; @@ -303,9 +274,8 @@ build_history (struct TALER_TESTING_Interpreter *is,      TALER_LOG_DEBUG ("Found first row\n"); -    if (build_history_hit_limit (total, -                                 hs, -                                 pos)) +    if (total >= GNUNET_MAX (hs->num_results, +                             -hs->num_results) )      {        TALER_LOG_DEBUG ("Hit history limit\n");        break; @@ -342,8 +312,6 @@ build_history (struct TALER_TESTING_Interpreter *is,      return 0;    } - -  GNUNET_assert (total < UINT_MAX);    h = GNUNET_new_array ((unsigned int) total,                          struct History);    total = 0; @@ -390,9 +358,8 @@ build_history (struct TALER_TESTING_Interpreter *is,        continue; /* skip until we find the marker */      } -    if (build_history_hit_limit (total, -                                 hs, -                                 pos)) +    if (total >= GNUNET_MAX (hs->num_results, +                             -hs->num_results))      {        TALER_LOG_INFO ("Hit history limit (2)\n");        break; @@ -462,45 +429,24 @@ build_history (struct TALER_TESTING_Interpreter *is,  /** - * Compute how many results we expect to be returned for - * the current command at @a is. - * - * @param is the interpreter state to inspect. - * @return number of results expected. - */ -static uint64_t -compute_result_count (struct TALER_TESTING_Interpreter *is) -{ -  uint64_t total; -  struct History *h; - -  total = build_history (is, &h); -  free_history (h, total); -  return total; -} - - -/**   * Check that the "/history" response matches the   * CMD whose offset in the list of CMDs is @a off.   *   * @param is the interpreter state. + * @param h expected history + * @param total number of entries in @a h   * @param off the offset (of the CMD list) where the command   *        to check is. - * @param dir the expected direction of the transaction.   * @param details the expected transaction details. - *   * @return #GNUNET_OK if the transaction is what we expect.   */  static int  check_result (struct TALER_TESTING_Interpreter *is, +              struct History *h, +              uint64_t total,                unsigned int off,                const struct TALER_BANK_DebitDetails *details)  { -  uint64_t total; -  struct History *h; - -  total = build_history (is, &h);    if (off >= total)    {      GNUNET_log (GNUNET_ERROR_TYPE_ERROR, @@ -524,12 +470,8 @@ check_result (struct TALER_TESTING_Interpreter *is,      print_expected (h,                      total,                      off); -    free_history (h, -                  total);      return GNUNET_SYSERR;    } -  free_history (h, -                total);    return GNUNET_OK;  } @@ -569,31 +511,34 @@ history_cb (void *cls,    struct HistoryState *hs = is->commands[is->ip].cls;    (void) row_id; +  if (MHD_HTTP_OK != http_status) +  { +    hs->hh = NULL; +    GNUNET_log (GNUNET_ERROR_TYPE_ERROR, +                "Unwanted response code from /history: %u\n", +                http_status); +    TALER_TESTING_interpreter_fail (is); +    return GNUNET_SYSERR; +  }    if (NULL == details)    {      hs->hh = NULL; -    if ( (hs->results_obtained != compute_result_count (is)) || +    if ( (hs->results_obtained != hs->total) ||           (GNUNET_YES == hs->failed) ||           (MHD_HTTP_NO_CONTENT != http_status) )      { -      uint64_t total; -      struct History *h; -        GNUNET_break (0); -      total = build_history (is, &h);        GNUNET_log (GNUNET_ERROR_TYPE_ERROR, -                  "Expected history of length %llu, got %llu;" +                  "Expected history of length %u, got %llu;"                    " HTTP status code: %u/%d, failed: %d\n", -                  (unsigned long long) total, +                  hs->total,                    (unsigned long long) hs->results_obtained,                    http_status,                    (int) ec,                    hs->failed); -      print_expected (h, -                      total, +      print_expected (hs->h, +                      hs->total,                        UINT_MAX); -      free_history (h, -                    total);        TALER_TESTING_interpreter_fail (is);        return GNUNET_SYSERR;      } @@ -601,17 +546,10 @@ history_cb (void *cls,      return GNUNET_OK;    } -  if (MHD_HTTP_OK != http_status) -  { -    hs->hh = NULL; -    GNUNET_log (GNUNET_ERROR_TYPE_ERROR, -                "Unwanted response code from /history: %u\n", -                http_status); -    TALER_TESTING_interpreter_fail (is); -    return GNUNET_SYSERR; -  }    /* check current element */    if (GNUNET_OK != check_result (is, +                                 hs->h, +                                 hs->total,                                   hs->results_obtained,                                   details))    { @@ -656,12 +594,12 @@ history_run (void *cls,    {      const struct TALER_TESTING_Command *history_cmd; -    history_cmd = TALER_TESTING_interpreter_lookup_command -                    (is, hs->start_row_reference); +    history_cmd +      = TALER_TESTING_interpreter_lookup_command (is, +                                                  hs->start_row_reference);      if (NULL == history_cmd)        TALER_TESTING_FAIL (is); -      if (GNUNET_OK !=          TALER_TESTING_get_trait_uint64 (history_cmd,                                          0, @@ -672,7 +610,7 @@ history_run (void *cls,      TALER_LOG_DEBUG ("row id (from trait) is %llu\n",                       (unsigned long long) row_id);    } - +  hs->total = build_history (is, &hs->h);    hs->hh = TALER_BANK_debit_history (is->ctx,                                       hs->account_url,                                       &hs->auth, @@ -703,6 +641,9 @@ history_cleanup (void *cls,      TALER_LOG_WARNING ("/history did not complete\n");      TALER_BANK_debit_history_cancel (hs->hh);    } +  for (unsigned int off = 0; off<hs->total; off++) +    GNUNET_free (hs->h[off].url); +  GNUNET_free_non_null (hs->h);    GNUNET_free (hs);  } @@ -749,4 +690,4 @@ TALER_TESTING_cmd_bank_debits (const char *label,  } -/* end of testing_api_cmd_history_debit.c */ +/* end of testing_api_cmd_bank_history_debit.c */  | 
