tests: Search the appropriate directories for our GIR XML inputs

During "as-installed" testing, we should search the GIR_DIR for GIR XML,
instead of hard-coding that it is `${prefix}/share/gir-1.0`. This is
not the case on at least Debian, in order to make it possible to
install more than one architecture's flavour of `GLib-2.0.gir`,
which contains some architecture-specific `#define`s.

Also search GOBJECT_INTROSPECTION_DATADIR/GIR_SUFFIX (in practice
something like `/usr/share/gir-1.0` in all cases) to accommodate
distributions like Debian that move the architecture-independent
majority of GIR XML into /usr/share to avoid duplication, leaving
only the architecture-specific minority of files like `GLib-2.0.gir`
in the GIR_DIR.

Signed-off-by: Simon McVittie <smcv@collabora.com>
This commit is contained in:
Simon McVittie 2025-02-21 12:35:16 +00:00
parent 135850a534
commit 9f18bb6258
12 changed files with 79 additions and 35 deletions

View File

@ -1175,6 +1175,7 @@ endforeach
python_test_env = test_env
python_test_env.prepend('PYTHONPATH', python_test_libraries_path)
python_test_env.prepend('PYTHONPATH', python_test_libraries_built)
foreach test_name, extra_args : python_tests
depends = [extra_args.get('depends', [])]

View File

@ -303,6 +303,8 @@ static GMarkupParser firstpass_parser =
NULL,
};
/* If you change this search order, gobject-introspection.git and
* tests/installed/glibconfig.py.in will probably also need updating */
static char *
locate_gir (GIIrParser *parser,
const char *girname)

View File

@ -25,6 +25,7 @@
import os
import unittest
import glibconfig
import taptestrunner
import testprogramrunner
@ -39,20 +40,9 @@ class TestGICompileRepositoryBase(testprogramrunner.TestProgramRunner):
def setUpClass(cls):
super().setUpClass()
if "G_TEST_BUILDDIR" in os.environ:
cls._gir_path = os.path.join(
os.environ["G_TEST_BUILDDIR"], "..", "introspection"
)
else:
cls._gir_path = os.path.join(
os.path.dirname(os.path.realpath(__file__)),
"..",
"..",
"..",
"share",
"gir-1.0",
)
print(f"gir path set to {cls._gir_path}")
# list of pathlib.Path
cls._gir_paths = glibconfig.GIR_XML_SEARCH_PATHS
print(f"gir path set to {cls._gir_paths}")
class TestGICompileRepository(TestGICompileRepositoryBase):
@ -73,13 +63,20 @@ class TestGICompileRepositoryForGLib(TestGICompileRepositoryBase):
GIR_NAME = "GLib-2.0"
def runTestProgram(self, *args, **kwargs):
gir_file = os.path.join(self._gir_path, f"{self.GIR_NAME}.gir")
self.assertTrue(os.path.exists(gir_file))
argv = [gir_file]
for d in self._gir_paths:
gir_file = d / f"{self.GIR_NAME}.gir"
if gir_file.exists():
break
else:
self.fail(f"Could not find {self.GIR_NAME}.gir in {self._gir_paths}")
argv = [str(gir_file)]
argv.extend(*args)
if self.GIR_NAME != "GLib-2.0":
argv.extend(["--includedir", self._gir_path])
for d in self._gir_paths:
argv.extend(["--includedir", str(d)])
return super().runTestProgram(argv, **kwargs)

View File

@ -183,6 +183,7 @@ endif
python_test_env = test_env
python_test_env.prepend('PYTHONPATH', python_test_libraries_path)
python_test_env.prepend('PYTHONPATH', python_test_libraries_built)
foreach test_name, extra_args : python_tests
depends = [extra_args.get('depends', [])]

View File

