From 4b0c0810df8e0fae9529d879539b8926b5b278a3 Mon Sep 17 00:00:00 2001 From: Eli Schwartz Date: Wed, 16 Mar 2022 18:36:25 -0400 Subject: unittests: convert python tests to project tests Perhaps when this test case was originally created, project tests could not use a matrix of options? This is certainly possible today, so don't write special unittest handling for this instead. This adds proper visibility into what gets run and what doesn't. Now we know which python executables got tested and which got skipped. --- .../python/8 different python versions/blaster.py | 14 +++++ .../8 different python versions/ext/meson.build | 6 +++ .../ext/tachyon_module.c | 59 ++++++++++++++++++++++ .../python/8 different python versions/meson.build | 26 ++++++++++ .../8 different python versions/meson_options.txt | 4 ++ .../python/8 different python versions/test.json | 13 +++++ test cases/unit/39 python extmodule/blaster.py | 14 ----- .../unit/39 python extmodule/ext/meson.build | 6 --- .../unit/39 python extmodule/ext/tachyon_module.c | 59 ---------------------- test cases/unit/39 python extmodule/meson.build | 26 ---------- .../unit/39 python extmodule/meson_options.txt | 4 -- unittests/pythontests.py | 41 +-------------- 12 files changed, 124 insertions(+), 148 deletions(-) create mode 100755 test cases/python/8 different python versions/blaster.py create mode 100644 test cases/python/8 different python versions/ext/meson.build create mode 100644 test cases/python/8 different python versions/ext/tachyon_module.c create mode 100644 test cases/python/8 different python versions/meson.build create mode 100644 test cases/python/8 different python versions/meson_options.txt create mode 100644 test cases/python/8 different python versions/test.json delete mode 100755 test cases/unit/39 python extmodule/blaster.py delete mode 100644 test cases/unit/39 python extmodule/ext/meson.build delete mode 100644 test cases/unit/39 python extmodule/ext/tachyon_module.c delete mode 100644 test cases/unit/39 python extmodule/meson.build delete mode 100644 test cases/unit/39 python extmodule/meson_options.txt diff --git a/test cases/python/8 different python versions/blaster.py b/test cases/python/8 different python versions/blaster.py new file mode 100755 index 0000000..163b6d4 --- /dev/null +++ b/test cases/python/8 different python versions/blaster.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python + +import sys +import tachyon + +result = tachyon.phaserize('shoot') + +if not isinstance(result, int): + print('Returned result not an integer.') + sys.exit(1) + +if result != 1: + print('Returned result {} is not 1.'.format(result)) + sys.exit(1) diff --git a/test cases/python/8 different python versions/ext/meson.build b/test cases/python/8 different python versions/ext/meson.build new file mode 100644 index 0000000..b13bb32 --- /dev/null +++ b/test cases/python/8 different python versions/ext/meson.build @@ -0,0 +1,6 @@ +pylib = py.extension_module('tachyon', + 'tachyon_module.c', + dependencies : py_dep, +) + +pypathdir = meson.current_build_dir() diff --git a/test cases/python/8 different python versions/ext/tachyon_module.c b/test cases/python/8 different python versions/ext/tachyon_module.c new file mode 100644 index 0000000..68eda53 --- /dev/null +++ b/test cases/python/8 different python versions/ext/tachyon_module.c @@ -0,0 +1,59 @@ +/* + Copyright 2018 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. +*/ + +/* A very simple Python extension module. */ + +#include +#include + +static PyObject* phaserize(PyObject *self, PyObject *args) { + const char *message; + int result; + + if(!PyArg_ParseTuple(args, "s", &message)) + return NULL; + + result = strcmp(message, "shoot") ? 0 : 1; +#if PY_VERSION_HEX < 0x03000000 + return PyInt_FromLong(result); +#else + return PyLong_FromLong(result); +#endif +} + +static PyMethodDef TachyonMethods[] = { + {"phaserize", phaserize, METH_VARARGS, + "Shoot tachyon cannons."}, + {NULL, NULL, 0, NULL} +}; + +#if PY_VERSION_HEX < 0x03000000 +PyMODINIT_FUNC inittachyon(void) { + Py_InitModule("tachyon", TachyonMethods); +} +#else +static struct PyModuleDef tachyonmodule = { + PyModuleDef_HEAD_INIT, + "tachyon", + NULL, + -1, + TachyonMethods +}; + +PyMODINIT_FUNC PyInit_tachyon(void) { + return PyModule_Create(&tachyonmodule); +} +#endif diff --git a/test cases/python/8 different python versions/meson.build b/test cases/python/8 different python versions/meson.build new file mode 100644 index 0000000..5b44394 --- /dev/null +++ b/test cases/python/8 different python versions/meson.build @@ -0,0 +1,26 @@ +project('Python extension module', 'c', + default_options : ['buildtype=release']) + +py_mod = import('python') + +py = py_mod.find_installation(get_option('python'), required : false) + +if py.found() + py_dep = py.dependency(required : false) + + if py_dep.found() + subdir('ext') + + test('extmod', + py, + args : files('blaster.py'), + env : ['PYTHONPATH=' + pypathdir]) + else + error('MESON_SKIP_TEST: Python libraries not found, skipping test.') + endif +else + error('MESON_SKIP_TEST: Python not found, skipping test.') +endif + +py = py_mod.find_installation(get_option('python'), required : get_option('disabled_opt')) +assert(not py.found(), 'find_installation not working with disabled feature') diff --git a/test cases/python/8 different python versions/meson_options.txt b/test cases/python/8 different python versions/meson_options.txt new file mode 100644 index 0000000..c85110d --- /dev/null +++ b/test cases/python/8 different python versions/meson_options.txt @@ -0,0 +1,4 @@ +option('python', type: 'string', + description: 'Name of or path to the python executable' +) +option('disabled_opt', type: 'feature', value: 'disabled') diff --git a/test cases/python/8 different python versions/test.json b/test cases/python/8 different python versions/test.json new file mode 100644 index 0000000..fe75a1c --- /dev/null +++ b/test cases/python/8 different python versions/test.json @@ -0,0 +1,13 @@ +{ + "matrix": { + "options": { + "python": [ + { "val": null }, + { "val": "python2" }, + { "val": "python3" }, + { "val": "pypy" }, + { "val": "pypy3" } + ] + } + } +} diff --git a/test cases/unit/39 python extmodule/blaster.py b/test cases/unit/39 python extmodule/blaster.py deleted file mode 100755 index 163b6d4..0000000 --- a/test cases/unit/39 python extmodule/blaster.py +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env python - -import sys -import tachyon - -result = tachyon.phaserize('shoot') - -if not isinstance(result, int): - print('Returned result not an integer.') - sys.exit(1) - -if result != 1: - print('Returned result {} is not 1.'.format(result)) - sys.exit(1) diff --git a/test cases/unit/39 python extmodule/ext/meson.build b/test cases/unit/39 python extmodule/ext/meson.build deleted file mode 100644 index b13bb32..0000000 --- a/test cases/unit/39 python extmodule/ext/meson.build +++ /dev/null @@ -1,6 +0,0 @@ -pylib = py.extension_module('tachyon', - 'tachyon_module.c', - dependencies : py_dep, -) - -pypathdir = meson.current_build_dir() diff --git a/test cases/unit/39 python extmodule/ext/tachyon_module.c b/test cases/unit/39 python extmodule/ext/tachyon_module.c deleted file mode 100644 index 68eda53..0000000 --- a/test cases/unit/39 python extmodule/ext/tachyon_module.c +++ /dev/null @@ -1,59 +0,0 @@ -/* - Copyright 2018 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. -*/ - -/* A very simple Python extension module. */ - -#include -#include - -static PyObject* phaserize(PyObject *self, PyObject *args) { - const char *message; - int result; - - if(!PyArg_ParseTuple(args, "s", &message)) - return NULL; - - result = strcmp(message, "shoot") ? 0 : 1; -#if PY_VERSION_HEX < 0x03000000 - return PyInt_FromLong(result); -#else - return PyLong_FromLong(result); -#endif -} - -static PyMethodDef TachyonMethods[] = { - {"phaserize", phaserize, METH_VARARGS, - "Shoot tachyon cannons."}, - {NULL, NULL, 0, NULL} -}; - -#if PY_VERSION_HEX < 0x03000000 -PyMODINIT_FUNC inittachyon(void) { - Py_InitModule("tachyon", TachyonMethods); -} -#else -static struct PyModuleDef tachyonmodule = { - PyModuleDef_HEAD_INIT, - "tachyon", - NULL, - -1, - TachyonMethods -}; - -PyMODINIT_FUNC PyInit_tachyon(void) { - return PyModule_Create(&tachyonmodule); -} -#endif diff --git a/test cases/unit/39 python extmodule/meson.build b/test cases/unit/39 python extmodule/meson.build deleted file mode 100644 index 5b44394..0000000 --- a/test cases/unit/39 python extmodule/meson.build +++ /dev/null @@ -1,26 +0,0 @@ -project('Python extension module', 'c', - default_options : ['buildtype=release']) - -py_mod = import('python') - -py = py_mod.find_installation(get_option('python'), required : false) - -if py.found() - py_dep = py.dependency(required : false) - - if py_dep.found() - subdir('ext') - - test('extmod', - py, - args : files('blaster.py'), - env : ['PYTHONPATH=' + pypathdir]) - else - error('MESON_SKIP_TEST: Python libraries not found, skipping test.') - endif -else - error('MESON_SKIP_TEST: Python not found, skipping test.') -endif - -py = py_mod.find_installation(get_option('python'), required : get_option('disabled_opt')) -assert(not py.found(), 'find_installation not working with disabled feature') diff --git a/test cases/unit/39 python extmodule/meson_options.txt b/test cases/unit/39 python extmodule/meson_options.txt deleted file mode 100644 index c85110d..0000000 --- a/test cases/unit/39 python extmodule/meson_options.txt +++ /dev/null @@ -1,4 +0,0 @@ -option('python', type: 'string', - description: 'Name of or path to the python executable' -) -option('disabled_opt', type: 'feature', value: 'disabled') diff --git a/unittests/pythontests.py b/unittests/pythontests.py index c8efbdd..27716d7 100644 --- a/unittests/pythontests.py +++ b/unittests/pythontests.py @@ -26,48 +26,11 @@ class PythonTests(BasePlatformTests): Tests that verify compilation of python extension modules ''' - def test_versions(self): + def test_bad_versions(self): if self.backend is not Backend.ninja: raise unittest.SkipTest(f'Skipping python tests with {self.backend.name} backend') - testdir = os.path.join(self.src_root, 'test cases', 'unit', '39 python extmodule') - - # No python version specified, this will use meson's python - self.init(testdir) - self.build() - self.run_tests() - self.wipe() - - # When specifying a known name, (python2 / python3) the module - # will also try 'python' as a fallback and use it if the major - # version matches - try: - self.init(testdir, extra_args=['-Dpython=python2']) - self.build() - self.run_tests() - except unittest.SkipTest: - # python2 is not necessarily installed on the test machine, - # if it is not, or the python headers can't be found, the test - # will raise MESON_SKIP_TEST, we could check beforehand what version - # of python is available, but it's a bit of a chicken and egg situation, - # as that is the job of the module, so we just ask for forgiveness rather - # than permission. - pass - - self.wipe() - - for py in ('pypy', 'pypy3'): - try: - self.init(testdir, extra_args=['-Dpython=%s' % py]) - except unittest.SkipTest: - # Same as above, pypy2 and pypy3 are not expected to be present - # on the test system, the test project only raises in these cases - continue - - # We have a pypy, this is expected to work - self.build() - self.run_tests() - self.wipe() + testdir = os.path.join(self.src_root, 'test cases', 'python', '8 different python versions') # The test is configured to error out with MESON_SKIP_TEST # in case it could not find python -- cgit v1.1