From: Heiko Schlittermann (HS12-RIPE) Date: Fri, 4 Nov 2016 14:36:50 +0000 (+0100) Subject: Testsuite: Add flavour detection X-Git-Tag: exim-4_88_RC4~5 X-Git-Url: https://git.exim.org/users/heiko/exim.git/commitdiff_plain/6336058cedeecb91a64ed69143b8b5221d08e16c Testsuite: Add flavour detection --- diff --git a/test/README b/test/README index 485ce290d..1a300663b 100644 --- a/test/README +++ b/test/README @@ -268,11 +268,15 @@ There are some options for the ./runtest script itself: -FLAVOUR This allows "overrides" for the test results. It's intended use is to deal with distro specific differences in the test - output. The default flavour is "foo". If during the test - run differences between the current and the expected output - are found and no flavour file exists already, you may update - the "common" expected output or you may create a flavour - file. If a flavour file already exists, any updates will go + output. The default flavour is "FOO" if autodetection fails. + (Autodection is possible for known flavours only. Known + flavours are computed after file name extensions in stdout/* + and stderr/*.) + + If during the test run differences between the current and + the expected output are found and no flavour file exists already, + you may update the "common" expected output or you may create a + flavour file. If a flavour file already exists, any updates will go into that flavour file! -KEEP Normally, after a successful run, the test output files are diff --git a/test/lib/Exim/Runtest.pm b/test/lib/Exim/Runtest.pm index 1677ae3e6..bdf9c60d6 100644 --- a/test/lib/Exim/Runtest.pm +++ b/test/lib/Exim/Runtest.pm @@ -2,12 +2,13 @@ package Exim::Runtest; use 5.010; use strict; use warnings; +use File::Basename; use IO::Socket::INET; use Cwd; use Carp; use parent 'Exporter'; -our @EXPORT_OK = qw(mailgroup dynamic_socket exim_binary); +our @EXPORT_OK = qw(mailgroup dynamic_socket exim_binary flavour flavours); our %EXPORT_TAGS = ( all => \@EXPORT_OK, ); @@ -104,6 +105,36 @@ sub exim_binary { return $binaries[0], @_; } +sub flavour { + my $etc = '/etc'; + + if (@_) { + croak "do not pass a directory, it's for testing only" + unless $ENV{HARNESS_ACTIVE}; + $etc = shift; + } + + if (open(my $f, '<', "$etc/os-release")) { + local $_ = join '', <$f>; + my ($id) = /^ID="?(.*?)"?\s*$/m; + my ($version) = /^VERSION_ID="?(.*?)"?\s*$/m; + return "$id$version"; + } + + if (open(my $f, '<', "$etc/debian_version")) { + chomp(local $_ = <$f>); + $_ = int $_; + return "debian$_"; + } + + undef; +} + +sub flavours { + my %h = map { /\.(\S+)$/, 1 } + glob('stdout/*.*'), glob('stderr/*.*'); + return sort keys %h; +} 1; @@ -131,6 +162,16 @@ Otherwise search the binary (while honouring C, C<../scripts/os-type> and C<../os-arch>) and return the the path to the binary and the unmodified I<@argv>. +=item B() + +Find a hint for the current flavour (Linux distro). It does so by checking +typical files in the F directory. + +=item B() + +Return a list of available flavours. It does so by scanning F and +F for I files (extensions after the numerical prefix. + =back =cut diff --git a/test/runtest b/test/runtest index fb1cfc762..d97969cf3 100755 --- a/test/runtest +++ b/test/runtest @@ -49,7 +49,10 @@ $gnutls_dh_bits_normal = 2236; $cf = "bin/cf -exact"; $cr = "\r"; $debug = 0; -$flavour = 'FOO'; +$flavour = do { + my $f = Exim::Runtest::flavour(); + (grep { $f eq $_ } Exim::Runtest::flavours()) ? $f : 'FOO'; +}; $force_continue = 0; $force_update = 0; $log_failed_filename = "failed-summary.log"; diff --git a/test/t/00-basic.t b/test/t/00-basic.t index ae8eff77d..49d6f6871 100644 --- a/test/t/00-basic.t +++ b/test/t/00-basic.t @@ -5,7 +5,7 @@ use Test::Exception; use lib 'lib'; use_ok 'Exim::Runtest', qw(:all) or BAIL_OUT 'Can not load the module'; -can_ok 'Exim::Runtest', qw(mailgroup dynamic_socket exim_binary); +can_ok 'Exim::Runtest', qw(mailgroup dynamic_socket exim_binary flavour flavours); pod_coverage_ok 'Exim::Runtest' => 'docs complete'; subtest 'mailgroup' => sub { @@ -39,4 +39,11 @@ subtest 'exim_binary' => sub { is_deeply [exim_binary(@argv2)], ["$cwd/t/samples/foo", @argv2[1,$#argv2]] => 'got the binary as rel path from argv'; }; +subtest 'flavour' => sub { + is flavour('t/samples/etc.debian8-os-release'), 'debian8' => 'got flavour debian8 from os-release'; + is flavour('t/samples/etc.debian8-debian-version'), 'debian8' => 'got flavour debian8 from debian_version'; + is flavour('t/samples/etc.fedora24'), 'fedora24' => 'got flavour fedora24 from os-release'; + is_deeply [flavours()], ['debian8'] => 'got available flavours'; +}; + done_testing; diff --git a/test/t/samples/etc.debian8-debian-version/debian_version b/test/t/samples/etc.debian8-debian-version/debian_version new file mode 100644 index 000000000..48c26da3e --- /dev/null +++ b/test/t/samples/etc.debian8-debian-version/debian_version @@ -0,0 +1 @@ +8.6 diff --git a/test/t/samples/etc.debian8-os-release/debian_version b/test/t/samples/etc.debian8-os-release/debian_version new file mode 100644 index 000000000..48c26da3e --- /dev/null +++ b/test/t/samples/etc.debian8-os-release/debian_version @@ -0,0 +1 @@ +8.6 diff --git a/test/t/samples/etc.debian8-os-release/os-release b/test/t/samples/etc.debian8-os-release/os-release new file mode 100644 index 000000000..120c51b08 --- /dev/null +++ b/test/t/samples/etc.debian8-os-release/os-release @@ -0,0 +1,8 @@ +PRETTY_NAME="Debian GNU/Linux 8 (jessie)" +NAME="Debian GNU/Linux" +VERSION_ID="8" +VERSION="8 (jessie)" +ID=debian +HOME_URL="http://www.debian.org/" +SUPPORT_URL="http://www.debian.org/support" +BUG_REPORT_URL="https://bugs.debian.org/" diff --git a/test/t/samples/etc.fedora24/os-release b/test/t/samples/etc.fedora24/os-release new file mode 100644 index 000000000..f962ae641 --- /dev/null +++ b/test/t/samples/etc.fedora24/os-release @@ -0,0 +1,14 @@ +NAME=Fedora +VERSION="24 (Twenty Four)" +ID=fedora +VERSION_ID=24 +PRETTY_NAME="Fedora 24 (Twenty Four)" +ANSI_COLOR="0;34" +CPE_NAME="cpe:/o:fedoraproject:fedora:24" +HOME_URL="https://fedoraproject.org/" +BUG_REPORT_URL="https://bugzilla.redhat.com/" +REDHAT_BUGZILLA_PRODUCT="Fedora" +REDHAT_BUGZILLA_PRODUCT_VERSION=24 +REDHAT_SUPPORT_PRODUCT="Fedora" +REDHAT_SUPPORT_PRODUCT_VERSION=24 +PRIVACY_POLICY_URL=https://fedoraproject.org/wiki/Legal:PrivacyPolicy