diff --git a/gio/tests/meson.build b/gio/tests/meson.build index 41770e47c..85d31d622 100644 --- a/gio/tests/meson.build +++ b/gio/tests/meson.build @@ -79,12 +79,11 @@ test_extra_programs = [ ['gdbus-testserver'], ] -test_env = [ - 'G_TEST_SRCDIR=' + meson.current_source_dir(), - 'G_TEST_BUILDDIR=' + meson.current_build_dir(), - 'GIO_MODULE_DIR=', - 'GIO_LAUNCH_DESKTOP=' + meson.build_root() + '/gio/gio-launch-desktop', -] +test_env = environment() +test_env.set('G_TEST_SRCDIR', meson.current_source_dir()) +test_env.set('G_TEST_BUILDDIR', meson.current_build_dir()) +test_env.set('GIO_MODULE_DIR', '') +test_env.set('GIO_LAUNCH_DESKTOP', meson.build_root() + '/gio/gio-launch-desktop') test_c_args = [ '-DG_LOG_DOMAIN="GLib-GIO"', diff --git a/glib/tests/meson.build b/glib/tests/meson.build index a2c6973a0..f5c0fbecb 100644 --- a/glib/tests/meson.build +++ b/glib/tests/meson.build @@ -1,201 +1,186 @@ -glib_tests = [ - 'array-test', - 'asyncqueue', - 'base64', - 'bitlock', - 'bookmarkfile', - 'bytes', - 'cache', - 'charset', - 'checksum', - 'collate', - 'cond', - 'convert', - 'dataset', - 'date', - 'dir', - 'environment', - 'error', - 'fileutils', - 'gdatetime', - 'guuid', - 'gvariant', - 'hash', - 'hmac', - 'hook', - 'hostutils', - 'keyfile', - 'list', - 'logging', - 'mainloop', - 'mappedfile', - 'markup', - 'markup-parse', - 'markup-collect', - 'markup-escape', - 'markup-subparser', - 'mem-overflow', - 'mutex', - 'node', - 'once', - 'option-context', - 'option-argv0', - 'overflow', - # overflow-fallback handled separately below - 'pattern', - 'private', - 'protocol', - 'queue', - 'rand', - 'rcbox', - 'rec-mutex', - 'refcount', - 'refcount-macro', - 'refstring', - 'regex', - 'rwlock', - 'scannerapi', - 'search-utils', - 'sequence', - 'shell', - 'slice', - 'slist', - 'sort', - 'spawn-multithreaded', - 'spawn-singlethread', - 'strfuncs', - 'string', - 'testing', - 'test-printf', - 'thread', - 'timeout', - 'timer', - 'tree', - 'utf8-performance', - 'utf8-pointer', - 'utf8-validate', - 'utf8-misc', - 'utils', - 'unicode', - 'uri', - '1bit-mutex', - '642026', -] +glib_tests = { + 'array-test' : {}, + 'asyncqueue' : {}, + 'atomic' : { + 'c_args' : cc.get_id() == 'gcc' ? ['-Wstrict-aliasing=2'] : [], + }, + 'autoptr' : { + 'skip' : cc.get_id() == 'msvc', + }, + 'base64' : {}, + 'bitlock' : {}, + 'bookmarkfile' : {}, + 'bytes' : {}, + 'cache' : {}, + 'charset' : {}, + 'checksum' : {}, + 'collate' : {}, + 'cond' : {}, + 'convert' : {}, + 'dataset' : {}, + 'date' : {}, + 'dir' : {}, + 'environment' : {}, + 'error' : {}, + 'fileutils' : {}, + 'gdatetime' : {}, + 'guuid' : {}, + 'gvariant' : { + 'suite' : ['slow'], + }, + 'gwakeup' : { + 'source' : ['gwakeuptest.c', '../gwakeup.c'], + 'install' : false, + }, + 'gwakeup-fallback' : { + 'skip' : not glib_conf.has('HAVE_EVENTFD'), + 'source' : ['gwakeuptest.c', '../gwakeup.c'], + 'c_args' : ['-DTEST_EVENTFD_FALLBACK'], + 'install' : false, + }, + 'hash' : {}, + 'hmac' : {}, + 'hook' : {}, + 'hostutils' : {}, + 'include' : { + 'skip' : host_machine.system() == 'windows', + }, + 'keyfile' : {}, + 'list' : {}, + 'logging' : {}, + 'mainloop' : {}, + 'mappedfile' : {}, + 'markup' : {}, + 'markup-parse' : {}, + 'markup-collect' : {}, + 'markup-escape' : {}, + 'markup-subparser' : {}, + 'mem-overflow' : {}, + 'mutex' : {}, + 'node' : {}, + 'once' : {}, + 'option-context' : {}, + 'option-argv0' : {}, + 'overflow' : {}, + 'overflow-fallback' : { + 'source' : 'overflow.c', + 'c_args' : ['-D_GLIB_TEST_OVERFLOW_FALLBACK'], + }, + 'pattern' : {}, + 'private' : {}, + 'protocol' : {}, + 'queue' : {}, + 'rand' : {}, + 'rcbox' : {}, + 'rec-mutex' : {}, + 'refcount' : {}, + 'refcount-macro' : { + 'source' : 'refcount.c', + 'c_args' : ['-DG_DISABLE_CHECKS'], + }, + 'refstring' : {}, + 'regex' : { + 'dependencies' : [pcre], + 'c_args' : use_pcre_static_flag ? ['-DPCRE_STATIC'] : [], + }, + 'rwlock' : {}, + 'scannerapi' : {}, + 'search-utils' : {}, + 'sequence' : { + 'suite' : ['slow'], + }, + 'shell' : {}, + 'slice' : {}, + 'slist' : {}, + 'sort' : {}, + 'spawn-multithreaded' : {}, + 'spawn-singlethread' : {}, + 'strfuncs' : {}, + 'string' : {}, + 'testing' : {}, + 'test-printf' : {}, + 'thread' : {}, + 'timeout' : {}, + 'timer' : {}, + 'tree' : {}, + 'utf8-performance' : {}, + 'utf8-pointer' : {}, + 'utf8-validate' : {}, + 'utf8-misc' : {}, + 'utils' : {}, + 'unicode' : {}, + 'unix' : { + 'skip' : host_machine.system() == 'windows', + }, + 'uri' : {}, + '1bit-mutex' : {}, + '1bit-emufutex' : { + 'source' : '1bit-mutex.c', + 'c_args' : ['-DTEST_EMULATED_FUTEX'], + 'install' : false, + }, + '642026' : { + 'suite' : ['slow'], + }, + '642026-ec' : { + 'source' : '642026.c', + 'c_args' : ['-DG_ERRORCHECK_MUTEXES'], + 'suite' : ['slow'], + }, +} -if host_machine.system() != 'windows' - glib_tests += [ 'unix', 'include' ] -endif - -if cc.get_id() != 'msvc' - glib_tests += [ 'autoptr' ] -endif - -# FIXME: use new environment() object # Not entirely random of course, but at least it changes over time random_number = minor_version + meson.version().split('.').get(1).to_int() -test_env = [ - 'G_TEST_SRCDIR=' + meson.current_source_dir(), - 'G_TEST_BUILDDIR=' + meson.current_build_dir(), - 'G_DEBUG=gc-friendly', - 'MALLOC_CHECK_=2', - 'MALLOC_PERTURB_=@0@'.format(random_number % 256), -] +test_env = environment() +test_env.set('G_TEST_SRCDIR', meson.current_source_dir()) +test_env.set('G_TEST_BUILDDIR', meson.current_build_dir()) +test_env.set('G_DEBUG', 'gc-friendly') +test_env.set('MALLOC_CHECK_', '2') +test_env.set('MALLOC_PERTURB_', '@0@'.format(random_number % 256)) +test_deps = [libm, thread_dep, libglib_dep] test_cargs = ['-DG_LOG_DOMAIN="GLib"'] -# Tests that consistently time out on the CI infrastructure -slow_tests = [ - 'gvariant', - 'sequence', - '642026', -] +foreach test_name, extra_args : glib_tests + # FIXME: This condition is ugly, meson should either have 'continue' + # keyword (https://github.com/mesonbuild/meson/issues/3601), or support + # mutable to dictionaries (https://github.com/mesonbuild/meson/pull/3820). + if not extra_args.get('skip', false) + source = extra_args.get('source', test_name + '.c') + install = installed_tests_enabled and extra_args.get('install', true) -foreach test_name : glib_tests - deps = [libm, thread_dep, libglib_dep] - source = test_name + '.c' - c_args = test_cargs + ['-DPCRE_STATIC'] - if test_name == 'regex' - deps += [pcre] - endif - if test_name == 'gdatetime' - deps += [libintl] - endif - # We build the refcount test twice: one to test the function-based API, - # and the other to test the macro-based API that is used when disabling - # checks - if test_name == 'refcount-macro' - source = 'refcount.c' - c_args += ['-DG_DISABLE_CHECKS'] - endif - exe = executable(test_name, source, - c_args : c_args, - dependencies : deps, - install : false, - ) - # These tests may take more than 30 seconds to run on the CI infrastructure - if slow_tests.contains(test_name) - test(test_name, exe, env : test_env, timeout : 120, suite : ['glib', 'slow']) - else - test(test_name, exe, env : test_env, suite : ['glib']) + if install + test_conf = configuration_data() + test_conf.set('installed_tests_dir', installed_tests_execdir) + test_conf.set('program', test_name) + configure_file( + input: installed_tests_template, + output: test_name + '.test', + install_dir: installed_tests_metadir, + configuration: test_conf + ) + endif + + exe = executable(test_name, source, + c_args : test_cargs + extra_args.get('c_args', []), + dependencies : test_deps + extra_args.get('dependencies', []), + install_dir: installed_tests_execdir, + install: install, + ) + + suite = ['glib'] + extra_args.get('suite', []) + timeout = suite.contains('slow') ? 120 : 30 + test(test_name, exe, env : test_env, timeout : timeout, suite : suite) endif endforeach -c_args_atomic = [] -if cc.get_id() == 'gcc' - c_args_atomic += ['-Wstrict-aliasing=2'] -endif - -deps = [libm, thread_dep, libglib_dep] - -exe = executable('atomic', 'atomic.c', - c_args : test_cargs + c_args_atomic, - dependencies : deps, -) -test('atomic', exe, env : test_env, suite : ['glib']) - -# FIXME: consolidate all of these into the array -exe = executable('overflow-fallback', 'overflow.c', - c_args : test_cargs + ['-D_GLIB_TEST_OVERFLOW_FALLBACK'], - dependencies : deps, - install : false, -) -test('overflow-fallback', exe, env : test_env, suite : ['glib']) - -exe = executable('642026-ec', '642026.c', - c_args : test_cargs + ['-DG_ERRORCHECK_MUTEXES'], - dependencies : deps, - install : false, -) -test('642026-ec', exe, env : test_env, timeout : 90, suite : ['glib', 'slow']) - -exe = executable('1bit-emufutex', '1bit-mutex.c', - c_args : test_cargs + ['-DTEST_EMULATED_FUTEX'], - dependencies : deps, - install : false, -) -test('1bit-emufutex', exe, env : test_env, suite : ['glib']) - -exe = executable('gwakeup', 'gwakeuptest.c', '../gwakeup.c', - c_args : test_cargs, - dependencies : deps, - install : false) -test('gwakeup', exe, env : test_env, suite : ['glib']) - -if glib_conf.has('HAVE_EVENTFD') - exe = executable('gwakeup-fallback', 'gwakeuptest.c', '../gwakeup.c', - c_args : test_cargs + ['-DTEST_EVENTFD_FALLBACK'], - dependencies : deps, - install : false, - ) - test('gwakeup-fallback', exe, env : test_env, suite : ['glib']) -endif - # test-spawn-echo helper binary required by the spawn tests above executable('test-spawn-echo', 'test-spawn-echo.c', c_args : test_cargs, - dependencies : deps, - install : false, + dependencies : test_deps, + install_dir: installed_tests_execdir, + install: installed_tests_enabled, ) # some testing of gtester functionality @@ -204,7 +189,6 @@ if not meson.is_cross_build() and host_system != 'windows' if xmllint.found() tmpsample_xml = custom_target('tmpsample.xml', output : 'tmpsample.xml', - build_by_default : true, # hack around meson bug, see PR #1335 command : [ gtester, '-k', '--quiet', '-o', '@OUTPUT@', '--test-arg=--gtester-selftest', gtester]) diff --git a/gobject/tests/meson.build b/gobject/tests/meson.build index 252b5ecf8..53b76d3eb 100644 --- a/gobject/tests/meson.build +++ b/gobject/tests/meson.build @@ -20,18 +20,16 @@ gobject_tests = [ 'ifaceproperties', ] -# FIXME: use new environment() object # FIXME: put common bits of test environment() in one location # Not entirely random of course, but at least it changes over time random_number = minor_version + meson.version().split('.').get(1).to_int() -test_env = [ - 'G_TEST_SRCDIR=' + meson.current_source_dir(), - 'G_TEST_BUILDDIR=' + meson.current_build_dir(), - 'G_DEBUG=gc-friendly', - 'MALLOC_CHECK_=2', - 'MALLOC_PERTURB_=@0@'.format(random_number % 256), -] +test_env = environment() +test_env.set('G_TEST_SRCDIR', meson.current_source_dir()) +test_env.set('G_TEST_BUILDDIR', meson.current_build_dir()) +test_env.set('G_DEBUG', 'gc-friendly') +test_env.set('MALLOC_CHECK_', '2') +test_env.set('MALLOC_PERTURB_', '@0@'.format(random_number % 256)) foreach test_name : gobject_tests deps = [libm, thread_dep, libglib_dep, libgobject_dep] diff --git a/meson.build b/meson.build index fa7357d40..15f895e7f 100644 --- a/meson.build +++ b/meson.build @@ -56,6 +56,7 @@ gioinc = include_directories('gio') glib_prefix = get_option('prefix') glib_bindir = join_paths(glib_prefix, get_option('bindir')) glib_libdir = join_paths(glib_prefix, get_option('libdir')) +glib_libexecdir = join_paths(glib_prefix, get_option('libexecdir')) glib_datadir = join_paths(glib_prefix, get_option('datadir')) glib_pkgdatadir = join_paths(glib_datadir, 'glib-2.0') glib_includedir = join_paths(glib_prefix, get_option('includedir')) @@ -66,6 +67,11 @@ endif glib_pkgconfigreldir = join_paths(glib_libdir, 'pkgconfig') +installed_tests_metadir = join_paths(glib_datadir, 'installed-tests', meson.project_name()) +installed_tests_execdir = join_paths(glib_libexecdir, 'installed-tests', meson.project_name()) +installed_tests_enabled = get_option('installed_tests') +installed_tests_template = files('template.test.in') + add_project_arguments('-D_GNU_SOURCE', language: 'c') # Disable strict aliasing; diff --git a/meson_options.txt b/meson_options.txt index 5245e0a8b..64accf68b 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -78,3 +78,8 @@ option('fam', type : 'boolean', value : false, description : 'Use fam for file system monitoring') + +option('installed_tests', + type : 'boolean', + value : false, + description : 'enable installed tests') diff --git a/template.test.in b/template.test.in new file mode 100644 index 000000000..f701627f8 --- /dev/null +++ b/template.test.in @@ -0,0 +1,3 @@ +[Test] +Type=session +Exec=@installed_tests_dir@/@program@ diff --git a/tests/meson.build b/tests/meson.build index 03997a634..3beb4c68a 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -1,11 +1,10 @@ # tests -test_env = [ - 'G_TEST_SRCDIR=' + meson.current_source_dir(), - 'G_TEST_BUILDDIR=' + meson.current_build_dir(), - 'G_DEBUG=gc-friendly', - 'MALLOC_CHECK_=2', -] +test_env = environment() +test_env.set('G_TEST_SRCDIR', meson.current_source_dir()) +test_env.set('G_TEST_BUILDDIR', meson.current_build_dir()) +test_env.set('G_DEBUG', 'gc-friendly') +test_env.set('MALLOC_CHECK_', '2') test_cargs = ['-DG_LOG_DOMAIN="GLib"']