[PATCH 0/2] Improve running test suite under valgrind

*** BLURB HERE *** Michal Prívozník (2): meson: Annotate each test() with 'suite' tests: Refresh valgrind suppressions docs/advanced-tests.rst | 2 +- docs/html/meson.build | 1 + docs/meson.build | 1 + src/access/meson.build | 1 + src/meson.build | 10 +++ tests/.valgrind.supp | 188 +++++++++------------------------------- tests/meson.build | 11 ++- 7 files changed, 64 insertions(+), 150 deletions(-) -- 2.41.0

A test case can be part of a test suite (just like we already have 'syntax-check'). This then allows developers to run only a subset of tests. For instance - when using valgrind test setup (`meson test -C _build/ --setup valgrind`) it makes zero sense to run syntax-check tests or other script based tests (e.g. check-augeas-*, check-remote_protocol, etc.). What does makes sense is to run compiled binaries. Strictly speaking, reaching that goal is as trivial as annotating only those compiled tests (declared in tests/meson.build) and running them selectively: meson test -C _build/ --setup valgrind --suite $TAG But it may be also desirable to run test scripts separately. Therefore, introduce two new tags: 'bin' for compiled tests, and 'script' for script based tests and annotate each test() accordingly. Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- docs/advanced-tests.rst | 2 +- docs/html/meson.build | 1 + docs/meson.build | 1 + src/access/meson.build | 1 + src/meson.build | 10 ++++++++++ tests/meson.build | 11 +++++++++-- 6 files changed, 23 insertions(+), 3 deletions(-) diff --git a/docs/advanced-tests.rst b/docs/advanced-tests.rst index 370e24cc98..b9dae46c8a 100644 --- a/docs/advanced-tests.rst +++ b/docs/advanced-tests.rst @@ -16,7 +16,7 @@ by running :: - $ meson test --setup valgrind + $ meson test --setup valgrind --suite bin `Valgrind <https://valgrind.org/>`__ is a test that checks for memory management issues, such as leaks or use of uninitialized diff --git a/docs/html/meson.build b/docs/html/meson.build index 4d8d44d783..c0a666f4e1 100644 --- a/docs/html/meson.build +++ b/docs/html/meson.build @@ -126,4 +126,5 @@ test( '--nonet', '--noout', docs_html_paths, ], depends: docs_html_dep, + suite: 'script' ) diff --git a/docs/meson.build b/docs/meson.build index 70d271ec6e..b20ef1c926 100644 --- a/docs/meson.build +++ b/docs/meson.build @@ -360,4 +360,5 @@ test( meson.project_build_root() / 'docs' ], env: runutf8, + suite: 'script' ) diff --git a/src/access/meson.build b/src/access/meson.build index 07c703e8b5..e65f17c0a2 100644 --- a/src/access/meson.build +++ b/src/access/meson.build @@ -110,4 +110,5 @@ test( python3_prog, args: [ check_aclperms_prog.full_path(), access_perm_h, files('viraccessperm.c') ], env: runutf8, + suite: 'script' ) diff --git a/src/meson.build b/src/meson.build index c2b882d464..28e4d0cc4e 100644 --- a/src/meson.build +++ b/src/meson.build @@ -923,6 +923,7 @@ if host_machine.system() == 'linux' python3_prog, args: [ check_symfile_prog.full_path(), libvirt_syms, libvirt_lib ], env: runutf8, + suite: 'script' ) if conf.has('WITH_REMOTE') @@ -931,6 +932,7 @@ if host_machine.system() == 'linux' python3_prog, args: [ check_symfile_prog.full_path(), libvirt_admin_syms, libvirt_admin_lib ], env: runutf8, + suite: 'script' ) endif endif @@ -944,6 +946,7 @@ test( files(sym_files, used_sym_files), ], env: runutf8, + suite: 'script' ) test( @@ -955,6 +958,7 @@ test( libvirt_admin_private_syms, ], env: runutf8, + suite: 'script' ) test( @@ -965,6 +969,7 @@ test( files('libvirt_public.syms'), libvirt_qemu_syms, libvirt_lxc_syms, ], env: runutf8, + suite: 'script' ) test( @@ -974,6 +979,7 @@ test( check_drivername_prog.full_path(), libvirt_admin_public_syms, ], env: runutf8, + suite: 'script' ) test( @@ -981,6 +987,7 @@ test( python3_prog, args: [ check_driverimpls_prog.full_path(), driver_source_files ], env: runutf8, + suite: 'script' ) test( @@ -988,6 +995,7 @@ test( python3_prog, args: [ check_aclrules_prog.full_path(), files('remote/remote_protocol.x'), stateful_driver_source_files ], env: runutf8, + suite: 'script' ) if augparse_prog.found() @@ -1000,6 +1008,7 @@ if augparse_prog.found() '-I', data['builddir'], data['file'].full_path(), ], + suite: 'script' ) endforeach endif @@ -1020,6 +1029,7 @@ if pdwtags_prog.found() and cc.get_id() != 'clang' ], env: runutf8, depends: [ lib ], + suite: 'script' ) endforeach endif diff --git a/tests/meson.build b/tests/meson.build index 0082446029..e6589ec555 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -595,7 +595,14 @@ foreach data : tests # default meson timeout timeout = 30 endif - test(data['name'], test_bin, env: tests_env, timeout: timeout, depends: tests_deps) + test( + data['name'], + test_bin, + env: tests_env, + timeout: timeout, + depends: tests_deps, + suite: 'bin' + ) endforeach @@ -695,7 +702,7 @@ endif foreach name : test_scripts script = find_program(name) - test(name, script, env: tests_env) + test(name, script, env: tests_env, suite: 'script') endforeach testenv = runutf8 -- 2.41.0

