diff options
| -rw-r--r-- | tests/FILEFORMAT.md | 19 | ||||
| -rw-r--r-- | tests/data/test842 | 7 | ||||
| -rwxr-xr-x | tests/ftpserver.pl | 30 | ||||
| -rwxr-xr-x | tests/runtests.pl | 20 |
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(); |
