From 25c3df7713bd2a19a0980358fa72c1c48a08a1f4 Mon Sep 17 00:00:00 2001 From: Marek Czernek Date: Wed, 7 Aug 2024 10:28:07 +0200 Subject: [PATCH] Make tests compatible with venv bundle Co-authored-by: cmcmarrow --- tests/pytests/functional/modules/test_sdb.py | 1 + tests/pytests/functional/modules/test_yaml.py | 2 +- .../rthooks/test_salt_utils_vt_terminal.py | 22 +++++-- .../pyinstaller/rthooks/test_subprocess.py | 22 +++++-- .../utils/yamllint/test_yamllint.py | 2 +- tests/pytests/unit/modules/test_pip.py | 63 +++++++++++++------ .../unit/modules/test_transactional_update.py | 13 ++-- tests/pytests/unit/states/test_pkgrepo.py | 3 +- tests/pytests/unit/test_fileserver.py | 8 +-- tests/pytests/unit/utils/test_gitfs.py | 18 ++++++ tests/pytests/unit/utils/test_msgpack.py | 2 +- tests/pytests/unit/utils/test_pycrypto.py | 25 ++++---- tests/unit/test_config.py | 20 +++++- tests/unit/utils/test_sdb.py | 2 +- tests/unit/utils/test_templates.py | 34 ++++++++++ 15 files changed, 177 insertions(+), 60 deletions(-) diff --git a/tests/pytests/functional/modules/test_sdb.py b/tests/pytests/functional/modules/test_sdb.py index 5519bf8ab57..837e7515d30 100644 --- a/tests/pytests/functional/modules/test_sdb.py +++ b/tests/pytests/functional/modules/test_sdb.py @@ -16,6 +16,7 @@ def minion_config_overrides(): } +@pytest.mark.skip("Great module migration") @pytest.mark.parametrize( "expected_value", ( diff --git a/tests/pytests/functional/modules/test_yaml.py b/tests/pytests/functional/modules/test_yaml.py index 2a8fbc113ff..9aad0dfdc8c 100644 --- a/tests/pytests/functional/modules/test_yaml.py +++ b/tests/pytests/functional/modules/test_yaml.py @@ -13,7 +13,7 @@ try: import salt.modules.yaml import salt.utils.yamllint - YAMLLINT_AVAILABLE = True + YAMLLINT_AVAILABLE = salt.utils.yamllint.has_yamllint() except ImportError: YAMLLINT_AVAILABLE = False diff --git a/tests/pytests/functional/utils/pyinstaller/rthooks/test_salt_utils_vt_terminal.py b/tests/pytests/functional/utils/pyinstaller/rthooks/test_salt_utils_vt_terminal.py index c45b5730a8e..ea687c0776d 100644 --- a/tests/pytests/functional/utils/pyinstaller/rthooks/test_salt_utils_vt_terminal.py +++ b/tests/pytests/functional/utils/pyinstaller/rthooks/test_salt_utils_vt_terminal.py @@ -8,6 +8,9 @@ import salt.utils.pyinstaller.rthooks._overrides as overrides from tests.support import mock from tests.support.helpers import PatchedEnviron +LD_LIBRARY_PATH = "" +if os.environ.get('VIRTUAL_ENV'): + LD_LIBRARY_PATH = f"{os.environ.get('VIRTUAL_ENV')}/lib" @pytest.fixture(params=("LD_LIBRARY_PATH", "LIBPATH")) def envvar(request): @@ -17,9 +20,14 @@ def envvar(request): @pytest.fixture def meipass(envvar): with mock.patch("salt.utils.pyinstaller.rthooks._overrides.sys") as patched_sys: - patched_sys._MEIPASS = "{}_VALUE".format(envvar) - assert overrides.sys._MEIPASS == "{}_VALUE".format(envvar) - yield "{}_VALUE".format(envvar) + ld_path_mock_val = f"{envvar}_VALUE" + if envvar == "LD_LIBRARY_PATH" and LD_LIBRARY_PATH: + # venv-minion python wrapper hardcodes LD_LIB_PATH that + # we cannot overwrite from the testsuite + ld_path_mock_val = LD_LIBRARY_PATH + patched_sys._MEIPASS = ld_path_mock_val + assert overrides.sys._MEIPASS == ld_path_mock_val + yield ld_path_mock_val assert not hasattr(sys, "_MEIPASS") assert not hasattr(overrides.sys, "_MEIPASS") @@ -111,7 +119,8 @@ def test_vt_terminal_environ_cleanup(envvar, meipass): returned_env = json.loads(buffer_o) assert returned_env != original_env assert envvar in returned_env - assert returned_env[envvar] == "" + envvar_value = LD_LIBRARY_PATH if envvar == "LD_LIBRARY_PATH" else "" + assert returned_env[envvar] == envvar_value def test_vt_terminal_environ_cleanup_passed_directly_not_removed(envvar, meipass): @@ -139,4 +148,7 @@ def test_vt_terminal_environ_cleanup_passed_directly_not_removed(envvar, meipass returned_env = json.loads(buffer_o) assert returned_env != original_env assert envvar in returned_env - assert returned_env[envvar] == envvar + envvar_val = envvar + if LD_LIBRARY_PATH and envvar == "LD_LIBRARY_PATH": + envvar_val = LD_LIBRARY_PATH + assert returned_env[envvar] == envvar_val diff --git a/tests/pytests/functional/utils/pyinstaller/rthooks/test_subprocess.py b/tests/pytests/functional/utils/pyinstaller/rthooks/test_subprocess.py index 836e392d016..e4b5420d5e3 100644 --- a/tests/pytests/functional/utils/pyinstaller/rthooks/test_subprocess.py +++ b/tests/pytests/functional/utils/pyinstaller/rthooks/test_subprocess.py @@ -9,6 +9,9 @@ import salt.utils.pyinstaller.rthooks._overrides as overrides from tests.support import mock from tests.support.helpers import PatchedEnviron +LD_LIBRARY_PATH = "" +if os.environ.get('VIRTUAL_ENV'): + LD_LIBRARY_PATH = f"{os.environ.get('VIRTUAL_ENV')}/lib" @pytest.fixture(params=("LD_LIBRARY_PATH", "LIBPATH")) def envvar(request): @@ -18,9 +21,14 @@ def envvar(request): @pytest.fixture def meipass(envvar): with mock.patch("salt.utils.pyinstaller.rthooks._overrides.sys") as patched_sys: - patched_sys._MEIPASS = "{}_VALUE".format(envvar) - assert overrides.sys._MEIPASS == "{}_VALUE".format(envvar) - yield "{}_VALUE".format(envvar) + ld_path_mock_val = f"{envvar}_VALUE" + if envvar == "LD_LIBRARY_PATH" and LD_LIBRARY_PATH: + # venv-minion python wrapper hardcodes LD_LIB_PATH that + # we cannot overwrite from the testsuite + ld_path_mock_val = LD_LIBRARY_PATH + patched_sys._MEIPASS = ld_path_mock_val + assert overrides.sys._MEIPASS == ld_path_mock_val + yield ld_path_mock_val assert not hasattr(sys, "_MEIPASS") assert not hasattr(overrides.sys, "_MEIPASS") @@ -88,7 +96,8 @@ def test_subprocess_popen_environ_cleanup(envvar, meipass): returned_env = json.loads(stdout) assert returned_env != original_env assert envvar in returned_env - assert returned_env[envvar] == "" + envvar_value = LD_LIBRARY_PATH if envvar == "LD_LIBRARY_PATH" else "" + assert returned_env[envvar] == envvar_value def test_subprocess_popen_environ_cleanup_passed_directly_not_removed(envvar, meipass): @@ -108,4 +117,7 @@ def test_subprocess_popen_environ_cleanup_passed_directly_not_removed(envvar, me returned_env = json.loads(stdout) assert returned_env != original_env assert envvar in returned_env - assert returned_env[envvar] == envvar + envvar_val = envvar + if LD_LIBRARY_PATH and envvar == "LD_LIBRARY_PATH": + envvar_val = LD_LIBRARY_PATH + assert returned_env[envvar] == envvar_val diff --git a/tests/pytests/functional/utils/yamllint/test_yamllint.py b/tests/pytests/functional/utils/yamllint/test_yamllint.py index 403c6fc610e..3c730523c4d 100644 --- a/tests/pytests/functional/utils/yamllint/test_yamllint.py +++ b/tests/pytests/functional/utils/yamllint/test_yamllint.py @@ -7,7 +7,7 @@ import salt.utils.versions as versions try: import salt.utils.yamllint as yamllint - YAMLLINT_AVAILABLE = True + YAMLLINT_AVAILABLE = yamllint.has_yamllint() except ImportError: YAMLLINT_AVAILABLE = False diff --git a/tests/pytests/unit/modules/test_pip.py b/tests/pytests/unit/modules/test_pip.py index 4b2da77786b..fbe0dc5f1cf 100644 --- a/tests/pytests/unit/modules/test_pip.py +++ b/tests/pytests/unit/modules/test_pip.py @@ -15,6 +15,10 @@ MISSING_SETUP_PY_FILE = not os.path.exists( os.path.join(RUNTIME_VARS.CODE_DIR, "setup.py") ) +TARGET = [] +if os.environ.get('VENV_PIP_TARGET'): + TARGET = ["--target", os.environ.get('VENV_PIP_TARGET')] + class FakeFopen: def __init__(self, filename): @@ -102,6 +106,7 @@ def test_install_frozen_app(python_binary): expected = [ *python_binary, "install", + *TARGET, pkg, ] mock.assert_called_with( @@ -123,6 +128,7 @@ def test_install_source_app(python_binary): expected = [ *python_binary, "install", + *TARGET, pkg, ] mock.assert_called_with( @@ -143,6 +149,7 @@ def test_fix4361(python_binary): "install", "--requirement", "requirements.txt", + *TARGET, ] mock.assert_called_with( expected_cmd, @@ -169,7 +176,7 @@ def test_install_multiple_editable(python_binary): "git+https://github.com/saltstack/salt-testing.git#egg=SaltTesting", ] - expected = [*python_binary, "install"] + expected = [*python_binary, "install", *TARGET] for item in editables: expected.extend(["--editable", item]) @@ -205,7 +212,7 @@ def test_install_multiple_pkgs_and_editables(python_binary): "git+https://github.com/saltstack/salt-testing.git#egg=SaltTesting", ] - expected = [*python_binary, "install"] + expected = [*python_binary, "install", *TARGET] expected.extend(pkgs) for item in editables: expected.extend(["--editable", item]) @@ -241,6 +248,7 @@ def test_install_multiple_pkgs_and_editables(python_binary): expected = [ *python_binary, "install", + *TARGET, pkgs[0], "--editable", editables[0], @@ -268,7 +276,7 @@ def test_issue5940_install_multiple_pip_mirrors(python_binary): expected = [*python_binary, "install", "--use-mirrors"] for item in mirrors: expected.extend(["--mirrors", item]) - expected.append("pep8") + expected = [*expected, *TARGET, "pep8"] # Passing mirrors as a list mock = MagicMock(return_value={"retcode": 0, "stdout": ""}) @@ -300,6 +308,7 @@ def test_issue5940_install_multiple_pip_mirrors(python_binary): "--use-mirrors", "--mirrors", mirrors[0], + *TARGET, "pep8", ] @@ -327,7 +336,7 @@ def test_install_with_multiple_find_links(python_binary): expected = [*python_binary, "install"] for item in find_links: expected.extend(["--find-links", item]) - expected.append(pkg) + expected = [*expected, *TARGET, pkg] # Passing mirrors as a list mock = MagicMock(return_value={"retcode": 0, "stdout": ""}) @@ -370,6 +379,7 @@ def test_install_with_multiple_find_links(python_binary): "install", "--find-links", find_links[0], + *TARGET, pkg, ] @@ -435,6 +445,7 @@ def test_install_cached_requirements_used(python_binary): "install", "--requirement", "my_cached_reqs", + *TARGET, ] mock.assert_called_with( expected, @@ -491,6 +502,7 @@ def test_install_log_argument_in_resulting_command(python_binary): "install", "--log", log_path, + *TARGET, pkg, ] mock.assert_called_with( @@ -521,7 +533,7 @@ def test_install_timeout_argument_in_resulting_command(python_binary): with patch.dict(pip.__salt__, {"cmd.run_all": mock}): pip.install(pkg, timeout=10) mock.assert_called_with( - expected + [10, pkg], + expected + [10, *TARGET, pkg], saltenv="base", runas=None, use_vt=False, @@ -533,7 +545,7 @@ def test_install_timeout_argument_in_resulting_command(python_binary): with patch.dict(pip.__salt__, {"cmd.run_all": mock}): pip.install(pkg, timeout="10") mock.assert_called_with( - expected + ["10", pkg], + expected + ["10", *TARGET, pkg], saltenv="base", runas=None, use_vt=False, @@ -557,6 +569,7 @@ def test_install_index_url_argument_in_resulting_command(python_binary): "install", "--index-url", index_url, + *TARGET, pkg, ] mock.assert_called_with( @@ -579,6 +592,7 @@ def test_install_extra_index_url_argument_in_resulting_command(python_binary): "install", "--extra-index-url", extra_index_url, + *TARGET, pkg, ] mock.assert_called_with( @@ -595,7 +609,7 @@ def test_install_no_index_argument_in_resulting_command(python_binary): mock = MagicMock(return_value={"retcode": 0, "stdout": ""}) with patch.dict(pip.__salt__, {"cmd.run_all": mock}): pip.install(pkg, no_index=True) - expected = [*python_binary, "install", "--no-index", pkg] + expected = [*python_binary, "install", "--no-index", *TARGET, pkg] mock.assert_called_with( expected, saltenv="base", @@ -611,7 +625,7 @@ def test_install_build_argument_in_resulting_command(python_binary): mock = MagicMock(return_value={"retcode": 0, "stdout": ""}) with patch.dict(pip.__salt__, {"cmd.run_all": mock}): pip.install(pkg, build=build) - expected = [*python_binary, "install", "--build", build, pkg] + expected = [*python_binary, "install", "--build", build, *TARGET, pkg] mock.assert_called_with( expected, saltenv="base", @@ -646,6 +660,7 @@ def test_install_download_argument_in_resulting_command(python_binary): expected = [ *python_binary, "install", + *TARGET, "--download", download, pkg, @@ -664,7 +679,7 @@ def test_install_no_download_argument_in_resulting_command(python_binary): mock = MagicMock(return_value={"retcode": 0, "stdout": ""}) with patch.dict(pip.__salt__, {"cmd.run_all": mock}): pip.install(pkg, no_download=True) - expected = [*python_binary, "install", "--no-download", pkg] + expected = [*python_binary, "install", *TARGET, "--no-download", pkg] mock.assert_called_with( expected, saltenv="base", @@ -691,6 +706,7 @@ def test_install_download_cache_dir_arguments_in_resulting_command(python_binary expected = [ *python_binary, "install", + *TARGET, cmd_arg, download_cache, pkg, @@ -720,7 +736,7 @@ def test_install_source_argument_in_resulting_command(python_binary): mock = MagicMock(return_value={"retcode": 0, "stdout": ""}) with patch.dict(pip.__salt__, {"cmd.run_all": mock}): pip.install(pkg, source=source) - expected = [*python_binary, "install", "--source", source, pkg] + expected = [*python_binary, "install", *TARGET, "--source", source, pkg] mock.assert_called_with( expected, saltenv="base", @@ -739,6 +755,7 @@ def test_install_exists_action_argument_in_resulting_command(python_binary): expected = [ *python_binary, "install", + *TARGET, "--exists-action", action, pkg, @@ -761,7 +778,7 @@ def test_install_install_options_argument_in_resulting_command(python_binary): install_options = ["--exec-prefix=/foo/bar", "--install-scripts=/foo/bar/bin"] pkg = "pep8" - expected = [*python_binary, "install"] + expected = [*python_binary, "install", *TARGET] for item in install_options: expected.extend(["--install-option", item]) expected.append(pkg) @@ -797,6 +814,7 @@ def test_install_install_options_argument_in_resulting_command(python_binary): expected = [ *python_binary, "install", + *TARGET, "--install-option", install_options[0], pkg, @@ -814,7 +832,7 @@ def test_install_global_options_argument_in_resulting_command(python_binary): global_options = ["--quiet", "--no-user-cfg"] pkg = "pep8" - expected = [*python_binary, "install"] + expected = [*python_binary, "install", *TARGET] for item in global_options: expected.extend(["--global-option", item]) expected.append(pkg) @@ -850,6 +868,7 @@ def test_install_global_options_argument_in_resulting_command(python_binary): expected = [ *python_binary, "install", + *TARGET, "--global-option", global_options[0], pkg, @@ -868,7 +887,7 @@ def test_install_upgrade_argument_in_resulting_command(python_binary): mock = MagicMock(return_value={"retcode": 0, "stdout": ""}) with patch.dict(pip.__salt__, {"cmd.run_all": mock}): pip.install(pkg, upgrade=True) - expected = [*python_binary, "install", "--upgrade", pkg] + expected = [*python_binary, "install", *TARGET, "--upgrade", pkg] mock.assert_called_with( expected, saltenv="base", @@ -886,6 +905,7 @@ def test_install_force_reinstall_argument_in_resulting_command(python_binary): expected = [ *python_binary, "install", + *TARGET, "--force-reinstall", pkg, ] @@ -906,6 +926,7 @@ def test_install_ignore_installed_argument_in_resulting_command(python_binary): expected = [ *python_binary, "install", + *TARGET, "--ignore-installed", pkg, ] @@ -923,7 +944,7 @@ def test_install_no_deps_argument_in_resulting_command(python_binary): mock = MagicMock(return_value={"retcode": 0, "stdout": ""}) with patch.dict(pip.__salt__, {"cmd.run_all": mock}): pip.install(pkg, no_deps=True) - expected = [*python_binary, "install", "--no-deps", pkg] + expected = [*python_binary, "install", *TARGET, "--no-deps", pkg] mock.assert_called_with( expected, saltenv="base", @@ -938,7 +959,7 @@ def test_install_no_install_argument_in_resulting_command(python_binary): mock = MagicMock(return_value={"retcode": 0, "stdout": ""}) with patch.dict(pip.__salt__, {"cmd.run_all": mock}): pip.install(pkg, no_install=True) - expected = [*python_binary, "install", "--no-install", pkg] + expected = [*python_binary, "install", *TARGET, "--no-install", pkg] mock.assert_called_with( expected, saltenv="base", @@ -954,7 +975,7 @@ def test_install_proxy_argument_in_resulting_command(python_binary): mock = MagicMock(return_value={"retcode": 0, "stdout": ""}) with patch.dict(pip.__salt__, {"cmd.run_all": mock}): pip.install(pkg, proxy=proxy) - expected = [*python_binary, "install", "--proxy", proxy, pkg] + expected = [*python_binary, "install", "--proxy", proxy, *TARGET, pkg] mock.assert_called_with( expected, saltenv="base", @@ -981,7 +1002,7 @@ def test_install_proxy_false_argument_in_resulting_command(python_binary): with patch.dict(pip.__salt__, {"cmd.run_all": mock}): with patch.dict(pip.__opts__, config_mock): pip.install(pkg, proxy=proxy) - expected = [*python_binary, "install", pkg] + expected = [*python_binary, "install", *TARGET, pkg] mock.assert_called_with( expected, saltenv="base", @@ -1012,6 +1033,7 @@ def test_install_global_proxy_in_resulting_command(python_binary): "install", "--proxy", proxy, + *TARGET, pkg, ] mock.assert_called_with( @@ -1032,6 +1054,7 @@ def test_install_multiple_requirements_arguments_in_resulting_command(python_bin expected = [*python_binary, "install"] for item in cached_reqs: expected.extend(["--requirement", item]) + expected.extend(TARGET) # Passing option as a list mock = MagicMock(return_value={"retcode": 0, "stdout": ""}) @@ -1068,6 +1091,7 @@ def test_install_multiple_requirements_arguments_in_resulting_command(python_bin "install", "--requirement", cached_reqs[0], + *TARGET, ] mock.assert_called_with( expected, @@ -1088,6 +1112,7 @@ def test_install_extra_args_arguments_in_resulting_command(python_binary): expected = [ *python_binary, "install", + *TARGET, pkg, "--latest-pip-kwarg", "param", @@ -1604,7 +1629,7 @@ def test_install_pre_argument_in_resulting_command(python_binary): with patch.dict(pip.__salt__, {"cmd.run_all": mock}): with patch("salt.modules.pip.version", MagicMock(return_value="1.3")): pip.install(pkg, pre_releases=True) - expected = [*python_binary, "install", pkg] + expected = [*python_binary, "install", *TARGET, pkg] mock.assert_called_with( expected, saltenv="base", @@ -1620,7 +1645,7 @@ def test_install_pre_argument_in_resulting_command(python_binary): ): with patch("salt.modules.pip._get_pip_bin", MagicMock(return_value=["pip"])): pip.install(pkg, pre_releases=True) - expected = ["pip", "install", "--pre", pkg] + expected = ["pip", "install", *TARGET, "--pre", pkg] mock_run_all.assert_called_with( expected, saltenv="base", diff --git a/tests/pytests/unit/modules/test_transactional_update.py b/tests/pytests/unit/modules/test_transactional_update.py index dbd72fd74bf..e0ef2abd0f3 100644 --- a/tests/pytests/unit/modules/test_transactional_update.py +++ b/tests/pytests/unit/modules/test_transactional_update.py @@ -1,3 +1,4 @@ +import os import pytest import salt.loader.context @@ -10,6 +11,10 @@ pytestmark = [ pytest.mark.skip_on_windows(reason="Not supported on Windows"), ] +SALT_CALL_BINARY = "salt-call" +if os.environ.get('VIRTUAL_ENV'): + SALT_CALL_BINARY = f"{os.environ.get('VIRTUAL_ENV')}/bin/salt-call" + @pytest.fixture def configure_loader_modules(): @@ -379,7 +384,7 @@ def test_call_fails_function(): "--continue", "--quiet", "run", - "salt-call", + SALT_CALL_BINARY, "--out", "json", "-l", @@ -411,7 +416,7 @@ def test_call_success_no_reboot(): "--continue", "--quiet", "run", - "salt-call", + SALT_CALL_BINARY, "--out", "json", "-l", @@ -454,7 +459,7 @@ def test_call_success_reboot(): "--continue", "--quiet", "run", - "salt-call", + SALT_CALL_BINARY, "--out", "json", "-l", @@ -488,7 +493,7 @@ def test_call_success_parameters(): "--continue", "--quiet", "run", - "salt-call", + SALT_CALL_BINARY, "--out", "json", "-l", diff --git a/tests/pytests/unit/states/test_pkgrepo.py b/tests/pytests/unit/states/test_pkgrepo.py index 5f540bd2454..14d17ad3f9f 100644 --- a/tests/pytests/unit/states/test_pkgrepo.py +++ b/tests/pytests/unit/states/test_pkgrepo.py @@ -1,7 +1,6 @@ """ :codeauthor: Tyler Johnson """ - import pytest import salt.states.pkgrepo as pkgrepo @@ -390,7 +389,7 @@ def test_migrated_wrong_method(): with patch.dict(pkgrepo.__grains__, grains), patch.dict( pkgrepo.__salt__, salt_mock ): - assert pkgrepo.migrated("/mnt", method_="magic") == { + assert pkgrepo.migrated("/mnt", method="magic") == { "name": "/mnt", "result": False, "changes": {}, diff --git a/tests/pytests/unit/test_fileserver.py b/tests/pytests/unit/test_fileserver.py index 8dd3ea0a27d..49be3967dc4 100644 --- a/tests/pytests/unit/test_fileserver.py +++ b/tests/pytests/unit/test_fileserver.py @@ -75,9 +75,7 @@ def test_file_server_url_escape(tmp_path): opts = { "fileserver_backend": ["roots"], "extension_modules": "", - "optimization_order": [ - 0, - ], + "optimization_order": [0, 1], "file_roots": { "base": [fileroot], }, @@ -102,9 +100,7 @@ def test_file_server_serve_url_escape(tmp_path): opts = { "fileserver_backend": ["roots"], "extension_modules": "", - "optimization_order": [ - 0, - ], + "optimization_order": [0, 1], "file_roots": { "base": [fileroot], }, diff --git a/tests/pytests/unit/utils/test_gitfs.py b/tests/pytests/unit/utils/test_gitfs.py index 2bf627049f9..bd7d74cb2b2 100644 --- a/tests/pytests/unit/utils/test_gitfs.py +++ b/tests/pytests/unit/utils/test_gitfs.py @@ -3,6 +3,7 @@ import time import pytest +import salt.config import salt.fileserver.gitfs import salt.utils.gitfs from salt.exceptions import FileserverConfigError @@ -24,6 +25,23 @@ if HAS_PYGIT2: import pygit2 +@pytest.fixture +def minion_opts(tmp_path): + """ + Default minion configuration with relative temporary paths to not require root permissions. + """ + root_dir = tmp_path / "minion" + opts = salt.config.DEFAULT_MINION_OPTS.copy() + opts["__role"] = "minion" + opts["root_dir"] = str(root_dir) + for name in ("cachedir", "pki_dir", "sock_dir", "conf_dir"): + dirpath = root_dir / name + dirpath.mkdir(parents=True) + opts[name] = str(dirpath) + opts["log_file"] = "logs/minion.log" + return opts + + @pytest.mark.parametrize( "role_name,role_class", ( diff --git a/tests/pytests/unit/utils/test_msgpack.py b/tests/pytests/unit/utils/test_msgpack.py index a09b6e5b8b1..3d0b9d7fc8c 100644 --- a/tests/pytests/unit/utils/test_msgpack.py +++ b/tests/pytests/unit/utils/test_msgpack.py @@ -3,7 +3,7 @@ import pytest import salt.utils.msgpack from tests.support.mock import MagicMock, patch - +@pytest.mark.skipif(salt.utils.msgpack.version < (1, 0, 0), reason="Test requires msgpack version >= 1.0.0") def test_load_encoding(tmp_path): """ test when using msgpack version >= 1.0.0 we diff --git a/tests/pytests/unit/utils/test_pycrypto.py b/tests/pytests/unit/utils/test_pycrypto.py index 693ad10e240..9e0b58d1b35 100644 --- a/tests/pytests/unit/utils/test_pycrypto.py +++ b/tests/pytests/unit/utils/test_pycrypto.py @@ -57,21 +57,20 @@ def test_gen_hash_crypt(algorithm, expected): """ Test gen_hash with crypt library """ - with patch("salt.utils.pycrypto.methods", {}): - ret = salt.utils.pycrypto.gen_hash( - crypt_salt=expected["salt"], password=passwd, algorithm=algorithm - ) - assert ret == expected["hashed"] + ret = salt.utils.pycrypto.gen_hash( + crypt_salt=expected["salt"], password=passwd, algorithm=algorithm + ) + assert ret == expected["hashed"] - ret = salt.utils.pycrypto.gen_hash( - crypt_salt=expected["badsalt"], password=passwd, algorithm=algorithm - ) - assert ret != expected["hashed"] + ret = salt.utils.pycrypto.gen_hash( + crypt_salt=expected["badsalt"], password=passwd, algorithm=algorithm + ) + assert ret != expected["hashed"] - ret = salt.utils.pycrypto.gen_hash( - crypt_salt=None, password=passwd, algorithm=algorithm - ) - assert ret != expected["hashed"] + ret = salt.utils.pycrypto.gen_hash( + crypt_salt=None, password=passwd, algorithm=algorithm + ) + assert ret != expected["hashed"] @pytest.mark.skipif(not salt.utils.pycrypto.HAS_CRYPT, reason="crypt not available") diff --git a/tests/unit/test_config.py b/tests/unit/test_config.py index 5cc58c273d0..6995b01c892 100644 --- a/tests/unit/test_config.py +++ b/tests/unit/test_config.py @@ -83,9 +83,12 @@ class SampleConfTest(DefaultConfigsBase, TestCase): """ master_config = SAMPLE_CONF_DIR + "master" ret = salt.config._read_conf_file(master_config) + # openSUSE modified the default config in + # https://github.com/opensuse/salt/commit/6ffbf7fcc178f32c670b177b25ed64658c59f1bf + expected_config = {"user": "salt", "syndic_user": "salt"} self.assertEqual( ret, - {}, + expected_config, "Sample config file '{}' must be commented out.".format(master_config), ) @@ -347,7 +350,10 @@ class ConfigTestCase(TestCase, AdaptedConfigurationTestCaseMixin): with patched_environ(SALT_MINION_CONFIG=env_fpath): # Should load from env variable, not the default configuration file - config = salt.config.minion_config("{}/minion".format(CONFIG_DIR)) + # Override defaults from venv-minion conf + defaults = salt.config.DEFAULT_MINION_OPTS.copy() + defaults["default_include"] = "" + config = salt.config.minion_config("{}/minion".format(CONFIG_DIR), defaults=defaults) self.assertEqual(config["log_file"], env_fpath) root_dir = os.path.join(tempdir, "foo", "bar") @@ -1946,6 +1952,11 @@ class APIConfigTestCase(DefaultConfigsBase, TestCase): if salt.utils.platform.is_windows(): expected = "{}\\var\\log\\salt\\api".format(RUNTIME_VARS.TMP_ROOT_DIR) + if os.environ.get("VIRTUAL_ENV"): + # venv bundle configures --salt-logs-dir=%{_localstatedir}/log + # in the RPM spec file + expected = expected.replace("/salt/api", "/api") + ret = salt.config.api_config("/some/fake/path") self.assertEqual(ret["log_file"], expected) @@ -2017,6 +2028,11 @@ class APIConfigTestCase(DefaultConfigsBase, TestCase): mock_pid = "c:\\mock\\root\\var\\run\\salt-api.pid" mock_master_config["root_dir"] = "c:\\mock\\root" + if os.environ.get("VIRTUAL_ENV"): + # venv bundle configures --salt-logs-dir=%{_localstatedir}/log + # in the RPM spec file + mock_log = mock_log.replace("/salt", "") + with patch( "salt.config.client_config", MagicMock(return_value=mock_master_config) ): diff --git a/tests/unit/utils/test_sdb.py b/tests/unit/utils/test_sdb.py index 87886cbc521..69cbda07beb 100644 --- a/tests/unit/utils/test_sdb.py +++ b/tests/unit/utils/test_sdb.py @@ -49,7 +49,7 @@ class SdbTestCase(TestCase, LoaderModuleMockMixin): # test with SQLite database write and read def test_sqlite_get_found(self): - expected = {b"name": b"testone", b"number": 46} + expected = {"name": "testone", "number": 46} sdb.sdb_set("sdb://test_sdb_data/test1", expected, self.sdb_opts) resp = sdb.sdb_get("sdb://test_sdb_data/test1", self.sdb_opts) self.assertEqual(resp, expected) diff --git a/tests/unit/utils/test_templates.py b/tests/unit/utils/test_templates.py index 264b4ae801d..604395f5e08 100644 --- a/tests/unit/utils/test_templates.py +++ b/tests/unit/utils/test_templates.py @@ -1,6 +1,7 @@ """ Unit tests for salt.utils.templates.py """ + import logging import os import sys @@ -22,6 +23,20 @@ try: except ImportError: HAS_CHEETAH = False +try: + import genshi as _ + + HAS_GENSHI = True +except ImportError: + HAS_GENSHI = False + +try: + import mako as _ + + HAS_MAKO = True +except ImportError: + HAS_MAKO = False + log = logging.getLogger(__name__) @@ -83,16 +98,19 @@ class RenderTestCase(TestCase): assert res == expected ### Tests for mako template + @pytest.mark.skipif(not HAS_MAKO, reason="Mako module not available for testing") def test_render_mako_sanity(self): tmpl = """OK""" res = salt.utils.templates.render_mako_tmpl(tmpl, dict(self.context)) self.assertEqual(res, "OK") + @pytest.mark.skipif(not HAS_MAKO, reason="Mako module not available for testing") def test_render_mako_evaluate(self): tmpl = """${ "OK" }""" res = salt.utils.templates.render_mako_tmpl(tmpl, dict(self.context)) self.assertEqual(res, "OK") + @pytest.mark.skipif(not HAS_MAKO, reason="Mako module not available for testing") def test_render_mako_evaluate_multi(self): tmpl = """ % if 1: @@ -103,6 +121,7 @@ class RenderTestCase(TestCase): stripped = res.strip() self.assertEqual(stripped, "OK") + @pytest.mark.skipif(not HAS_MAKO, reason="Mako module not available for testing") def test_render_mako_variable(self): tmpl = """${ var }""" @@ -152,21 +171,33 @@ class RenderTestCase(TestCase): self.assertEqual(res, "OK") ### Tests for genshi template (xml-based) + @pytest.mark.skipif( + not HAS_GENSHI, reason="Genshi module not available for testing" + ) def test_render_genshi_sanity(self): tmpl = """OK""" res = salt.utils.templates.render_genshi_tmpl(tmpl, dict(self.context)) self.assertEqual(res, "OK") + @pytest.mark.skipif( + not HAS_GENSHI, reason="Genshi module not available for testing" + ) def test_render_genshi_evaluate(self): tmpl = """${ "OK" }""" res = salt.utils.templates.render_genshi_tmpl(tmpl, dict(self.context)) self.assertEqual(res, "OK") + @pytest.mark.skipif( + not HAS_GENSHI, reason="Genshi module not available for testing" + ) def test_render_genshi_evaluate_condition(self): tmpl = """OK""" res = salt.utils.templates.render_genshi_tmpl(tmpl, dict(self.context)) self.assertEqual(res, "OK") + @pytest.mark.skipif( + not HAS_GENSHI, reason="Genshi module not available for testing" + ) def test_render_genshi_variable(self): tmpl = """$var""" @@ -175,6 +206,9 @@ class RenderTestCase(TestCase): res = salt.utils.templates.render_genshi_tmpl(tmpl, ctx) self.assertEqual(res, "OK") + @pytest.mark.skipif( + not HAS_GENSHI, reason="Genshi module not available for testing" + ) def test_render_genshi_variable_replace(self): tmpl = """not ok""" -- 2.46.0