diff options
Diffstat (limited to 'source4/scripting/python')
| -rw-r--r-- | source4/scripting/python/samba/tests/docs.py | 90 | 
1 files changed, 90 insertions, 0 deletions
diff --git a/source4/scripting/python/samba/tests/docs.py b/source4/scripting/python/samba/tests/docs.py new file mode 100644 index 0000000000..1ab3e55b81 --- /dev/null +++ b/source4/scripting/python/samba/tests/docs.py @@ -0,0 +1,90 @@ +# Unix SMB/CIFS implementation. +# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2007-2012 +# +# Tests for documentation. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program.  If not, see <http://www.gnu.org/licenses/>. +# + +"""Tests for presence of documentation.""" + +import samba +import samba.tests + +import os +import re +import subprocess + + +class TestCase(samba.tests.TestCase): + +    def _format_message(self, parameters, message): +        parameters = list(parameters) +        parameters.sort() +        return message + '\n\n    %s' % ('\n    '.join(parameters)) + + +def get_documented_parameters(sourcedir): +    p = subprocess.Popen( +        ["xsltproc", "--xinclude", "--param", "smb.context", "ALL", "generate-context.xsl", "parameters.all.xml"], +        stdout=subprocess.PIPE, cwd=os.path.join(sourcedir, "docs-xml", "smbdotconf")) +    out, err = p.communicate() +    assert p.returncode == 0, "returncode was %r" % p.returncode +    for l in out.splitlines(): +        m = re.match('<samba:parameter .*?name="([^"]*?)"', l) +        if m: +            name = m.group(1).replace(" ", "") +            yield name + + +def get_implementation_parameters(sourcedir): +    # Reading entries from source code +    f = open(os.path.join(sourcedir, "lib/param/param_table.c"), "r") +    try: +        # burn through the preceding lines +        while True: +            l = f.readline() +            if l.startswith("static struct parm_struct parm_table"): +                break + +        for l in f.readlines(): +            if re.match("^\s*\}\;\s*$", l): +                break +            # pull in the param names only +            if re.match(".*P_SEPARATOR.*", l): +                continue +            m = re.match("\s*\.label\s*=\s*\"(.*)\".*", l) +            if not m: +                continue + +            name = m.group(1) +            yield name.lower().replace(" ", "") +    finally: +        f.close() + + +class SmbDotConfTests(TestCase): + +    def test_missing(self): +        topdir = samba.source_tree_topdir() +        documented = set(get_documented_parameters(topdir)) +        parameters = set(get_implementation_parameters(topdir)) +        unknown = documented.difference(parameters) +        if len(unknown) > 0: +            self.fail(self._format_message(unknown, +                "Parameters that are documented but not in the implementation:")) +        undocumented = parameters.difference(documented) +        if len(undocumented) > 0: +            self.fail(self._format_message(undocumented, +                "Parameters that are in the implementation but undocumented:"))  | 
