runtests: make random seed fixed for a month
When using randomized features of runtests (-R and --shallow) it is useful to have a fixed random seed to make sure for example extra commits in a branch or a rebase won't change the seed that would make repeated runs work differently. As it is also useful to change seed sometimes, the default seed is now determined based on the current month (and first line curl -V output). When the month changes, so will the random seed. The specific seed is also shown in the standard test suite top header and it can be set explictly with the new --seed=[num] option so that the exact order of a previous run can be achieved. Closes #4734
This commit is contained in:
Родитель
5059f5552f
Коммит
a7d4693a48
|
@ -78,6 +78,9 @@ people checking the failures and the reasons for them might not have physical
|
||||||
access to the machine and logs.
|
access to the machine and logs.
|
||||||
.IP "-R"
|
.IP "-R"
|
||||||
Run the tests in a scrambled, or randomized, order instead of sequentially.
|
Run the tests in a scrambled, or randomized, order instead of sequentially.
|
||||||
|
|
||||||
|
The random seed initially set for this is fixed per month and can be set with
|
||||||
|
\fI--seed\fP.
|
||||||
.IP "-r"
|
.IP "-r"
|
||||||
Display run time statistics. (Requires Perl Time::HiRes module)
|
Display run time statistics. (Requires Perl Time::HiRes module)
|
||||||
.IP "-rf"
|
.IP "-rf"
|
||||||
|
@ -91,11 +94,18 @@ If \fB-R\fP is also used, the scrambling is done after the repeats have
|
||||||
extended the test sequence.
|
extended the test sequence.
|
||||||
.IP "-s"
|
.IP "-s"
|
||||||
Shorter output. Speaks less than default.
|
Shorter output. Speaks less than default.
|
||||||
.IP "--shallow=[num](,seed)"
|
.IP "--seed=[num]"
|
||||||
|
When using \fI--shallow\fP or \fI-R\rP that random certain aspects of the
|
||||||
|
behavior, this option can set the initial seed. If not set, the random seed
|
||||||
|
will be set based on the currently set local year and month and the first line
|
||||||
|
of the "curl -V" output.
|
||||||
|
.IP "--shallow=[num]"
|
||||||
Used together with \fB-t\fP. This limits the number of tests to fail in
|
Used together with \fB-t\fP. This limits the number of tests to fail in
|
||||||
torture mode to no more than 'num' per test case. If this reduces the amount,
|
torture mode to no more than 'num' per test case. If this reduces the amount,
|
||||||
the given 'seed' will be used to randomly discard entries to fail until the
|
the script will randomly discard entries to fail until the amount is 'num'.
|
||||||
amount is 'num'.
|
|
||||||
|
The random seed initially set for this is fixed per month and can be set with
|
||||||
|
\fI--seed\fP.
|
||||||
.IP "-t[num]"
|
.IP "-t[num]"
|
||||||
Selects a \fBtorture\fP test for the given tests. This makes runtests.pl first
|
Selects a \fBtorture\fP test for the given tests. This makes runtests.pl first
|
||||||
run the tests once and count the number of memory allocations made. It then
|
run the tests once and count the number of memory allocations made. It then
|
||||||
|
|
|
@ -69,6 +69,7 @@ BEGIN {
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Cwd;
|
use Cwd;
|
||||||
|
use Digest::MD5 qw(md5);
|
||||||
|
|
||||||
# Subs imported from serverhelp module
|
# Subs imported from serverhelp module
|
||||||
use serverhelp qw(
|
use serverhelp qw(
|
||||||
|
@ -323,7 +324,7 @@ my $torture;
|
||||||
my $tortnum;
|
my $tortnum;
|
||||||
my $tortalloc;
|
my $tortalloc;
|
||||||
my $shallow;
|
my $shallow;
|
||||||
my $shallowseed;
|
my $randseed = 0;
|
||||||
|
|
||||||
#######################################################################
|
#######################################################################
|
||||||
# logmsg is our general message logging subroutine.
|
# logmsg is our general message logging subroutine.
|
||||||
|
@ -3008,6 +3009,7 @@ sub checksystem {
|
||||||
logmsg sprintf("* Env: %s%s", $valgrind?"Valgrind ":"",
|
logmsg sprintf("* Env: %s%s", $valgrind?"Valgrind ":"",
|
||||||
$run_event_based?"event-based ":"");
|
$run_event_based?"event-based ":"");
|
||||||
logmsg sprintf("%s\n", $libtool?"Libtool ":"");
|
logmsg sprintf("%s\n", $libtool?"Libtool ":"");
|
||||||
|
logmsg ("* Seed: $randseed\n");
|
||||||
|
|
||||||
if($verbose) {
|
if($verbose) {
|
||||||
logmsg "* Ports:\n";
|
logmsg "* Ports:\n";
|
||||||
|
@ -5046,18 +5048,20 @@ while(@ARGV) {
|
||||||
$tortalloc = $1;
|
$tortalloc = $1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
elsif($ARGV[0] =~ /--shallow=(\d+)(,|)(\d*)/) {
|
elsif($ARGV[0] =~ /--shallow=(\d+)/) {
|
||||||
# Fail no more than this amount per tests when running
|
# Fail no more than this amount per tests when running
|
||||||
# torture.
|
# torture.
|
||||||
my ($num, $seed)=($1,$3);
|
my ($num)=($1);
|
||||||
$shallow=$num;
|
$shallow=$num;
|
||||||
$shallowseed=$seed?$seed:1234; # get a real seed later
|
|
||||||
srand($shallowseed); # make it predictable
|
|
||||||
}
|
}
|
||||||
elsif($ARGV[0] =~ /--repeat=(\d+)/) {
|
elsif($ARGV[0] =~ /--repeat=(\d+)/) {
|
||||||
# Repeat-run the given tests this many times
|
# Repeat-run the given tests this many times
|
||||||
$repeat = $1;
|
$repeat = $1;
|
||||||
}
|
}
|
||||||
|
elsif($ARGV[0] =~ /--seed=(\d+)/) {
|
||||||
|
# Set a fixed random seed (used for -R and --shallow)
|
||||||
|
$randseed = $1;
|
||||||
|
}
|
||||||
elsif($ARGV[0] eq "-a") {
|
elsif($ARGV[0] eq "-a") {
|
||||||
# continue anyway, even if a test fail
|
# continue anyway, even if a test fail
|
||||||
$anyway=1;
|
$anyway=1;
|
||||||
|
@ -5118,11 +5122,12 @@ Usage: runtests.pl [options] [test selection(s)]
|
||||||
-l list all test case names/descriptions
|
-l list all test case names/descriptions
|
||||||
-n no valgrind
|
-n no valgrind
|
||||||
-p print log file contents when a test fails
|
-p print log file contents when a test fails
|
||||||
-R scrambled order
|
-R scrambled order (uses the random seed, see --seed)
|
||||||
-r run time statistics
|
-r run time statistics
|
||||||
-rf full run time statistics
|
-rf full run time statistics
|
||||||
-s short output
|
-s short output
|
||||||
--shallow=[num](,seed) make the torture tests thinner
|
--seed=[num] set the random seed to a fixed number
|
||||||
|
--shallow=[num] randomly makes the torture tests "thinner"
|
||||||
-t[N] torture (simulate function failures); N means fail Nth function
|
-t[N] torture (simulate function failures); N means fail Nth function
|
||||||
-v verbose output
|
-v verbose output
|
||||||
-vc path use this curl only to verify the existing servers
|
-vc path use this curl only to verify the existing servers
|
||||||
|
@ -5175,6 +5180,20 @@ EOHELP
|
||||||
shift @ARGV;
|
shift @ARGV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!$randseed) {
|
||||||
|
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
|
||||||
|
localtime(time);
|
||||||
|
# seed of the month. December 2019 becomes 201912
|
||||||
|
$randseed = ($year+1900)*100 + $mon+1;
|
||||||
|
open(C, "$CURL --version 2>/dev/null|");
|
||||||
|
my @c = <C>;
|
||||||
|
close(C);
|
||||||
|
# use the first line of output and get the md5 out of it
|
||||||
|
my $str = md5($c[0]);
|
||||||
|
$randseed += unpack('S', $str); # unsigned 16 bit value
|
||||||
|
}
|
||||||
|
srand $randseed;
|
||||||
|
|
||||||
if(@testthis && ($testthis[0] ne "")) {
|
if(@testthis && ($testthis[0] ne "")) {
|
||||||
$TESTCASES=join(" ", @testthis);
|
$TESTCASES=join(" ", @testthis);
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче