Testsuite: Add flavour detection
authorHeiko Schlittermann (HS12-RIPE) <hs@schlittermann.de>
Fri, 4 Nov 2016 14:36:50 +0000 (15:36 +0100)
committerHeiko Schlittermann (HS12-RIPE) <hs@schlittermann.de>
Fri, 4 Nov 2016 14:45:07 +0000 (15:45 +0100)
test/README
test/lib/Exim/Runtest.pm
test/runtest
test/t/00-basic.t
test/t/samples/etc.debian8-debian-version/debian_version [new file with mode: 0644]
test/t/samples/etc.debian8-os-release/debian_version [new file with mode: 0644]
test/t/samples/etc.debian8-os-release/os-release [new file with mode: 0644]
test/t/samples/etc.fedora24/os-release [new file with mode: 0644]

index 485ce29..1a30066 100644 (file)
@@ -268,11 +268,15 @@ There are some options for the ./runtest script itself:
   -FLAVOUR <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
index 1677ae3..bdf9c60 100644 (file)
@@ -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<EXIM_BUILD_SUFFIX>,
 C<../scripts/os-type> and C<../os-arch>) and return the
 the path to the binary and the unmodified I<@argv>.
 
+=item B<flavour>()
+
+Find a hint for the current flavour (Linux distro). It does so by checking
+typical files in the F</etc> directory.
+
+=item B<flavours>()
+
+Return a list of available flavours. It does so by scanning F<stdout/> and
+F<stderr/> for I<flavour> files (extensions after the numerical prefix.
+
 =back
 
 =cut
index fb1cfc7..d97969c 100755 (executable)
@@ -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";
index ae8eff7..49d6f68 100644 (file)
@@ -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 (file)
index 0000000..48c26da
--- /dev/null
@@ -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 (file)
index 0000000..48c26da
--- /dev/null
@@ -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 (file)
index 0000000..120c51b
--- /dev/null
@@ -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 (file)
index 0000000..f962ae6
--- /dev/null
@@ -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