The Meson Build System
http://mesonbuild.com/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
162 lines
5.6 KiB
162 lines
5.6 KiB
#!/usr/bin/env python3 |
|
# Copyright 2016-2021 The Meson development team |
|
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); |
|
# you may not use this file except in compliance with the License. |
|
# You may obtain a copy of the License at |
|
|
|
# http://www.apache.org/licenses/LICENSE-2.0 |
|
|
|
# Unless required by applicable law or agreed to in writing, software |
|
# distributed under the License is distributed on an "AS IS" BASIS, |
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
# See the License for the specific language governing permissions and |
|
# limitations under the License. |
|
|
|
# Work around some pathlib bugs... |
|
from mesonbuild import _pathlib |
|
import sys |
|
sys.modules['pathlib'] = _pathlib |
|
|
|
import time |
|
import subprocess |
|
import os |
|
import unittest |
|
|
|
import mesonbuild.mlog |
|
import mesonbuild.depfile |
|
import mesonbuild.dependencies.base |
|
import mesonbuild.dependencies.factory |
|
import mesonbuild.compilers |
|
import mesonbuild.envconfig |
|
import mesonbuild.environment |
|
import mesonbuild.mesonlib |
|
import mesonbuild.coredata |
|
import mesonbuild.modules.gnome |
|
from mesonbuild.mesonlib import ( |
|
python_command |
|
) |
|
import mesonbuild.dependencies.base |
|
import mesonbuild.modules.pkgconfig |
|
|
|
from mesonbuild.mesonmain import setup_vsenv |
|
|
|
from unittests.allplatformstests import AllPlatformTests |
|
from unittests.darwintests import DarwinTests |
|
from unittests.failuretests import FailureTests |
|
from unittests.linuxcrosstests import LinuxCrossArmTests, LinuxCrossMingwTests |
|
from unittests.machinefiletests import NativeFileTests, CrossFileTests |
|
from unittests.rewritetests import RewriterTests |
|
from unittests.taptests import TAPParserTests |
|
from unittests.datatests import DataTests |
|
from unittests.internaltests import InternalTests |
|
from unittests.linuxliketests import LinuxlikeTests |
|
from unittests.pythontests import PythonTests |
|
from unittests.subprojectscommandtests import SubprojectsCommandTests |
|
from unittests.windowstests import WindowsTests |
|
|
|
def unset_envs(): |
|
# For unit tests we must fully control all command lines |
|
# so that there are no unexpected changes coming from the |
|
# environment, for example when doing a package build. |
|
varnames = ['CPPFLAGS', 'LDFLAGS'] + list(mesonbuild.compilers.compilers.CFLAGS_MAPPING.values()) |
|
for v in varnames: |
|
if v in os.environ: |
|
del os.environ[v] |
|
|
|
def convert_args(argv): |
|
# If we got passed a list of tests, pass it on |
|
pytest_args = ['-v'] if '-v' in argv else [] |
|
test_list = [] |
|
for arg in argv: |
|
if arg.startswith('-'): |
|
if arg in ('-f', '--failfast'): |
|
arg = '--exitfirst' |
|
pytest_args.append(arg) |
|
continue |
|
# ClassName.test_name => 'ClassName and test_name' |
|
if '.' in arg: |
|
arg = ' and '.join(arg.split('.')) |
|
test_list.append(arg) |
|
if test_list: |
|
pytest_args += ['-k', ' or '.join(test_list)] |
|
return pytest_args |
|
|
|
def running_single_tests(argv, cases): |
|
''' |
|
Check whether we only got arguments for running individual tests, not |
|
entire testcases, and not all testcases (no test args). |
|
''' |
|
got_test_arg = False |
|
for arg in argv: |
|
if arg.startswith('-'): |
|
continue |
|
for case in cases: |
|
if not arg.startswith(case): |
|
continue |
|
if '.' not in arg: |
|
# Got a testcase, done |
|
return False |
|
got_test_arg = True |
|
return got_test_arg |
|
|
|
def setup_backend(): |
|
filtered = [] |
|
be = 'ninja' |
|
for a in sys.argv: |
|
if a.startswith('--backend'): |
|
be = a.split('=')[1] |
|
else: |
|
filtered.append(a) |
|
# Since we invoke the tests via unittest or xtest test runner |
|
# we need to pass the backend to use to the spawned process via |
|
# this side channel. Yes it sucks, but at least is is fully |
|
# internal to this file. |
|
os.environ['MESON_UNIT_TEST_BACKEND'] = be |
|
sys.argv = filtered |
|
|
|
def main(): |
|
unset_envs() |
|
setup_backend() |
|
cases = ['InternalTests', 'DataTests', 'AllPlatformTests', 'FailureTests', |
|
'PythonTests', 'NativeFileTests', 'RewriterTests', 'CrossFileTests', |
|
'TAPParserTests', 'SubprojectsCommandTests', |
|
|
|
'LinuxlikeTests', 'LinuxCrossArmTests', 'LinuxCrossMingwTests', |
|
'WindowsTests', 'DarwinTests'] |
|
|
|
try: |
|
import pytest # noqa: F401 |
|
# Need pytest-xdist for `-n` arg |
|
import xdist # noqa: F401 |
|
pytest_args = [] |
|
# Don't use pytest-xdist when running single unit tests since it wastes |
|
# time spawning a lot of processes to distribute tests to in that case. |
|
if not running_single_tests(sys.argv, cases): |
|
pytest_args += ['-n', 'auto'] |
|
# Let there be colors! |
|
if 'CI' in os.environ: |
|
pytest_args += ['--color=yes'] |
|
pytest_args += ['./run_unittests.py'] |
|
pytest_args += convert_args(sys.argv[1:]) |
|
# Always disable pytest-cov because we use a custom setup |
|
try: |
|
import pytest_cov # noqa: F401 |
|
print('Disabling pytest-cov') |
|
pytest_args += ['-p' 'no:cov'] |
|
except ImportError: |
|
pass |
|
return subprocess.run(python_command + ['-m', 'pytest'] + pytest_args).returncode |
|
except ImportError: |
|
print('pytest-xdist not found, using unittest instead') |
|
# Fallback to plain unittest. |
|
return unittest.main(defaultTest=cases, buffer=True) |
|
|
|
if __name__ == '__main__': |
|
setup_vsenv() |
|
print('Meson build system', mesonbuild.coredata.version, 'Unit Tests') |
|
start = time.monotonic() |
|
try: |
|
raise SystemExit(main()) |
|
finally: |
|
print('Total time: {:.3f} seconds'.format(time.monotonic() - start))
|
|
|