glib/girepository/tests/meson.build
Marco Trevisan (Treviño) 71a7887c8a build: Preload sanitizer libraries before than any other library
In some test cases (but not only) GLib needs to preload libraries when
launching executables, however this doesn't work well with ASAN because
libasan needs to be the first library to be loaded in such case.

We've been ignoring the error so far, using verify_asan_link_order=false
ASAN option, but this is not the correct way because it implies that
we don't check any pre-loaded library, as we instead should.

So in the platforms we know, get the proper sanitizer libraries paths
and pre-load them when required.

We don't do it for installed tests since the full paths may change in
the target system, so ignoring the error is safer.

This meson code has been used for various years now in fprintd project
to run tests in CI in both fedora and debian-based systems with no
issues, so I consider it reliable.

In case no preload variables are found the default ignore mode is used
2025-02-11 15:01:37 +01:00

192 lines
5.2 KiB
Meson

# SPDX-License-Identifier: LGPL-2.1-or-later
# SPDX-FileCopyrightText: 2024 GNOME Foundation
girepository_tests = {
'cmph-bdz': {
'dependencies': [cmph_dep],
},
'dump' : {
'export_dynamic': true,
},
'gthash' : {
'dependencies': [girepo_gthash_dep],
},
}
# Some tests require GIR files to have been generated
if enable_gir
glib_gir_testing_dep = glib_gir
gobject_gir_testing_dep = [
glib_gir_testing_dep,
gobject_gir,
]
gmodule_gir_testing_dep = [
glib_gir_testing_dep,
gmodule_gir,
]
gio_gir_testing_dep = [
gobject_gir_testing_dep,
gmodule_gir_testing_dep,
gio_gir,
]
gio_platform_gir_testing_dep = [
gio_gir_testing_dep,
gio_platform_gir,
]
girepository_gir_testing_dep = [
gio_gir_testing_dep,
girepository_gir,
]
girepository_tests += {
'callable-info' : {
'depends': gio_gir_testing_dep,
},
'function-info' : {
'dependencies': [libffi_dep],
'depends': glib_gir_testing_dep,
},
'object-info' : {
'depends': gio_gir_testing_dep,
},
'registered-type-info' : {
'depends': gobject_gir_testing_dep,
},
'repository' : {
'depends': [gio_gir_testing_dep, gio_platform_gir_testing_dep],
'dependencies': [libgio_dep],
},
'repository-search-paths' : {
'c_args': '-DGOBJECT_INTROSPECTION_LIBDIR="@0@"'.format(glib_libdir),
'depends': glib_gir_testing_dep,
},
'struct-info' : {
'depends': gobject_gir_testing_dep,
},
'throws' : {
'depends': gio_gir_testing_dep,
},
'union-info' : {
'depends': glib_gir_testing_dep,
},
}
if cc.get_id() != 'msvc'
girepository_tests += {
'autoptr-girepository' : {
'dependencies': [libffi_dep],
'source' : 'autoptr.c',
'depends': gio_gir_testing_dep,
},
}
endif
endif
test_env = environment()
test_env.set('G_TEST_SRCDIR', meson.current_source_dir())
test_env.set('G_TEST_BUILDDIR', meson.current_build_dir())
test_deps = [libm, thread_dep, libgirepository_dep]
test_cargs = ['-DG_LOG_DOMAIN="GIRepository"', '-UG_DISABLE_ASSERT']
test_cpp_args = test_cargs
foreach test_name, extra_args : girepository_tests
source = extra_args.get('source', test_name + '.c')
install = installed_tests_enabled and extra_args.get('install', true)
installed_tests_env = extra_args.get('installed_tests_env', {})
if install
test_conf = configuration_data()
test_conf.set('installed_tests_dir', installed_tests_execdir)
test_conf.set('program', test_name)
test_env_override = ''
if installed_tests_env != {}
if installed_tests_env.has_key(glib_exec_var_preload)
installed_tests_env += {
'ASAN_OPTIONS': ','.join([
glib_exec_asan_option_ignore_preload,
installed_tests_env.get('ASAN_OPTIONS', ''),
]),
}
endif
envs = []
foreach var, value : installed_tests_env
envs += '@0@=\'@1@\''.format(var, value)
endforeach
test_env_override = '@0@ @1@ '.format(env_program.full_path(), ' '.join(envs))
endif
test_conf.set('env', test_env_override)
configure_file(
input: installed_tests_template_tap,
output: test_name + '.test',
install_dir: installed_tests_metadir,
install_tag: 'tests',
configuration: test_conf
)
endif
exe = executable(test_name, source, 'test-common.c',
c_args: test_cargs + extra_args.get('c_args', []),
cpp_args: test_cpp_args + extra_args.get('cpp_args', []),
link_args: extra_args.get('link_args', []),
override_options: extra_args.get('override_options', []),
dependencies: test_deps + extra_args.get('dependencies', []),
link_with: extra_args.get('link_with', []),
export_dynamic: extra_args.get('export_dynamic', false),
install_dir: installed_tests_execdir,
install_tag: 'tests',
install: install,
)
depends = [extra_args.get('depends', [])]
suite = ['girepository', 'core'] + extra_args.get('suite', [])
timeout = suite.contains('slow') ? test_timeout_slow : test_timeout
if extra_args.get('can_fail', false)
suite += 'failing'
endif
foreach program : extra_args.get('extra_programs', [])
depends += test_extra_programs_targets[program]
endforeach
local_test_env = test_env
local_test_env_args = extra_args.get('env', {})
if local_test_env_args.has_key(glib_exec_var_preload)
if glib_exec_preloaded_env.has_key(glib_exec_var_preload)
local_test_env_args += {
glib_exec_var_preload: glib_exec_var_preload_separator.join([
glib_exec_preloaded_env.get(glib_exec_var_preload),
local_test_env_args.get(glib_exec_var_preload),
])
}
else
local_test_env_args += {
'ASAN_OPTIONS': ','.join([
glib_exec_asan_option_ignore_preload,
local_test_env_args.get('ASAN_OPTIONS', ''),
]),
}
endif
endif
foreach var, value : local_test_env_args
local_test_env.append(var, value)
endforeach
test(test_name, exe,
args: extra_args.get('args', []),
protocol: extra_args.get('protocol', test_protocol),
depends: depends,
env: local_test_env,
timeout: timeout,
suite: suite,
should_fail: extra_args.get('should_fail', false),
)
endforeach