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
This commit is contained in:
Daniel Stenberg 2023-12-31 16:27:46 +01:00
parent 8620b11c3a
commit 12f832d950
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2
2 changed files with 24 additions and 0 deletions

View File

@ -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

View File

@ -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