From 16a6d39dc94eccf60f25e5abfaeb6c313e39c39a Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Wed, 15 Jan 2020 22:09:39 +0100 Subject: [PATCH] simplify bank history commands --- src/lib/test_bank_api.c | 106 ++++---- src/lib/testing_api_cmd_bank_history_credit.c | 240 +++++++----------- src/lib/testing_api_cmd_bank_history_debit.c | 219 ++++++---------- 3 files changed, 228 insertions(+), 337 deletions(-) diff --git a/src/lib/test_bank_api.c b/src/lib/test_bank_api.c index 0ae77353f..21dbe74b5 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); + 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); + } } diff --git a/src/lib/testing_api_cmd_bank_history_credit.c b/src/lib/testing_api_cmd_bank_history_credit.c index d2f962e20..be820ab4b 100644 --- a/src/lib/testing_api_cmd_bank_history_credit.c +++ b/src/lib/testing_api_cmd_bank_history_credit.c @@ -31,6 +31,30 @@ #include "taler_fakebank_lib.h" +/** + * 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. */ @@ -74,30 +98,16 @@ struct HistoryState */ int failed; -}; - - -/** - * Item in the transaction history, as reconstructed from the - * command history. - */ -struct History -{ + /** + * Expected history. + */ + struct History *h; /** - * Wire details. + * Length of @e h */ - struct TALER_BANK_CreditDetails details; + unsigned int total; - /** - * Serial ID of the wire transfer. - */ - uint64_t row_id; - - /** - * URL to free. - */ - char *url; }; @@ -127,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= hs->num_results; -} - - /** * This function constructs the list of history elements that * interest the account number of the caller. It has two main @@ -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; @@ -453,52 +423,32 @@ 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,38 +507,6 @@ history_cb (void *cls, struct HistoryState *hs = is->commands[is->ip].cls; (void) row_id; - if (NULL == details) - { - hs->hh = NULL; - if ( (hs->results_obtained != compute_result_count (is)) || - (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;" - " HTTP status code: %u/%d, failed: %d\n", - (unsigned long long) total, - (unsigned long long) hs->results_obtained, - http_status, - (int) ec, - hs->failed); - print_expected (h, - total, - UINT_MAX); - free_history (h, - total); - TALER_TESTING_interpreter_fail (is); - return GNUNET_SYSERR; - } - TALER_TESTING_interpreter_next (is); - return GNUNET_OK; - } - if (MHD_HTTP_OK != http_status) { hs->hh = NULL; @@ -602,8 +516,36 @@ history_cb (void *cls, TALER_TESTING_interpreter_fail (is); return GNUNET_SYSERR; } + if (NULL == details) + { + hs->hh = NULL; + if ( (hs->results_obtained != hs->total) || + (GNUNET_YES == hs->failed) || + (MHD_HTTP_NO_CONTENT != http_status) ) + { + GNUNET_break (0); + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Expected history of length %u, got %llu;" + " HTTP status code: %u/%d, failed: %d\n", + hs->total, + (unsigned long long) hs->results_obtained, + http_status, + (int) ec, + hs->failed); + print_expected (hs->h, + hs->total, + UINT_MAX); + TALER_TESTING_interpreter_fail (is); + return GNUNET_SYSERR; + } + TALER_TESTING_interpreter_next (is); + return GNUNET_OK; + } + /* 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; offtotal; 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 8459c9771..267ea1432 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 @@ */ /** - * @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 -{ + /** + * Expected history. + */ + struct History *h; /** - * Wire details. + * Length of @e h */ - struct TALER_BANK_DebitDetails details; + unsigned int total; - /** - * Serial ID of the wire transfer. - */ - uint64_t row_id; - - /** - * URL to free. - */ - char *url; }; @@ -127,22 +136,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= hs->num_results; -} - - /** * This function constructs the list of history elements that * interest the account number of the caller. It has two main @@ -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; @@ -461,46 +428,25 @@ 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,38 +511,6 @@ history_cb (void *cls, struct HistoryState *hs = is->commands[is->ip].cls; (void) row_id; - if (NULL == details) - { - hs->hh = NULL; - if ( (hs->results_obtained != compute_result_count (is)) || - (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;" - " HTTP status code: %u/%d, failed: %d\n", - (unsigned long long) total, - (unsigned long long) hs->results_obtained, - http_status, - (int) ec, - hs->failed); - print_expected (h, - total, - UINT_MAX); - free_history (h, - total); - TALER_TESTING_interpreter_fail (is); - return GNUNET_SYSERR; - } - TALER_TESTING_interpreter_next (is); - return GNUNET_OK; - } - if (MHD_HTTP_OK != http_status) { hs->hh = NULL; @@ -610,8 +520,36 @@ history_cb (void *cls, TALER_TESTING_interpreter_fail (is); return GNUNET_SYSERR; } + if (NULL == details) + { + hs->hh = NULL; + if ( (hs->results_obtained != hs->total) || + (GNUNET_YES == hs->failed) || + (MHD_HTTP_NO_CONTENT != http_status) ) + { + GNUNET_break (0); + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Expected history of length %u, got %llu;" + " HTTP status code: %u/%d, failed: %d\n", + hs->total, + (unsigned long long) hs->results_obtained, + http_status, + (int) ec, + hs->failed); + print_expected (hs->h, + hs->total, + UINT_MAX); + TALER_TESTING_interpreter_fail (is); + return GNUNET_SYSERR; + } + TALER_TESTING_interpreter_next (is); + return GNUNET_OK; + } + /* 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; offtotal; 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 */