diff options
author | Sloane Hertel <19572925+s-hertel@users.noreply.github.com> | 2023-02-28 21:21:48 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-02-28 21:21:48 +0100 |
commit | b981a9dfcd1f799abf6183eade556e653792cc03 (patch) | |
tree | bb339d6f495209576784e1d2bfb5330ec6b5d6ef /test/units/utils/display/test_curses.py | |
parent | Relocate and refactor ansible-test diff unit tests (#80113) (diff) | |
download | ansible-b981a9dfcd1f799abf6183eade556e653792cc03.tar.xz ansible-b981a9dfcd1f799abf6183eade556e653792cc03.zip |
add a worker queue to get updates from the main results thread (#79886)
* Create a queue per WorkerProcess to receive intra-task updates
* Update `pause` action to use the worker queue
* Deprecate ConnectionBase()._new_stdin
* Add new `Display` convenience method `prompt_until` to manage both controller- and worker-sourced prompting without cross-fork stdin sharing, in-worker mechanism to handle request-response over new worker queue.
Diffstat (limited to 'test/units/utils/display/test_curses.py')
-rw-r--r-- | test/units/utils/display/test_curses.py | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/test/units/utils/display/test_curses.py b/test/units/utils/display/test_curses.py new file mode 100644 index 0000000000..2199edfe0b --- /dev/null +++ b/test/units/utils/display/test_curses.py @@ -0,0 +1,95 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2021 Ansible Project +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function +__metaclass__ = type + +import curses +import importlib +import io +import pytest +import sys + +from ansible.plugins.action import pause # pylint: disable=unused-import +from ansible.module_utils.six import PY2 + +builtin_import = 'builtins.__import__' +if PY2: + builtin_import = '__builtin__.__import__' + + +def test_pause_curses_tigetstr_none(mocker, monkeypatch): + monkeypatch.delitem(sys.modules, 'ansible.utils.display') + + dunder_import = __import__ + + def _import(*args, **kwargs): + if args[0] == 'curses': + mock_curses = mocker.Mock() + mock_curses.setupterm = mocker.Mock(return_value=True) + mock_curses.tigetstr = mocker.Mock(return_value=None) + return mock_curses + else: + return dunder_import(*args, **kwargs) + + mocker.patch(builtin_import, _import) + + mod = importlib.import_module('ansible.utils.display') + if mod.HAS_CURSES: + mod.setupterm() + + assert mod.HAS_CURSES is True + assert mod.MOVE_TO_BOL == b'\r' + assert mod.CLEAR_TO_EOL == b'\x1b[K' + + +def test_pause_missing_curses(mocker, monkeypatch): + monkeypatch.delitem(sys.modules, 'ansible.utils.display') + + dunder_import = __import__ + + def _import(*args, **kwargs): + if args[0] == 'curses': + raise ImportError + else: + return dunder_import(*args, **kwargs) + + mocker.patch(builtin_import, _import) + + mod = importlib.import_module('ansible.utils.display') + if mod.HAS_CURSES: + mod.setupterm() + + with pytest.raises(AttributeError): + mod.curses # pylint: disable=pointless-statement + + assert mod.HAS_CURSES is False + assert mod.MOVE_TO_BOL == b'\r' + assert mod.CLEAR_TO_EOL == b'\x1b[K' + + +@pytest.mark.parametrize('exc', (curses.error, TypeError, io.UnsupportedOperation)) +def test_pause_curses_setupterm_error(mocker, monkeypatch, exc): + monkeypatch.delitem(sys.modules, 'ansible.utils.display') + + dunder_import = __import__ + + def _import(*args, **kwargs): + if args[0] == 'curses': + mock_curses = mocker.Mock() + mock_curses.setupterm = mocker.Mock(side_effect=exc) + mock_curses.error = curses.error + return mock_curses + else: + return dunder_import(*args, **kwargs) + + mocker.patch(builtin_import, _import) + + mod = importlib.import_module('ansible.utils.display') + if mod.HAS_CURSES: + mod.setupterm() + + assert mod.HAS_CURSES is False + assert mod.MOVE_TO_BOL == b'\r' + assert mod.CLEAR_TO_EOL == b'\x1b[K' |