summaryrefslogtreecommitdiff
path: root/cloudinit/conftest.py
diff options
context:
space:
mode:
authorDaniel Watkins <oddbloke@ubuntu.com>2020-05-21 10:24:18 -0400
committerGitHub <noreply@github.com>2020-05-21 10:24:18 -0400
commitde9c02a4c09d603bdfe5d23478e6c050223d79b6 (patch)
tree660f67be972534f9b7f49074b239b484942bf76c /cloudinit/conftest.py
parentfae90f14f0668a673e02bc7313bc84828e7cae71 (diff)
downloadvyos-cloud-init-de9c02a4c09d603bdfe5d23478e6c050223d79b6.tar.gz
vyos-cloud-init-de9c02a4c09d603bdfe5d23478e6c050223d79b6.zip
conftest: implement partial disable_subp_usage (#371)
This allows tests to be configured to permit some commands to be run via util.subp, while still rejecting any unexpected calls. See the documentation for further details.
Diffstat (limited to 'cloudinit/conftest.py')
-rw-r--r--cloudinit/conftest.py43
1 files changed, 39 insertions, 4 deletions
diff --git a/cloudinit/conftest.py b/cloudinit/conftest.py
index af458c31..37cbbcda 100644
--- a/cloudinit/conftest.py
+++ b/cloudinit/conftest.py
@@ -2,6 +2,8 @@ from unittest import mock
import pytest
+from cloudinit import util
+
@pytest.yield_fixture(autouse=True)
def disable_subp_usage(request):
@@ -20,18 +22,51 @@ def disable_subp_usage(request):
def test_whoami(self):
util.subp(["whoami"])
+ To instead allow util.subp usage for a specific command, you can set the
+ parameter passed to this fixture to that command:
+
+ @pytest.mark.parametrize("disable_subp_usage", ["bash"], indirect=True)
+ def test_bash(self):
+ util.subp(["bash"])
+
+ To specify multiple commands, set the parameter to a list (note the
+ double-layered list: we specify a single parameter that is itself a list):
+
+ @pytest.mark.parametrize(
+ "disable_subp_usage", ["bash", "whoami"], indirect=True)
+ def test_several_things(self):
+ util.subp(["bash"])
+ util.subp(["whoami"])
+
This fixture (roughly) mirrors the functionality of
CiTestCase.allowed_subp. N.B. While autouse fixtures do affect non-pytest
tests, CiTestCase's allowed_subp does take precedence (and we have
TestDisableSubpUsageInTestSubclass to confirm that).
-
- TODO:
- * Enable select subp usage (i.e. allowed_subp=[...])
"""
should_disable = getattr(request, "param", True)
if should_disable:
+ if not isinstance(should_disable, (list, str)):
+ def side_effect(args, *other_args, **kwargs):
+ raise AssertionError("Unexpectedly used util.subp")
+ else:
+ # Look this up before our patch is in place, so we have access to
+ # the real implementation in side_effect
+ subp = util.subp
+
+ if isinstance(should_disable, str):
+ should_disable = [should_disable]
+
+ def side_effect(args, *other_args, **kwargs):
+ cmd = args[0]
+ if cmd not in should_disable:
+ raise AssertionError(
+ "Unexpectedly used util.subp to call {} (allowed:"
+ " {})".format(cmd, ",".join(should_disable))
+ )
+ return subp(args, *other_args, **kwargs)
+
with mock.patch('cloudinit.util.subp', autospec=True) as m_subp:
- m_subp.side_effect = AssertionError("Unexpectedly used util.subp")
+ m_subp.side_effect = side_effect
yield
else:
yield