On Tue, Jul 18, 2023 at 14:28:56 +0200, Michal Privoznik wrote:
A test case can be part of a test suite (just like we already have 'syntax-check'). This then allows developers to run only a subset of tests. For instance - when using valgrind test setup (`meson test -C _build/ --setup valgrind`) it makes zero sense to run syntax-check tests or other script based tests (e.g. check-augeas-*, check-remote_protocol, etc.). What does makes sense is to run compiled binaries.
Strictly speaking, reaching that goal is as trivial as annotating only those compiled tests (declared in tests/meson.build) and running them selectively:
meson test -C _build/ --setup valgrind --suite $TAG
But it may be also desirable to run test scripts separately.
Therefore, introduce two new tags: 'bin' for compiled tests, and 'script' for script based tests and annotate each test() accordingly.
Tbh this annotation feels very arbitrary but since we don't use it and I don't really see us running anything besides unit tests from this repository I don't think we'll need to use this any time soon for anything else. Reviewed-by: Peter Krempa <pkrempa@redhat.com>

Since nobody is expected to run valgrind over scripts now, we can drop plenty of suppressions. Also, there are some old ones that no longer exist and new ones, that are not covered. Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- tests/.valgrind.supp | 188 ++++++++++--------------------------------- 1 file changed, 41 insertions(+), 147 deletions(-) diff --git a/tests/.valgrind.supp b/tests/.valgrind.supp index f78b3b1f72..9ccefab0df 100644 --- a/tests/.valgrind.supp +++ b/tests/.valgrind.supp @@ -1,163 +1,57 @@ { - bashMemoryLeak1 + glib-memory-leak1 Memcheck:Leak - fun:malloc - fun:xmalloc - ... - fun:execute_command_internal + match-leak-kinds: possible + fun:calloc + fun:allocate_dtv + fun:_dl_allocate_tls + fun:pthread_create@@GLIBC_2.34 + fun:g_system_thread_new ... - obj:*/bin/bash + fun:g_task_get_type_once + fun:g_task_get_type + fun:_g_dbus_initialize.part.0 + fun:g_dbus_error_new_for_dbus_error + fun:wrap_g_dbus_connection_call_sync } { - bashMemoryLeak2 + glib-memory-leak2 Memcheck:Leak + match-leak-kinds: possible fun:malloc - fun:xmalloc + fun:tsearch + fun:__add_to_environ + fun:setenv + fun:g_setenv ... - fun:yyparse - fun:parse_command - fun:read_command - ... - obj:*/bin/bash + fun:virTestMain + fun:main } { - bashMemoryLeak3 + commandtest Memcheck:Leak - fun:malloc - fun:xmalloc - fun:array_create - fun:array_copy - fun:run_exit_trap - fun:exit_shell - ... - obj:*/bin/bash + match-leak-kinds: possible + fun:calloc + fun:allocate_dtv + fun:_dl_allocate_tls + fun:pthread_create@@GLIBC_2.34 + fun:virThreadCreateFull + fun:virCommandRunAsync + fun:test21 + fun:virTestRun + fun:mymain + fun:virTestMain + fun:main } { - bashMemoryLeak4 + eventtest Memcheck:Leak - match-leak-kinds: definite - fun:malloc - fun:xmalloc - fun:set_default_locale + match-leak-kinds: possible + fun:calloc + fun:allocate_dtv + fun:_dl_allocate_tls + fun:pthread_create@@GLIBC_2.34 + fun:mymain + fun:virTestMain fun:main - ... - obj:*/bin/bash -} -# -# Failure seen in /usr/lib64/ld-2.15.so -# -{ - dlInitMemoryLeak1 - Memcheck:Leak - fun:?alloc - ... - fun:call_init.part.0 - fun:_dl_init - ... - obj:*/lib*/ld-2.*so* -} -# -# Failure seen in -# p11_kit_registered_module_to_name: /usr/lib64/libp11-kit.so.0.0.0 -# gnutls_pkcs11_init: /usr/lib64/libgnutls.so.26.22.4 -# -{ - gnutlsInitMemoryLeak - Memcheck:Leak - fun:malloc - fun:strdup - fun:p11_kit_registered_module_to_name - fun:gnutls_pkcs11_init - fun:gnutls_global_init - ... - obj:*/lib*/libc-2.*so* -} -# -# Failure seen in eventtest, qemumonitorjsontest, qemuhotplugtest, -# qemuagenttest -# -{ - dlAllocateTlsMemoryLeak - Memcheck:Leak - fun:calloc - fun:_dl_allocate_tls - fun:pthread_create* - ... - fun:mymain - fun:virtTestMain - ... - obj:*/lib*/libc-2.*so* -} -# -# commandtest validates the various threaded commands. The -# virThreadCreate() routine allocates and passes args to the -# new thread which now owns the 'args' and thus cannot be free'd -# -{ - commandtestLeak1 - Memcheck:Leak - fun:calloc - fun:virAlloc - fun:virThreadCreate - fun:mymain - fun:virtTestMain -} -# -# The Error code requires static memory that is never free'd -# for thread local storage to store error message/data -# -{ - commandtestLeak2 - Memcheck:Leak - fun:calloc - fun:virAlloc - ... - fun:vir*LastError* - fun:virEventRunDefaultImpl - fun:virCommandThreadWorker - fun:virThreadHelper - fun:start_thread - fun:clone -} -# -# Some of the commandtests (test0, test1, test4, & test18) cause the -# following traceback although it appears the memory is properly freed -# -{ - commandtestLeak3 - Memcheck:Leak - fun:calloc - fun:virAllocN - fun:virEventPollRunOnce - fun:virEventRunDefaultImpl - fun:virCommandThreadWorker - fun:virThreadHelper - fun:start_thread - fun:clone -} -# -# seclabeltest relies on 'selabel_close' which is not in libvirt -# -{ - seclabeltestcond1 - Memcheck:Cond - obj:/usr/lib64/libselinux.so.1 - fun:selabel_close - fun:virSecuritySELinuxSecurityDriverClose - fun:virSecurityManagerDispose - fun:virObjectUnref - fun:main -} -# -# types registered with GLib are never freed -# -{ - glibTypeRegisterLeak - Memcheck:Leak - match-leak-kinds: possible - ... - fun:g_realloc - obj:*/lib*/libgobject* - fun:g_type_register_static - ... } -- 2.41.0

