diff --git a/test/docs_unittest.py b/test/docs_unittest.py index 075ec391129943d1be8684cf4910ed6c87b84535..fbd31a078b232922597ca6708c59898182b9fac6 100755 --- a/test/docs_unittest.py +++ b/test/docs_unittest.py @@ -28,11 +28,15 @@ from ganeti import _autoconf from ganeti import utils from ganeti import cmdlib from ganeti import build +from ganeti import compat from ganeti.rapi import connector import testutils +VALID_URI_RE = re.compile(r"^[-/a-z0-9]*$") + + class TestDocs(unittest.TestCase): """Documentation tests""" @@ -68,6 +72,12 @@ class TestDocs(unittest.TestCase): msg=("Missing documentation for hook %s/%s" % (lucls.HTYPE, lucls.HPATH))) + def _CheckRapiResource(self, uri, fixup): + # Apply fixes before testing + for (rx, value) in fixup.items(): + uri = rx.sub(value, uri) + + self.assertTrue(VALID_URI_RE.match(uri), msg="Invalid URI %r" % uri) def testRapiDocs(self): """Check whether all RAPI resources are documented. @@ -75,17 +85,26 @@ class TestDocs(unittest.TestCase): """ rapidoc = self._ReadDocFile("rapi.rst") - node_name = "[node_name]" - instance_name = "[instance_name]" - group_name = "[group_name]" - job_id = "[job_id]" - disk_index = "[disk_index]" + node_name = re.escape("[node_name]") + instance_name = re.escape("[instance_name]") + group_name = re.escape("[group_name]") + job_id = re.escape("[job_id]") + disk_index = re.escape("[disk_index]") + + resources = connector.GetHandlers(node_name, instance_name, group_name, + job_id, disk_index) + + uri_check_fixup = { + re.compile(node_name): "node1examplecom", + re.compile(instance_name): "inst1examplecom", + re.compile(group_name): "group4440", + re.compile(job_id): "9409", + re.compile(disk_index): "123", + } - resources = connector.GetHandlers(re.escape(node_name), - re.escape(instance_name), - re.escape(group_name), - re.escape(job_id), - re.escape(disk_index)) + assert compat.all(VALID_URI_RE.match(value) + for value in uri_check_fixup.values()), \ + "Fixup values must be valid URIs, too" titles = [] @@ -105,14 +124,16 @@ class TestDocs(unittest.TestCase): if hasattr(key, "match"): self.assert_(key.pattern.startswith("^/2/"), msg="Pattern %r does not start with '^/2/'" % key.pattern) + self.assertEqual(key.pattern[-1], "$") found = False for title in titles: - if (title.startswith("``") and - title.endswith("``") and - key.match(title[2:-2])): - found = True - break + if title.startswith("``") and title.endswith("``"): + uri = title[2:-2] + if key.match(uri): + self._CheckRapiResource(uri, uri_check_fixup) + found = True + break if not found: # TODO: Find better way of identifying resource @@ -122,7 +143,9 @@ class TestDocs(unittest.TestCase): self.assert_(key.startswith("/2/") or key in prefix_exception, msg="Path %r does not start with '/2/'" % key) - if ("``%s``" % key) not in titles: + if ("``%s``" % key) in titles: + self._CheckRapiResource(key, {}) + else: undocumented.append(key) self.failIf(undocumented,