Add '3rd-party/xfpt/' from commit '24eaa721effcf2f56d1da62344ee27ac9721d3ec'
[exim.git] / 3rd-party / xfpt / testing / runtest
diff --git a/3rd-party/xfpt/testing/runtest b/3rd-party/xfpt/testing/runtest
new file mode 100755 (executable)
index 0000000..a125ce7
--- /dev/null
@@ -0,0 +1,165 @@
+#!/usr/bin/perl -w
+
+# Controlling script for xfpt tests
+
+$xfpt = "../src/xfpt -S ../share";
+$cf = (-f "/usr/local/bin/cf")? "cf" : "diff";
+
+$force_update = 0;
+$starttest = undef;
+$endtest = undef;
+$started = 0;
+
+$cmd_options = "";
+while (defined $ARGV[0] && $ARGV[0] =~ /^-/)
+  {
+  my($arg) = shift @ARGV;
+  $cmd_options .= "$arg ";
+  } 
+
+if (defined $ARGV[0])
+  {
+  $starttest = $endtest = $ARGV[0];
+  $endtest = $ARGV[1] if defined $ARGV[1];
+  $endtest = undef if $endtest eq "+"; 
+  }   
+  
+opendir(DIR, "./infiles") || die "Failed to opendir ./infiles: $!\n";
+@files = sort(readdir(DIR));
+closedir(DIR);
+
+while (scalar @files > 0)
+  {
+  my($copy) = 0;
+  my($file) = shift @files;
+  my($options) = $cmd_options; 
+
+  # Skip . and .. and also skip any file ending in .opt because that
+  # contains options for any given test, and any file ending in .inc
+  # because that is an included file. 
+    
+  next if $file =~ /^\.\.?$|\.opt$|\.inc$/;
+  
+  next if !$started && defined $starttest && $file !~ /^$starttest/;
+  $started = 1; 
+  
+  $options .= `cat infiles/$file.opt` if -e "infiles/$file.opt";
+  chomp $options; 
+  
+  my ($rc) = system("$xfpt $options -o test.xml infiles/$file " .
+                    "2> test.err");
+
+#  if (($rc >> 8) != 0)
+#    {
+#    printf("Test $file RC = 0x%x\n", $rc);
+#    system("more test.err"); 
+#    exit 1;
+#    }
+    
+  # Compare stderr output
+    
+  if (! -z "test.err")
+    {
+    if (! -e "outfiles/$file.err")
+      {
+      printf("There is stderr output, but outfiles/$file.err does not exist.\n");
+      system("more test.err"); 
+      exit 1;
+      }    
+
+    $rc = system("$cf test.err outfiles/$file.err >test.cf");
+    
+    if ($rc != 0)
+      {
+      # printf("text cf RC=$rc\n");
+      system("more test.cf");
+    
+      for (;;)
+        {
+        print "Continue, Update & retry, Quit? [Q] ";
+    
+        if ($force_update)
+          {
+          $_ = "u";
+          print "... update forced\n";
+          }
+        else
+          {
+          open(T, "/dev/tty") || die "Failed to open /dev/tty: $!\n";
+          $_ = <T>;
+          close(T);
+          }
+    
+        exit 1 if /^q?$/i;
+        goto CHECK_MAIN if /^c$/i; 
+        
+        if (/^u$/)
+          {
+          exit 1 if system("cp test.err outfiles/$file.err") != 0;
+          unshift @files, $file; 
+          print (("#" x 79) . "\n");
+          last;
+          }
+        }
+
+      redo;   # Repeats the test
+      } 
+    }  
+
+  # Compare the main output
+
+  CHECK_MAIN:
+   
+  $rc = system("$cf test.xml outfiles/$file >test.cf");
+  if ($rc != 0)
+    {
+    # printf("cf RC=$rc\n");
+    system("more test.cf");
+
+    for (;;)
+      {
+      print "View, Continue, Update & retry, Quit? [Q] ";
+
+      if ($force_update)
+        {
+        $_ = "u";
+        print "... update forced\n";
+        }
+      else
+        {
+        open(T, "/dev/tty") || die "Failed to open /dev/tty: $!\n";
+        $_ = <T>;
+        close(T);
+        }
+
+      exit 1 if /^\s*q?$/i;
+      last if /^\s*c$/i; 
+      
+      if (/^\s*v$/)
+        {
+        system ("less -XF test.xml"); 
+        # Stay in loop to reprompt 
+        }  
+      
+      elsif (/^\s*u$/)
+        {
+        exit 1 if system("cp test.xml outfiles/$file") != 0;
+        unshift @files, $file; 
+        print (("#" x 79) . "\n");
+        last;
+        }
+      }
+    }
+  else
+    {
+    printf ("Test $file OK\n");
+#    system("gzip outfiles/$file"); 
+    last if defined $endtest && $file =~ /^$endtest/;
+    }
+  }
+  
+die "No selected test found\n" if !$started; 
+
+system("/bin/rm -rf test.* test-*"); 
+
+# End