From 615d35407b4b06e8a5793d6c8d7f3a14179d17fd Mon Sep 17 00:00:00 2001 From: Marcello Stanisci Date: Fri, 21 Dec 2018 15:03:58 +0100 Subject: [PATCH] #5136. Adding CMD that reconnects to a exchange, using serialized keys. --- .../testing_api_cmd_serialize_keys.c | 116 +++++++++++++++++- 1 file changed, 112 insertions(+), 4 deletions(-) diff --git a/src/exchange-lib/testing_api_cmd_serialize_keys.c b/src/exchange-lib/testing_api_cmd_serialize_keys.c index f647a6224..4b9480ab6 100644 --- a/src/exchange-lib/testing_api_cmd_serialize_keys.c +++ b/src/exchange-lib/testing_api_cmd_serialize_keys.c @@ -38,6 +38,13 @@ struct SerializeKeysState * Serialized keys. */ json_t *keys; + + /** + * Exchange URL. Needed because the exchange gets disconnected + * from, after keys serialization. This value is then needed by + * subsequent commands that have to reconnect to the exchagne. + */ + const char *exchange_url; }; @@ -56,9 +63,12 @@ serialize_keys_run (void *cls, struct SerializeKeysState *sks = cls; sks->keys = TALER_EXCHANGE_serialize_data (is->exchange); - if (NULL == sks->keys) TALER_TESTING_interpreter_fail (is); + + sks->exchange_url = TALER_EXCHANGE_get_base_url (is->exchange); + TALER_EXCHANGE_disconnect (is->exchange); + TALER_TESTING_interpreter_next (is); } @@ -103,8 +113,8 @@ serialize_keys_traits (void *cls, struct TALER_TESTING_Trait traits[] = { - TALER_TESTING_make_trait_exchange_keys (0, - sks->keys), + TALER_TESTING_make_trait_exchange_keys (0, sks->keys), + TALER_TESTING_make_trait_url (0, sks->exchange_url), TALER_TESTING_trait_end () }; @@ -115,7 +125,81 @@ serialize_keys_traits (void *cls, } /** - * Make a serialize-keys CMD. + * /keys callback. Just checks HTTP status is OK, + * and step forward to next command. + * + * @param cls closure + * @param keys information about the various keys used + * by the exchange, NULL if /keys failed + * @param compat protocol compatibility information* + */ +static void +cb (void *cls, + const struct TALER_EXCHANGE_Keys *keys, + enum TALER_EXCHANGE_VersionCompatibility compat) +{ + struct TALER_TESTING_Interpreter *is = cls; + + if (NULL == keys) + TALER_TESTING_interpreter_fail (is); + + TALER_TESTING_interpreter_next (is); +} + + +/** + * Run the command. + * + * @param cls closure. + * @param cmd the command to execute. + * @param is the interpreter state. + */ +static void +connect_with_state_run (void *cls, + const struct TALER_TESTING_Command *cmd, + struct TALER_TESTING_Interpreter *is) +{ + const struct TALER_TESTING_Command *state_cmd; + const json_t *serialized_keys; + const char *state_reference = cls; + const char *exchange_url; + + state_cmd = TALER_TESTING_interpreter_lookup_command + (is, state_reference); + + /* Command providing serialized keys not found. */ + if (NULL == state_cmd) + { + GNUNET_break (0); + TALER_TESTING_interpreter_fail (is); + return; + } + + GNUNET_assert + (GNUNET_OK == TALER_TESTING_get_trait_exchange_keys + (state_cmd, + 0, + &serialized_keys)); + + GNUNET_assert + (GNUNET_OK == TALER_TESTING_get_trait_url + (state_cmd, + 0, + &exchange_url)); + + is->exchange = TALER_EXCHANGE_connect (is->ctx, + exchange_url, + cb, + is, + TALER_EXCHANGE_OPTION_DATA, + serialized_keys, + TALER_EXCHANGE_OPTION_END); +} + +/** + * Make a serialize-keys CMD. It will ask for + * keys serialization __and__ disconnect from the + * exchange. * * @param label CMD label * @return the CMD. @@ -136,3 +220,27 @@ TALER_TESTING_cmd_serialize_keys (const char *label) return cmd; } + + +/** + * Make a connect-with-state CMD. This command + * will use a serialized key state to reconnect + * to the exchange. + * + * @param label command label + * @param state_reference label of a CMD offering + * a serialized key state. + * @return the CMD. + */ +struct TALER_TESTING_Command +TALER_TESTING_cmd_connect_with_state (const char *label, + const char *state_reference) +{ + struct TALER_TESTING_Command cmd = { + .cls = (char *) state_reference, + .label = label, + .run = connect_with_state_run, + }; + + return cmd; +}