X-Git-Url: https://code.grnet.gr/git/ganeti-local/blobdiff_plain/fb926117f623a61776b90e992126f953679ca066..09bf5d24a29ee617d1eab566fa9b07d60cf2ed1a:/test/docs_unittest.py diff --git a/test/docs_unittest.py b/test/docs_unittest.py index c437920..d91976c 100755 --- a/test/docs_unittest.py +++ b/test/docs_unittest.py @@ -86,6 +86,11 @@ def _ReadDocFile(filename): class TestHooksDocs(unittest.TestCase): + HOOK_PATH_OK = frozenset([ + "master-ip-turnup", + "master-ip-turndown", + ]) + def test(self): """Check whether all hooks are documented. @@ -98,34 +103,62 @@ class TestHooksDocs(unittest.TestCase): assert len(lu2opcode) == len(mcpu.Processor.DISPATCH_TABLE), \ "Found duplicate entries" - for name in dir(cmdlib): - obj = getattr(cmdlib, name) - - if (isinstance(obj, type) and - issubclass(obj, cmdlib.LogicalUnit) and - hasattr(obj, "HPATH")): - self._CheckHook(name, obj, hooksdoc, lu2opcode) - - def _CheckHook(self, name, lucls, hooksdoc, lu2opcode): - opcls = lu2opcode.get(lucls, None) - - if lucls.HTYPE is None: - return + hooks_paths = frozenset(re.findall("^:directory:\s*(.+)\s*$", hooksdoc, + re.M)) + self.assertTrue(self.HOOK_PATH_OK.issubset(hooks_paths), + msg="Whitelisted path not found in documentation") + + raw_hooks_ops = re.findall("^OP_(?!CODE$).+$", hooksdoc, re.M) + hooks_ops = set() + duplicate_ops = set() + for op in raw_hooks_ops: + if op in hooks_ops: + duplicate_ops.add(op) + else: + hooks_ops.add(op) - # TODO: Improve this test (e.g. find hooks documented but no longer - # existing) + self.assertFalse(duplicate_ops, + msg="Found duplicate opcode documentation: %s" % + utils.CommaJoin(duplicate_ops)) - if opcls: - self.assertTrue(re.findall("^%s$" % re.escape(opcls.OP_ID), - hooksdoc, re.M), - msg=("Missing hook documentation for %s" % - (opcls.OP_ID))) + seen_paths = set() + seen_ops = set() - pattern = r"^:directory:\s*%s\s*$" % re.escape(lucls.HPATH) + self.assertFalse(duplicate_ops, + msg="Found duplicated hook documentation: %s" % + utils.CommaJoin(duplicate_ops)) - self.assert_(re.findall(pattern, hooksdoc, re.M), - msg=("Missing documentation for hook %s/%s" % - (lucls.HTYPE, lucls.HPATH))) + for name in dir(cmdlib): + lucls = getattr(cmdlib, name) + + if (isinstance(lucls, type) and + issubclass(lucls, cmdlib.LogicalUnit) and + hasattr(lucls, "HPATH")): + if lucls.HTYPE is None: + continue + + opcls = lu2opcode.get(lucls, None) + + if opcls: + seen_ops.add(opcls.OP_ID) + self.assertTrue(opcls.OP_ID in hooks_ops, + msg="Missing hook documentation for %s" % + opcls.OP_ID) + self.assertTrue(lucls.HPATH in hooks_paths, + msg="Missing documentation for hook %s/%s" % + (lucls.HTYPE, lucls.HPATH)) + seen_paths.add(lucls.HPATH) + + missed_ops = hooks_ops - seen_ops + missed_paths = hooks_paths - seen_paths - self.HOOK_PATH_OK + + self.assertFalse(missed_ops, + msg="Op documents hook not existing anymore: %s" % + utils.CommaJoin(missed_ops)) + + self.assertFalse(missed_paths, + msg="Hook path does not exist in opcode: %s" % + utils.CommaJoin(missed_paths)) class TestRapiDocs(unittest.TestCase):