twister

HTTP fault injector for testing
Log | Files | Refs | README | LICENSE

commit ed4f74e6d159419637ca71910c4c9f3674f1656b
parent 1f2e546e3647ca38d20796c2f275766c3fa03e38
Author: Marcello Stanisci <stanisci.m@gmail.com>
Date:   Fri,  9 Mar 2018 21:00:51 +0100

add testing-lib command to modify responses.

Diffstat:
Msrc/include/taler_twister_testing_lib.h | 16++++++++++++++++
Msrc/twister/testing_api_cmd_exec_client.c | 140++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 155 insertions(+), 1 deletion(-)

diff --git a/src/include/taler_twister_testing_lib.h b/src/include/taler_twister_testing_lib.h @@ -64,4 +64,20 @@ TALER_TESTING_cmd_delete_object (const char *label, const char *config_filename, const char *path); + +/** + * This command deletes the JSON object pointed by @a path. + * + * @param label command label + * @param config_filename configuration filename. + * @param path object-like path notation to point the object + * to delete. + * + * @return the command + */ +struct TALER_TESTING_Command +TALER_TESTING_cmd_modify_object (const char *label, + const char *config_filename, + const char *path, + const char *value); #endif diff --git a/src/twister/testing_api_cmd_exec_client.c b/src/twister/testing_api_cmd_exec_client.c @@ -29,6 +29,28 @@ #include <taler/taler_testing_lib.h> #include "taler_twister_testing_lib.h" +struct ModifyObjectState +{ + /** + * Process handle for the twister CLI client. + */ + struct GNUNET_OS_Process *proc; + + /** + * Object-like notation to the object to delete. + */ + const char *path; + + const char *value; + + /** + * Config file name to pass to the CLI client. + */ + const char *config_filename; + +}; + + struct DeleteObjectState { /** @@ -239,7 +261,6 @@ delete_object_traits (void *cls, index); } - /** * FIXME: document. */ @@ -267,6 +288,89 @@ delete_object_run (void *cls, TALER_TESTING_wait_for_sigchld (is); } +/** + * TODO. + */ +static void +modify_object_cleanup + (void *cls, + const struct TALER_TESTING_Command *cmd) +{ + struct ModifyObjectState *mos = cls; + + if (NULL != mos->proc) + { + GNUNET_break (0 == GNUNET_OS_process_kill (mos->proc, + SIGKILL)); + GNUNET_OS_process_wait (mos->proc); + GNUNET_OS_process_destroy (mos->proc); + mos->proc = NULL; + } + GNUNET_free (mos); +} + + +/** + * Extract information from a command that is useful for other + * commands. + * + * @param cls closure + * @param ret[out] result (could be anything) + * @param trait name of the trait + * @param selector more detailed information about which object + * to return in case there were multiple generated + * by the command + * @return #GNUNET_OK on success + */ +static int +modify_object_traits (void *cls, + void **ret, + const char *trait, + unsigned int index) +{ + + struct ModifyObjectState *mos = cls; + struct TALER_TESTING_Trait traits[] = { + TALER_TESTING_make_trait_process (0, &mos->proc), + TALER_TESTING_trait_end () + }; + + return TALER_TESTING_get_trait (traits, + ret, + trait, + index); +} + + +/** + * FIXME: document. + */ +static void +modify_object_run (void *cls, + const struct TALER_TESTING_Command *cmd, + struct TALER_TESTING_Interpreter *is) +{ + struct ModifyObjectState *mos = cls; + + mos->proc = GNUNET_OS_start_process (GNUNET_NO, + GNUNET_OS_INHERIT_STD_ALL, + NULL, NULL, NULL, + "taler-twister", + "taler-twister", + "-c", mos->config_filename, + "--deleteobject", mos->path, + "--value", mos->value, + NULL); + if (NULL == mos->proc) + { + GNUNET_break (0); + TALER_TESTING_interpreter_fail (is); + return; + } + TALER_TESTING_wait_for_sigchld (is); +} + + /** * This command deletes the JSON object pointed by @a path. @@ -298,3 +402,37 @@ TALER_TESTING_cmd_delete_object (const char *label, return cmd; } + + +/** + * This command deletes the JSON object pointed by @a path. + * + * @param label command label + * @param config_filename configuration filename. + * @param path object-like path notation to point the object + * to delete. + * + * @return the command + */ +struct TALER_TESTING_Command +TALER_TESTING_cmd_modify_object (const char *label, + const char *config_filename, + const char *path, + const char *value) +{ + struct ModifyObjectState *mos; + struct TALER_TESTING_Command cmd; + + mos = GNUNET_new (struct ModifyObjectState); + mos->path = path; + mos->value = value; + mos->config_filename = config_filename; + + cmd.label = label; + cmd.run = &modify_object_run; + cmd.cleanup = &modify_object_cleanup; + cmd.traits = &modify_object_traits; + cmd.cls = mos; + + return cmd; +}