Backport PR #1199 to improve validate_script_output result display
parent
a05be1c479
commit
e6e824cb2a
@ -0,0 +1,166 @@
|
||||
From f4be85471d4b9a555233f3cfc6ddaa9eb4b49a13 Mon Sep 17 00:00:00 2001
|
||||
From: Tina Mueller <tina.mueller@suse.com>
|
||||
Date: Wed, 14 Aug 2019 18:58:22 +0200
|
||||
Subject: [PATCH] Improve result display of validate_script_output
|
||||
|
||||
See also https://progress.opensuse.org/issues/54548
|
||||
|
||||
Before the output showed:
|
||||
|
||||
# wait_serial expected: (whatever the output was)
|
||||
|
||||
# Result:
|
||||
(whatever the output was)
|
||||
|
||||
"wait_serial" is wrong here, and it showed the actual output twice.
|
||||
|
||||
Now it shows:
|
||||
|
||||
validate_script_output got:
|
||||
(whatever the output was)
|
||||
|
||||
Check function (deparsed code):
|
||||
{
|
||||
package your::test::package;
|
||||
/some.*regex/;
|
||||
}
|
||||
|
||||
* Also validate_script_output() can now take a simple regular expression qr/foo/
|
||||
instead of a coderef.
|
||||
|
||||
* Add explicit return statement to make current behaviour transparent
|
||||
---
|
||||
cpanfile | 1 +
|
||||
dist/rpm/os-autoinst.spec | 2 +-
|
||||
t/03-testapi.t | 7 +++++
|
||||
testapi.pm | 55 ++++++++++++++++++++++++++++++---------
|
||||
4 files changed, 52 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/cpanfile b/cpanfile
|
||||
index 4b8e68592..da23f89d4 100644
|
||||
--- a/cpanfile
|
||||
+++ b/cpanfile
|
||||
@@ -1,3 +1,4 @@
|
||||
+requires 'B::Deparse';
|
||||
requires 'Carp';
|
||||
requires 'Carp::Always';
|
||||
requires 'Class::Accessor::Fast';
|
||||
diff --git a/t/03-testapi.t b/t/03-testapi.t
|
||||
index e893c1ddc..63aab9aca 100755
|
||||
--- a/t/03-testapi.t
|
||||
+++ b/t/03-testapi.t
|
||||
@@ -489,6 +489,7 @@ subtest 'validate_script_output' => sub {
|
||||
my $mock_testapi = Test::MockModule->new('testapi');
|
||||
$mock_testapi->mock(script_output => sub { return 'output'; });
|
||||
ok(!validate_script_output('script', sub { m/output/ }), 'validating output with default timeout');
|
||||
+ ok(!validate_script_output('script', qr/output/), 'validating output with regex and default timeout');
|
||||
ok(!validate_script_output('script', sub { m/output/ }, 30), 'specifying timeout');
|
||||
like(
|
||||
exception {
|
||||
@@ -496,6 +497,12 @@ subtest 'validate_script_output' => sub {
|
||||
},
|
||||
qr/output not validating/
|
||||
);
|
||||
+ like(
|
||||
+ exception {
|
||||
+ validate_script_output('script', ['Invalid parameter']);
|
||||
+ },
|
||||
+ qr/coderef or regexp/
|
||||
+ );
|
||||
};
|
||||
|
||||
subtest 'wait_still_screen' => sub {
|
||||
diff --git a/testapi.pm b/testapi.pm
|
||||
index 1b36c73cc..b5bdb4abc 100755
|
||||
--- a/testapi.pm
|
||||
+++ b/testapi.pm
|
||||
@@ -33,7 +33,8 @@ use OpenQA::Isotovideo::NeedleDownloader;
|
||||
use Digest::MD5 'md5_base64';
|
||||
use Carp qw(cluck croak);
|
||||
use MIME::Base64 'decode_base64';
|
||||
-use Scalar::Util 'looks_like_number';
|
||||
+use Scalar::Util qw(looks_like_number reftype);
|
||||
+use B::Deparse;
|
||||
|
||||
require bmwqemu;
|
||||
use constant OPENQA_LIBPATH => '/usr/share/openqa/lib';
|
||||
@@ -1117,20 +1118,23 @@ sub get_test_data {
|
||||
|
||||
=head2 validate_script_output
|
||||
|
||||
- validate_script_output($script, $code [, timeout => $timeout] [,quiet => $quiet])
|
||||
+ validate_script_output($script, $code | $regexp [, timeout => $timeout] [,quiet => $quiet])
|
||||
|
||||
Deprecated mode
|
||||
|
||||
validate_script_output($script, $code, [$wait])
|
||||
|
||||
-Wrapper around script_output, that runs a callback on the output. Use it as
|
||||
+Wrapper around script_output, that runs a callback on the output, or
|
||||
+alternatively matches a regular expression. Use it as
|
||||
|
||||
- validate_script_output "cat /etc/hosts", sub { m/127.*localhost/ }
|
||||
+ validate_script_output "cat /etc/hosts", sub { m/127.*localhost/ };
|
||||
+ validate_script_output "cat /etc/hosts", qr/127.*localhost/;
|
||||
+ validate_script_output "cat /etc/hosts", sub { $_ !~ m/987.*somehost/ };
|
||||
|
||||
=cut
|
||||
|
||||
sub validate_script_output {
|
||||
- my ($script, $code) = splice(@_, 0, 2);
|
||||
+ my ($script, $check) = splice(@_, 0, 2);
|
||||
my %args = compat_args(
|
||||
{
|
||||
timeout => 30,
|
||||
@@ -1140,17 +1144,44 @@ sub validate_script_output {
|
||||
my $output = script_output($script, %args);
|
||||
my $res = 'ok';
|
||||
|
||||
- # set $_ so the callbacks can be simpler code
|
||||
- $_ = $output;
|
||||
- if (!$code->()) {
|
||||
- $res = 'fail';
|
||||
- bmwqemu::diag("output does not pass the code block:\n$output");
|
||||
+ my $message = '';
|
||||
+ if (reftype $check eq 'CODE') {
|
||||
+ # set $_ so the callbacks can be simpler code
|
||||
+ $_ = $output;
|
||||
+ if (!$check->()) {
|
||||
+ $res = 'fail';
|
||||
+ bmwqemu::diag("output does not pass the code block:\n$output");
|
||||
+ }
|
||||
+ my $deparse = B::Deparse->new("-p");
|
||||
+ # avoid "use strict; use warnings" in the output to make it shorter
|
||||
+ $deparse->ambient_pragmas(warnings => [], strict => "all");
|
||||
+
|
||||
+ my $body = $deparse->coderef2text($check);
|
||||
+
|
||||
+ $message = sprintf
|
||||
+ "validate_script_output got:\n%s\n\nCheck function (deparsed code):\n%s",
|
||||
+ $output, $body;
|
||||
+ }
|
||||
+ elsif (reftype $check eq 'REGEXP') {
|
||||
+ if ($output !~ $check) {
|
||||
+ $res = 'fail';
|
||||
+ bmwqemu::diag("output does not match the regex:\n$output");
|
||||
+ }
|
||||
+ $message = sprintf
|
||||
+ "validate_script_output got:\n%s\n\nRegular expression:\n%s",
|
||||
+ $output, $check;
|
||||
+ }
|
||||
+ else {
|
||||
+ croak "Invalid use of validate_script_output(), second arg must be a coderef or regexp";
|
||||
}
|
||||
- # abusing the function
|
||||
- $autotest::current_test->record_serialresult($output, $res, $output) unless ($args{quiet});
|
||||
+ $autotest::current_test->record_resultfile(
|
||||
+ 'validate_script_output', $message,
|
||||
+ result => $res,
|
||||
+ );
|
||||
if ($res eq 'fail') {
|
||||
croak "output not validating";
|
||||
}
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
=head2 become_root
|
Loading…
Reference in new issue