diff options
author | ng0 <ng0@n0.is> | 2019-04-10 20:49:59 +0000 |
---|---|---|
committer | ng0 <ng0@n0.is> | 2019-04-10 20:51:36 +0000 |
commit | 71acaff203586a956c71f0e90317d5fff0a50e14 (patch) | |
tree | fa2abb2a5b48894783da859e74c1966772be3ddf /src/bank-lib | |
parent | 2699155b81f8db564e27610896eb2af0c3e88c6d (diff) | |
parent | a73e1dd4198bd7fe83e6e00ee01fe5a83bbaa41d (diff) | |
download | exchange-71acaff203586a956c71f0e90317d5fff0a50e14.tar.xz |
Merge branch 'master' of git.taler.net:exchange
Diffstat (limited to 'src/bank-lib')
-rw-r--r-- | src/bank-lib/bank_api_history.c | 5 | ||||
-rw-r--r-- | src/bank-lib/fakebank.c | 56 | ||||
-rw-r--r-- | src/bank-lib/test_bank_api_new.c | 47 | ||||
-rw-r--r-- | src/bank-lib/test_bank_api_twisted.c | 22 | ||||
-rw-r--r-- | src/bank-lib/test_bank_api_with_fakebank_new.c | 6 | ||||
-rw-r--r-- | src/bank-lib/test_bank_api_with_fakebank_twisted.c | 20 | ||||
-rw-r--r-- | src/bank-lib/testing_api_cmd_history.c | 188 |
7 files changed, 273 insertions, 71 deletions
diff --git a/src/bank-lib/bank_api_history.c b/src/bank-lib/bank_api_history.c index 4b9ea3c3c..5cdac9170 100644 --- a/src/bank-lib/bank_api_history.c +++ b/src/bank-lib/bank_api_history.c @@ -419,7 +419,7 @@ TALER_BANK_history_range (struct GNUNET_CURL_Context *ctx, GNUNET_TIME_round_abs (&end_date); GNUNET_asprintf (&url, - "/history?auth=basic&account_number=%llu&start=%llu&end=%llu&direction=%s&cancelled=%s&ordering=%s", + "/history-range?auth=basic&account_number=%llu&start=%llu&end=%llu&direction=%s&cancelled=%s&ordering=%s", (unsigned long long) account_number, start_date.abs_value_us / 1000LL / 1000LL, end_date.abs_value_us / 1000LL / 1000LL, @@ -498,7 +498,8 @@ TALER_BANK_history (struct GNUNET_CURL_Context *ctx, /* Locate and "cut" the 'start' argument, * if the user didn't provide one. */ if (UINT64_MAX == start_row) - *strstr (url, "&start=") = '\0'; + *strstr (url, + "&start=") = '\0'; hh = put_history_job (ctx, bank_base_url, diff --git a/src/bank-lib/fakebank.c b/src/bank-lib/fakebank.c index 9915516cd..1220fa057 100644 --- a/src/bank-lib/fakebank.c +++ b/src/bank-lib/fakebank.c @@ -587,6 +587,7 @@ handle_reject (struct TALER_FAKEBANK_Handle *h, return ret; } + /** * Handle incoming HTTP request for /history * @@ -596,9 +597,40 @@ handle_reject (struct TALER_FAKEBANK_Handle *h, * @return MHD result code */ static int -handle_history_new (struct TALER_FAKEBANK_Handle *h, - struct MHD_Connection *connection, - void **con_cls) +handle_home_page (struct TALER_FAKEBANK_Handle *h, + struct MHD_Connection *connection, + void **con_cls) +{ + int ret; + struct MHD_Response *resp; +#define HELLOMSG "Hello, Fakebank!" + + resp = MHD_create_response_from_buffer + (strlen (HELLOMSG), + HELLOMSG, + MHD_RESPMEM_MUST_COPY); + + ret = MHD_queue_response (connection, + MHD_HTTP_OK, + resp); + + MHD_destroy_response (resp); + return ret; +} + + +/** + * Handle incoming HTTP request for /history + * + * @param h the fakebank handle + * @param connection the connection + * @param con_cls place to store state, not used + * @return MHD result code + */ +static int +handle_history (struct TALER_FAKEBANK_Handle *h, + struct MHD_Connection *connection, + void **con_cls) { struct HistoryArgs ha; struct HistoryRangeIds hri; @@ -763,6 +795,18 @@ handle_mhd_request (void *cls, { struct TALER_FAKEBANK_Handle *h = cls; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Fakebank, serving: %s\n", + url); + + + if ( (0 == strcasecmp (url, + "/")) && + (0 == strcasecmp (method, + MHD_HTTP_METHOD_GET)) ) + return handle_home_page (h, + connection, + con_cls); if ( (0 == strcasecmp (url, "/admin/add/incoming")) && (0 == strcasecmp (method, @@ -792,9 +836,9 @@ handle_mhd_request (void *cls, "/history")) && (0 == strcasecmp (method, MHD_HTTP_METHOD_GET)) ) - return handle_history_new (h, - connection, - con_cls); + return handle_history (h, + connection, + con_cls); /* Unexpected URL path, just close the connection. */ /* we're rather impolite here, but it's a testcase. */ diff --git a/src/bank-lib/test_bank_api_new.c b/src/bank-lib/test_bank_api_new.c index 38ac537f7..5031a3089 100644 --- a/src/bank-lib/test_bank_api_new.c +++ b/src/bank-lib/test_bank_api_new.c @@ -40,6 +40,29 @@ #define CONFIG_FILE "bank.conf" /** + * Adds to the current time. + * + * @param relative number of _seconds_ to add to the current time. + * @return a new absolute time, modified according to @e relative. + */ +#define NOWPLUSSECS(secs) \ + GNUNET_TIME_absolute_add \ + (now, \ + GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, \ + secs)) + +/** + * Subtracts from the current time. + * + * @param relative number of _seconds_ to add to the current time. + * @return a new absolute time, modified according to @e relative. + */ +#define NOWMINUSSECS(secs) \ + GNUNET_TIME_absolute_subtract \ + (now, \ + GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, \ + secs)) +/** * Bank process. */ struct GNUNET_OS_Process *bankd; @@ -61,11 +84,12 @@ run (void *cls, { extern struct TALER_BANK_AuthenticationData AUTHS[]; + struct GNUNET_TIME_Absolute now; GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Bank serves at `%s'\n", bank_url); - + now = GNUNET_TIME_absolute_get (); struct TALER_TESTING_Command commands[] = { TALER_TESTING_cmd_bank_history ("history-0", @@ -76,6 +100,15 @@ run (void *cls, NULL, /* start */ 5), + TALER_TESTING_cmd_bank_history_range_with_dates + ("history-0-range", + bank_url, + EXCHANGE_ACCOUNT_NUMBER, + TALER_BANK_DIRECTION_BOTH, + GNUNET_NO, + NOWMINUSSECS (5), + NOWPLUSSECS (5)), + TALER_TESTING_cmd_fakebank_transfer_with_subject ("deposit-1", "KUDOS:5.01", @@ -131,6 +164,18 @@ run (void *cls, "deposit-1", 5), + /** + * Just check that the two transactions show up. + */ + TALER_TESTING_cmd_bank_history_range_with_dates + ("history-2-range", + bank_url, + EXCHANGE_ACCOUNT_NUMBER, + TALER_BANK_DIRECTION_BOTH, + GNUNET_NO, + NOWMINUSSECS (5), + NOWPLUSSECS (5)), + TALER_TESTING_cmd_bank_reject ("reject-1", bank_url, "deposit-1"), diff --git a/src/bank-lib/test_bank_api_twisted.c b/src/bank-lib/test_bank_api_twisted.c index f9aaf5a1f..d01dbad94 100644 --- a/src/bank-lib/test_bank_api_twisted.c +++ b/src/bank-lib/test_bank_api_twisted.c @@ -81,24 +81,23 @@ static void run (void *cls, struct TALER_TESTING_Interpreter *is) { - struct TALER_TESTING_Command commands[] = { + TALER_TESTING_cmd_wait_service ("wait-service", + "http://localhost:8888/"), + TALER_TESTING_cmd_bank_history ("history-0", - twister_url, + TWISTED_BANK_URL, EXCHANGE_ACCOUNT_NUMBER, TALER_BANK_DIRECTION_BOTH, GNUNET_NO, NULL, 5), - /** - * End the suite. Fixme: better to have a label for this - * too, as it shows a "(null)" token on logs. - */ TALER_TESTING_cmd_end () }; - TALER_TESTING_run (is, commands); + TALER_TESTING_run (is, + commands); } /** @@ -109,7 +108,8 @@ run (void *cls, static void purge_process (struct GNUNET_OS_Process *process) { - GNUNET_OS_process_kill (process, SIGINT); + GNUNET_OS_process_kill (process, + SIGINT); GNUNET_OS_process_wait (process); GNUNET_OS_process_destroy (process); } @@ -124,14 +124,16 @@ main (int argc, unsetenv ("XDG_CONFIG_HOME"); GNUNET_log_setup ("test-bank-api-twisted", - "DEBUG", NULL); + "DEBUG", + NULL); if (NULL == (bank_url = TALER_TESTING_prepare_bank (CONFIG_FILE))) return 77; if (NULL == (bankd = TALER_TESTING_run_bank - (CONFIG_FILE, bank_url))) + (CONFIG_FILE, + bank_url))) return 77; if (NULL == (twister_url = TALER_TESTING_prepare_twister diff --git a/src/bank-lib/test_bank_api_with_fakebank_new.c b/src/bank-lib/test_bank_api_with_fakebank_new.c index b8eaabea0..8865cc403 100644 --- a/src/bank-lib/test_bank_api_with_fakebank_new.c +++ b/src/bank-lib/test_bank_api_with_fakebank_new.c @@ -63,12 +63,6 @@ run (void *cls, struct TALER_TESTING_Command commands[] = { - /** - * NOTE: this command uses internally the _fakebank_ version - * of the add-incoming command. However, this does seem to - * work fine against the Python bank too! Some renaming is - * required.. - */ TALER_TESTING_cmd_bank_history ("history-0", fakebank_url, BANK_ACCOUNT_NUMBER, diff --git a/src/bank-lib/test_bank_api_with_fakebank_twisted.c b/src/bank-lib/test_bank_api_with_fakebank_twisted.c index ca9d42f91..4cf500fbe 100644 --- a/src/bank-lib/test_bank_api_with_fakebank_twisted.c +++ b/src/bank-lib/test_bank_api_with_fakebank_twisted.c @@ -75,18 +75,23 @@ static void run (void *cls, struct TALER_TESTING_Interpreter *is) { + struct TALER_TESTING_Command commands[] = { + + /** + * Can't use the "wait service" CMD here because the + * fakebank runs inside the same process of the test. + */ + TALER_TESTING_cmd_sleep ("wait interface", + 2), + TALER_TESTING_cmd_bank_history ("history-0", - fakebank_url, + TWISTED_BANK_URL, EXCHANGE_ACCOUNT_NUMBER, TALER_BANK_DIRECTION_BOTH, GNUNET_NO, NULL, 5), - /** - * End the suite. Fixme: better to have a label for this - * too, as it shows a "(null)" token on logs. - */ TALER_TESTING_cmd_end () }; @@ -120,8 +125,9 @@ main (int argc, unsetenv ("XDG_DATA_HOME"); unsetenv ("XDG_CONFIG_HOME"); - GNUNET_log_setup ("test-bank-api-twisted", - "DEBUG", NULL); + GNUNET_log_setup ("test-bank-api-with-fakebank-twisted", + "DEBUG", + NULL); if (NULL == (fakebank_url = TALER_TESTING_prepare_fakebank (CONFIG_FILE, diff --git a/src/bank-lib/testing_api_cmd_history.c b/src/bank-lib/testing_api_cmd_history.c index 37e15af82..a50fd9bab 100644 --- a/src/bank-lib/testing_api_cmd_history.c +++ b/src/bank-lib/testing_api_cmd_history.c @@ -1,4 +1,4 @@ -/* + /* This file is part of TALER Copyright (C) 2018 Taler Systems SA @@ -40,19 +40,16 @@ */ struct HistoryState { - /** * Base URL of the bank offering the "history" operation. */ const char *bank_url; - /** * Account number to ask the history for. */ uint64_t account_no; - /** * Which type of records we are interested: in-transfers * / out-transfers / rejected transfers. @@ -65,7 +62,9 @@ struct HistoryState const char *start_row_reference; /** - * How many rows we want in the result. + * How many rows we want in the result, _at most_. In + * the case of /history-range, we fake this value with + * INT64_MAX. */ long long num_results; @@ -263,6 +262,45 @@ 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) +{ + /* "/history-range" case. */ + if (GNUNET_TIME_UNIT_FOREVER_ABS.abs_value_us != + hs->start_date.abs_value_us) + { + const struct GNUNET_TIME_Absolute *timestamp; + + GNUNET_assert (GNUNET_OK == + TALER_TESTING_get_trait_absolute_time (pos, + 0, + ×tamp)); + + GNUNET_assert (GNUNET_TIME_UNIT_FOREVER_ABS.abs_value_us != + hs->end_date.abs_value_us); + + return timestamp->abs_value_us >= hs->end_date.abs_value_us; + } + + 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 @@ -305,10 +343,10 @@ build_history (struct TALER_TESTING_Interpreter *is, 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); + 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); @@ -316,7 +354,9 @@ build_history (struct TALER_TESTING_Interpreter *is, (add_incoming_cmd, 0, &row_id_start)); } - GNUNET_assert (0 != hs->num_results); + GNUNET_assert ((0 != hs->num_results) || + (GNUNET_TIME_UNIT_FOREVER_ABS.abs_value_us != + hs->start_date.abs_value_us)); if (0 == is->ip) { @@ -344,9 +384,9 @@ build_history (struct TALER_TESTING_Interpreter *is, if (NULL == row_id_start) ok = GNUNET_YES; - /* This loop counts how many commands in the list off _all_ - * the commands belong to the history of the caller. This - * is stored in the @var total variable. */ + /* This loop counts how many commands _later than "start"_ belong + * to the history of the caller. This is stored in the @var total + * variable. */ for (unsigned int off = start;off != end + inc; off += inc) { const struct TALER_TESTING_Command *pos = &is->commands[off]; @@ -358,11 +398,12 @@ build_history (struct TALER_TESTING_Interpreter *is, * that do not offer a "row_id" trait. Such skipped CMDs are * not interesting for building a history. */ - - if (GNUNET_OK != TALER_TESTING_get_trait_uint64 - (pos, 0, &row_id)) + if (GNUNET_OK != TALER_TESTING_get_trait_uint64 (pos, + 0, + &row_id)) continue; + /* Seek "/history" starting row. */ if (NULL != row_id_start) { if (*row_id_start == *row_id) @@ -373,12 +414,32 @@ build_history (struct TALER_TESTING_Interpreter *is, continue; } } + + /* Seek "/history-range" starting row, _if_ that's the case */ + if (GNUNET_TIME_UNIT_FOREVER_ABS.abs_value_us != + hs->start_date.abs_value_us) + { + const struct GNUNET_TIME_Absolute *timestamp; + + TALER_TESTING_get_trait_absolute_time (pos, + 0, + ×tamp); + if (hs->start_date.abs_value_us <= timestamp->abs_value_us) + { + total = 0; + ok = GNUNET_YES; + continue; + } + } + /* when 'start' was _not_ given, then ok == GNUNET_YES */ if (GNUNET_NO == ok) continue; /* skip until we find the marker */ - if (total >= hs->num_results * inc) - break; /* hit limit specified by command */ + if (build_history_hit_limit (total, + hs, + pos)) + break; cancelled = test_cancelled (is, off); @@ -435,7 +496,6 @@ build_history (struct TALER_TESTING_Interpreter *is, if (NULL == row_id_start) ok = GNUNET_YES; - /** * This loop _only_ populates the array of history elements. */ @@ -457,12 +517,32 @@ build_history (struct TALER_TESTING_Interpreter *is, if (*row_id_start == *row_id) { - /* Doesn't count, start is excluded from output. */ + /* Warning: this zeroing is superfluous, as total doesn't + * get incremented if 'start' was given and couldn't be found. + */ total = 0; ok = GNUNET_YES; continue; } } + + /* Seek "/history-range" starting row, _if_ that's the case */ + if (GNUNET_TIME_UNIT_FOREVER_ABS.abs_value_us != + hs->start_date.abs_value_us) + { + const struct GNUNET_TIME_Absolute *timestamp; + + TALER_TESTING_get_trait_absolute_time (pos, + 0, + ×tamp); + if (hs->start_date.abs_value_us <= timestamp->abs_value_us) + { + total = 0; + ok = GNUNET_YES; + continue; + } + } + if (GNUNET_NO == ok) { TALER_LOG_INFO ("Skip on `%s'\n", @@ -470,7 +550,9 @@ build_history (struct TALER_TESTING_Interpreter *is, continue; /* skip until we find the marker */ } - if (total >= hs->num_results * inc) + if (build_history_hit_limit (total, + hs, + pos)) { TALER_LOG_INFO ("hit limit specified by command\n"); break; @@ -490,6 +572,12 @@ build_history (struct TALER_TESTING_Interpreter *is, (unsigned long long) *credit_account_no, (unsigned long long) hs->account_no); + /** + * Discard transactions where the audited account played + * _both_ the credit and the debit roles, but _only if_ + * the audit goes on both directions.. This needs more + * explaination! + */ if ( ( (0 != (hs->direction & TALER_BANK_DIRECTION_CREDIT)) && (hs->account_no == *credit_account_no)) && ( (0 != (hs->direction & TALER_BANK_DIRECTION_DEBIT)) && @@ -513,6 +601,10 @@ build_history (struct TALER_TESTING_Interpreter *is, GNUNET_assert (NULL != bank_hostname); bank_hostname += 3; + /* Next two blocks only put the 'direction' and 'banking' + * information. */ + + /* Asked for credit, and account got the credit. */ if ( (0 != (hs->direction & TALER_BANK_DIRECTION_CREDIT)) && (hs->account_no == *credit_account_no)) { @@ -528,6 +620,8 @@ build_history (struct TALER_TESTING_Interpreter *is, bank_hostname, (unsigned long long) *debit_account_no); } + + /* Asked for debit, and account got the debit. */ if ( (0 != (hs->direction & TALER_BANK_DIRECTION_DEBIT)) && (hs->account_no == *debit_account_no)) { @@ -543,6 +637,9 @@ build_history (struct TALER_TESTING_Interpreter *is, bank_hostname, (unsigned long long) *credit_account_no); } + + /* This block _completes_ the information of the current item, + * with amount / subject / exchange URL. */ if ( ( (0 != (hs->direction & TALER_BANK_DIRECTION_CREDIT)) && (hs->account_no == *credit_account_no)) || ( (0 != (hs->direction & TALER_BANK_DIRECTION_DEBIT)) && @@ -690,9 +787,8 @@ history_cb (void *cls, struct TALER_TESTING_Interpreter *is = cls; struct HistoryState *hs = is->commands[is->ip].cls; - /* Possibly we got the 204 status code - * as a "end of list" marker. */ - if (MHD_HTTP_OK != http_status) + /*NOTE: "204 No Content" is used to signal the end of results.*/ + if (MHD_HTTP_NO_CONTENT == http_status) { hs->hh = NULL; if ( (hs->results_obtained != compute_result_count (is)) || @@ -719,6 +815,19 @@ history_cb (void *cls, TALER_TESTING_interpreter_next (is); return; } + + if (MHD_HTTP_OK != http_status) + { + hs->hh = NULL; + GNUNET_log + (GNUNET_ERROR_TYPE_ERROR, + "Unwanted response code from /history[-range]: %u\n", + http_status); + TALER_TESTING_interpreter_fail (is); + return; + } + + /* check current element */ if (GNUNET_OK != check_result (is, hs->results_obtained, dir, @@ -774,8 +883,9 @@ history_run (void *cls, if (NULL == history_cmd) TALER_TESTING_FAIL (is); - if (GNUNET_OK != TALER_TESTING_get_trait_uint64 - (history_cmd, 0, &row_id_ptr)) + if (GNUNET_OK != TALER_TESTING_get_trait_uint64 (history_cmd, + 0, + &row_id_ptr)) TALER_TESTING_FAIL (is); row_id = *row_id_ptr; @@ -830,10 +940,13 @@ history_range_run (void *cls, if (GNUNET_OK != TALER_TESTING_get_trait_absolute_time (history_cmd, 0, &start_date)) TALER_TESTING_FAIL (is); + hs->start_date = *start_date; } else { - GNUNET_assert (UINT64_MAX != hs->start_date.abs_value_us); + /* no trait wanted. */ + GNUNET_assert (GNUNET_TIME_UNIT_FOREVER_ABS.abs_value_us != + hs->start_date.abs_value_us); start_date = &hs->start_date; } @@ -851,10 +964,13 @@ history_range_run (void *cls, if (GNUNET_OK != TALER_TESTING_get_trait_absolute_time (history_cmd, 0, &end_date)) TALER_TESTING_FAIL (is); + hs->end_date = *end_date; } else { - GNUNET_assert (UINT64_MAX != hs->end_date.abs_value_us); + /* no trait wanted. */ + GNUNET_assert (GNUNET_TIME_UNIT_FOREVER_ABS.abs_value_us != + hs->end_date.abs_value_us); end_date = &hs->end_date; } @@ -933,6 +1049,8 @@ TALER_TESTING_cmd_bank_history hs->start_row_reference = start_row_reference; hs->num_results = num_results; hs->ascending = ascending; + hs->start_date = GNUNET_TIME_UNIT_FOREVER_ABS; + hs->end_date = GNUNET_TIME_UNIT_FOREVER_ABS; struct TALER_TESTING_Command cmd = { .label = label, @@ -962,8 +1080,6 @@ TALER_TESTING_cmd_bank_history * @param end_row_reference reference to a command that can * offer a absolute time to use as the 'end' argument * for "/history-range". - * @param num_result how many rows we want in the result. - * * @return the command. */ struct TALER_TESTING_Command @@ -974,8 +1090,7 @@ TALER_TESTING_cmd_bank_history_range enum TALER_BANK_Direction direction, unsigned int ascending, const char *start_row_reference, - const char *end_row_reference, - long long num_results) + const char *end_row_reference) { struct HistoryState *hs; @@ -985,7 +1100,6 @@ TALER_TESTING_cmd_bank_history_range hs->direction = direction; hs->start_row_reference = start_row_reference; hs->end_row_reference = end_row_reference; - hs->num_results = num_results; hs->ascending = ascending; hs->start_date = GNUNET_TIME_UNIT_FOREVER_ABS; hs->end_date = GNUNET_TIME_UNIT_FOREVER_ABS; @@ -1016,8 +1130,6 @@ TALER_TESTING_cmd_bank_history_range * of "/history-range". * @param end_date value for the 'end' argument * of "/history-range". - * @param num_result how many rows we want in the result. - * * @return the command. */ struct TALER_TESTING_Command @@ -1028,8 +1140,7 @@ TALER_TESTING_cmd_bank_history_range_with_dates enum TALER_BANK_Direction direction, unsigned int ascending, struct GNUNET_TIME_Absolute start_date, - struct GNUNET_TIME_Absolute end_date, - long long num_results) + struct GNUNET_TIME_Absolute end_date) { struct HistoryState *hs; @@ -1037,10 +1148,9 @@ TALER_TESTING_cmd_bank_history_range_with_dates hs->bank_url = bank_url; hs->account_no = account_no; hs->direction = direction; - hs->num_results = num_results; hs->ascending = ascending; hs->start_date = start_date; - hs->end_date = start_date; + hs->end_date = end_date; struct TALER_TESTING_Command cmd = { .label = label, |