aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarcello Stanisci <stanisci.m@gmail.com>2019-01-17 16:37:16 +0100
committerMarcello Stanisci <stanisci.m@gmail.com>2019-01-17 16:37:16 +0100
commit148b546435a8fdd83372d4f546d809f5322ae05b (patch)
tree5fe02ad38cbb2f5e7ffe1e3f7671e99ba593a620 /src
parentaeec67acaa786f9bf42e61df2d8c6d93198e8609 (diff)
/keys API.
Adding method to override the last_denom value for a key set.
Diffstat (limited to 'src')
-rw-r--r--src/include/taler_exchange_service.h10
-rw-r--r--src/include/taler_testing_lib.h28
-rw-r--r--src/lib/exchange_api_handle.c19
-rwxr-xr-xsrc/lib/test_exchange_api_overlapping_keys_bug.c11
-rw-r--r--src/lib/testing_api_cmd_check_keys.c66
5 files changed, 128 insertions, 6 deletions
diff --git a/src/include/taler_exchange_service.h b/src/include/taler_exchange_service.h
index a1ecc0bef..88fcf74af 100644
--- a/src/include/taler_exchange_service.h
+++ b/src/include/taler_exchange_service.h
@@ -422,6 +422,16 @@ TALER_EXCHANGE_disconnect (struct TALER_EXCHANGE_Handle *exchange);
const struct TALER_EXCHANGE_Keys *
TALER_EXCHANGE_get_keys (struct TALER_EXCHANGE_Handle *exchange);
+/**
+ * Let the user set the last valid denomination time manually.
+ *
+ * @param exchange the exchange handle.
+ * @param last_denom_new new last denomination time.
+ */
+void
+TALER_EXCHANGE_set_last_denom (struct TALER_EXCHANGE_Handle *exchange,
+ struct GNUNET_TIME_Absolute last_denom_new);
+
/**
* Check if our current response for /keys is valid, and if
diff --git a/src/include/taler_testing_lib.h b/src/include/taler_testing_lib.h
index eeb0a5c00..edca769df 100644
--- a/src/include/taler_testing_lib.h
+++ b/src/include/taler_testing_lib.h
@@ -1425,6 +1425,34 @@ TALER_TESTING_cmd_check_keys_pull_all_keys
/**
+ * Make a "check keys" command. This type of command
+ * checks whether the number of denomination keys from
+ * @a exchange matches @a num_denom_keys. Additionally,
+ * it lets the user set a last denom issue date to be
+ * used in the request for /keys.
+ *
+ * @param label command label
+ * @param generation when this command is run, exactly @a
+ * generation /keys downloads took place. If the number
+ * of downloads is less than @a generation, the logic will
+ * first make sure that @a generation downloads are done,
+ * and _then_ execute the rest of the command.
+ * @param num_denom_keys expected number of denomination keys.
+ * @param exchange connection handle to the exchange to test.
+ * @param last_denom_date date to be set in the "last_denom_issue"
+ * URL parameter of /keys.
+ *
+ * @return the command.
+ */
+struct TALER_TESTING_Command
+TALER_TESTING_cmd_check_keys_with_last_denom
+ (const char *label,
+ unsigned int generation,
+ unsigned int num_denom_keys,
+ struct GNUNET_TIME_Absolute last_denom_date);
+
+
+/**
* Create a "batch" command. Such command takes a
* end_CMD-terminated array of CMDs and executed them.
* Once it hits the end CMD, it passes the control
diff --git a/src/lib/exchange_api_handle.c b/src/lib/exchange_api_handle.c
index bace2b47b..284dbbb34 100644
--- a/src/lib/exchange_api_handle.c
+++ b/src/lib/exchange_api_handle.c
@@ -1030,6 +1030,21 @@ request_keys (void *cls);
void
TEAH_handle_reset (struct TALER_EXCHANGE_Handle *h);
+
+
+/**
+ * Let the user set the last valid denomination time manually.
+ *
+ * @param exchange the exchange handle.
+ * @param last_denom_new new last denomination time.
+ */
+void
+TALER_EXCHANGE_set_last_denom (struct TALER_EXCHANGE_Handle *exchange,
+ struct GNUNET_TIME_Absolute last_denom_new)
+{
+ exchange->key_data.last_denom_issue_date = last_denom_new;
+}
+
/**
* Check if our current response for /keys is valid, and if
* not trigger download.
@@ -1047,8 +1062,12 @@ TALER_EXCHANGE_check_keys_current (struct TALER_EXCHANGE_Handle *exchange,
{
if (NULL != exchange->kr)
return GNUNET_TIME_UNIT_ZERO_ABS;
+
if (GNUNET_YES == pull_all_keys)
+ {
+ GNUNET_assert (GNUNET_YES == force_download);
TEAH_handle_reset (exchange);
+ }
if ( (GNUNET_NO == force_download) &&
(0 < GNUNET_TIME_absolute_get_remaining (exchange->key_data_expiration).rel_value_us) )
return exchange->key_data_expiration;
diff --git a/src/lib/test_exchange_api_overlapping_keys_bug.c b/src/lib/test_exchange_api_overlapping_keys_bug.c
index 175754fcb..8944bae22 100755
--- a/src/lib/test_exchange_api_overlapping_keys_bug.c
+++ b/src/lib/test_exchange_api_overlapping_keys_bug.c
@@ -96,12 +96,11 @@ run (void *cls,
1,
4),
- /**
- * Avoid cherry-pick, just GET /keys.
- */
- TALER_TESTING_cmd_check_keys_pull_all_keys ("second-download",
- 2,
- 4),
+ /* Causes GET /keys?last_denom_issue=0 */
+ TALER_TESTING_cmd_check_keys_with_last_denom ("second-download",
+ 2,
+ 8,
+ GNUNET_TIME_UNIT_ZERO_ABS),
TALER_TESTING_cmd_end ()
};
diff --git a/src/lib/testing_api_cmd_check_keys.c b/src/lib/testing_api_cmd_check_keys.c
index 6cd605c38..976639ae0 100644
--- a/src/lib/testing_api_cmd_check_keys.c
+++ b/src/lib/testing_api_cmd_check_keys.c
@@ -54,6 +54,20 @@ struct CheckKeysState
* downloaded.
*/
unsigned int pull_all_keys;
+
+ /**
+ * If GNUNET_YES, then the user must specify the
+ * last_denom_issue_date manually. This way, it is possible
+ * to force whatever X value here: /keys?last_denom_issue=X.
+ */
+ unsigned int set_last_denom;
+
+ /**
+ * Value X to set as the URL parameter:
+ * "/keys?last_denom_issue=X" is used only when `set_last_denom'
+ * equals GNUNET_YES.
+ */
+ struct GNUNET_TIME_Absolute last_denom_date;
};
@@ -82,6 +96,13 @@ check_keys_run (void *cls,
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
"Triggering GET /keys, cmd `%s'\n",
cmd->label);
+
+ if (GNUNET_YES == cks->set_last_denom)
+ {
+ TALER_LOG_DEBUG ("Forcing last_denom_date URL argument\n");
+ TALER_EXCHANGE_set_last_denom (is->exchange,
+ cks->last_denom_date);
+ }
/* Means re-download /keys. */
GNUNET_break
@@ -137,6 +158,51 @@ check_keys_cleanup (void *cls,
/**
* Make a "check keys" command. This type of command
* checks whether the number of denomination keys from
+ * @a exchange matches @a num_denom_keys. Additionally,
+ * it lets the user set a last denom issue date to be
+ * used in the request for /keys.
+ *
+ * @param label command label
+ * @param generation when this command is run, exactly @a
+ * generation /keys downloads took place. If the number
+ * of downloads is less than @a generation, the logic will
+ * first make sure that @a generation downloads are done,
+ * and _then_ execute the rest of the command.
+ * @param num_denom_keys expected number of denomination keys.
+ * @param exchange connection handle to the exchange to test.
+ * @param last_denom_date date to be set in the "last_denom_issue"
+ * URL parameter of /keys.
+ *
+ * @return the command.
+ */
+struct TALER_TESTING_Command
+TALER_TESTING_cmd_check_keys_with_last_denom
+ (const char *label,
+ unsigned int generation,
+ unsigned int num_denom_keys,
+ struct GNUNET_TIME_Absolute last_denom_date)
+{
+ struct CheckKeysState *cks;
+
+ cks = GNUNET_new (struct CheckKeysState);
+ cks->generation = generation;
+ cks->num_denom_keys = num_denom_keys;
+ cks->set_last_denom = GNUNET_YES;
+ cks->last_denom_date = last_denom_date;
+
+ struct TALER_TESTING_Command cmd = {
+ .cls = cks,
+ .label = label,
+ .run = &check_keys_run,
+ .cleanup = &check_keys_cleanup
+ };
+
+ return cmd;
+}
+
+/**
+ * Make a "check keys" command. This type of command
+ * checks whether the number of denomination keys from
* @a exchange matches @a num_denom_keys.
*
* @param label command label