mirror of
https://github.com/ansible/ansible.git
synced 2026-08-03 00:22:10 +02:00
ansible-test - Upgrade coverage for Python 3.10+ (#86811)
* Upgrade coverage for Python 3.10+. * Fix unit tests. * Use ctrace to improve performance. It's unclear why this improves performance on Python 3.10 and 3.14.
This commit is contained in:
@@ -0,0 +1,2 @@
|
|||||||
|
minor_changes:
|
||||||
|
- ansible-test - Upgrade ``coverage`` for Python 3.10 and later.
|
||||||
@@ -1,2 +1,3 @@
|
|||||||
# The test-constraints sanity test verifies this file, but changes must be made manually to keep it in up-to-date.
|
# The test-constraints sanity test verifies this file, but changes must be made manually to keep it in up-to-date.
|
||||||
coverage == 7.10.7 ; python_version >= '3.9' and python_version <= '3.14'
|
coverage == 7.13.5 ; python_version >= '3.10' and python_version <= '3.15'
|
||||||
|
coverage == 7.10.7 ; python_version >= '3.9' and python_version <= '3.9'
|
||||||
|
|||||||
@@ -69,7 +69,8 @@ class CoverageVersion:
|
|||||||
|
|
||||||
COVERAGE_VERSIONS = (
|
COVERAGE_VERSIONS = (
|
||||||
# IMPORTANT: Keep this in sync with the ansible-test.txt requirements file.
|
# IMPORTANT: Keep this in sync with the ansible-test.txt requirements file.
|
||||||
CoverageVersion('7.10.7', 7, (3, 9), (3, 14)),
|
CoverageVersion('7.13.5', 7, (3, 10), (3, 15)),
|
||||||
|
CoverageVersion('7.10.7', 7, (3, 9), (3, 9)),
|
||||||
)
|
)
|
||||||
"""
|
"""
|
||||||
This tuple specifies the coverage version to use for Python version ranges.
|
This tuple specifies the coverage version to use for Python version ranges.
|
||||||
@@ -248,6 +249,7 @@ def generate_ansible_coverage_config() -> str:
|
|||||||
"""Generate code coverage configuration for Ansible tests."""
|
"""Generate code coverage configuration for Ansible tests."""
|
||||||
coverage_config = """
|
coverage_config = """
|
||||||
[run]
|
[run]
|
||||||
|
core = ctrace
|
||||||
branch = True
|
branch = True
|
||||||
concurrency =
|
concurrency =
|
||||||
multiprocessing
|
multiprocessing
|
||||||
@@ -288,6 +290,7 @@ def generate_collection_coverage_config() -> str:
|
|||||||
|
|
||||||
coverage_config = f"""
|
coverage_config = f"""
|
||||||
[run]
|
[run]
|
||||||
|
core = ctrace
|
||||||
branch = True
|
branch = True
|
||||||
concurrency =
|
concurrency =
|
||||||
multiprocessing
|
multiprocessing
|
||||||
|
|||||||
@@ -22,41 +22,51 @@ class TestImports(unittest.TestCase):
|
|||||||
if mod in sys.modules:
|
if mod in sys.modules:
|
||||||
del sys.modules[mod]
|
del sys.modules[mod]
|
||||||
|
|
||||||
@patch.object(builtins, '__import__')
|
def test_module_utils_basic_import_syslog(self):
|
||||||
def test_module_utils_basic_import_syslog(self, mock_import):
|
present = True
|
||||||
|
|
||||||
def _mock_import(name, *args, **kwargs):
|
def _mock_import(name, *args, **kwargs):
|
||||||
if name == 'syslog':
|
if name == 'syslog':
|
||||||
|
if present:
|
||||||
|
return unittest.mock.MagicMock()
|
||||||
raise ImportError
|
raise ImportError
|
||||||
return realimport(name, *args, **kwargs)
|
return realimport(name, *args, **kwargs)
|
||||||
|
|
||||||
self.clear_modules(['syslog', 'ansible.module_utils.basic'])
|
with patch.object(builtins, '__import__', _mock_import):
|
||||||
mod = builtins.__import__('ansible.module_utils.basic')
|
self.clear_modules(['syslog', 'ansible.module_utils.basic'])
|
||||||
self.assertTrue(mod.module_utils.basic.HAS_SYSLOG)
|
mod = builtins.__import__('ansible.module_utils.basic')
|
||||||
|
self.assertTrue(mod.module_utils.basic.HAS_SYSLOG)
|
||||||
|
|
||||||
self.clear_modules(['syslog', 'ansible.module_utils.basic'])
|
present = False
|
||||||
mock_import.side_effect = _mock_import
|
|
||||||
mod = builtins.__import__('ansible.module_utils.basic')
|
self.clear_modules(['syslog', 'ansible.module_utils.basic'])
|
||||||
self.assertFalse(mod.module_utils.basic.HAS_SYSLOG)
|
mod = builtins.__import__('ansible.module_utils.basic')
|
||||||
|
self.assertFalse(mod.module_utils.basic.HAS_SYSLOG)
|
||||||
|
|
||||||
|
self.clear_modules(['syslog', 'ansible.module_utils.basic'])
|
||||||
|
|
||||||
|
def test_module_utils_basic_import_selinux(self):
|
||||||
|
present = True
|
||||||
|
|
||||||
@patch.object(builtins, '__import__')
|
|
||||||
def test_module_utils_basic_import_selinux(self, mock_import):
|
|
||||||
def _mock_import(name, globals=None, locals=None, fromlist=tuple(), level=0, **kwargs):
|
def _mock_import(name, globals=None, locals=None, fromlist=tuple(), level=0, **kwargs):
|
||||||
if name == 'ansible.module_utils.compat' and fromlist == ('selinux',):
|
if name == 'ansible.module_utils.compat' and fromlist == ('selinux',):
|
||||||
|
if present:
|
||||||
|
return unittest.mock.MagicMock()
|
||||||
raise ImportError
|
raise ImportError
|
||||||
return realimport(name, globals=globals, locals=locals, fromlist=fromlist, level=level, **kwargs)
|
return realimport(name, globals=globals, locals=locals, fromlist=fromlist, level=level, **kwargs)
|
||||||
|
|
||||||
try:
|
with patch.object(builtins, '__import__', _mock_import):
|
||||||
self.clear_modules(['ansible.module_utils.compat.selinux', 'ansible.module_utils.basic'])
|
self.clear_modules(['ansible.module_utils.compat.selinux', 'ansible.module_utils.basic'])
|
||||||
mod = builtins.__import__('ansible.module_utils.basic')
|
mod = builtins.__import__('ansible.module_utils.basic')
|
||||||
self.assertTrue(mod.module_utils.basic.HAVE_SELINUX)
|
self.assertTrue(mod.module_utils.basic.HAVE_SELINUX)
|
||||||
except ImportError:
|
|
||||||
# no selinux on test system, so skip
|
|
||||||
pass
|
|
||||||
|
|
||||||
self.clear_modules(['ansible.module_utils.compat.selinux', 'ansible.module_utils.basic'])
|
present = False
|
||||||
mock_import.side_effect = _mock_import
|
|
||||||
mod = builtins.__import__('ansible.module_utils.basic')
|
self.clear_modules(['ansible.module_utils.compat.selinux', 'ansible.module_utils.basic'])
|
||||||
self.assertFalse(mod.module_utils.basic.HAVE_SELINUX)
|
mod = builtins.__import__('ansible.module_utils.basic')
|
||||||
|
self.assertFalse(mod.module_utils.basic.HAVE_SELINUX)
|
||||||
|
|
||||||
|
self.clear_modules(['ansible.module_utils.compat.selinux', 'ansible.module_utils.basic'])
|
||||||
|
|
||||||
# FIXME: doesn't work yet
|
# FIXME: doesn't work yet
|
||||||
# @patch.object(builtins, 'bytes')
|
# @patch.object(builtins, 'bytes')
|
||||||
@@ -64,22 +74,29 @@ class TestImports(unittest.TestCase):
|
|||||||
# mock_bytes.side_effect = NameError()
|
# mock_bytes.side_effect = NameError()
|
||||||
# from ansible.module_utils import basic
|
# from ansible.module_utils import basic
|
||||||
|
|
||||||
@patch.object(builtins, '__import__')
|
def test_module_utils_basic_import_systemd_journal(self):
|
||||||
def test_module_utils_basic_import_systemd_journal(self, mock_import):
|
present = True
|
||||||
|
|
||||||
def _mock_import(name, *args, **kwargs):
|
def _mock_import(name, *args, **kwargs):
|
||||||
try:
|
try:
|
||||||
fromlist = kwargs.get('fromlist', args[2])
|
fromlist = kwargs.get('fromlist', args[2])
|
||||||
except IndexError:
|
except IndexError:
|
||||||
fromlist = []
|
fromlist = []
|
||||||
if name == 'systemd' and 'journal' in fromlist:
|
if name == 'systemd' and 'journal' in fromlist:
|
||||||
|
if present:
|
||||||
|
return unittest.mock.MagicMock()
|
||||||
raise ImportError
|
raise ImportError
|
||||||
return realimport(name, *args, **kwargs)
|
return realimport(name, *args, **kwargs)
|
||||||
|
|
||||||
self.clear_modules(['systemd', 'ansible.module_utils.basic'])
|
with patch.object(builtins, '__import__', _mock_import):
|
||||||
mod = builtins.__import__('ansible.module_utils.basic')
|
self.clear_modules(['systemd', 'ansible.module_utils.basic'])
|
||||||
self.assertTrue(mod.module_utils.basic.has_journal)
|
mod = builtins.__import__('ansible.module_utils.basic')
|
||||||
|
self.assertTrue(mod.module_utils.basic.has_journal)
|
||||||
|
|
||||||
self.clear_modules(['systemd', 'ansible.module_utils.basic'])
|
present = False
|
||||||
mock_import.side_effect = _mock_import
|
|
||||||
mod = builtins.__import__('ansible.module_utils.basic')
|
self.clear_modules(['systemd', 'ansible.module_utils.basic'])
|
||||||
self.assertFalse(mod.module_utils.basic.has_journal)
|
mod = builtins.__import__('ansible.module_utils.basic')
|
||||||
|
self.assertFalse(mod.module_utils.basic.has_journal)
|
||||||
|
|
||||||
|
self.clear_modules(['systemd', 'ansible.module_utils.basic'])
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
import unittest
|
import unittest
|
||||||
from unittest.mock import patch, MagicMock
|
from unittest.mock import patch, MagicMock
|
||||||
@@ -49,10 +50,12 @@ class TestErrors(unittest.TestCase):
|
|||||||
bam = MagicMock()
|
bam = MagicMock()
|
||||||
bam.__file__ = '/path/to/my/foo/bar/bam/__init__.py'
|
bam.__file__ = '/path/to/my/foo/bar/bam/__init__.py'
|
||||||
bar_pkg.bam = bam
|
bar_pkg.bam = bam
|
||||||
foo_pkg.return_value.bar = bar_pkg
|
foo_pkg.bar = bar_pkg
|
||||||
pl = PluginLoader('test', 'foo.bar.bam', 'test', 'test_plugin')
|
pl = PluginLoader('test', 'foo.bar.bam', 'test', 'test_plugin')
|
||||||
with patch('builtins.__import__', foo_pkg):
|
sys.modules['foo'] = foo_pkg
|
||||||
self.assertEqual(pl._get_package_paths(), ['/path/to/my/foo/bar/bam'])
|
sys.modules['foo.bar'] = bar_pkg
|
||||||
|
sys.modules['foo.bar.bam'] = bam
|
||||||
|
self.assertEqual(pl._get_package_paths(), ['/path/to/my/foo/bar/bam'])
|
||||||
|
|
||||||
def test_plugins__get_paths(self):
|
def test_plugins__get_paths(self):
|
||||||
pl = PluginLoader('test', '', 'test', 'test_plugin')
|
pl = PluginLoader('test', '', 'test', 'test_plugin')
|
||||||
|
|||||||
Reference in New Issue
Block a user