tests: Use real tempfile in pt_util-t
[openafs.git] / tests / tests-lib / perl5 / mancheck_utils.pm
index 834e603..62e1693 100644 (file)
@@ -19,27 +19,14 @@ sub check_command_binary {
     }
 }
 
-# TAP test: test_command_man_pages
-#
-# Gather a list of a command's subcommands (like listvol for vos)
-# by running a command with the "help" argument.  From that list
-# of subcommands spit out, see if a man page exists for that
-# command_subcommand
 #
-# Arguments: two scalars:
-#
-#                builddir : A path to the OpenAFS build directory,
-#                           such as /tmp/1.4.14
+# Run the command help to determine the list of sub-commands.
 #
-#         fullpathcommand : The full path to the actual command's
-#                           binary, such as /tmp/1.4.14/src/volser/vos
-#
-# Returns: the number of tests run
-#
-sub test_command_man_pages {
-    my ($builddir, $fullpathcommand) = @_;
+sub lookup_sub_commands {
+    my ($srcdir, $command) = @_;
 
-    my $command = basename($fullpathcommand);
+    my $fullpathcommand = "$srcdir/$command";
+    check_command_binary($fullpathcommand);
 
     # build up our list of available commands from the help output
     open(HELPOUT, "$fullpathcommand help 2>&1 |") or BAIL_OUT("can't fork: $!");
@@ -48,11 +35,32 @@ sub test_command_man_pages {
     while (<HELPOUT>) {
         # Skip the header thingy
         next if /Commands are/;
+        # Skip the version subcommand, it's always present but not interesting
+        next if /^version/;
         @comm = split();
         push(@subcommlist, $comm[0]);
     }
     close HELPOUT;
     @subcommlist = sort(@subcommlist);
+    return @subcommlist;
+}
+
+# TAP test: test_command_man_pages
+#
+# Test if a man page exists for each command sub-command.
+# Runs one test per sub-command.
+#
+# Arguments:
+#
+#                  srcdir : A path to the OpenAFS source directory,
+#                           such as /tmp/1.4.14
+#
+#                 command : the name of the command (e.g. vos)
+#
+#             subcommlist : a list of sub-commands for command
+#
+sub test_command_man_pages {
+    my ($srcdir, $command, @subcommlist) = @_;
 
     # The following is because File::Find makes no sense to me
     # for this purpose, and actually seems totally misnamed
@@ -61,9 +69,9 @@ sub test_command_man_pages {
     my $frex = "";
     # Since we don't know what man section it might be in,
     # search all existing man page files for a filename match
-    my @mandirglob = glob("$builddir/doc/man-pages/man[1-8]/*");
+    my @mandirglob = glob("$srcdir/doc/man-pages/man[1-8]/*");
     # For every subcommand, see if command_subcommand.[1-8] exists
-    # in our man page build dir.
+    # in our man page source dir.
     foreach (@subcommlist) {
         my $subcommand = $_;
         $found = 0;
@@ -78,9 +86,31 @@ sub test_command_man_pages {
                last;
            }
        }
-       $testcount = $testcount + 1;
        ok($found eq 1, "existence of man page for $command" . "_$subcommand");
     }
-    return $testcount;
+}
+
+#
+# Setup the test plan and run all of the tests for the given command suite.
+#
+# Call like so:
+# run_manpage_tests("src/ptserver", "pts");
+#
+sub run_manpage_tests($$) {
+    my ($subdir, $command) = @_;
+
+    # When run from 'runtests', our cwd will be TOP_OBJDIR/tests. $C_TAP_SOURCE
+    # is set to TOP_SRCDIR/tests, and $C_TAP_BUILD is set to TOP_OBJDIR/tests.
+    # We want the top-level src and obj dirs, in order to find the relevant
+    # binaries and manpages.
+    my $srcdir = $ENV{C_TAP_SOURCE} . "/..";
+    my $objdir = $ENV{C_TAP_BUILD} . "/..";
+
+    my @sub_commands = lookup_sub_commands("$objdir/$subdir", $command);
+    die("No subcommands found in $objdir/$subdir/$command?") unless(@sub_commands);
+
+    plan tests => scalar @sub_commands;
+
+    test_command_man_pages($srcdir, $command, @sub_commands);
 }
 1;