@ -514,6 +514,7 @@ endif
python_test_env = test_env
python_test_env.prepend('PYTHONPATH', python_test_libraries_path)
python_test_env.prepend('PYTHONPATH', python_test_libraries_built)
foreach test_name, extra_args : python_tests
depends = [extra_args.get('depends', [])]

View File

@ -234,6 +234,7 @@ endforeach
python_test_env = test_env
python_test_env.prepend('PYTHONPATH', python_test_libraries_path)
python_test_env.prepend('PYTHONPATH', python_test_libraries_built)
foreach test_name, extra_args : python_tests
depends = [extra_args.get('depends', [])]

View File

@ -2500,6 +2500,7 @@ assert(fs.exists(python_test_libraries_path))
if not python_version.version_compare(python_version_req)
error('Requires Python @0@, @1@ found.'.format(python_version_req, python_version))
endif
python_test_libraries_built = meson.project_build_root() / 'tests' / 'lib'
# Determine which user environment-dependent files that we want to install
bash = find_program('bash', required : false)

View File

@ -16,7 +16,7 @@ export TEST_REQUIRES_TOOLS="black git"
run_lint () {
# shellcheck disable=SC2046
black --diff --check $(git ls-files '*.py')
black --diff --check $(git ls-files '*.py' 'tests/lib/*.py.in')
}
# shellcheck source=tests/lint-common.sh

View File

@ -21,7 +21,7 @@ run_lint () {
# shellcheck disable=SC2046
flake8 \
--max-line-length=88 --ignore="$formatting_warnings" \
$(git ls-files '*.py')
$(git ls-files '*.py' 'tests/lib/*.py.in')
}
# shellcheck source=tests/lint-common.sh

View File

@ -0,0 +1,29 @@
# Copyright 2025 Simon McVittie
# SPDX-License-Identifier: LGPL-2.1-or-later
import os
from pathlib import Path
if "G_TEST_BUILDDIR" in os.environ:
# During build-time testing, we search the build tree.
# We can't use the value of G_TEST_BUILDDIR here because we don't
# know how deeply nested the current build directory is.
project_build_root = Path(__file__).resolve().parent.parent.parent
# Where to find GLib-2.0.gir, etc. as a list of Path, highest priority first
GIR_XML_SEARCH_PATHS = [
project_build_root / "girepository" / "introspection",
]
else:
# During as-installed testing, we search the final paths.
# This is a subset of the search path from girparser.c locate_gir(),
# with only the directories that are part of GLib's prefix,
# excluding XDG_DATA_HOME, XDG_DATA_DIRS and the hard-coded
# /usr/share fallback
GIR_XML_SEARCH_PATHS = [
Path(r"@glib_girdir@"),
Path(r"@glib_datadir@") / "gir-1.0",
]

25
tests/lib/meson.build Normal file
View File

@ -0,0 +1,25 @@
# Copyright 2024 Collabora Ltd.
# Copyright 2025 Simon McVittie
# SPDX-License-Identifier: LGPL-2.1-or-later
install_data(
files(
'taptestrunner.py',
'testprogramrunner.py',
),
install_dir: installed_tests_execdir,
install_tag: 'tests',
)
tests_conf = configuration_data()
tests_conf.set('glib_datadir', glib_datadir)
tests_conf.set('glib_girdir', glib_girdir)
configure_file(
configuration: tests_conf,
input: 'glibconfig.py.in',
output: 'glibconfig.py',
install: installed_tests_enabled,
install_dir: installed_tests_execdir,
install_tag: 'tests',
)

View File

@ -34,18 +34,4 @@ test(
protocol : 'tap',
)
# TAP test runner for Python tests
if installed_tests_enabled
lib_path = fs.relative_to(
meson.project_source_root() / python_test_libraries_path,
meson.current_source_dir())
install_data(
files(
lib_path / 'taptestrunner.py',
lib_path / 'testprogramrunner.py',
),
install_dir: installed_tests_execdir,
install_tag: 'tests',
)
endif
subdir('lib')