summaryrefslogtreecommitdiffstats
path: root/testsuite/Testsrc/test_code_checks.py
diff options
context:
space:
mode:
authorChris St. Pierre <chris.a.st.pierre@gmail.com>2012-09-24 14:51:36 -0400
committerChris St. Pierre <chris.a.st.pierre@gmail.com>2012-09-25 11:58:48 -0400
commit3f16355e18cdceb37828a00a8181d9cc60815cd0 (patch)
treee2b38114e0a06d3c7b28ad4ef5c15793e21eb2b3 /testsuite/Testsrc/test_code_checks.py
parent47aebb16f15fe6f8ce29d8c6b105f10d8d64c295 (diff)
downloadbcfg2-3f16355e18cdceb37828a00a8181d9cc60815cd0.tar.gz
bcfg2-3f16355e18cdceb37828a00a8181d9cc60815cd0.tar.bz2
bcfg2-3f16355e18cdceb37828a00a8181d9cc60815cd0.zip
fixed tests for pylint changes
Diffstat (limited to 'testsuite/Testsrc/test_code_checks.py')
-rw-r--r--testsuite/Testsrc/test_code_checks.py178
1 files changed, 178 insertions, 0 deletions
diff --git a/testsuite/Testsrc/test_code_checks.py b/testsuite/Testsrc/test_code_checks.py
new file mode 100644
index 000000000..41a91caff
--- /dev/null
+++ b/testsuite/Testsrc/test_code_checks.py
@@ -0,0 +1,178 @@
+import os
+import re
+import sys
+import glob
+from subprocess import Popen, PIPE, STDOUT
+
+# add all parent testsuite directories to sys.path to allow (most)
+# relative imports in python 2.4
+_path = os.path.dirname(__file__)
+while _path != '/':
+ if os.path.basename(_path).lower().startswith("test"):
+ sys.path.append(_path)
+ if os.path.basename(_path) == "testsuite":
+ break
+ _path = os.path.dirname(_path)
+from common import can_skip, skip, skipIf, skipUnless, Bcfg2TestCase
+
+try:
+ import django
+ HAS_DJANGO = True
+except ImportError:
+ HAS_DJANGO = False
+
+# path to Bcfg2 src directory
+srcpath = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..",
+ "src"))
+
+# path to pylint rc file
+rcfile = os.path.abspath(os.path.join(os.path.dirname(__file__), "..",
+ "pylintrc.conf"))
+
+# test for pylint existence
+try:
+ Popen(['pylint'], stdout=PIPE, stderr=STDOUT).wait()
+ HAS_PYLINT = True
+except OSError:
+ HAS_PYLINT = False
+
+
+# perform a full range of code checks on the listed files.
+full_checks = {
+ "lib/Bcfg2/Server": ["Lint",
+ "Plugin",
+ "BuiltinCore.py",
+ "CherryPyCore.py",
+ "Core.py"],
+ "lib/Bcfg2/Server/Plugins": ["Bundler.py",
+ "Bzr.py",
+ "Cfg",
+ "Cvs.py",
+ "DBStats.py",
+ "Darcs.py",
+ "Defaults.py",
+ "FileProbes.py",
+ "Fossil.py",
+ "Git.py",
+ "GroupPatterns.py",
+ "Guppy.py",
+ "Hg.py",
+ "Ohai.py",
+ "Packages",
+ "Probes.py",
+ "Properties.py",
+ "PuppetENC.py",
+ "Rules.py",
+ "SEModules.py",
+ "ServiceCompat.py",
+ "Svn.py",
+ "Svn2.py",
+ "TemplateHelper.py",
+ "Trigger.py",
+ ],
+ "lib/Bcfg2/Client/Tools": ["POSIX"],
+ }
+
+# perform full code checks on the listed executables
+sbin_checks = {
+ "sbin": ["bcfg2-server", "bcfg2-yum-helper"]
+ }
+
+# perform limited, django-safe checks on the listed files
+django_checks = {
+ "lib/Bcfg2/Server": ["Reports", "models.py"]
+ }
+
+# perform no checks at all on the listed files
+no_checks = {
+ "lib/Bcfg2/Client/Tools": ["APT.py", "RPMng.py", "rpmtools.py"],
+ "lib/Bcfg2/Server": ["Snapshots", "Hostbase"]
+ }
+
+
+class TestPylint(Bcfg2TestCase):
+ pylint_cmd = ["pylint", "--rcfile", rcfile]
+
+ # regex to find errors and fatal errors
+ error_re = re.compile(r':\d+:\s+\[[EF]\d{4}')
+
+ # build the blacklist
+ blacklist = []
+ for parent, modules in no_checks.items():
+ blacklist.extend([os.path.join(srcpath, parent, m) for m in modules])
+
+ def _get_paths(self, pathlist):
+ paths = []
+ for parent, modules in pathlist.items():
+ paths.extend([os.path.join(srcpath, parent, m) for m in modules])
+ return list(set(paths) - set(self.blacklist))
+
+ @skipIf(not os.path.exists(srcpath), "%s does not exist" % srcpath)
+ @skipIf(not os.path.exists(rcfile), "%s does not exist" % rcfile)
+ @skipUnless(HAS_PYLINT, "pylint not found, skipping")
+ def test_lib_full(self):
+ self._pylint_full(self._get_paths(full_checks))
+
+ @skipIf(not os.path.exists(srcpath), "%s does not exist" % srcpath)
+ @skipIf(not os.path.exists(rcfile), "%s does not exist" % rcfile)
+ @skipUnless(HAS_PYLINT, "pylint not found, skipping")
+ def test_sbin_full(self):
+ self._pylint_full(self._get_paths(sbin_checks),
+ extra_args=["--module-rgx",
+ "[a-z_-][a-z0-9_-]*$"])
+
+ def _pylint_full(self, paths, extra_args=None):
+ """ test select files for all pylint errors """
+ if extra_args is None:
+ extra_args = []
+ args = self.pylint_cmd + extra_args + \
+ ["-f", "parseable"] + \
+ [os.path.join(srcpath, p) for p in paths]
+ pylint = Popen(args, stdout=PIPE, stderr=STDOUT)
+ print(pylint.communicate()[0])
+ self.assertEqual(pylint.wait(), 0)
+
+ @skipIf(not os.path.exists(srcpath), "%s does not exist" % srcpath)
+ @skipIf(not os.path.exists(rcfile), "%s does not exist" % rcfile)
+ @skipUnless(HAS_PYLINT, "pylint not found, skipping")
+ def test_sbin_errors(self):
+ flist = list(set(os.path.join(srcpath, p)
+ for p in glob.glob("sbin/*")) - set(self.blacklist))
+ return self._pylint_errors(flist)
+
+ @skipUnless(HAS_DJANGO, "Django not found, skipping")
+ @skipIf(not os.path.exists(srcpath), "%s does not exist" % srcpath)
+ @skipIf(not os.path.exists(rcfile), "%s does not exist" % rcfile)
+ @skipUnless(HAS_PYLINT, "pylint not found, skipping")
+ def test_django_errors(self):
+ return self._pylint_errors(self._get_paths(django_checks),
+ extra_args=["-d", "E1101"])
+
+ @skipIf(not os.path.exists(srcpath), "%s does not exist" % srcpath)
+ @skipIf(not os.path.exists(rcfile), "%s does not exist" % rcfile)
+ @skipUnless(HAS_PYLINT, "pylint not found, skipping")
+ def test_lib_errors(self):
+ ignore = []
+ for fname_list in django_checks.values() + no_checks.values():
+ ignore.extend(fname_list)
+ return self._pylint_errors(["lib/Bcfg2"],
+ extra_args=["--ignore", ",".join(ignore)])
+
+ def _pylint_errors(self, paths, extra_args=None):
+ """ test all files for fatals and errors """
+ if extra_args is None:
+ extra_args = []
+ args = self.pylint_cmd + extra_args + \
+ ["-f", "parseable", "-d", "R0801,E1103"] + \
+ [os.path.join(srcpath, p) for p in paths]
+ pylint = Popen(args, stdout=PIPE, stderr=STDOUT)
+ output = pylint.communicate()[0]
+ rv = pylint.wait()
+
+ for line in output.splitlines():
+ #print line
+ if self.error_re.search(line):
+ print(line)
+ # pylint returns a bitmask, where 1 means fatal errors
+ # were encountered and 2 means errors were encountered.
+ self.assertEqual(rv & 3, 0)