[libvirt] [PATCH] tests: new test: virsh-synopsis

I wanted help SYNOPSIS output that was regular enough to parse. Enforcing/correcting the following is the first step:
From fa58b801ea80f52a10d48ab75a359ffe06c4be40 Mon Sep 17 00:00:00 2001 From: Jim Meyering <meyering@redhat.com> Date: Fri, 21 Nov 2008 10:58:36 +0100 Subject: [PATCH] tests: new test: virsh-synopsis
* tests/virsh-synopsis: new file * tests/Makefile.am (test_scripts): Add virsh-synopsis. * src/virsh.c: Correct help SYNOPSIS for each of seven commands. When I first ran this script, "make check" failed like this: ... invalid help SYNOPSIS for net-create: create a network from an XML <file> invalid help SYNOPSIS for net-define: define a network from an XML <file> invalid help SYNOPSIS for net-start: start <network> invalid help SYNOPSIS for pool-create: create a pool from an XML <file> invalid help SYNOPSIS for pool-define: define a pool from an XML <file> invalid help SYNOPSIS for pool-start: start <pool> invalid help SYNOPSIS for vol-create: create <file> FAIL: virsh-synopsis --- src/virsh.c | 17 +++++++++-------- tests/Makefile.am | 1 + tests/virsh-synopsis | 43 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 8 deletions(-) create mode 100755 tests/virsh-synopsis diff --git a/src/virsh.c b/src/virsh.c index 4195781..78c536e 100644 --- a/src/virsh.c +++ b/src/virsh.c @@ -2365,7 +2365,7 @@ cmdNetworkAutostart(vshControl *ctl, const vshCmd *cmd) * "net-create" command */ static const vshCmdInfo info_network_create[] = { - {"syntax", "create a network from an XML <file>"}, + {"syntax", "net-create <file>"}, {"help", gettext_noop("create a network from an XML file")}, {"desc", gettext_noop("Create a network.")}, {NULL, NULL} @@ -2413,7 +2413,7 @@ cmdNetworkCreate(vshControl *ctl, const vshCmd *cmd) * "net-define" command */ static const vshCmdInfo info_network_define[] = { - {"syntax", "define a network from an XML <file>"}, + {"syntax", "net-define <file>"}, {"help", gettext_noop("define (but don't start) a network from an XML file")}, {"desc", gettext_noop("Define a network.")}, {NULL, NULL} @@ -2697,7 +2697,7 @@ cmdNetworkName(vshControl *ctl, const vshCmd *cmd) * "net-start" command */ static const vshCmdInfo info_network_start[] = { - {"syntax", "start <network>"}, + {"syntax", "net-start <network>"}, {"help", gettext_noop("start a (previously defined) inactive network")}, {"desc", gettext_noop("Start a network.")}, {NULL, NULL} @@ -2862,14 +2862,15 @@ cmdPoolAutostart(vshControl *ctl, const vshCmd *cmd) * "pool-create" command */ static const vshCmdInfo info_pool_create[] = { - {"syntax", "create a pool from an XML <file>"}, + {"syntax", "pool-create <file>"}, {"help", gettext_noop("create a pool from an XML file")}, {"desc", gettext_noop("Create a pool.")}, {NULL, NULL} }; static const vshCmdOptDef opts_pool_create[] = { - {"file", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("file containing an XML pool description")}, + {"file", VSH_OT_DATA, VSH_OFLAG_REQ, + gettext_noop("file containing an XML pool description")}, {NULL, 0, 0, NULL} }; @@ -3000,7 +3001,7 @@ cmdPoolCreateAs(vshControl *ctl, const vshCmd *cmd) * "pool-define" command */ static const vshCmdInfo info_pool_define[] = { - {"syntax", "define a pool from an XML <file>"}, + {"syntax", "pool-define <file>"}, {"help", gettext_noop("define (but don't start) a pool from an XML file")}, {"desc", gettext_noop("Define a pool.")}, {NULL, NULL} @@ -3727,7 +3728,7 @@ cmdPoolName(vshControl *ctl, const vshCmd *cmd) * "pool-start" command */ static const vshCmdInfo info_pool_start[] = { - {"syntax", "start <pool>"}, + {"syntax", "pool-start <pool>"}, {"help", gettext_noop("start a (previously defined) inactive pool")}, {"desc", gettext_noop("Start a pool.")}, {NULL, NULL} @@ -3965,7 +3966,7 @@ cmdPoolUuid(vshControl *ctl, const vshCmd *cmd) * "vol-create" command */ static const vshCmdInfo info_vol_create[] = { - {"syntax", "create <file>"}, + {"syntax", "vol-create <file>"}, {"help", gettext_noop("create a vol from an XML file")}, {"desc", gettext_noop("Create a vol.")}, {NULL, NULL} diff --git a/tests/Makefile.am b/tests/Makefile.am index 0b4eebd..bec3791 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -58,6 +58,7 @@ test_scripts += \ undefine \ vcpupin virsh-all + virsh-synopsis endif EXTRA_DIST += $(test_scripts) diff --git a/tests/virsh-synopsis b/tests/virsh-synopsis new file mode 100755 index 0000000..6ce58a2 --- /dev/null +++ b/tests/virsh-synopsis @@ -0,0 +1,43 @@ +#!/bin/sh +# ensure that each command's help "SYNOPSIS" line starts with the command name + +# Copyright (C) 2008 Free Software Foundation, Inc. + +# 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/>. + +if test "$VERBOSE" = yes; then + set -x + virsh --version +fi + +. $srcdir/test-lib.sh + +fail=0 + +test_url=test:///default + +virsh -c $test_url help > cmds || framework_failure +cmds=$(sed -n 's/^ \([^ ][^ ]*\) .*/\1/p' cmds) || framework_failure +test -n "$cmds" || framework_failure + +for i in $cmds; do + virsh -c $test_url help $i > help || fail=1 + grep -A1 '^ SYNOPSIS$' help > synopsis \ + || { echo 1>&2 missing or invalid help SYNOPSIS for $i; fail=1; } + sed -n 2p synopsis > s2 || framework_failure + grep -E "^ $i( |$)" s2 > /dev/null \ + || { echo 1>&2 "invalid help SYNOPSIS for $i:"; cat s2 1>&2; fail=1; } +done + +(exit $fail); exit $fail -- 1.6.0.4.1021.g4320

On Fri, Nov 21, 2008 at 11:13:03AM +0100, Jim Meyering wrote:
I wanted help SYNOPSIS output that was regular enough to parse.
static const vshCmdInfo info_network_create[] = { - {"syntax", "create a network from an XML <file>"}, + {"syntax", "net-create <file>"},
I'm kind of wondering why we manually write the "syntax" string at all. We know the name of the command, and we know the names of all the args, so we can auto-generate this entire string. Daniel -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|

"Daniel P. Berrange" <berrange@redhat.com> wrote:
On Fri, Nov 21, 2008 at 11:13:03AM +0100, Jim Meyering wrote:
I wanted help SYNOPSIS output that was regular enough to parse.
static const vshCmdInfo info_network_create[] = { - {"syntax", "create a network from an XML <file>"}, + {"syntax", "net-create <file>"},
I'm kind of wondering why we manually write the "syntax" string at all. We know the name of the command, and we know the names of all the args, so we can auto-generate this entire string.
Right. Everything we need is already in e.g., the associated vshCmdOptDef table. Any objection to committing that for now? Once those lines are all generated, the test won't be needed any more, but in the mean time it might help. BTW, I don't see a way to distinguish mutually-exclusive boolean options (like --all and --inactive, which appear in each synopsis like [ --inactive | --all ]) from ones that can be combined like those of attach-disk attach-disk <domain> <source> <target> [--driver <driver>] \ [--subdriver <subdriver>] [--type <type>] [--mode <mode>] which may be specified independently. Sure, all of the latter type happen to be non-boolean, and we could use that,... until we need to add a command with exclusive non-bool options.

On Fri, Nov 21, 2008 at 12:06:30PM +0100, Jim Meyering wrote:
"Daniel P. Berrange" <berrange@redhat.com> wrote:
On Fri, Nov 21, 2008 at 11:13:03AM +0100, Jim Meyering wrote:
I wanted help SYNOPSIS output that was regular enough to parse.
static const vshCmdInfo info_network_create[] = { - {"syntax", "create a network from an XML <file>"}, + {"syntax", "net-create <file>"},
I'm kind of wondering why we manually write the "syntax" string at all. We know the name of the command, and we know the names of all the args, so we can auto-generate this entire string.
Right. Everything we need is already in e.g., the associated vshCmdOptDef table.
Any objection to committing that for now? Once those lines are all generated, the test won't be needed any more, but in the mean time it might help.
Ok.
BTW, I don't see a way to distinguish mutually-exclusive boolean options (like --all and --inactive, which appear in each synopsis like [ --inactive | --all ]) from ones that can be combined like those of attach-disk
I don't think that's a huge problem - just list them all, and use the description text to specify the constraints on their use. Daniel -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
participants (2)
-
Daniel P. Berrange
-
Jim Meyering