From 16a6d39dc94eccf60f25e5abfaeb6c313e39c39a Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Wed, 15 Jan 2020 22:09:39 +0100 Subject: simplify bank history commands --- src/lib/testing_api_cmd_bank_history_credit.c | 212 ++++++++++---------------- 1 file changed, 79 insertions(+), 133 deletions(-) (limited to 'src/lib/testing_api_cmd_bank_history_credit.c') 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 -{ - /** - * 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; }; @@ -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,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; offtotal; off++) + GNUNET_free (hs->h[off].url); + GNUNET_free_non_null (hs->h); GNUNET_free (hs); } -- cgit v1.2.3