Code

Fix minor test issues
[nagiosplug.git] / NPTest.pm
index 440e7343e36ebb4505797402fe0109925e8a6c33..54a535e77808b167741ba30ca744fcb3266acc5c 100644 (file)
--- a/NPTest.pm
+++ b/NPTest.pm
@@ -21,7 +21,7 @@ use Data::Dumper;
 use Test;
 
 use vars qw($VERSION);
-$VERSION = do { my @r = (q$Revision$ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; # must be all one line, for MakeMaker
+$VERSION = "1556."; # must be all one line, for MakeMaker
 
 =head1 NAME
 
@@ -44,23 +44,23 @@ default via the C<use NPTest;> statement.
 
 =over
 
-=item C<getTestParameter(...)>
+=item getTestParameter( "ENV_VARIABLE", $brief_description, $default )
 
-A flexible and user override-able method of collecting, storing and
-retrieving test parameters. This function allows the test harness
+$default is optional.
+
+This function allows the test harness
 developer to interactively request test parameter information from the
-user, when the no means of obtaining the information automatically has
-been successful. The user is provided with the option of accepting
-test harness developer's default value for the parameter, if a suggested
-default is provided.
-
-User supplied responses are stored in an external (file-based)
-cache. These values are retrieved on subsequent runs alleviating the
-user of reconfirming the previous entered responses. The user is able
-to override the value of a parameter on any given run by setting the
-associated environment variable. These environment variable based
-overrides are not stored in the cache, allowing one-time and what-if
-based tests on the command line without polluting the cache.
+user. The user can accept the developer's default value or reply "none"
+which will then be returned as "" for the test to skip if appropriate.
+
+If a parameter needs to be entered and the test is run without a tty 
+attached (such as a cronjob), the parameter will be assigned as if it 
+was "none". Tests can check for the parameter and skip if not set.
+
+Responses are stored in an external, file-based cache so subsequent test
+runs will use these values. The user is able to change the values by
+amending the values in the file /var/tmp/NPTest.cache, or by setting
+the appropriate environment variable before running the test.
 
 The option exists to store parameters in a scoped means, allowing a
 test harness to a localise a parameter should the need arise. This
@@ -73,7 +73,7 @@ called "check_disk.t" requesting the parameter "mountpoint_valid", the
 cache is first searched for "check_disk"/"mountpoint_valid", if this
 fails, then a search is conducted for "mountpoint_valid".
 
-The facilitate quick testing setup, it is possible to accept all the
+To facilitate quick testing setup, it is possible to accept all the
 developer provided defaults by setting the environment variable
 "NPTEST_ACCEPTDEFAULT" to "1" (or any other perl truth value). Note
 that, such defaults are not stored in the cache, as there is currently
@@ -306,7 +306,16 @@ sub skipMissingCmd
 
 sub getTestParameter
 {
-  my( $param, $envvar, $default, $brief, $scoped ) = @_;
+  my( $param, $envvar, $default, $brief, $scoped );
+  my $new_style;
+  if (scalar @_ <= 3) {
+       ($param, $brief, $default) = @_;
+       $envvar = $param;
+       $new_style = 1;
+  } else {
+       ( $param, $envvar, $default, $brief, $scoped ) = @_;
+       $new_style = 0;
+  }
 
   # Apply default values for optional arguments
   $scoped = ( defined( $scoped ) && $scoped );
@@ -319,8 +328,13 @@ sub getTestParameter
   }
 
   my $cachedValue = SearchCache( $param, $testharness );
-  if ( defined( $cachedValue ) && $cachedValue )
+  if ( defined( $cachedValue ) )
   {
+    # This save required to convert to new style because the key required is
+    # changing to the environment variable
+    if ($new_style == 0) {
+      SetCacheParameter( $envvar, undef, $cachedValue );
+    }
     return $cachedValue;
   }
 
@@ -332,6 +346,9 @@ sub getTestParameter
     return $default;
   }
 
+  # Set "none" if no terminal attached (eg, tinderbox build servers when new variables set)
+  return "" unless (-t STDERR);
+
   my $userResponse = "";
 
   while ( $userResponse eq "" )
@@ -339,9 +356,9 @@ sub getTestParameter
     print STDERR "\n";
     print STDERR "Test Harness         : $testharness\n";
     print STDERR "Test Parameter       : $param\n";
-    print STDERR "Environment Variable : $envvar\n";
+    print STDERR "Environment Variable : $envvar\n" if ($param ne $envvar);
     print STDERR "Brief Description    : $brief\n";
-    print STDERR "Enter value ", ($defaultValid ? "[${default}]" : "[]"), " => ";
+    print STDERR "Enter value (or 'none') ", ($defaultValid ? "[${default}]" : "[]"), " => ";
     $userResponse = <STDIN>;
     $userResponse = "" if ! defined( $userResponse ); # Handle EOF
     chomp( $userResponse );
@@ -353,6 +370,10 @@ sub getTestParameter
 
   print STDERR "\n";
 
+  if ($userResponse =~ /^(na|none)$/) {
+       $userResponse = "";
+  }
+
   # define all user responses at global scope
   SetCacheParameter( $param, ( $scoped ? $testharness : undef ), $userResponse );
 
@@ -378,6 +399,7 @@ sub SearchCache
   {
     return $CACHE{$param};
   }
+  return undef;        # Need this to say "nothing found"
 }
 
 sub SetCacheParameter
@@ -546,7 +568,7 @@ sub TestsFrom
 
   closedir( DIR );
 
-  return @tests;
+  return sort @tests;
 }
 
 # All the new object oriented stuff below
@@ -575,21 +597,38 @@ sub output {
        }
 }
 
+sub perf_output {
+       my $self = shift;
+       $_ = $self->{output};
+       /\|(.*)$/;
+       return $1 || "";
+}
+
+sub only_output {
+       my $self = shift;
+       $_ = $self->{output};
+       /(.*?)\|/;
+       return $1 || "";
+}
+
 sub testCmd {
        my $class = shift;
        my $command = shift or die "No command passed to testCmd";
        my $object = $class->new;
        
        my $output = `$command`;
+       $object->return_code($? >> 8);
+       $_ = $? & 127;
+       if ($_) {
+               die "Got signal $_ for command $command";
+       }
        chomp $output;
-       
        $object->output($output);
-       $object->return_code($? >> 8);
 
+       my ($pkg, $file, $line) = caller(0);
+       print "Testing: $command", $/;
        if ($ENV{'NPTEST_DEBUG'}) {
-               my ($pkg, $file, $line) = caller(0);
                print "testCmd: Called from line $line in $file", $/;
-               print "Testing: $command", $/;
                print "Output:  ", $object->output, $/;
                print "Return code: ", $object->return_code, $/;
        }