summaryrefslogtreecommitdiffstats
path: root/run_unittests.py
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-29 04:41:38 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-29 04:41:38 +0000
commit7b6e527f440cd7e6f8be2b07cee320ee6ca18786 (patch)
tree4a2738d69fa2814659fdadddf5826282e73d81f4 /run_unittests.py
parentInitial commit. (diff)
downloadmeson-upstream.tar.xz
meson-upstream.zip
Adding upstream version 1.0.1.upstream/1.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rwxr-xr-xrun_unittests.py160
1 files changed, 160 insertions, 0 deletions
diff --git a/run_unittests.py b/run_unittests.py
new file mode 100755
index 0000000..ddcde76
--- /dev/null
+++ b/run_unittests.py
@@ -0,0 +1,160 @@
+#!/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.coredata
+import mesonbuild.modules.gnome
+from mesonbuild.mesonlib import python_command, setup_vsenv
+import mesonbuild.modules.pkgconfig
+
+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
+from unittests.platformagnostictests import PlatformAgnosticTests
+
+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', 'PlatformAgnosticTests',
+
+ 'LinuxlikeTests', 'LinuxCrossArmTests', 'LinuxCrossMingwTests',
+ 'WindowsTests', 'DarwinTests']
+
+ try:
+ import pytest # noqa: F401
+ pytest_args = []
+ try:
+ # Need pytest-xdist for `-n` arg
+ import xdist # noqa: F401
+ # 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']
+ except ImportError:
+ print('pytest-xdist not found, tests will not be distributed across CPU cores')
+ # 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 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))