[libvirt] [PATCH] tests: avoid re-execing test once for each mock
Michal Privoznik
mprivozn at redhat.com
Fri Jan 10 10:18:40 UTC 2020
On 1/9/20 7:04 PM, Daniel P. Berrangé wrote:
> When debugging tests under GDB there is a significant time
> delay each time an execve is done as GDB scans shared libraries
> once again. For tests which use many mock libraries, we have
> been invoking execve many times which makes the GDB experience
> horrible. This changes our framework to activate the full
> set of mock libraries in one single execve.
It's not only gdb, the performance drop is even more visible with
valgrind --trace-children=yes.
>
> Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
> ---
> tests/qemucapsprobe.c | 8 +++++++-
> tests/testutils.c | 29 ++++++++++++++++++++++++-----
> tests/testutils.h | 10 +++-------
> 3 files changed, 34 insertions(+), 13 deletions(-)
>
> diff --git a/tests/qemucapsprobe.c b/tests/qemucapsprobe.c
> index 6837f2a0f6..c7e8f3309d 100644
> --- a/tests/qemucapsprobe.c
> +++ b/tests/qemucapsprobe.c
> @@ -46,8 +46,14 @@ main(int argc, char **argv)
> {
> virThread thread;
> virQEMUCapsPtr caps;
> + const char *mock = VIR_TEST_MOCK("qemucapsprobe");
>
> - VIR_TEST_PRELOAD(VIR_TEST_MOCK("qemucapsprobe"));
> + if (!virFileIsExecutable(mock)) {
> + perror(mock);
> + return EXIT_FAILURE;
> + }
> +
> + VIR_TEST_PRELOAD(mock);
>
> if (argc != 2) {
> fprintf(stderr, "%s QEMU_binary\n", argv[0]);
> diff --git a/tests/testutils.c b/tests/testutils.c
> index 6f0ef2b2f1..b490609e36 100644
> --- a/tests/testutils.c
> +++ b/tests/testutils.c
> @@ -856,15 +856,34 @@ int virTestMain(int argc,
> virLogOutputPtr *outputs = NULL;
> g_autofree char *baseprogname = NULL;
> const char *progname;
> -
> - if (getenv("VIR_TEST_FILE_ACCESS"))
> - VIR_TEST_PRELOAD(VIR_TEST_MOCK("virtest"));
> + g_autofree const char **preloads = NULL;
> + size_t npreloads = 0;
> + g_autofree char *mock = NULL;
> +
> + if (getenv("VIR_TEST_FILE_ACCESS")) {
> + preloads = g_renew(const char *, preloads, npreloads + 2);
> + preloads[npreloads++] = VIR_TEST_MOCK("virtest");
> + preloads[npreloads] = NULL;
> + }
>
> va_start(ap, func);
> - while ((lib = va_arg(ap, const char *)))
> - VIR_TEST_PRELOAD(lib);
> + while ((lib = va_arg(ap, const char *))) {
> + if (!virFileIsExecutable(lib)) {
> + perror(lib);
> + return EXIT_FAILURE;
> + }
> +
> + preloads = g_renew(const char *, preloads, npreloads + 2);
> + preloads[npreloads++] = lib;
> + preloads[npreloads] = NULL;
> + }
> va_end(ap);
>
> + if (preloads) {
> + mock = g_strjoinv(":", (char **)preloads);
> + VIR_TEST_PRELOAD(mock);
> + }
> +
> progname = baseprogname = g_path_get_basename(argv[0]);
> if (STRPREFIX(progname, "lt-"))
> progname += 3;
> diff --git a/tests/testutils.h b/tests/testutils.h
> index 8a7ea38f43..2944c25e8b 100644
> --- a/tests/testutils.h
> +++ b/tests/testutils.h
> @@ -127,19 +127,15 @@ int virTestMain(int argc,
> # define MOCK_EXT ".so"
> #endif
>
> -#define VIR_TEST_PRELOAD(lib) \
> +#define VIR_TEST_PRELOAD(libs) \
> do { \
> const char *preload = getenv(PRELOAD_VAR); \
> if (preload == NULL || strstr(preload, lib) == NULL) { \
s/lib/libs/
> char *newenv; \
> - if (!virFileIsExecutable(lib)) { \
> - perror(lib); \
> - return EXIT_FAILURE; \
> - } \
> if (!preload) { \
> - newenv = (char *) lib; \
> + newenv = (char *) libs; \
> } else { \
> - newenv = g_strdup_printf("%s:%s", lib, preload); \
> + newenv = g_strdup_printf("%s:%s", libs, preload); \
> } \
> g_setenv(PRELOAD_VAR, newenv, TRUE); \
> FORCE_FLAT_NAMESPACE \
>
Reviewed-by: Michal Privoznik <mprivozn at redhat.com>
Michal
More information about the libvir-list
mailing list