quilt-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Quilt-dev] [PATCH] test suite: Record the status returned by every comm


From: Jean Delvare
Subject: [Quilt-dev] [PATCH] test suite: Record the status returned by every command
Date: Fri, 31 May 2013 14:43:10 +0200

Record the status returned by every command, so that test cases can
check them.
---
Andreas, what do you think? Martin had a use case for this some months
ago.

 test/run |   36 ++++++++++++++++++++++--------------
 1 file changed, 22 insertions(+), 14 deletions(-)

--- a/test/run
+++ b/test/run
@@ -81,6 +81,7 @@ if (defined $ARGV[0]) {
 }
 
 for (;;) {
+  my $last_status;
   my $line = <SOURCE>; $lineno++;
   if (defined $line) {
     # Substitute %{VAR} with environment variables.
@@ -92,13 +93,16 @@ for (;;) {
     } elsif ($line =~ s/^\s*> ?//) {
       push @$out, $line;
     } else {
-      process_test($prog, $prog_line, $in, $out);
+      $last_status = process_test($prog, $prog_line, $in, $out);
       last if $prog_line >= $opt_l;
 
       $prog = [];
       $prog_line = 0;
     }
     if ($line =~ s/^\s*\$ ?//) {
+      # Substitute %{?} with the last command's status.
+      $line =~ s[%{\?}][$last_status]eg;
+
       $prog = [ map { s/\\(.)/$1/g; $_ } split /(?<!\\)\s+/, $line ];
       $prog_line = $lineno;
       $in = [];
@@ -132,13 +136,14 @@ exit $failed ? 1 : 0;
 
 sub process_test($$$$) {
   my ($prog, $prog_line, $in, $out) = @_;
+  my ($result, $exec_status);
 
   return unless @$prog;
 
        my $p = [ @$prog ];
        print_body "[$prog_line] \$ ".join(' ',
                   map { s/\s/\\$&/g; $_ } @$p)." -- ";
-       my $result = exec_test($prog, $in);
+       ($exec_status, $result) = exec_test($prog, $in);
        my @good = ();
        my $nmax = (@$out > @$result) ? @$out : @$result;
        for (my $n=0; $n < $nmax; $n++) {
@@ -171,6 +176,8 @@ sub process_test($$$$) {
                              $r, $good[$n], $l);
          }
        }
+
+       return $exec_status;
 }
 
 
@@ -180,7 +187,7 @@ sub su($) {
   $user ||= "root";
 
   my ($login, $pass, $uid, $gid) = getpwnam($user)
-    or return [ "su: user $user does not exist\n" ];
+    or return 1, [ "su: user $user does not exist\n" ];
   my @groups = ();
   my $fh = new FileHandle("/etc/group")
     or return [ "opening /etc/group: $!\n" ];
@@ -201,17 +208,17 @@ sub su($) {
   $( = $gid;
   $) = $groups;
   if ($!) {
-    return [ "su: $!\n" ];
+    return 1, [ "su: $!\n" ];
   }
   if ($uid != 0) {
     $> = $uid;
     #$< = $uid;
     if ($!) {
-      return [ "su: $prog->[1]: $!\n" ];
+      return 1, [ "su: $prog->[1]: $!\n" ];
     }
   }
   #print STDERR "[($>,$<)($(,$))]";
-  return [];
+  return 0, [];
 }
 
 
@@ -237,10 +244,10 @@ sub sg($) {
          $) = $groups;
   }
   if ($!) {
-    return [ "sg: $!\n" ];
+    return 1, [ "sg: $!\n" ];
   }
   print STDERR "[($>,$<)($(,$))]";
-  return [];
+  return 0, [];
 }
 
 
@@ -251,13 +258,13 @@ sub exec_test($$) {
 
   if ($prog->[0] eq "umask") {
     umask oct $prog->[1];
-    return [];
+    return 0, [];
   } elsif ($prog->[0] eq "cd") {
     if (!chdir $prog->[1]) {
-      return [ "chdir: $prog->[1]: $!\n" ];
+      return 1, [ "chdir: $prog->[1]: $!\n" ];
     }
     $ENV{PWD} = getcwd;
-    return [];
+    return 0, [];
   } elsif ($prog->[0] eq "su") {
     return su($prog->[1]);
   } elsif ($prog->[0] eq "sg") {
@@ -267,10 +274,10 @@ sub exec_test($$) {
     # FIXME: need to evaluate $value, so that things like this will work:
     # export dir=$PWD/dir
     $ENV{$name} = $value;
-    return [];
+    return 0, [];
   } elsif ($prog->[0] eq "unset") {
     delete $ENV{$prog->[1]};
-    return [];
+    return 0, [];
   }
 
   pipe *IN2, *OUT
@@ -320,7 +327,8 @@ sub exec_test($$) {
       }
       push @$result, $_;
     }
-    return $result;
+    wait();
+    return $? >> 8, $result;
   } else {
     # Client
     $< = $>;

-- 
Jean Delvare
Suse L3




reply via email to

[Prev in Thread] Current Thread [Next in Thread]