Module: check_mk
Branch: master
Commit: fcfc55f24c335a737109bf7b92f162c3dd752875
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=fcfc55f24c335a…
Author: Lars Michelsen <lm(a)mathias-kettner.de>
Date: Wed Mar 21 17:19:14 2018 +0100
Tests: Prepare for better unit test support
* Patch cmk.omd_version() which tries to access some site specific file.
It's called at import time by some cmk_base.default_config module.
* Also patch some cmk.paths.* variables to make the unit tests be able
to load some things directly from the git, e.g. the checks or man pages
* Add import path for our livestatus module (livestatus/api/python)
Change-Id: I0532e4777d64b473e9826fcc9aae7744b075e13b
---
tests/conftest.py | 57 +++++++++++++++++++++++++++++++++++++++++++----
tests/testlib/__init__.py | 25 ++++++++++++---------
2 files changed, 68 insertions(+), 14 deletions(-)
diff --git a/tests/conftest.py b/tests/conftest.py
index a7c93d8..4478ddf 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -2,9 +2,53 @@
import os
import pwd
import pytest
+import _pytest.monkeypatch
import sys
import glob
import testlib
+import tempfile
+import shutil
+import errno
+
+# Some cmk.* code is calling things like cmk. is_raw_edition() at import time
+# (e.g. cmk_base/default_config/notify.py) for edition specific variable
+# defaults. In integration tests we want to use the exact version of the
+# site. For unit tests we assume we are in Enterprise Edition context.
+def fake_version_and_paths():
+ if is_running_as_site_user():
+ return
+
+ monkeypatch = _pytest.monkeypatch.MonkeyPatch()
+ tmp_dir = tempfile.mkdtemp(prefix="pytest_cmk_")
+
+ import cmk
+ monkeypatch.setattr(cmk, "omd_version", lambda: "%s.cee" %
cmk.__version__)
+
+ monkeypatch.setattr("cmk.paths.checks_dir", "%s/checks" %
cmk_path())
+ monkeypatch.setattr("cmk.paths.notifications_dir",
"%s/notifications" % cmk_path())
+ monkeypatch.setattr("cmk.paths.inventory_dir",
"%s/inventory" % cmk_path())
+ monkeypatch.setattr("cmk.paths.check_manpages_dir", "%s/checkman"
% cmk_path())
+ monkeypatch.setattr("cmk.paths.tmp_dir", tmp_dir)
+
+
+# Cleanup temporary directory created above
+(a)pytest.fixture(scope="session"sion", autouse=True)
+def cleanup_cmk():
+ yield
+
+ if is_running_as_site_user():
+ return
+
+ import cmk.paths
+
+ if "pytest_cmk_" not in cmk.paths.tmp_dir:
+ return
+
+ try:
+ shutil.rmtree(cmk.paths.tmp_dir)
+ except OSError as exc:
+ if exc.errno != errno.ENOENT:
+ raise # re-raise exception
def cmk_path():
@@ -25,19 +69,23 @@ def add_python_paths():
# make the repo directory available (cmk lib)
sys.path.insert(0, cmk_path())
+ # if not running as site user, make the livestatus module available
+ if not is_running_as_site_user():
+ sys.path.insert(0, os.path.join(cmk_path(), "livestatus/api/python"))
+
def pytest_cmdline_main(config):
# Some special tests are not executed in a site environment
- if config.getoption('markexpr') in [ "packaging", "git",
"html_gentest" ]:
+ if config.getoption('markexpr') in [ "packaging", "git",
"html_gentest", "unit" ]:
return
setup_site_and_switch_user()
-def setup_site_and_switch_user():
- def is_running_as_site_user():
- return pwd.getpwuid(os.getuid()).pw_name == _site_id()
+def is_running_as_site_user():
+ return pwd.getpwuid(os.getuid()).pw_name == _site_id()
+def setup_site_and_switch_user():
if is_running_as_site_user():
return # This is executed as site user. Nothing to be done.
@@ -103,6 +151,7 @@ def _site_id():
#
add_python_paths()
+fake_version_and_paths()
# Session fixtures must be in conftest.py to work properly
@pytest.fixture(scope="session", autouse=True)
diff --git a/tests/testlib/__init__.py b/tests/testlib/__init__.py
index 0a3c924..459033d 100644
--- a/tests/testlib/__init__.py
+++ b/tests/testlib/__init__.py
@@ -589,15 +589,20 @@ class Site(object):
def _install_test_python_modules(self):
- for file_name in os.listdir("/usr/local/lib/python2.7/dist-packages"):
- target_path = self.path("local/lib/python/"+file_name)
- if not os.path.exists(target_path):
- assert os.system("sudo ln -s
/usr/local/lib/python2.7/dist-packages/%s %s" %
- (file_name, target_path)) >> 8 == 0
- #assert self.execute(["pip", "install",
- # "-r", os.path.join(cmk_path(), "tests",
"requirements.txt"),
- # "-r", os.path.join(cmk_path(), "tests",
"pylint", "requirements.txt"),
- # ]).wait() == 0
+ python_home = os.environ.get("VIRTUAL_ENV")
+ bin_dir = os.path.join(python_home, "bin")
+ packages_dir = os.path.join(python_home,
"lib/python2.7/site-packages")
+
+ for file_name in os.listdir(packages_dir):
+ #if "cffi" in file_name:
+ # continue
+
+ assert os.system("sudo rsync -a --chown %s:%s %s
%s/local/lib/python/" %
+ (self.id, self.id, os.path.join(packages_dir, file_name),
self.root)) >> 8 == 0
+
+ for file_name in [ "py.test", "pytest" ]:
+ assert os.system("sudo rsync -a --chown %s:%s %s %s/local/bin" %
+ (self.id, self.id, os.path.join(bin_dir, file_name), self.root))
>> 8 == 0
def rm_if_not_reusing(self):
@@ -763,7 +768,7 @@ class Site(object):
env_var_str = " ".join([ "%s=%s" % (k, pipes.quote(v))
for k, v in env_vars.items() ]) + " "
- cmd = env_var_str + subprocess.list2cmdline(["python"] + sys.argv + [
cmk_path() + "/tests" ])
+ cmd = env_var_str + subprocess.list2cmdline(["python",
self.path("local/bin/py.test")] + sys.argv[1:] + [ cmk_path() +
"/tests" ])
args = [ "/usr/bin/sudo", "--", "/bin/su",
"-l", self.id, "-c", cmd ]
return subprocess.call(args)