On Tue, Jul 18, 2023 at 14:28:57 +0200, Michal Privoznik wrote:
Since nobody is expected to run valgrind over scripts now, we can drop plenty of suppressions. Also, there are some old ones that no longer exist and new ones, that are not covered.
Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- tests/.valgrind.supp | 188 ++++++++++--------------------------------- 1 file changed, 41 insertions(+), 147 deletions(-)
Is it really worth keeping this file in the repository? I don't think we can keep it current.

On 7/19/23 12:50, Peter Krempa wrote:
On Tue, Jul 18, 2023 at 14:28:57 +0200, Michal Privoznik wrote:
Since nobody is expected to run valgrind over scripts now, we can drop plenty of suppressions. Also, there are some old ones that no longer exist and new ones, that are not covered.
Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- tests/.valgrind.supp | 188 ++++++++++--------------------------------- 1 file changed, 41 insertions(+), 147 deletions(-)
Is it really worth keeping this file in the repository? I don't think we can keep it current.
We have valgrind test setup (add_test_setup() in tests/meson.build) that passes this file. What we could have is a configure option that specifies where the file is so that everybody can keep a copy specific to their system. Would that work? Michal

On Wed, Jul 19, 2023 at 14:31:24 +0200, Michal Prívozník wrote:
On 7/19/23 12:50, Peter Krempa wrote:
On Tue, Jul 18, 2023 at 14:28:57 +0200, Michal Privoznik wrote:
Since nobody is expected to run valgrind over scripts now, we can drop plenty of suppressions. Also, there are some old ones that no longer exist and new ones, that are not covered.
Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- tests/.valgrind.supp | 188 ++++++++++--------------------------------- 1 file changed, 41 insertions(+), 147 deletions(-)
Is it really worth keeping this file in the repository? I don't think we can keep it current.
We have valgrind test setup (add_test_setup() in tests/meson.build) that passes this file. What we could have is a configure option that specifies where the file is so that everybody can keep a copy specific to their system. Would that work?
If we invoke it from the testsuite then I guess it makes sense to distribute it. Arguably we could make it empty or contain a comment saying what to put there. Reviewed-by: Peter Krempa <pkrempa@redhat.com>
participants (3)
-
Michal Privoznik
-
Michal Prívozník
-
Peter Krempa