Browse Source

testutil: make runtests support %include

Using this instruction, a test case can include the contents of a file
into the test during the preprocessing.

Closes #12612
Daniel Stenberg 3 months ago
parent
commit
12f832d950
2 changed files with 24 additions and 0 deletions
  1. 11 0
      tests/FILEFORMAT.md
  2. 13 0
      tests/testutil.pm

+ 11 - 0
tests/FILEFORMAT.md

@@ -74,6 +74,17 @@ For example, to insert the word hello 100 times:
 
     %repeat[100 x hello]%
 
+## Include file
+
+This instruction allows a test case to include another file. It is helpful to
+remember that the ordinary variables are expanded before the include happens
+so `%LOGDIR` and the others can be used in the include line.
+
+The file name cannot contain `%` as that letter is used to end the name for
+the include instruction:
+
+    %include filename%
+
 ## Conditional lines
 
 Lines in the test file can be made to appear conditionally on a specific

+ 13 - 0
tests/testutil.pm

@@ -94,6 +94,15 @@ sub clearlogs {
 
 
 #######################################################################
+
+sub includefile {
+    my ($f) = @_;
+    open(F, "<$f");
+    my @a = <F>;
+    close(F);
+    return join("", @a);
+}
+
 sub subbase64 {
     my ($thing) = @_;
 
@@ -113,6 +122,7 @@ sub subbase64 {
         $d =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
         $$thing =~ s/%%HEX%%/$d/;
     }
+    # repeat
     while($$thing =~ s/%repeat\[(\d+) x (.*?)\]%/%%REPEAT%%/i) {
         # decode %NN characters
         my ($d, $n) = ($2, $1);
@@ -120,6 +130,9 @@ sub subbase64 {
         my $all = $d x $n;
         $$thing =~ s/%%REPEAT%%/$all/;
     }
+
+    # include a file
+    $$thing =~ s/%include ([^%]*)%[\n\r]+/includefile($1)/ge;
 }
 
 my $prevupdate;  # module scope so it remembers the last value