# Unix SMB/CIFS implementation. # Copyright (C) Catalyst IT Ltd 2017. # # Originally written by Douglas Bagnall # # 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 . # import os import re from samba.tests.samba_tool.base import SambaToolCmdTest from samba.tests import BlackboxProcessError, BINDIR from samba.tests import check_help_consistency from samba.common import get_string from samba import version from pathlib import Path class HelpTestCase(SambaToolCmdTest): """Tests for samba-tool help and --help We test for consistency and lack of crashes.""" def _find_sub_commands(self, args): self.runcmd(*args) def test_help_tree(self): # we call actual subprocesses, because we are probing the # actual help output where there is no sub-command. Don't copy # this if you have an actual command: for that use # self.runcmd() or self.runsubcmd(). known_commands = [[]] failed_commands = [] undocumented = [] with open(Path(BINDIR) / '../docs-xml/manpages/samba-tool.8.xml') as f: man = f.read() for i in range(4): new_commands = [] for c in known_commands: if ' '.join(c) not in man: undocumented.append(c) line = ' '.join(['samba-tool'] + c + ['--help']) try: output = self.check_output(line) except BlackboxProcessError as e: output = e.stdout failed_commands.append(c) output = get_string(output) tail = output.partition('Available subcommands:')[2] subcommands = re.findall(r'^\s*([\w-]+)\s+-', tail, re.MULTILINE) for s in subcommands: new_commands.append(c + [s]) # check that `samba-tool help X Y` == `samba-tool X Y --help` line = ' '.join(['samba-tool', 'help'] + c) try: output2 = self.check_output(line) except BlackboxProcessError as e: output2 = e.stdout failed_commands.append(c) output2 = get_string(output2) self.assertEqual(output, output2) err = check_help_consistency(output, options_start='Options:', options_end='Available subcommands:') if err is not None: self.fail("consistency error with %s:\n%s" % (line, err)) if not new_commands: break known_commands = new_commands self.assertEqual(failed_commands, []) if undocumented: print("-=" * 36) print("\nPlease update `man samba-tool`!\n") print("Some samba-tool subcommands seem to missing from the man-page!") print("To help fix this, below are Docbook-like snippets based on the ") print("--help text. Please modify these to be correct (both as XML and") print("as content) and add them to docs-xml/manpages/samba-tool.8.xml") print("Remember, you can explain things more deeply in a man-page,") print("but you can also trim off common options that have already been") print("explained.") print() env = dict(os.environ) env['SAMBATOOL_HELP_IS_XML'] = '1' for c in undocumented: line = ' '.join(['samba-tool'] + c + ['--help']) print(f" ") try: output = self.check_output(line, env=env) except BlackboxProcessError as e: print(f"