summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/FILEFORMAT.md19
-rw-r--r--tests/data/test8427
-rwxr-xr-xtests/ftpserver.pl30
-rwxr-xr-xtests/runtests.pl20
4 files changed, 60 insertions, 16 deletions
diff --git a/tests/FILEFORMAT.md b/tests/FILEFORMAT.md
index 0f5ae7f51..6f6e71bb7 100644
--- a/tests/FILEFORMAT.md
+++ b/tests/FILEFORMAT.md
@@ -21,6 +21,25 @@ variables are substituted by the their respective contents and the output
version of the test file is stored as `log/testNUM`. That version is what will
be read and used by the test servers.
+## Base64 Encoding
+
+In the preprocess stage, a special instruction can be used to have runtests.pl
+base64 encode a certain section and insert in the generated output file. This
+is in particular good for test cases where the test tool is expected to pass
+in base64 encoded content that might use dynamic information that is unique
+for this particular test invocation, like the server port number.
+
+To insert a base64 encoded string into the output, use this syntax:
+
+ %b64[ data to encode ]b64%
+
+The data to encode can then use any of the existing variables mentioned below,
+or even percent-encoded individual bytes. As an example, insert the HTTP
+server's port number (in ASCII) followed by a space and the hexadecimal byte
+9a:
+
+ %b64[%HTTPPORT %9a]b64%
+
# Variables
When the test is preprocessed, a range of "variables" in the test file will be
diff --git a/tests/data/test842 b/tests/data/test842
index 1d9181e17..2b5ae1c18 100644
--- a/tests/data/test842
+++ b/tests/data/test842
@@ -15,7 +15,7 @@ RFC7628
<servercmd>
AUTH OAUTHBEARER
REPLY AUTHENTICATE +
-REPLY bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMwFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ== A002 OK AUTHENTICATE completed
+REPLY %b64[n,a=user,%01host=127.0.0.1%01port=%IMAPPORT%01auth=Bearer mF_9.B5f-4.1JqM%01%01]b64% A002 OK AUTHENTICATE completed
</servercmd>
<data>
From: me@somewhere
@@ -42,9 +42,6 @@ IMAP OAuth 2.0 (OAUTHBEARER) authentication
</command>
# The protocol section doesn't support ways of specifying the raw data in the
# base64 encoded message so we must assert this
-<precheck>
-perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP' ne '127.0.0.1' || '%IMAPPORT' ne '9003' );"
-</precheck>
</client>
#
@@ -53,7 +50,7 @@ perl -e "print 'Test requires default test server host and port' if ( '%HOSTIP'
<protocol>
A001 CAPABILITY
A002 AUTHENTICATE OAUTHBEARER
-bixhPXVzZXIsAWhvc3Q9MTI3LjAuMC4xAXBvcnQ9OTAwMwFhdXRoPUJlYXJlciBtRl85LkI1Zi00LjFKcU0BAQ==
+%b64[n,a=user,%01host=127.0.0.1%01port=%IMAPPORT%01auth=Bearer mF_9.B5f-4.1JqM%01%01]b64%
A003 SELECT 842
A004 FETCH 1 BODY[]
A005 LOGOUT
diff --git a/tests/ftpserver.pl b/tests/ftpserver.pl
index a0b36e5de..d587f453e 100755
--- a/tests/ftpserver.pl
+++ b/tests/ftpserver.pl
@@ -83,6 +83,7 @@ my $proto = 'ftp'; # default server protocol
my $srcdir; # directory where ftpserver.pl is located
my $srvrname; # server name for presentation purposes
my $cwd_testno; # test case numbers extracted from CWD command
+my $testno = 0; # test case number (read from ftpserver.cmd)
my $path = '.';
my $logdir = $path .'/log';
@@ -449,17 +450,14 @@ sub startsf {
# Returns the given test's reply data
#
sub getreplydata {
- my ($testno) = @_;
+ my ($num) = @_;
my $testpart = "";
- $testno =~ s/^([^0-9]*)//;
- if($testno > 10000) {
- $testpart = $testno % 10000;
- $testno = int($testno / 10000);
+ $num =~ s/^([^0-9]*)//;
+ if($num > 10000) {
+ $testpart = $num % 10000;
}
- loadtest("$srcdir/data/test$testno");
-
my @data = getpart("reply", "data$testpart");
if((!@data) && ($testpart ne "")) {
@data = getpart("reply", "data");
@@ -2093,7 +2091,8 @@ my @ftpdir=("total 20\r\n",
logmsg "pass LIST data on data connection\n";
if($cwd_testno) {
- loadtest("$srcdir/data/test$cwd_testno");
+ loadtest("$logdir/test$cwd_testno") ||
+ loadtest("$srcdir/data/test$cwd_testno");
my @data = getpart("reply", "data");
for(@data) {
@@ -2156,7 +2155,8 @@ sub MDTM_ftp {
$testno = int($testno / 10000);
}
- loadtest("$srcdir/data/test$testno");
+ loadtest("$logdir/test$testno") ||
+ loadtest("$srcdir/data/test$testno");
my @data = getpart("reply", "mdtm");
@@ -2209,7 +2209,8 @@ sub SIZE_ftp {
$testno = int($testno / 10000);
}
- loadtest("$srcdir/data/test$testno");
+ loadtest("$logdir/test$testno") ||
+ loadtest("$srcdir/data/test$testno");
my @data = getpart("reply", "size");
@@ -2298,7 +2299,8 @@ sub RETR_ftp {
$testno = int($testno / 10000);
}
- loadtest("$srcdir/data/test$testno");
+ loadtest("$logdir/test$testno") ||
+ loadtest("$srcdir/data/test$testno");
my @data = getpart("reply", "data$testpart");
@@ -2881,6 +2883,10 @@ sub customize {
$nosave = 1;
logmsg "FTPD: NOSAVE prevents saving of uploaded data\n";
}
+ elsif($_ =~ /^Testnum (\d+)/){
+ $testno = $1;
+ logmsg "FTPD: run test case number: $testno\n";
+ }
}
close(CUSTOM);
}
@@ -3069,6 +3075,8 @@ while(1) {
$| = 1;
&customize(); # read test control instructions
+ loadtest("$logdir/test$testno") ||
+ loadtest("$srcdir/data/test$testno");
my $welcome = $commandreply{"welcome"};
if(!$welcome) {
diff --git a/tests/runtests.pl b/tests/runtests.pl
index cc70a1011..b25b3f456 100755
--- a/tests/runtests.pl
+++ b/tests/runtests.pl
@@ -76,6 +76,7 @@ use strict;
use warnings;
use Cwd;
use Digest::MD5 qw(md5);
+use MIME::Base64;
# Subs imported from serverhelp module
use serverhelp qw(
@@ -3338,6 +3339,20 @@ sub subVariables {
$$thing =~ s/${prefix}H2CVER/$h2cver/g;
}
+sub subBase64 {
+ my ($thing) = @_;
+
+ # cut out the base64 piece
+ if($$thing =~ s/%b64\[(.*)\]b64%/%%B64%%/i) {
+ my $d = $1;
+ # encode %NN characters
+ $d =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
+ my $enc = encode_base64($d, "");
+ # put the result into there
+ $$thing =~ s/%%B64%%/$enc/;
+ }
+}
+
sub fixarray {
my @in = @_;
@@ -3560,16 +3575,21 @@ sub singletest {
for my $s (@entiretest) {
my $f = $s;
subVariables(\$s, "%");
+ subBase64(\$s);
if($f ne $s) {
$diff++;
}
print D $s;
}
close(D);
+
# remove the separate test file again if nothing was updated to keep
# things simpler
unlink($otest) if(!$diff);
+ # in case the process changed the file, reload it
+ loadtest("log/test${testnum}") if($diff);
+
# timestamp required servers verification end
$timesrvrend{$testnum} = Time::HiRes::time();