2016-04-20 10:10:43 +08:00
|
|
|
#! /usr/bin/env perl
|
2022-05-03 18:52:38 +08:00
|
|
|
# Copyright 2015-2022 The OpenSSL Project Authors. All Rights Reserved.
|
2016-04-20 10:10:43 +08:00
|
|
|
#
|
2018-12-06 20:05:25 +08:00
|
|
|
# Licensed under the Apache License 2.0 (the "License"). You may not use
|
2016-04-20 10:10:43 +08:00
|
|
|
# this file except in compliance with the License. You can obtain a copy
|
|
|
|
# in the file LICENSE in the source distribution or at
|
|
|
|
# https://www.openssl.org/source/license.html
|
Groundwork for a perl based testing framework
The idea with this perl based testing framework is to make use of
what's delivered with perl and exists on all sorts of platforms.
The choice came to using Test::More and Test::Harness, as that seems
to be the most widely spread foundation, even if perl is aged.
The main runner of the show is run_tests.pl. As it currently stands,
it's designed to run from inside Makefile, but it's absolutely
possible to run it from the command line as well, like so:
cd test
OPENSSL_SRCDIR=.. perl run_tests.pl
The tester scripts themselves are stored in the subdirectory recipes/,
and initially, we have two such scripts, recipes/00-check_testalltests.t
and recipes/00-check_testexes.t. recipes/00-check_testalltests.t will
pick out the dependencies of "alltests" in test/Makefile, and check if
it can find recipes with corresponding names. recipes/00-check_testexes.t
does something similar, but bases it on existing compiled test binaries.
They make it easy to figure out what's to be added, and will be
removed when this effort is finished.
Individual recipes can be run as well, of course, as they are perl
scripts in themselves. For example, you can run only
recipes/00-check_testexes.t like so:
cd test
OPENSSL_SRCDIR=.. perl recipes/00-check_testexes.t
To make coding easier, there's a routine library OpenSSL::Test, which
is reachable in a perl script like so:
use lib 'testlib';
use OpenSSL::Test;
Reviewed-by: Rich Salz <rsalz@openssl.org>
2015-04-18 01:44:48 +08:00
|
|
|
|
|
|
|
use strict;
|
|
|
|
use warnings;
|
|
|
|
|
2020-06-24 18:12:20 +08:00
|
|
|
# Recognise VERBOSE aka V which is common on other projects.
|
2020-06-27 21:45:58 +08:00
|
|
|
# Additionally, recognise VERBOSE_FAILURE aka VF aka REPORT_FAILURES
|
|
|
|
# and recognise VERBOSE_FAILURE_PROGRESS aka VFP aka REPORT_FAILURES_PROGRESS.
|
2016-05-08 20:09:56 +08:00
|
|
|
BEGIN {
|
|
|
|
$ENV{HARNESS_VERBOSE} = "yes" if $ENV{VERBOSE} || $ENV{V};
|
2020-06-27 21:45:58 +08:00
|
|
|
$ENV{HARNESS_VERBOSE_FAILURE} = "yes"
|
|
|
|
if $ENV{VERBOSE_FAILURE} || $ENV{VF} || $ENV{REPORT_FAILURES};
|
2020-06-24 18:12:20 +08:00
|
|
|
$ENV{HARNESS_VERBOSE_FAILURE_PROGRESS} = "yes"
|
2020-06-27 21:45:58 +08:00
|
|
|
if ($ENV{VERBOSE_FAILURE_PROGRESS} || $ENV{VFP}
|
|
|
|
|| $ENV{REPORT_FAILURES_PROGRESS});
|
2016-05-08 20:09:56 +08:00
|
|
|
}
|
|
|
|
|
Groundwork for a perl based testing framework
The idea with this perl based testing framework is to make use of
what's delivered with perl and exists on all sorts of platforms.
The choice came to using Test::More and Test::Harness, as that seems
to be the most widely spread foundation, even if perl is aged.
The main runner of the show is run_tests.pl. As it currently stands,
it's designed to run from inside Makefile, but it's absolutely
possible to run it from the command line as well, like so:
cd test
OPENSSL_SRCDIR=.. perl run_tests.pl
The tester scripts themselves are stored in the subdirectory recipes/,
and initially, we have two such scripts, recipes/00-check_testalltests.t
and recipes/00-check_testexes.t. recipes/00-check_testalltests.t will
pick out the dependencies of "alltests" in test/Makefile, and check if
it can find recipes with corresponding names. recipes/00-check_testexes.t
does something similar, but bases it on existing compiled test binaries.
They make it easy to figure out what's to be added, and will be
removed when this effort is finished.
Individual recipes can be run as well, of course, as they are perl
scripts in themselves. For example, you can run only
recipes/00-check_testexes.t like so:
cd test
OPENSSL_SRCDIR=.. perl recipes/00-check_testexes.t
To make coding easier, there's a routine library OpenSSL::Test, which
is reachable in a perl script like so:
use lib 'testlib';
use OpenSSL::Test;
Reviewed-by: Rich Salz <rsalz@openssl.org>
2015-04-18 01:44:48 +08:00
|
|
|
use File::Spec::Functions qw/catdir catfile curdir abs2rel rel2abs/;
|
|
|
|
use File::Basename;
|
2017-08-02 04:43:56 +08:00
|
|
|
use FindBin;
|
|
|
|
use lib "$FindBin::Bin/../util/perl";
|
|
|
|
use OpenSSL::Glob;
|
2017-05-10 18:58:36 +08:00
|
|
|
|
2016-01-30 08:05:33 +08:00
|
|
|
my $srctop = $ENV{SRCTOP} || $ENV{TOP};
|
|
|
|
my $bldtop = $ENV{BLDTOP} || $ENV{TOP};
|
|
|
|
my $recipesdir = catdir($srctop, "test", "recipes");
|
2017-08-02 04:10:39 +08:00
|
|
|
my $libdir = rel2abs(catdir($srctop, "util", "perl"));
|
2020-09-01 11:13:09 +08:00
|
|
|
my $jobs = $ENV{HARNESS_JOBS} // 1;
|
Groundwork for a perl based testing framework
The idea with this perl based testing framework is to make use of
what's delivered with perl and exists on all sorts of platforms.
The choice came to using Test::More and Test::Harness, as that seems
to be the most widely spread foundation, even if perl is aged.
The main runner of the show is run_tests.pl. As it currently stands,
it's designed to run from inside Makefile, but it's absolutely
possible to run it from the command line as well, like so:
cd test
OPENSSL_SRCDIR=.. perl run_tests.pl
The tester scripts themselves are stored in the subdirectory recipes/,
and initially, we have two such scripts, recipes/00-check_testalltests.t
and recipes/00-check_testexes.t. recipes/00-check_testalltests.t will
pick out the dependencies of "alltests" in test/Makefile, and check if
it can find recipes with corresponding names. recipes/00-check_testexes.t
does something similar, but bases it on existing compiled test binaries.
They make it easy to figure out what's to be added, and will be
removed when this effort is finished.
Individual recipes can be run as well, of course, as they are perl
scripts in themselves. For example, you can run only
recipes/00-check_testexes.t like so:
cd test
OPENSSL_SRCDIR=.. perl recipes/00-check_testexes.t
To make coding easier, there's a routine library OpenSSL::Test, which
is reachable in a perl script like so:
use lib 'testlib';
use OpenSSL::Test;
Reviewed-by: Rich Salz <rsalz@openssl.org>
2015-04-18 01:44:48 +08:00
|
|
|
|
2021-06-15 22:11:51 +08:00
|
|
|
$ENV{OPENSSL_CONF} = rel2abs(catfile($srctop, "apps", "openssl.cnf"));
|
2021-05-24 20:25:28 +08:00
|
|
|
$ENV{OPENSSL_CONF_INCLUDE} = rel2abs(catdir($bldtop, "test"));
|
2020-04-30 23:08:57 +08:00
|
|
|
$ENV{OPENSSL_MODULES} = rel2abs(catdir($bldtop, "providers"));
|
|
|
|
$ENV{OPENSSL_ENGINES} = rel2abs(catdir($bldtop, "engines"));
|
2021-06-15 22:11:51 +08:00
|
|
|
$ENV{CTLOG_FILE} = rel2abs(catfile($srctop, "test", "ct", "log_list.cnf"));
|
2018-04-29 05:26:22 +08:00
|
|
|
|
2022-02-25 00:20:14 +08:00
|
|
|
# On platforms that support this, this will ensure malloc returns data that is
|
|
|
|
# set to a non-zero value. Can be helpful for detecting uninitialized reads in
|
|
|
|
# some situations.
|
|
|
|
$ENV{'MALLOC_PERTURB_'} = '128' if !defined $ENV{'MALLOC_PERTURB_'};
|
|
|
|
|
2017-05-10 18:58:36 +08:00
|
|
|
my %tapargs =
|
2019-09-11 17:05:11 +08:00
|
|
|
( verbosity => $ENV{HARNESS_VERBOSE} ? 1 : 0,
|
|
|
|
lib => [ $libdir ],
|
|
|
|
switches => '-w',
|
|
|
|
merge => 1,
|
2021-02-11 06:28:41 +08:00
|
|
|
timer => $ENV{HARNESS_TIMER} ? 1 : 0,
|
2017-05-10 18:58:36 +08:00
|
|
|
);
|
Groundwork for a perl based testing framework
The idea with this perl based testing framework is to make use of
what's delivered with perl and exists on all sorts of platforms.
The choice came to using Test::More and Test::Harness, as that seems
to be the most widely spread foundation, even if perl is aged.
The main runner of the show is run_tests.pl. As it currently stands,
it's designed to run from inside Makefile, but it's absolutely
possible to run it from the command line as well, like so:
cd test
OPENSSL_SRCDIR=.. perl run_tests.pl
The tester scripts themselves are stored in the subdirectory recipes/,
and initially, we have two such scripts, recipes/00-check_testalltests.t
and recipes/00-check_testexes.t. recipes/00-check_testalltests.t will
pick out the dependencies of "alltests" in test/Makefile, and check if
it can find recipes with corresponding names. recipes/00-check_testexes.t
does something similar, but bases it on existing compiled test binaries.
They make it easy to figure out what's to be added, and will be
removed when this effort is finished.
Individual recipes can be run as well, of course, as they are perl
scripts in themselves. For example, you can run only
recipes/00-check_testexes.t like so:
cd test
OPENSSL_SRCDIR=.. perl recipes/00-check_testexes.t
To make coding easier, there's a routine library OpenSSL::Test, which
is reachable in a perl script like so:
use lib 'testlib';
use OpenSSL::Test;
Reviewed-by: Rich Salz <rsalz@openssl.org>
2015-04-18 01:44:48 +08:00
|
|
|
|
2021-02-09 16:32:32 +08:00
|
|
|
if ($jobs > 1) {
|
|
|
|
if ($ENV{HARNESS_VERBOSE}) {
|
|
|
|
print "Warning: HARNESS_JOBS > 1 ignored with HARNESS_VERBOSE\n";
|
|
|
|
} else {
|
|
|
|
$tapargs{jobs} = $jobs;
|
|
|
|
print "Using HARNESS_JOBS=$jobs\n";
|
|
|
|
}
|
|
|
|
}
|
2020-06-30 15:23:56 +08:00
|
|
|
|
2019-09-11 17:05:11 +08:00
|
|
|
# Additional OpenSSL special TAP arguments. Because we can't pass them via
|
|
|
|
# TAP::Harness->new(), they will be accessed directly, see the
|
|
|
|
# TAP::Parser::OpenSSL implementation further down
|
|
|
|
my %openssl_args = ();
|
|
|
|
|
2020-06-08 19:40:34 +08:00
|
|
|
$openssl_args{'failure_verbosity'} = $ENV{HARNESS_VERBOSE} ? 0 :
|
2020-06-24 18:12:20 +08:00
|
|
|
$ENV{HARNESS_VERBOSE_FAILURE_PROGRESS} ? 2 :
|
|
|
|
1; # $ENV{HARNESS_VERBOSE_FAILURE}
|
|
|
|
print "Warning: HARNESS_VERBOSE overrides HARNESS_VERBOSE_FAILURE*\n"
|
|
|
|
if ($ENV{HARNESS_VERBOSE} && ($ENV{HARNESS_VERBOSE_FAILURE}
|
|
|
|
|| $ENV{HARNESS_VERBOSE_FAILURE_PROGRESS}));
|
|
|
|
print "Warning: HARNESS_VERBOSE_FAILURE_PROGRESS overrides HARNESS_VERBOSE_FAILURE\n"
|
|
|
|
if ($ENV{HARNESS_VERBOSE_FAILURE_PROGRESS} && $ENV{HARNESS_VERBOSE_FAILURE});
|
2019-09-11 17:05:11 +08:00
|
|
|
|
|
|
|
my $outfilename = $ENV{HARNESS_TAP_COPY};
|
|
|
|
open $openssl_args{'tap_copy'}, ">$outfilename"
|
|
|
|
or die "Trying to create $outfilename: $!\n"
|
|
|
|
if defined $outfilename;
|
|
|
|
|
Add a more versatile test chooser
So far, the test runner (test/run_tests.pl) could get a list of tests
to run, and if non were given, it assumes all available tests should
be performed.
However, that makes skipping just one or two tests a bit of a pain.
This change makes the possibilities more versatile, run_checker.pl
takes these arguments and will process them in the given order,
starting with an empty set of tests to perform:
alltests The current set becomes the whole set of
available tests.
test_xxx Adds 'test_xxx' to the current set.
-test_xxx Removes 'test_xxx' from the current set. If
nothing has been added to the set before this
argument, the current set is first initialised
to the whole set of available tests, then
'test_xxx' is removed from the current set.
list Display all available tests, then stop.
If no arguments are given, 'alltests' is assumed.
Reviewed-by: Emilia Käsper <emilia@openssl.org>
2016-09-01 19:34:32 +08:00
|
|
|
my @alltests = find_matching_tests("*");
|
|
|
|
my %tests = ();
|
|
|
|
|
2020-07-02 23:59:55 +08:00
|
|
|
sub reorder {
|
|
|
|
my $key = pop;
|
|
|
|
|
|
|
|
# for parallel test runs, do slow tests first
|
2020-12-02 16:05:22 +08:00
|
|
|
if ($jobs > 1 && $key =~ m/test_ssl_new|test_fuzz/) {
|
2021-05-31 23:00:38 +08:00
|
|
|
$key =~ s/(\d+)-/01-/;
|
2020-07-02 23:59:55 +08:00
|
|
|
}
|
|
|
|
return $key;
|
|
|
|
}
|
|
|
|
|
Add a more versatile test chooser
So far, the test runner (test/run_tests.pl) could get a list of tests
to run, and if non were given, it assumes all available tests should
be performed.
However, that makes skipping just one or two tests a bit of a pain.
This change makes the possibilities more versatile, run_checker.pl
takes these arguments and will process them in the given order,
starting with an empty set of tests to perform:
alltests The current set becomes the whole set of
available tests.
test_xxx Adds 'test_xxx' to the current set.
-test_xxx Removes 'test_xxx' from the current set. If
nothing has been added to the set before this
argument, the current set is first initialised
to the whole set of available tests, then
'test_xxx' is removed from the current set.
list Display all available tests, then stop.
If no arguments are given, 'alltests' is assumed.
Reviewed-by: Emilia Käsper <emilia@openssl.org>
2016-09-01 19:34:32 +08:00
|
|
|
my $initial_arg = 1;
|
|
|
|
foreach my $arg (@ARGV ? @ARGV : ('alltests')) {
|
|
|
|
if ($arg eq 'list') {
|
2020-07-02 23:59:55 +08:00
|
|
|
foreach (@alltests) {
|
|
|
|
(my $x = basename($_)) =~ s|^[0-9][0-9]-(.*)\.t$|$1|;
|
|
|
|
print $x,"\n";
|
|
|
|
}
|
|
|
|
exit 0;
|
Groundwork for a perl based testing framework
The idea with this perl based testing framework is to make use of
what's delivered with perl and exists on all sorts of platforms.
The choice came to using Test::More and Test::Harness, as that seems
to be the most widely spread foundation, even if perl is aged.
The main runner of the show is run_tests.pl. As it currently stands,
it's designed to run from inside Makefile, but it's absolutely
possible to run it from the command line as well, like so:
cd test
OPENSSL_SRCDIR=.. perl run_tests.pl
The tester scripts themselves are stored in the subdirectory recipes/,
and initially, we have two such scripts, recipes/00-check_testalltests.t
and recipes/00-check_testexes.t. recipes/00-check_testalltests.t will
pick out the dependencies of "alltests" in test/Makefile, and check if
it can find recipes with corresponding names. recipes/00-check_testexes.t
does something similar, but bases it on existing compiled test binaries.
They make it easy to figure out what's to be added, and will be
removed when this effort is finished.
Individual recipes can be run as well, of course, as they are perl
scripts in themselves. For example, you can run only
recipes/00-check_testexes.t like so:
cd test
OPENSSL_SRCDIR=.. perl recipes/00-check_testexes.t
To make coding easier, there's a routine library OpenSSL::Test, which
is reachable in a perl script like so:
use lib 'testlib';
use OpenSSL::Test;
Reviewed-by: Rich Salz <rsalz@openssl.org>
2015-04-18 01:44:48 +08:00
|
|
|
}
|
Add a more versatile test chooser
So far, the test runner (test/run_tests.pl) could get a list of tests
to run, and if non were given, it assumes all available tests should
be performed.
However, that makes skipping just one or two tests a bit of a pain.
This change makes the possibilities more versatile, run_checker.pl
takes these arguments and will process them in the given order,
starting with an empty set of tests to perform:
alltests The current set becomes the whole set of
available tests.
test_xxx Adds 'test_xxx' to the current set.
-test_xxx Removes 'test_xxx' from the current set. If
nothing has been added to the set before this
argument, the current set is first initialised
to the whole set of available tests, then
'test_xxx' is removed from the current set.
list Display all available tests, then stop.
If no arguments are given, 'alltests' is assumed.
Reviewed-by: Emilia Käsper <emilia@openssl.org>
2016-09-01 19:34:32 +08:00
|
|
|
if ($arg eq 'alltests') {
|
2020-07-02 23:59:55 +08:00
|
|
|
warn "'alltests' encountered, ignoring everything before that...\n"
|
|
|
|
unless $initial_arg;
|
|
|
|
%tests = map { $_ => 1 } @alltests;
|
Add a more versatile test chooser
So far, the test runner (test/run_tests.pl) could get a list of tests
to run, and if non were given, it assumes all available tests should
be performed.
However, that makes skipping just one or two tests a bit of a pain.
This change makes the possibilities more versatile, run_checker.pl
takes these arguments and will process them in the given order,
starting with an empty set of tests to perform:
alltests The current set becomes the whole set of
available tests.
test_xxx Adds 'test_xxx' to the current set.
-test_xxx Removes 'test_xxx' from the current set. If
nothing has been added to the set before this
argument, the current set is first initialised
to the whole set of available tests, then
'test_xxx' is removed from the current set.
list Display all available tests, then stop.
If no arguments are given, 'alltests' is assumed.
Reviewed-by: Emilia Käsper <emilia@openssl.org>
2016-09-01 19:34:32 +08:00
|
|
|
} elsif ($arg =~ m/^(-?)(.*)/) {
|
2020-07-02 23:59:55 +08:00
|
|
|
my $sign = $1;
|
|
|
|
my $test = $2;
|
|
|
|
my @matches = find_matching_tests($test);
|
|
|
|
|
|
|
|
# If '-foo' is the first arg, it's short for 'alltests -foo'
|
|
|
|
if ($sign eq '-' && $initial_arg) {
|
|
|
|
%tests = map { $_ => 1 } @alltests;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (scalar @matches == 0) {
|
|
|
|
warn "Test $test found no match, skipping ",
|
|
|
|
($sign eq '-' ? "removal" : "addition"),
|
|
|
|
"...\n";
|
|
|
|
} else {
|
|
|
|
foreach $test (@matches) {
|
|
|
|
if ($sign eq '-') {
|
|
|
|
delete $tests{$test};
|
|
|
|
} else {
|
|
|
|
$tests{$test} = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
Add a more versatile test chooser
So far, the test runner (test/run_tests.pl) could get a list of tests
to run, and if non were given, it assumes all available tests should
be performed.
However, that makes skipping just one or two tests a bit of a pain.
This change makes the possibilities more versatile, run_checker.pl
takes these arguments and will process them in the given order,
starting with an empty set of tests to perform:
alltests The current set becomes the whole set of
available tests.
test_xxx Adds 'test_xxx' to the current set.
-test_xxx Removes 'test_xxx' from the current set. If
nothing has been added to the set before this
argument, the current set is first initialised
to the whole set of available tests, then
'test_xxx' is removed from the current set.
list Display all available tests, then stop.
If no arguments are given, 'alltests' is assumed.
Reviewed-by: Emilia Käsper <emilia@openssl.org>
2016-09-01 19:34:32 +08:00
|
|
|
} else {
|
2020-07-02 23:59:55 +08:00
|
|
|
warn "I don't know what '$arg' is about, ignoring...\n";
|
Add a more versatile test chooser
So far, the test runner (test/run_tests.pl) could get a list of tests
to run, and if non were given, it assumes all available tests should
be performed.
However, that makes skipping just one or two tests a bit of a pain.
This change makes the possibilities more versatile, run_checker.pl
takes these arguments and will process them in the given order,
starting with an empty set of tests to perform:
alltests The current set becomes the whole set of
available tests.
test_xxx Adds 'test_xxx' to the current set.
-test_xxx Removes 'test_xxx' from the current set. If
nothing has been added to the set before this
argument, the current set is first initialised
to the whole set of available tests, then
'test_xxx' is removed from the current set.
list Display all available tests, then stop.
If no arguments are given, 'alltests' is assumed.
Reviewed-by: Emilia Käsper <emilia@openssl.org>
2016-09-01 19:34:32 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
$initial_arg = 0;
|
Groundwork for a perl based testing framework
The idea with this perl based testing framework is to make use of
what's delivered with perl and exists on all sorts of platforms.
The choice came to using Test::More and Test::Harness, as that seems
to be the most widely spread foundation, even if perl is aged.
The main runner of the show is run_tests.pl. As it currently stands,
it's designed to run from inside Makefile, but it's absolutely
possible to run it from the command line as well, like so:
cd test
OPENSSL_SRCDIR=.. perl run_tests.pl
The tester scripts themselves are stored in the subdirectory recipes/,
and initially, we have two such scripts, recipes/00-check_testalltests.t
and recipes/00-check_testexes.t. recipes/00-check_testalltests.t will
pick out the dependencies of "alltests" in test/Makefile, and check if
it can find recipes with corresponding names. recipes/00-check_testexes.t
does something similar, but bases it on existing compiled test binaries.
They make it easy to figure out what's to be added, and will be
removed when this effort is finished.
Individual recipes can be run as well, of course, as they are perl
scripts in themselves. For example, you can run only
recipes/00-check_testexes.t like so:
cd test
OPENSSL_SRCDIR=.. perl recipes/00-check_testexes.t
To make coding easier, there's a routine library OpenSSL::Test, which
is reachable in a perl script like so:
use lib 'testlib';
use OpenSSL::Test;
Reviewed-by: Rich Salz <rsalz@openssl.org>
2015-04-18 01:44:48 +08:00
|
|
|
}
|
|
|
|
|
2021-05-31 23:00:38 +08:00
|
|
|
# prep recipes are mandatory and need to be always run first
|
|
|
|
my @preps = glob(catfile($recipesdir,"00-prep_*.t"));
|
|
|
|
foreach my $test (@preps) {
|
|
|
|
delete $tests{$test};
|
|
|
|
}
|
|
|
|
|
Add a more versatile test chooser
So far, the test runner (test/run_tests.pl) could get a list of tests
to run, and if non were given, it assumes all available tests should
be performed.
However, that makes skipping just one or two tests a bit of a pain.
This change makes the possibilities more versatile, run_checker.pl
takes these arguments and will process them in the given order,
starting with an empty set of tests to perform:
alltests The current set becomes the whole set of
available tests.
test_xxx Adds 'test_xxx' to the current set.
-test_xxx Removes 'test_xxx' from the current set. If
nothing has been added to the set before this
argument, the current set is first initialised
to the whole set of available tests, then
'test_xxx' is removed from the current set.
list Display all available tests, then stop.
If no arguments are given, 'alltests' is assumed.
Reviewed-by: Emilia Käsper <emilia@openssl.org>
2016-09-01 19:34:32 +08:00
|
|
|
sub find_matching_tests {
|
|
|
|
my ($glob) = @_;
|
Groundwork for a perl based testing framework
The idea with this perl based testing framework is to make use of
what's delivered with perl and exists on all sorts of platforms.
The choice came to using Test::More and Test::Harness, as that seems
to be the most widely spread foundation, even if perl is aged.
The main runner of the show is run_tests.pl. As it currently stands,
it's designed to run from inside Makefile, but it's absolutely
possible to run it from the command line as well, like so:
cd test
OPENSSL_SRCDIR=.. perl run_tests.pl
The tester scripts themselves are stored in the subdirectory recipes/,
and initially, we have two such scripts, recipes/00-check_testalltests.t
and recipes/00-check_testexes.t. recipes/00-check_testalltests.t will
pick out the dependencies of "alltests" in test/Makefile, and check if
it can find recipes with corresponding names. recipes/00-check_testexes.t
does something similar, but bases it on existing compiled test binaries.
They make it easy to figure out what's to be added, and will be
removed when this effort is finished.
Individual recipes can be run as well, of course, as they are perl
scripts in themselves. For example, you can run only
recipes/00-check_testexes.t like so:
cd test
OPENSSL_SRCDIR=.. perl recipes/00-check_testexes.t
To make coding easier, there's a routine library OpenSSL::Test, which
is reachable in a perl script like so:
use lib 'testlib';
use OpenSSL::Test;
Reviewed-by: Rich Salz <rsalz@openssl.org>
2015-04-18 01:44:48 +08:00
|
|
|
|
2017-03-10 02:08:03 +08:00
|
|
|
if ($glob =~ m|^[\d\[\]\?\-]+$|) {
|
2021-05-31 23:00:38 +08:00
|
|
|
return glob(catfile($recipesdir,"$glob-*.t"));
|
2017-03-10 02:08:03 +08:00
|
|
|
}
|
2021-05-31 23:00:38 +08:00
|
|
|
|
|
|
|
return glob(catfile($recipesdir,"*-$glob.t"));
|
2015-09-15 20:07:10 +08:00
|
|
|
}
|
2017-05-10 18:58:36 +08:00
|
|
|
|
2019-09-11 17:05:11 +08:00
|
|
|
# The following is quite a bit of hackery to adapt to both TAP::Harness
|
|
|
|
# and Test::Harness, depending on what's available.
|
2020-06-08 19:40:34 +08:00
|
|
|
# The TAP::Harness hack allows support for HARNESS_VERBOSE_FAILURE* and
|
2019-09-11 17:05:11 +08:00
|
|
|
# HARNESS_TAP_COPY, while the Test::Harness hack can't, because the pre
|
|
|
|
# TAP::Harness Test::Harness simply doesn't have support for this sort of
|
|
|
|
# thing.
|
|
|
|
#
|
|
|
|
# We use eval to avoid undue interruption if TAP::Harness isn't present.
|
|
|
|
|
|
|
|
my $package;
|
|
|
|
my $eres;
|
|
|
|
|
|
|
|
$eres = eval {
|
|
|
|
package TAP::Parser::OpenSSL;
|
2020-07-21 17:32:02 +08:00
|
|
|
use parent -norequire, 'TAP::Parser';
|
|
|
|
require TAP::Parser;
|
2019-09-11 17:05:11 +08:00
|
|
|
|
|
|
|
sub new {
|
|
|
|
my $class = shift;
|
|
|
|
my %opts = %{ shift() };
|
2020-06-08 19:40:34 +08:00
|
|
|
my $failure_verbosity = $openssl_args{failure_verbosity};
|
|
|
|
my @plans = (); # initial level, no plan yet
|
|
|
|
my $output_buffer = "";
|
2019-09-11 17:05:11 +08:00
|
|
|
|
|
|
|
# We rely heavily on perl closures to make failure verbosity work
|
|
|
|
# We need to do so, because there's no way to safely pass extra
|
|
|
|
# objects down all the way to the TAP::Parser::Result object
|
|
|
|
my @failure_output = ();
|
|
|
|
my %callbacks = ();
|
2020-06-08 19:40:34 +08:00
|
|
|
if ($failure_verbosity > 0 || defined $openssl_args{tap_copy}) {
|
|
|
|
$callbacks{ALL} = sub { # on each line of test output
|
2019-09-11 17:05:11 +08:00
|
|
|
my $self = shift;
|
|
|
|
my $fh = $openssl_args{tap_copy};
|
|
|
|
print $fh $self->as_string, "\n"
|
|
|
|
if defined $fh;
|
2020-06-08 19:40:34 +08:00
|
|
|
|
|
|
|
my $failure_verbosity = $openssl_args{failure_verbosity};
|
2020-06-24 18:12:20 +08:00
|
|
|
if ($failure_verbosity > 0) {
|
2020-06-08 19:40:34 +08:00
|
|
|
my $is_plan = $self->is_plan;
|
|
|
|
my $tests_planned = $is_plan && $self->tests_planned;
|
|
|
|
my $is_test = $self->is_test;
|
|
|
|
my $is_ok = $is_test && $self->is_ok;
|
2020-06-20 23:20:20 +08:00
|
|
|
|
|
|
|
# workaround for parser not coping with sub-test indentation
|
2020-06-08 19:40:34 +08:00
|
|
|
if ($self->is_unknown) {
|
2020-06-20 23:20:20 +08:00
|
|
|
my $level = $#plans;
|
|
|
|
my $indent = $level < 0 ? "" : " " x ($level * 4);
|
|
|
|
|
2020-06-08 19:40:34 +08:00
|
|
|
($is_plan, $tests_planned) = (1, $1)
|
2020-06-20 23:20:20 +08:00
|
|
|
if ($self->as_string =~ m/^$indent 1\.\.(\d+)/);
|
2020-06-08 19:40:34 +08:00
|
|
|
($is_test, $is_ok) = (1, !$1)
|
2020-06-20 23:20:20 +08:00
|
|
|
if ($self->as_string =~ m/^$indent(not )?ok /);
|
2020-06-08 19:40:34 +08:00
|
|
|
}
|
2020-06-20 23:20:20 +08:00
|
|
|
|
2020-06-08 19:40:34 +08:00
|
|
|
if ($is_plan) {
|
|
|
|
push @plans, $tests_planned;
|
|
|
|
$output_buffer = ""; # ignore comments etc. until plan
|
|
|
|
} elsif ($is_test) { # result of a test
|
|
|
|
pop @plans if @plans && --($plans[-1]) <= 0;
|
|
|
|
print $output_buffer if !$is_ok;
|
2020-06-20 23:07:52 +08:00
|
|
|
print "\n".$self->as_string
|
2020-06-08 19:40:34 +08:00
|
|
|
if !$is_ok || $failure_verbosity == 2;
|
2020-06-24 18:13:38 +08:00
|
|
|
print "\n# ------------------------------------------------------------------------------" if !$is_ok;
|
2020-06-08 19:40:34 +08:00
|
|
|
$output_buffer = "";
|
2020-06-20 23:07:52 +08:00
|
|
|
} elsif ($self->as_string ne "") {
|
|
|
|
# typically is_comment or is_unknown
|
|
|
|
$output_buffer .= "\n".$self->as_string;
|
2020-06-08 19:40:34 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2019-09-11 17:05:11 +08:00
|
|
|
}
|
|
|
|
|
2020-06-08 19:40:34 +08:00
|
|
|
if ($failure_verbosity > 0) {
|
2019-09-11 17:05:11 +08:00
|
|
|
$callbacks{EOF} = sub {
|
|
|
|
my $self = shift;
|
|
|
|
|
|
|
|
# We know we are a TAP::Parser::Aggregator object
|
|
|
|
if (scalar $self->failed > 0 && @failure_output) {
|
|
|
|
# We add an extra empty line, because in the case of a
|
|
|
|
# progress counter, we're still at the end of that progress
|
|
|
|
# line.
|
|
|
|
print $_, "\n" foreach (("", @failure_output));
|
|
|
|
}
|
2020-06-08 19:40:34 +08:00
|
|
|
# Echo any trailing comments etc.
|
2020-06-24 18:12:20 +08:00
|
|
|
print "$output_buffer";
|
2019-09-11 17:05:11 +08:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
if (keys %callbacks) {
|
|
|
|
# If %opts already has a callbacks element, the order here
|
|
|
|
# ensures we do not override it
|
|
|
|
%opts = ( callbacks => { %callbacks }, %opts );
|
|
|
|
}
|
|
|
|
|
|
|
|
return $class->SUPER::new({ %opts });
|
|
|
|
}
|
2017-05-10 18:58:36 +08:00
|
|
|
|
2019-09-11 17:05:11 +08:00
|
|
|
package TAP::Harness::OpenSSL;
|
2020-07-21 17:32:02 +08:00
|
|
|
use parent -norequire, 'TAP::Harness';
|
|
|
|
require TAP::Harness;
|
2019-09-11 17:05:11 +08:00
|
|
|
|
|
|
|
package main;
|
|
|
|
|
|
|
|
$tapargs{parser_class} = "TAP::Parser::OpenSSL";
|
|
|
|
$package = 'TAP::Harness::OpenSSL';
|
|
|
|
};
|
|
|
|
|
|
|
|
unless (defined $eres) {
|
|
|
|
$eres = eval {
|
|
|
|
# Fake TAP::Harness in case it's not loaded
|
|
|
|
package TAP::Harness::fake;
|
|
|
|
use parent 'Test::Harness';
|
|
|
|
|
|
|
|
sub new {
|
|
|
|
my $class = shift;
|
|
|
|
my %args = %{ shift() };
|
|
|
|
|
|
|
|
return bless { %args }, $class;
|
|
|
|
}
|
|
|
|
|
|
|
|
sub runtests {
|
|
|
|
my $self = shift;
|
|
|
|
|
|
|
|
# Pre TAP::Harness Test::Harness doesn't support [ filename, name ]
|
|
|
|
# elements, so convert such elements to just be the filename
|
|
|
|
my @args = map { ref($_) eq 'ARRAY' ? $_->[0] : $_ } @_;
|
|
|
|
|
|
|
|
my @switches = ();
|
|
|
|
if ($self->{switches}) {
|
|
|
|
push @switches, $self->{switches};
|
|
|
|
}
|
|
|
|
if ($self->{lib}) {
|
|
|
|
foreach (@{$self->{lib}}) {
|
|
|
|
my $l = $_;
|
|
|
|
|
|
|
|
# It seems that $switches is getting interpreted with 'eval'
|
|
|
|
# or something like that, and that we need to take care of
|
|
|
|
# backslashes or they will disappear along the way.
|
|
|
|
$l =~ s|\\|\\\\|g if $^O eq "MSWin32";
|
|
|
|
push @switches, "-I$l";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$Test::Harness::switches = join(' ', @switches);
|
|
|
|
Test::Harness::runtests(@args);
|
|
|
|
}
|
|
|
|
|
|
|
|
package main;
|
|
|
|
$package = 'TAP::Harness::fake';
|
|
|
|
};
|
|
|
|
}
|
2017-05-10 18:58:36 +08:00
|
|
|
|
2019-09-11 17:05:11 +08:00
|
|
|
unless (defined $eres) {
|
|
|
|
print $@,"\n" if $@;
|
|
|
|
print $!,"\n" if $!;
|
|
|
|
exit 127;
|
2017-05-10 18:58:36 +08:00
|
|
|
}
|
|
|
|
|
2019-09-11 17:05:11 +08:00
|
|
|
my $harness = $package->new(\%tapargs);
|
|
|
|
my $ret =
|
2021-05-31 23:00:38 +08:00
|
|
|
$harness->runtests(map { [ abs2rel($_, rel2abs(curdir())), basename($_) ] }
|
|
|
|
@preps);
|
2022-03-07 18:48:13 +08:00
|
|
|
|
|
|
|
if (ref($ret) ne "TAP::Parser::Aggregator" || !$ret->has_errors) {
|
|
|
|
$ret =
|
|
|
|
$harness->runtests(map { [ abs2rel($_, rel2abs(curdir())), basename($_) ] }
|
|
|
|
sort { reorder($a) cmp reorder($b) } keys %tests);
|
|
|
|
}
|
2017-05-10 18:58:36 +08:00
|
|
|
|
2021-06-16 12:48:12 +08:00
|
|
|
# If this is a TAP::Parser::Aggregator, $ret->has_errors is the count of
|
|
|
|
# tests that failed. We don't bother with that exact number, just exit
|
|
|
|
# with an appropriate exit code when it isn't zero.
|
|
|
|
if (ref($ret) eq "TAP::Parser::Aggregator") {
|
|
|
|
exit 0 unless $ret->has_errors;
|
|
|
|
exit 1 unless $^O eq 'VMS';
|
|
|
|
# On VMS, perl converts an exit 1 to SS$_ABORT (%SYSTEM-F-ABORT), which
|
|
|
|
# is a bit harsh. As per perl recommendations, we explicitly use the
|
|
|
|
# same VMS status code as typical C programs would for exit(1), except
|
|
|
|
# we set the error severity rather than success.
|
|
|
|
# Ref: https://perldoc.perl.org/perlport#exit
|
|
|
|
# https://perldoc.perl.org/perlvms#$?
|
|
|
|
exit 0x35a000 # C facility code
|
|
|
|
+ 8 # 1 << 3 (to make space for the 3 severity bits)
|
|
|
|
+ 2 # severity: E(rror)
|
|
|
|
+ 0x10000000; # bit 28 set => the shell stays silent
|
|
|
|
}
|
2017-05-10 18:58:36 +08:00
|
|
|
|
2019-09-11 17:05:11 +08:00
|
|
|
# If this isn't a TAP::Parser::Aggregator, it's the pre-TAP test harness,
|
|
|
|
# which simply dies at the end if any test failed, so we don't need to bother
|
|
|
|
# with any exit code in that case.
|