Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package os-autoinst for openSUSE:Factory 
checked in at 2026-03-30 18:32:38
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/os-autoinst (Old)
 and      /work/SRC/openSUSE:Factory/.os-autoinst.new.1999 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "os-autoinst"

Mon Mar 30 18:32:38 2026 rev:580 rq:1343605 version:5.1774620706.b22e21b

Changes:
--------
--- /work/SRC/openSUSE:Factory/os-autoinst/os-autoinst.changes  2026-03-27 
16:53:00.452237061 +0100
+++ /work/SRC/openSUSE:Factory/.os-autoinst.new.1999/os-autoinst.changes        
2026-03-30 18:36:47.856850490 +0200
@@ -1,0 +2,12 @@
+Mon Mar 30 08:21:41 UTC 2026 - [email protected]
+
+- Update to version 5.1774620706.b22e21b:
+  * feat: Add option to add signatures
+  * style: Add tool to add Mojo::Base include automatically
+  * test: Add CoverageWorkaround.pm
+  * test: Use Syntax::Keyword::Try::Deparse to avoid warnings
+  * chore: Reduce permissions of remaining workflow
+  * test: skip t/ files in Test::Compile syntax check
+  * refactor: Deduplicate svirt tests in t/22-svirt.t
+
+-------------------------------------------------------------------

Old:
----
  os-autoinst-5.1774551362.dd2a78c.obscpio

New:
----
  os-autoinst-5.1774620706.b22e21b.obscpio

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ os-autoinst-devel-test.spec ++++++
--- /var/tmp/diff_new_pack.YSGcV4/_old  2026-03-30 18:36:49.896935782 +0200
+++ /var/tmp/diff_new_pack.YSGcV4/_new  2026-03-30 18:36:49.896935782 +0200
@@ -18,7 +18,7 @@
 
 %define         short_name os-autoinst-devel
 Name:           %{short_name}-test
-Version:        5.1774551362.dd2a78c
+Version:        5.1774620706.b22e21b
 Release:        0
 Summary:        Test package for %{short_name}
 License:        GPL-2.0-or-later

++++++ os-autoinst-openvswitch-test.spec ++++++
--- /var/tmp/diff_new_pack.YSGcV4/_old  2026-03-30 18:36:49.932937287 +0200
+++ /var/tmp/diff_new_pack.YSGcV4/_new  2026-03-30 18:36:49.936937454 +0200
@@ -19,7 +19,7 @@
 %define name_ext -test
 %define         short_name os-autoinst-openvswitch
 Name:           %{short_name}%{?name_ext}
-Version:        5.1774551362.dd2a78c
+Version:        5.1774620706.b22e21b
 Release:        0
 Summary:        test package for %{short_name}
 License:        GPL-2.0-or-later

++++++ os-autoinst-test.spec ++++++
--- /var/tmp/diff_new_pack.YSGcV4/_old  2026-03-30 18:36:49.976939127 +0200
+++ /var/tmp/diff_new_pack.YSGcV4/_new  2026-03-30 18:36:49.976939127 +0200
@@ -19,7 +19,7 @@
 %define name_ext -test
 %define         short_name os-autoinst
 Name:           %{short_name}%{?name_ext}
-Version:        5.1774551362.dd2a78c
+Version:        5.1774620706.b22e21b
 Release:        0
 Summary:        test package for os-autoinst
 License:        GPL-2.0-or-later

++++++ os-autoinst.spec ++++++
--- /var/tmp/diff_new_pack.YSGcV4/_old  2026-03-30 18:36:50.016940799 +0200
+++ /var/tmp/diff_new_pack.YSGcV4/_new  2026-03-30 18:36:50.020940966 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           os-autoinst
-Version:        5.1774551362.dd2a78c
+Version:        5.1774620706.b22e21b
 Release:        0
 Summary:        OS-level test automation
 License:        GPL-2.0-or-later
@@ -117,7 +117,7 @@
 %define test_non_s390_requires %{nil}
 %endif
 # The following line is generated from dependencies.yaml
-%define test_base_requires %main_requires cpio icewm perl(Benchmark) 
perl(Devel::Cover) perl(FindBin) perl(Pod::Coverage) perl(Test::Mock::Time) 
perl(Test::MockModule) perl(Test::MockObject) perl(Test::MockRandom) 
perl(Test::Mojo) perl(Test::Most) perl(Test::Output) perl(Test::Perl::Critic) 
perl(Test::Pod) perl(Test::Strict) perl(Test::Warnings) >= 0.029 procps 
python3-setuptools qemu >= 4.0 qemu-tools socat xorg-x11-Xvnc xterm 
xterm-console
+%define test_base_requires %main_requires cpio icewm perl(Benchmark) 
perl(Devel::Cover) perl(FindBin) perl(Pod::Coverage) perl(Test::Compile) 
perl(Test::Mock::Time) perl(Test::MockModule) perl(Test::MockObject) 
perl(Test::MockRandom) perl(Test::Mojo) perl(Test::Most) perl(Test::Output) 
perl(Test::Perl::Critic) perl(Test::Pod) perl(Test::Warnings) >= 0.029 procps 
python3-setuptools qemu >= 4.0 qemu-tools socat xorg-x11-Xvnc xterm 
xterm-console
 # The following line is generated from dependencies.yaml
 %define test_version_only_requires perl(Mojo::IOLoop::ReadWriteProcess) >= 0.28
 # The following line is generated from dependencies.yaml

++++++ os-autoinst-5.1774551362.dd2a78c.obscpio -> 
os-autoinst-5.1774620706.b22e21b.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1774551362.dd2a78c/.github/workflows/ci.yml 
new/os-autoinst-5.1774620706.b22e21b/.github/workflows/ci.yml
--- old/os-autoinst-5.1774551362.dd2a78c/.github/workflows/ci.yml       
2026-03-26 19:56:02.000000000 +0100
+++ new/os-autoinst-5.1774620706.b22e21b/.github/workflows/ci.yml       
2026-03-27 15:11:46.000000000 +0100
@@ -30,6 +30,8 @@
           path: coverage.tar
           retention-days: 15
   static-check-containers:
+    permissions:
+      contents: read
     runs-on: ubuntu-latest
     steps:
       - uses: actions/checkout@v4
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1774551362.dd2a78c/container/os-autoinst_dev/Dockerfile 
new/os-autoinst-5.1774620706.b22e21b/container/os-autoinst_dev/Dockerfile
--- old/os-autoinst-5.1774551362.dd2a78c/container/os-autoinst_dev/Dockerfile   
2026-03-26 19:56:02.000000000 +0100
+++ new/os-autoinst-5.1774620706.b22e21b/container/os-autoinst_dev/Dockerfile   
2026-03-27 15:11:46.000000000 +0100
@@ -143,6 +143,7 @@
        'perl(Template::Toolkit)' \
        'perl(Term::ANSIColor)' \
        'perl(Test::CheckGitStatus)' \
+       'perl(Test::Compile)' \
        'perl(Test::Mock::Time)' \
        'perl(Test::MockModule)' \
        'perl(Test::MockObject)' \
@@ -152,7 +153,6 @@
        'perl(Test::Output)' \
        'perl(Test::Perl::Critic)' \
        'perl(Test::Pod)' \
-       'perl(Test::Strict)' \
        'perl(Test::Warnings)' \
        'perl(Thread::Queue)' \
        'perl(Time::HiRes)' \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-autoinst-5.1774551362.dd2a78c/cpanfile 
new/os-autoinst-5.1774620706.b22e21b/cpanfile
--- old/os-autoinst-5.1774551362.dd2a78c/cpanfile       2026-03-26 
19:56:02.000000000 +0100
+++ new/os-autoinst-5.1774620706.b22e21b/cpanfile       2026-03-27 
15:11:46.000000000 +0100
@@ -85,6 +85,7 @@
     requires 'Perl::Critic::Policy';
     requires 'Perl::Critic::Utils';
     requires 'Pod::Coverage';
+    requires 'Test::Compile';
     requires 'Test::Mock::Time';
     requires 'Test::MockModule';
     requires 'Test::MockObject';
@@ -94,7 +95,6 @@
     requires 'Test::Output';
     requires 'Test::Perl::Critic';
     requires 'Test::Pod';
-    requires 'Test::Strict';
     requires 'Test::Warnings', '>= 0.029';
 
 };
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-autoinst-5.1774551362.dd2a78c/dependencies.yaml 
new/os-autoinst-5.1774620706.b22e21b/dependencies.yaml
--- old/os-autoinst-5.1774551362.dd2a78c/dependencies.yaml      2026-03-26 
19:56:02.000000000 +0100
+++ new/os-autoinst-5.1774620706.b22e21b/dependencies.yaml      2026-03-27 
15:11:46.000000000 +0100
@@ -157,7 +157,7 @@
   perl(Test::Output):
   perl(Test::Perl::Critic):
   perl(Test::Pod):
-  perl(Test::Strict):
+  perl(Test::Compile):
   perl(Test::Warnings): '>= 0.029'
   qemu: '>= 4.0'
   qemu-tools:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1774551362.dd2a78c/dist/rpm/os-autoinst.spec 
new/os-autoinst-5.1774620706.b22e21b/dist/rpm/os-autoinst.spec
--- old/os-autoinst-5.1774551362.dd2a78c/dist/rpm/os-autoinst.spec      
2026-03-26 19:56:02.000000000 +0100
+++ new/os-autoinst-5.1774620706.b22e21b/dist/rpm/os-autoinst.spec      
2026-03-27 15:11:46.000000000 +0100
@@ -117,7 +117,7 @@
 %define test_non_s390_requires %{nil}
 %endif
 # The following line is generated from dependencies.yaml
-%define test_base_requires %main_requires cpio icewm perl(Benchmark) 
perl(Devel::Cover) perl(FindBin) perl(Pod::Coverage) perl(Test::Mock::Time) 
perl(Test::MockModule) perl(Test::MockObject) perl(Test::MockRandom) 
perl(Test::Mojo) perl(Test::Most) perl(Test::Output) perl(Test::Perl::Critic) 
perl(Test::Pod) perl(Test::Strict) perl(Test::Warnings) >= 0.029 procps 
python3-setuptools qemu >= 4.0 qemu-tools socat xorg-x11-Xvnc xterm 
xterm-console
+%define test_base_requires %main_requires cpio icewm perl(Benchmark) 
perl(Devel::Cover) perl(FindBin) perl(Pod::Coverage) perl(Test::Compile) 
perl(Test::Mock::Time) perl(Test::MockModule) perl(Test::MockObject) 
perl(Test::MockRandom) perl(Test::Mojo) perl(Test::Most) perl(Test::Output) 
perl(Test::Perl::Critic) perl(Test::Pod) perl(Test::Warnings) >= 0.029 procps 
python3-setuptools qemu >= 4.0 qemu-tools socat xorg-x11-Xvnc xterm 
xterm-console
 # The following line is generated from dependencies.yaml
 %define test_version_only_requires perl(Mojo::IOLoop::ReadWriteProcess) >= 0.28
 # The following line is generated from dependencies.yaml
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1774551362.dd2a78c/script/os-autoinst-testmodules-strict 
new/os-autoinst-5.1774620706.b22e21b/script/os-autoinst-testmodules-strict
--- old/os-autoinst-5.1774551362.dd2a78c/script/os-autoinst-testmodules-strict  
1970-01-01 01:00:00.000000000 +0100
+++ new/os-autoinst-5.1774620706.b22e21b/script/os-autoinst-testmodules-strict  
2026-03-27 15:11:46.000000000 +0100
@@ -0,0 +1,184 @@
+#!/usr/bin/perl
+# Copyright SUSE LLC
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+=head1 SYNOPSIS
+
+os-autoinst-testmodules-strict [OPTIONS] [files]
+
+Check test modules for Mojo::Base statements (and optionally add them
+automatically).
+
+Will exit with code 2 if there are any changes.
+
+Use a special comment in a file to let me know to leave it alone:
+
+    ## no os-autoinst style
+
+Example:
+
+    tools/os-autoinst-testmodules-strict tests/*/*.pm --write
+
+=head1 OPTIONS
+
+=over 4
+
+=item B<--write>
+
+Write changed file(s)
+
+=item B<-v, --verbose>
+
+Be verbose
+
+=item B<-v, --signatures>
+
+Always add signatures.
+By default it does not add C<-signatures> if it was not alraedy used.
+
+=item B<-h, -?, --help>
+
+Show this help.
+
+=back
+
+=cut
+
+use Mojo::Base -signatures;
+use Getopt::Long;
+use List::Util qw(max);
+use Mojo::File qw(path);
+use PPI;
+use Syntax::Keyword::Try;
+
+sub usage ($r) { require Pod::Usage; Pod::Usage::pod2usage($r) }
+
+my $rc = 0;
+unless (caller) {
+    $|++;
+    GetOptions(\my %options, 'help|h|?', 'verbose|v', 'write', 'signatures') 
or usage(1);
+    usage(0) if $options{help};
+    usage(1) unless @ARGV;
+    $rc = main(\%options, @ARGV);
+}
+END {
+    $? = 2 if $rc;
+}
+
+sub main ($options, @files) {
+    my $rc = 0;
+    my $length = max map { length } @files;
+    my $format = "[%3d%%] %9s %-*s\r";
+    for my $i (0 .. $#files) {
+        my $file = $files[$i];
+        my $code = ref $file ? $$file : path($file)->slurp;
+        my $doc = PPI::Document->new(\$code) or die "Could not parse code\n";
+        my $progress = int 100 * $i / @files;
+        $options->{verbose} and printf $format, $progress, 'Analyzing', 
$length, $file;
+        my $module;
+        try {
+            $module = analyze($doc);
+        }
+        catch ($e) {    # uncoverable statement
+            say "\nError in '$file': $e";
+            $rc = 1;
+            next;
+        }
+        next if $module->{nofix};
+
+        my $old = "$doc";
+        my $changed = fix($module, {signatures => $options->{signatures}});
+        if ($changed and "$changed" ne $old) {
+            if ($options->{write}) {
+                say sprintf '      Writing %-*s', $length, $file;
+                ref $file ? $$file = "$doc" : $doc->save($file);
+            }
+            else {
+                say sprintf '    Would change %-*s', $length, $file;
+                $rc = 1;
+            }
+        }
+    }
+    return $rc;
+}
+
+sub fix ($module, $args) {
+    my %seen;
+    my @classes = grep { not $seen{$_}++ } @{$module->{base_classes}};
+    my $new_code = 'use Mojo::Base ';
+    if (@classes > 1) {
+        $new_code .= "qw(@classes)";
+    }
+    else {
+        $new_code .= "'$classes[0]'";
+    }
+    if ($args->{signatures} or $module->{signatures}) {
+        $new_code .= ', -signatures';
+    }
+    $new_code .= ";\n";
+    my $temp_doc = PPI::Document->new(\$new_code);
+    my $new_statement = $temp_doc->child(0)->clone;
+
+    my ($first, @objects) = @{$module->{objects}};
+    $first->insert_before($new_statement);
+    $first->remove;
+    for my $obj (@objects) {
+        my $next = $obj->next_sibling;
+        $next->remove if $next->isa('PPI::Token::Whitespace');
+        $obj->remove;
+    }
+    return $module->{doc};
+}
+
+sub add_include ($module, $stmt) {
+    my %include = (class => $stmt->module);
+    my @args;
+    for my $token ($stmt->arguments) {
+        next if $token->isa('PPI::Token::Operator');
+        if ($token->isa('PPI::Token::Quote')) {
+            push @args, $token->string;
+        }
+        elsif ($token->isa('PPI::Token::QuoteLike::Words')) {
+            push @args, $token->literal;
+        }
+        elsif ($token->isa('PPI::Token::Word')) {
+            # unquoted word
+            push @args, $token->content;
+        }
+    }
+    for my $arg (@args) {
+        if ($arg eq '-signatures') {
+            $module->{signatures} = 1;
+        }
+        elsif ($arg eq '-strict') {
+            $module->{strict} = 1;
+        }
+        else {
+            push @{$module->{base_classes}}, $arg;
+        }
+    }
+    return \%include;
+}
+
+sub analyze ($doc) {
+    my %module = (doc => $doc);
+    $module{objects} = \my @objects;
+    $module{base_classes} = \my @classes;
+    my $comments = $doc->find('PPI::Token::Comment') || [];
+    for my $comment (@$comments) {
+        if ($comment->content =~ m/^## no os-autoinst style/) {
+            $module{nofix} = 1;
+            return \%module;
+        }
+    }
+
+    my $includes = $doc->find('PPI::Statement::Include') || [];
+    for my $stmt (@$includes) {
+        next unless $stmt->module =~ m/^(?:base|Mojo::Base|parent)$/;
+        next unless my $include = add_include(\%module, $stmt);
+        push @objects, $stmt;
+    }
+    die 'No base statements' unless @classes;
+    return \%module;
+}
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1774551362.dd2a78c/t/00-compile-check-all.t 
new/os-autoinst-5.1774620706.b22e21b/t/00-compile-check-all.t
--- old/os-autoinst-5.1774551362.dd2a78c/t/00-compile-check-all.t       
2026-03-26 19:56:02.000000000 +0100
+++ new/os-autoinst-5.1774620706.b22e21b/t/00-compile-check-all.t       
2026-03-27 15:11:46.000000000 +0100
@@ -7,43 +7,55 @@
 # We need :no_end_test here because otherwise it would output a no warnings
 # test for each of the modules, but with the same test number
 use Test::Warnings qw(:no_end_test :report_warnings);
-use Test::Strict;
+use Test::Compile;
 use File::Which;
 
 use FindBin '$Bin';
 chdir "$Bin/..";
 
-push @Test::Strict::MODULES_ENABLING_STRICT, 'Test::Most';
-push @Test::Strict::MODULES_ENABLING_WARNINGS, 'Test::Most';
-
-$Test::Strict::TEST_SYNTAX = 1;
-$Test::Strict::TEST_STRICT = 1;
-$Test::Strict::TEST_WARNINGS = 1;
 # We don't want to check files under external, as there might be
 # missing dependencies like perltidy in OBS builds
 chomp(my @external_files = qx{find external -type f});
 # Skip test modules as they rely on ENABLE_MODERN_PERL_FEATURES
 chomp(my @test_modules = qx{find t/data/tests t/data/wheels_dir t/data/assets 
t/fake/tests -name '*.pm' -not -name 'main.pm' -type f,l});
-$Test::Strict::TEST_SKIP = [
+my $TEST_SKIP = [
     'tools/lib/perlcritic/Perl/Critic/Policy/HashKeyQuotes.pm',
     't/data/tests/main.pm',    # fails with "Can't locate testdistribution.pm" 
as this check does not automatically add the required lib dir
     @test_modules, @external_files
 ];
 
+my $test = Test::Compile->new();
+my @files;
+
 # Prevent any non-tracked files or files within .git (e.g. in.git/rr-cache) to
 # interfer
 if (-d '.git' and which('git')) {
-    no warnings 'redefine';
-    *Test::Strict::_all_files = sub {
-        my $root = qx{git rev-parse --show-toplevel};
-        chomp($root);
-        $root .= '/';
-        my @all_git_files = qx{git ls-files};
-        chomp(@all_git_files);
-        my $files_to_skip = $Test::Strict::TEST_SKIP || [];
-        my %skip = map { $_ => undef } @$files_to_skip;
-        return map { $root . $_ } grep { !exists $skip{$_} } @all_git_files;   
 # Exclude files to skip
-    }
+    my $root = qx{git rev-parse --show-toplevel};
+    chomp($root);
+    $root .= '/';
+    my @all_git_files = qx{git ls-files};
+    chomp(@all_git_files);
+    my %skip = map { $_ => undef } @$TEST_SKIP;
+    @files = map { $root . $_ } grep { !exists $skip{$_} && $_ !~ /^t\// } 
@all_git_files;    # Exclude files to skip
 }
+else {
+    @files = ($test->all_pm_files('.'), $test->all_pl_files('.'));    # 
uncoverable statement
+    my %skip = map { $_ => undef } @$TEST_SKIP;    # uncoverable statement
+    @files = grep { my $f = s{^\./}{}r; !exists $skip{$f} && $f !~ /^t\// } 
@files;    # uncoverable statement
+}
+
+# Only check perl files and skip test scripts (already executed)
+@files = grep { /\.(?:pm|pl|t)$/ } @files;
 
-all_perl_files_ok('.');
+plan tests => scalar @files;
+
+foreach my $file (@files) {
+    my $ok;
+    if ($file =~ /\.pm$/) {
+        $ok = $test->pm_file_compiles($file);
+    }
+    else {
+        $ok = $test->pl_file_compiles($file);
+    }
+    ok($ok, "Syntax check $file");
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-autoinst-5.1774551362.dd2a78c/t/22-svirt.t 
new/os-autoinst-5.1774620706.b22e21b/t/22-svirt.t
--- old/os-autoinst-5.1774551362.dd2a78c/t/22-svirt.t   2026-03-26 
19:56:02.000000000 +0100
+++ new/os-autoinst-5.1774620706.b22e21b/t/22-svirt.t   2026-03-27 
15:11:46.000000000 +0100
@@ -94,6 +94,50 @@
     ok 'XML looks as expected';
 }
 
+sub _mock_svirt_vmware ($cmds_ref, $ssh_cmds_ref) {
+    $bmwqemu::vars{VMWARE_HOST} = 'h';
+    $bmwqemu::vars{VMWARE_USERNAME} = 'u';
+    $bmwqemu::vars{VMWARE_PASSWORD} = 'p';
+
+    my $chan_mock = Test::MockObject->new->set_true(qw(write send_eof close 
read2 eof exit_status));
+    my $backend_mock = Test::MockModule->new('backend::svirt');
+    my $console_mock = Test::MockModule->new('consoles::sshVirtsh');
+    my $tmp_mock = Test::MockModule->new('File::Temp');
+    $console_mock->redefine(run_cmd => sub ($self, $cmd, %args) { push 
@$cmds_ref, $cmd; 0 });
+    $console_mock->redefine(get_cmd_output => sub ($self, $cmd, %args) { push 
@$cmds_ref, $cmd; 0 });
+    $backend_mock->redefine(run_ssh_cmd => sub ($self, $cmd, %args) { push 
@$cmds_ref, $cmd; 0 });
+    $backend_mock->redefine(run_ssh => sub ($self, $cmd, %args) { push 
@$ssh_cmds_ref, $cmd; (undef, $chan_mock) });
+    $backend_mock->redefine(start_serial_grab => 1);
+    $console_mock->redefine(get_ssh_credentials => sub { (hostname => 'foo', 
username => 'root', password => '123') });
+    $tmp_mock->redefine(tempfile => sub { (undef, '/t') });
+    return {backend => $backend_mock, console => $console_mock, tmp => 
$tmp_mock};
+}
+
+sub _check_vmware_cmds ($cmds, $extra_cmds = []) {
+    like shift @$cmds, qr/cat > \/t <<.*username=u.*password=p.*auth-esx-h/s, 
'config written';
+    my $s = 'virsh -c esx://u@h/?no_verify=1\\&authfile=/t ';
+    my @expected = (
+        $s . ' destroy openQA-SUT-1',
+        $s . ' undefine --snapshots-metadata openQA-SUT-1',
+        $s . ' define /var/lib/libvirt/images/openQA-SUT-1.xml',
+        'echo \'bios.bootDelay = "10000"\' >> 
/vmfs/volumes/datastore1/openQA/openQA-SUT-1.vmx',
+        'test -e /vmfs/volumes/datastore1/openQA/openQA-SUT-1.nvram',
+        'echo \'nvram = "openQA-SUT-1.nvram"\' >> 
/vmfs/volumes/datastore1/openQA/openQA-SUT-1.vmx',
+        @$extra_cmds,
+        $s . ' start openQA-SUT-1 2> >(tee 
/tmp/os-autoinst-openQA-SUT-1-stderr.log >&2)',
+        $s . ' dumpxml openQA-SUT-1'
+    );
+    is_deeply $cmds, \@expected, 'expected commands invoked' or always_explain 
$cmds;
+}
+
+sub _new_svirt_console ($ssh_creds) {
+    my $svirt = consoles::sshVirtsh->new('svirt');
+    $svirt->backend(backend::baseclass->new);
+    $svirt->_init_ssh($ssh_creds);
+    $svirt->_init_xml();
+    return $svirt;
+}
+
 subtest 'XML config for VNC and serial console' => sub {
     $svirt_console->_init_xml();
     $testapi::password = 'secret';
@@ -191,36 +235,10 @@
 };
 
 subtest 'starting VMware console' => sub {
-    $bmwqemu::vars{VMWARE_HOST} = 'h';
-    $bmwqemu::vars{VMWARE_USERNAME} = 'u';
-    $bmwqemu::vars{VMWARE_PASSWORD} = 'p';
-
-    my $chan_mock = Test::MockObject->new->set_true(qw(write send_eof close 
read2 eof exit_status));
-    my $backend_mock = Test::MockModule->new('backend::svirt');
-    my $console_mock = Test::MockModule->new('consoles::sshVirtsh');
-    my $tmp_mock = Test::MockModule->new('File::Temp');
-    my @cmds;
-    $console_mock->redefine(run_cmd => sub ($self, $cmd, %args) { push @cmds, 
$cmd; 0 });
-    $console_mock->redefine(get_cmd_output => sub ($self, $cmd, %args) { push 
@cmds, $cmd; 0 });
-    $backend_mock->redefine(run_ssh_cmd => sub ($self, $cmd, %args) { push 
@cmds, $cmd; 0 });
-    $backend_mock->redefine(run_ssh => sub ($self, $cmd, %args) { (undef, 
$chan_mock) });
-    $backend_mock->redefine(start_serial_grab => 1);
-    $console_mock->redefine(get_ssh_credentials => sub { (hostname => 'foo', 
username => 'root', password => '123') });
-    $tmp_mock->redefine(tempfile => sub { (undef, '/t') });
-
+    my (@cmds, @ssh_cmds);
+    my $mocks = _mock_svirt_vmware(\@cmds, \@ssh_cmds);
     $svirt_console->define_and_start;
-    like shift @cmds, qr/cat > \/t <<.*username=u.*password=p.*auth-esx-h/s, 
'config written';
-    my $s = 'virsh -c esx://u@h/?no_verify=1\\&authfile=/t ';
-    is_deeply \@cmds, [
-        $s . ' destroy openQA-SUT-1',
-        $s . ' undefine --snapshots-metadata openQA-SUT-1',
-        $s . ' define /var/lib/libvirt/images/openQA-SUT-1.xml',
-        'echo \'bios.bootDelay = "10000"\' >> 
/vmfs/volumes/datastore1/openQA/openQA-SUT-1.vmx',
-        'test -e /vmfs/volumes/datastore1/openQA/openQA-SUT-1.nvram',
-        'echo \'nvram = "openQA-SUT-1.nvram"\' >> 
/vmfs/volumes/datastore1/openQA/openQA-SUT-1.vmx',
-        $s . ' start openQA-SUT-1 2> >(tee 
/tmp/os-autoinst-openQA-SUT-1-stderr.log >&2)',
-        $s . ' dumpxml openQA-SUT-1'
-    ], 'expected commands invoked' or always_explain \@cmds;
+    _check_vmware_cmds(\@cmds);
 };
 
 subtest 'test config encoding' => sub {
@@ -241,142 +259,58 @@
 };
 
 subtest 'starting VMware console with InvalidConfig' => sub {
-    $bmwqemu::vars{VMWARE_HOST} = 'h';
-    $bmwqemu::vars{VMWARE_USERNAME} = 'u';
-    $bmwqemu::vars{VMWARE_PASSWORD} = 'p';
     $bmwqemu::vars{GUESTINFO_COMBUSTION} = 'someTestScript';
     $bmwqemu::vars{GUESTINFO_CONFIG} = 'NotValid';
 
-    my $chan_mock = Test::MockObject->new->set_true(qw(write send_eof close 
read2 eof exit_status));
-    my $backend_mock = Test::MockModule->new('backend::svirt');
-    my $console_mock = Test::MockModule->new('consoles::sshVirtsh');
-    my $tmp_mock = Test::MockModule->new('File::Temp');
     my (@cmds, @ssh_cmds);
-    $console_mock->redefine(run_cmd => sub ($self, $cmd, %args) { push @cmds, 
$cmd; 0 });
-    $console_mock->redefine(get_cmd_output => sub ($self, $cmd, %args) { push 
@cmds, $cmd; 0 });
-    $backend_mock->redefine(run_ssh => sub ($self, $cmd, %args) { push 
@ssh_cmds, $cmd; (undef, $chan_mock) });
-    $backend_mock->redefine(start_serial_grab => 1);
-    $console_mock->redefine(get_ssh_credentials => sub { (hostname => 'foo', 
username => 'root', password => '123') });
-    $tmp_mock->redefine(tempfile => sub { (undef, '/t') });
-
+    my $mocks = _mock_svirt_vmware(\@cmds, \@ssh_cmds);
     dies_ok { $svirt_console->define_and_start } 'Invalid GUESTINFO_CONFIG was 
passed';
 };
 
 subtest 'starting VMware console with combustion' => sub {
-    $bmwqemu::vars{VMWARE_HOST} = 'h';
-    $bmwqemu::vars{VMWARE_USERNAME} = 'u';
-    $bmwqemu::vars{VMWARE_PASSWORD} = 'p';
     $bmwqemu::vars{GUESTINFO_COMBUSTION} = 'someTestScript';
     $bmwqemu::vars{GUESTINFO_CONFIG} = 'combustion';
 
-    my $chan_mock = Test::MockObject->new->set_true(qw(write send_eof close 
read2 eof exit_status));
-    my $backend_mock = Test::MockModule->new('backend::svirt');
-    my $console_mock = Test::MockModule->new('consoles::sshVirtsh');
-    my $tmp_mock = Test::MockModule->new('File::Temp');
-    my @cmds;
-    $console_mock->redefine(run_cmd => sub ($self, $cmd, %args) { push @cmds, 
$cmd; 0 });
-    $console_mock->redefine(get_cmd_output => sub ($self, $cmd, %args) { push 
@cmds, $cmd; 0 });
-    $backend_mock->redefine(run_ssh_cmd => sub ($self, $cmd, %args) { push 
@cmds, $cmd; 0 });
-    $backend_mock->redefine(run_ssh => sub ($self, $cmd, %args) { (undef, 
$chan_mock) });
-    $backend_mock->redefine(start_serial_grab => 1);
-    $console_mock->redefine(get_ssh_credentials => sub { (hostname => 'foo', 
username => 'root', password => '123') });
-    $tmp_mock->redefine(tempfile => sub { (undef, '/t') });
-    $console_mock->redefine(_encode_config => sub ($self, $f, $k) { 
'testingCombustion' });
+    my (@cmds, @ssh_cmds);
+    my $mocks = _mock_svirt_vmware(\@cmds, \@ssh_cmds);
+    $mocks->{console}->redefine(_encode_config => sub ($self, $f, $k) { 
'testingCombustion' });
 
     $svirt_console->define_and_start;
-    like shift @cmds, qr/cat > \/t <<.*username=u.*password=p.*auth-esx-h/s, 
'config written';
-    my $s = 'virsh -c esx://u@h/?no_verify=1\\&authfile=/t ';
-    is_deeply \@cmds, [
-        $s . ' destroy openQA-SUT-1',
-        $s . ' undefine --snapshots-metadata openQA-SUT-1',
-        $s . ' define /var/lib/libvirt/images/openQA-SUT-1.xml',
-        'echo \'bios.bootDelay = "10000"\' >> 
/vmfs/volumes/datastore1/openQA/openQA-SUT-1.vmx',
-        'test -e /vmfs/volumes/datastore1/openQA/openQA-SUT-1.nvram',
-        'echo \'nvram = "openQA-SUT-1.nvram"\' >> 
/vmfs/volumes/datastore1/openQA/openQA-SUT-1.vmx',
-        'echo \'guestinfo.combustion.script = "testingCombustion"\' >> 
/vmfs/volumes/datastore1/openQA/openQA-SUT-1.vmx',
-        $s . ' start openQA-SUT-1 2> >(tee 
/tmp/os-autoinst-openQA-SUT-1-stderr.log >&2)',
-        $s . ' dumpxml openQA-SUT-1'
-    ], 'expected commands invoked' or always_explain \@cmds;
+    _check_vmware_cmds(\@cmds, ['echo \'guestinfo.combustion.script = 
"testingCombustion"\' >> /vmfs/volumes/datastore1/openQA/openQA-SUT-1.vmx']);
 };
 
 subtest 'starting VMware console with ignition' => sub {
-    $bmwqemu::vars{VMWARE_HOST} = 'h';
-    $bmwqemu::vars{VMWARE_USERNAME} = 'u';
-    $bmwqemu::vars{VMWARE_PASSWORD} = 'p';
     $bmwqemu::vars{GUESTINFO_IGNITION} = 'testing/config.ign';
     $bmwqemu::vars{GUESTINFO_CONFIG} = 'ignition';
     $bmwqemu::vars{GUESTINFO_COMBUSTION} = undef;
 
-    my $chan_mock = Test::MockObject->new->set_true(qw(write send_eof close 
read2 eof exit_status));
-    my $backend_mock = Test::MockModule->new('backend::svirt');
-    my $console_mock = Test::MockModule->new('consoles::sshVirtsh');
-    my $tmp_mock = Test::MockModule->new('File::Temp');
-    my @cmds;
-    $console_mock->redefine(run_cmd => sub ($self, $cmd, %args) { push @cmds, 
$cmd; 0 });
-    $console_mock->redefine(get_cmd_output => sub ($self, $cmd, %args) { push 
@cmds, $cmd; 0 });
-    $backend_mock->redefine(run_ssh_cmd => sub ($self, $cmd, %args) { push 
@cmds, $cmd; 0 });
-    $backend_mock->redefine(run_ssh => sub ($self, $cmd, %args) { (undef, 
$chan_mock) });
-    $backend_mock->redefine(start_serial_grab => 1);
-    $console_mock->redefine(get_ssh_credentials => sub { (hostname => 'foo', 
username => 'root', password => '123') });
-    $tmp_mock->redefine(tempfile => sub { (undef, '/t') });
-    $console_mock->redefine(_encode_config => sub ($self, $f, $k) { 
'ignitionTEST' });
+    my (@cmds, @ssh_cmds);
+    my $mocks = _mock_svirt_vmware(\@cmds, \@ssh_cmds);
+    $mocks->{console}->redefine(_encode_config => sub ($self, $f, $k) { 
'ignitionTEST' });
 
     $svirt_console->define_and_start;
-    like shift @cmds, qr/cat > \/t <<.*username=u.*password=p.*auth-esx-h/s, 
'config written';
-    my $s = 'virsh -c esx://u@h/?no_verify=1\\&authfile=/t ';
-    is_deeply \@cmds, [
-        $s . ' destroy openQA-SUT-1',
-        $s . ' undefine --snapshots-metadata openQA-SUT-1',
-        $s . ' define /var/lib/libvirt/images/openQA-SUT-1.xml',
-        'echo \'bios.bootDelay = "10000"\' >> 
/vmfs/volumes/datastore1/openQA/openQA-SUT-1.vmx',
-        'test -e /vmfs/volumes/datastore1/openQA/openQA-SUT-1.nvram',
-        'echo \'nvram = "openQA-SUT-1.nvram"\' >> 
/vmfs/volumes/datastore1/openQA/openQA-SUT-1.vmx',
-        'echo \'guestinfo.ignition.config.data.encoding = "gzip+base64"\' >> 
/vmfs/volumes/datastore1/openQA/openQA-SUT-1.vmx',
-        'echo \'guestinfo.ignition.config.data = "ignitionTEST"\' >> 
/vmfs/volumes/datastore1/openQA/openQA-SUT-1.vmx',
-        $s . ' start openQA-SUT-1 2> >(tee 
/tmp/os-autoinst-openQA-SUT-1-stderr.log >&2)',
-        $s . ' dumpxml openQA-SUT-1'
-    ], 'expected commands invoked' or always_explain \@cmds;
+    _check_vmware_cmds(\@cmds, [
+            'echo \'guestinfo.ignition.config.data.encoding = "gzip+base64"\' 
>> /vmfs/volumes/datastore1/openQA/openQA-SUT-1.vmx',
+            'echo \'guestinfo.ignition.config.data = "ignitionTEST"\' >> 
/vmfs/volumes/datastore1/openQA/openQA-SUT-1.vmx'
+    ]);
 };
 
 subtest 'starting VMware console with cloud-init' => sub {
-    $bmwqemu::vars{VMWARE_HOST} = 'h';
-    $bmwqemu::vars{VMWARE_USERNAME} = 'u';
-    $bmwqemu::vars{VMWARE_PASSWORD} = 'p';
     $bmwqemu::vars{GUESTINFO_CLOUD_INIT} = 'someCloud_init_file1, meta_data';
     $bmwqemu::vars{GUESTINFO_CONFIG} = 'cloud-init';
     $bmwqemu::vars{GUESTINFO_COMBUSTION} = undef;
 
-    my $chan_mock = Test::MockObject->new->set_true(qw(write send_eof close 
read2 eof exit_status));
-    my $backend_mock = Test::MockModule->new('backend::svirt');
-    my $console_mock = Test::MockModule->new('consoles::sshVirtsh');
-    my $tmp_mock = Test::MockModule->new('File::Temp');
     my (@cmds, @ssh_cmds);
-    $console_mock->redefine(run_cmd => sub ($self, $cmd, %args) { push @cmds, 
$cmd; 0 });
-    $console_mock->redefine(get_cmd_output => sub ($self, $cmd, %args) { push 
@cmds, $cmd; 0 });
-    $backend_mock->redefine(run_ssh_cmd => sub ($self, $cmd, %args) { push 
@cmds, $cmd; 0 });
-    $backend_mock->redefine(run_ssh => sub ($self, $cmd, %args) { push 
@ssh_cmds, $cmd; (undef, $chan_mock) });
-    $backend_mock->redefine(start_serial_grab => 1);
-    $console_mock->redefine(get_ssh_credentials => sub { (hostname => 'foo', 
username => 'root', password => '123') });
-    $tmp_mock->redefine(tempfile => sub { (undef, '/t') });
-    $console_mock->redefine(_encode_config => sub ($self, $f, $k) { 
'CI_test_CONF' });
+    my $mocks = _mock_svirt_vmware(\@cmds, \@ssh_cmds);
+    $mocks->{console}->redefine(_encode_config => sub ($self, $f, $k) { 
'CI_test_CONF' });
 
     $svirt_console->define_and_start;
-    like shift @cmds, qr/cat > \/t <<.*username=u.*password=p.*auth-esx-h/s, 
'config written';
-    my $s = 'virsh -c esx://u@h/?no_verify=1\\&authfile=/t ';
-    is_deeply \@cmds, [
-        $s . ' destroy openQA-SUT-1',
-        $s . ' undefine --snapshots-metadata openQA-SUT-1',
-        $s . ' define /var/lib/libvirt/images/openQA-SUT-1.xml',
-        'echo \'bios.bootDelay = "10000"\' >> 
/vmfs/volumes/datastore1/openQA/openQA-SUT-1.vmx',
-        'test -e /vmfs/volumes/datastore1/openQA/openQA-SUT-1.nvram',
-        'echo \'nvram = "openQA-SUT-1.nvram"\' >> 
/vmfs/volumes/datastore1/openQA/openQA-SUT-1.vmx',
-        'echo \'guestinfo.userdata.encoding = "gzip+base64"\' >> 
/vmfs/volumes/datastore1/openQA/openQA-SUT-1.vmx',
-        'echo \'guestinfo.metadata.encoding = "gzip+base64"\' >> 
/vmfs/volumes/datastore1/openQA/openQA-SUT-1.vmx',
-        'echo \'guestinfo.userdata = "CI_test_CONF"\' >> 
/vmfs/volumes/datastore1/openQA/openQA-SUT-1.vmx',
-        'echo \'guestinfo.metadata = "CI_test_CONF"\' >> 
/vmfs/volumes/datastore1/openQA/openQA-SUT-1.vmx',
-        $s . ' start openQA-SUT-1 2> >(tee 
/tmp/os-autoinst-openQA-SUT-1-stderr.log >&2)',
-        $s . ' dumpxml openQA-SUT-1'
-    ], 'expected commands invoked' or always_explain \@cmds;
+    _check_vmware_cmds(\@cmds, [
+            'echo \'guestinfo.userdata.encoding = "gzip+base64"\' >> 
/vmfs/volumes/datastore1/openQA/openQA-SUT-1.vmx',
+            'echo \'guestinfo.metadata.encoding = "gzip+base64"\' >> 
/vmfs/volumes/datastore1/openQA/openQA-SUT-1.vmx',
+            'echo \'guestinfo.userdata = "CI_test_CONF"\' >> 
/vmfs/volumes/datastore1/openQA/openQA-SUT-1.vmx',
+            'echo \'guestinfo.metadata = "CI_test_CONF"\' >> 
/vmfs/volumes/datastore1/openQA/openQA-SUT-1.vmx'
+    ]);
 };
 
 subtest 'SSH credentials' => sub {
@@ -629,10 +563,7 @@
 
         my $vmware_openqa_datastore = '/vmfs/volumes/' . 
get_var('VMWARE_DATASTORE') . '/openQA/';
 
-        my $svirt = consoles::sshVirtsh->new('svirt');
-        $svirt->backend(backend::baseclass->new);
-        $svirt->_init_ssh($ssh_creds_svirt);
-        $svirt->_init_xml();
+        my $svirt = _new_svirt_console($ssh_creds_svirt);
 
         subtest 'family vmware only file=>"specified"' => sub {
             my $dev_id = 'device_id_101';
@@ -714,10 +645,7 @@
         set_var(VIRSH_VMM_TYPE => 'hvm');
         my $basedir = '/var/lib/libvirt/images/';
 
-        my $svirt = consoles::sshVirtsh->new('svirt');
-        $svirt->backend(backend::baseclass->new);
-        $svirt->_init_ssh($ssh_creds_svirt);
-        $svirt->_init_xml();
+        my $svirt = _new_svirt_console($ssh_creds_svirt);
 
         subtest 'family xcirt-xen-hvm only file=>"specified"' => sub {
             my $dev_id = 'device_id_105';
@@ -853,10 +781,7 @@
         set_var(VIRSH_VMM_TYPE => undef);
         my $basedir = '/var/lib/libvirt/images/';
 
-        my $svirt = consoles::sshVirtsh->new('svirt');
-        $svirt->backend(backend::baseclass->new);
-        $svirt->_init_ssh($ssh_creds_svirt);
-        $svirt->_init_xml();
+        my $svirt = _new_svirt_console($ssh_creds_svirt);
 
         subtest 'family kvm create=1' => sub {
             my $dev_id = 'dev_id_012';
@@ -998,10 +923,7 @@
         set_var(VIRSH_VMM_TYPE => 'linux');
         my $basedir = '/var/lib/libvirt/images/';
 
-        my $svirt = consoles::sshVirtsh->new('svirt');
-        $svirt->backend(backend::baseclass->new);
-        $svirt->_init_ssh($ssh_creds_svirt);
-        $svirt->_init_xml();
+        my $svirt = _new_svirt_console($ssh_creds_svirt);
 
         subtest 'family svirt-xen-pv only file=>"specified"' => sub {
             my $dev_id = 'device_id_105';
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1774551362.dd2a78c/t/48-testmodules-style.t 
new/os-autoinst-5.1774620706.b22e21b/t/48-testmodules-style.t
--- old/os-autoinst-5.1774551362.dd2a78c/t/48-testmodules-style.t       
1970-01-01 01:00:00.000000000 +0100
+++ new/os-autoinst-5.1774620706.b22e21b/t/48-testmodules-style.t       
2026-03-27 15:11:46.000000000 +0100
@@ -0,0 +1,229 @@
+#!/usr/bin/perl
+# Copyright SUSE LLC
+# SPDX-License-Identifier: GPL-2.0-or-later
+use Test::Most;
+use Test::Warnings qw(:report_warnings);
+use Test::Output qw(combined_like);
+use FindBin '$Bin';
+use YAML::PP qw(Load);
+use Syntax::Keyword::Try;
+
+my $script = "$Bin/../script/os-autoinst-testmodules-strict";
+require $script;
+
+subtest 'various inputs' => sub {
+    my $data = do { local $/; <DATA> };
+    my @tests = Load $data;
+    for my $i (0 .. $#tests) {
+        note "################################### $i";
+        my $test = $tests[$i];
+        my ($options, $in, $exp) = @$test;
+        note $in;
+        my $doc = PPI::Document->new(\$in) or die 'Could not parse code';
+        my $module;
+        my $err;
+        try {
+            $module = main::analyze($doc);
+        }
+        catch ($e) {
+            $err = $e;
+        }
+        if ($in =~ m/## no os-autoinst style/) {
+            ok $module->{nofix};
+            next;
+        }
+        if ($exp) {
+            my $changed = fix($module, {signatures => $options->{signatures}});
+            if ($changed) {
+                $changed =~ s/^\n+//;
+            }
+            $exp =~ s/^\n+//;
+            is $changed, $exp;
+        }
+        else {
+            like $err, qr{No base};
+        }
+    }
+};
+
+subtest 'main' => sub {
+    my @args = qw(t/data/tests/bar/module2.pm);
+    combined_like { main::main({}, @args) } qr/Would change @args/, 'checking 
file';
+
+    my $code = 'use CGI';
+    combined_like { main::main({}, \$code) } qr/Error.*No base/, 'no base 
statements';
+
+    $code = 'use base "x"';
+    combined_like { main::main({}, \$code) } qr/Would change/, 'checking 
string';
+
+    $code = 'use base "x"';
+    combined_like { main::main({write => 1}, \$code) } qr/Writing/, 'changing 
string';
+    is $code, q{use Mojo::Base 'x';}, 'changed string like expected';
+};
+
+subtest 'script' => sub {
+    my $out = qx{$^X $script};
+    is $? >> 8, 1, 'script exits with 1 in case of usage errors';
+
+    $out = qx{$^X $script t/data/tests/bar/module2.pm};
+    is $? >> 8, 2, 'script exits with 2 in case of changes';
+};
+
+done_testing;
+
+__DATA__
+---
+- { signatures: 1 }
+- |
+    use Mojo::Base -strict;
+    use base 'basetest';
+
+    sub run { }
+- |
+    use Mojo::Base 'basetest', -signatures;
+
+    sub run { }
+
+---
+- { signatures: 1 }
+- |
+    use Mojo::Base -strict;
+
+- |
+
+---
+- { signatures: 1 }
+- |
+    # comment
+    use base 'basetest';
+
+    sub run { }
+- |
+    # comment
+    use Mojo::Base 'basetest', -signatures;
+
+    sub run { }
+
+---
+- { signatures: 1 }
+- |
+    use Mojo::Base 'basetest', -signatures;
+
+- |
+    use Mojo::Base 'basetest', -signatures;
+
+
+---
+- { signatures: 1 }
+- |
+    use Mojo::Base 'basetest', -strict;
+    use base 'opensusebasetest';
+
+- |
+    use Mojo::Base qw(basetest opensusebasetest), -signatures;
+
+
+---
+- { signatures: 0 }
+- |
+    use Mojo::Base 'basetest', -strict;
+    use base 'opensusebasetest';
+
+- |
+    use Mojo::Base qw(basetest opensusebasetest);
+
+
+---
+- { signatures: 0 }
+- |
+    use Mojo::Base 'basetest', -strict, -signatures;
+    use base 'opensusebasetest';
+
+- |
+    use Mojo::Base qw(basetest opensusebasetest), -signatures;
+
+
+---
+- { signatures: 1 }
+- |
+    use Mojo::Base 'basetest', -strict;
+    use base 'basetest';
+
+- |
+    use Mojo::Base 'basetest', -signatures;
+
+
+---
+- { signatures: 1 }
+- |
+    sub run { }
+- |
+
+---
+- { signatures: 1 }
+- |
+    use base qw(foo bar);
+
+- |
+    use Mojo::Base qw(foo bar), -signatures;
+
+
+---
+- { signatures: 1 }
+- |
+    use base 'foo', 'bar';
+
+- |
+    use Mojo::Base qw(foo bar), -signatures;
+
+
+---
+- { signatures: 1 }
+- |
+    use Mojo::Base qw(basetest basetest2), -strict;
+    use base 'basetest3';
+
+- |
+    use Mojo::Base qw(basetest basetest2 basetest3), -signatures;
+
+
+---
+- { signatures: 1 }
+- |
+    use base 'basetest1';
+    use base 'basetest2';
+
+- |
+    use Mojo::Base qw(basetest1 basetest2), -signatures;
+
+
+---
+- { signatures: 1 }
+- |
+    use parent 'basetest1';
+    use base 'basetest2';
+
+- |
+    use Mojo::Base qw(basetest1 basetest2), -signatures;
+
+
+---
+- { signatures: 1 }
+- |
+    # These are barewords, but we also handle them
+    use parent basetest1;
+    use base basetest2;
+
+- |
+    # These are barewords, but we also handle them
+    use Mojo::Base qw(basetest1 basetest2), -signatures;
+
+---
+- { signatures: 1 }
+- |
+    ## no os-autoinst style
+    use base 'basetest';
+
+- |
+    ## no os-autoinst style
+    use base 'basetest';
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/os-autoinst-5.1774551362.dd2a78c/t/lib/CoverageWorkaround.pm 
new/os-autoinst-5.1774620706.b22e21b/t/lib/CoverageWorkaround.pm
--- old/os-autoinst-5.1774551362.dd2a78c/t/lib/CoverageWorkaround.pm    
1970-01-01 01:00:00.000000000 +0100
+++ new/os-autoinst-5.1774620706.b22e21b/t/lib/CoverageWorkaround.pm    
2026-03-27 15:11:46.000000000 +0100
@@ -0,0 +1,89 @@
+package CoverageWorkaround;
+use Mojo::Base -strict;
+
+=head1 DESCRIPTION
+
+A wrapper around Devel::Cover, configuring some things to enable covering some
+things default D::C misses, and to make it less noisy. Run this to generate a
+coverage report on the tests:
+
+    cover -delete && HARNESS_PERL_SWITCHES='-Ilib -MACover' prove -r t && cover
+
+=cut
+
+# prevent these two from interfering with coverage
+BEGIN { $INC{$_}++ for qw( DB/Skip.pm UDAG/VendorBox/Log/Auto.pm ) }
+
+#use Devel::Cover qw' -ignore ^t/ -coverage statement branch condition path 
subroutine ';
+
+# this is for the sketched pushmark/leaveasync cover fixes below
+# use Module::Runtime 'use_module';
+# our $IS_ASYNC = 0;
+
+# this silences warnings about some dynamically generated code
+#no warnings 'uninitialized';
+#$Devel::Cover::DB::Ignore_filenames = qr@
+#      $Devel::Cover::DB::Ignore_filenames
+#
+#      | # SpecIO
+#      (?: ^Specio::\S+-\> )
+#      | # Moose
+#      (?: ^reader\ Moose::Meta::Class:: )
+#      | # Moose
+#      (?: ^inline\ delegation\ in )
+#      | # SSLeay
+#      (?: blib/lib/Net/SSLeay.pm )
+#    |
+#      (?: exportable\ function )
+#    |
+#      (?: compiled\ check )
+#    |
+#      (?: compiled\ assertion )
+#    |
+#      (?: compiled\ coercion )
+#    |
+#      (?: generated\ by\ Specio:: )
+#    |
+#      (?: inlined\ sub\ for )
+#@x;
+
+sub B::Deparse::pp_await {    # fix await parsing # no:style:signatures
+    my ($self, $op, $cx) = @_;
+    return $self->maybe_parens_unop('await', $op->first, $cx);
+}
+
+# dumb way to handle these, simply silences them instead of deparsing them
+# optimally the code below would be implemented
+sub B::Deparse::pp_leaveasync { 'XXX;' }    # no:style:signatures
+sub B::Deparse::pp_pushmark { 'XXX;' }    # no:style:signatures
+
+package Syntax::Keyword::Try::DeparseUDFix;
+use Mojo::Base -strict;
+
+use B::Deparse;    # keep original pp_leave sub for 134812 fix below
+my $orig_pp_leave;
+BEGIN { $orig_pp_leave = \&B::Deparse::pp_leave; }    # no:style:signatures
+
+use Syntax::Keyword::Try::Deparse;    # enable try/catch deparsing for coverage
+
+my $patched_pp_leave;    # apply 134812 fix below
+{
+    $patched_pp_leave = \&B::Deparse::pp_leave;
+    no warnings 'redefine';
+    *B::Deparse::pp_leave = \&pp_leave;
+}
+
+sub pp_leave {    # fix https://rt.cpan.org/Ticket/Display.html?id=134812 # 
no:style:signatures
+    my $self = shift;
+    my ($op) = @_;
+
+    my $enter = $op->first;
+    no strict 'subs';    ## no critic (TestingAndDebugging::ProhibitNoStrict, 
TestingAndDebugging::ProhibitProlongedStrictureOverride)
+    no warnings;
+    return $self->$orig_pp_leave(@_) if $enter->type != OP_ENTER;
+
+    my $meth = ref $enter->sibling eq 'B::COP' ? $orig_pp_leave : 
$patched_pp_leave;
+    return $self->$meth(@_);
+}
+
+1;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/os-autoinst-5.1774551362.dd2a78c/tools/invoke-tests 
new/os-autoinst-5.1774620706.b22e21b/tools/invoke-tests
--- old/os-autoinst-5.1774551362.dd2a78c/tools/invoke-tests     2026-03-26 
19:56:02.000000000 +0100
+++ new/os-autoinst-5.1774620706.b22e21b/tools/invoke-tests     2026-03-27 
15:11:46.000000000 +0100
@@ -65,9 +65,10 @@
 # set Perl module include path and coverage options
 export 
PERL5LIB="$source_directory:$source_directory/ppmclibs/blib/lib:$source_directory/ppmclibs/blib/arch/auto/tinycv:$PERL5LIB"
 if [[ $WITH_COVER_OPTIONS ]]; then
-    
ignore="external/|tools/|t/data/tests/tests/|t/data/tests/pythontests/|t/data/tests/luatests/|t/data/wheels_dir|/tmp|$prove_path"
+    
ignore="external/|tools/|t/data/tests/tests/|t/data/tests/pythontests/|t/data/tests/luatests/|t/data/wheels_dir|/tmp|$prove_path|CoverageWorkaround"
     # add ' -MOpenQA::Test::PatchDeparse' for older OS versions to avoid 
warnings
-    export PERL5OPT="$PERL5OPT 
-I$source_directory/external/os-autoinst-common/lib -MTest::CheckGitStatus 
-MDevel::Cover=-db,$db,-ignore,$ignore,-coverage,statement"
+    export PERL5OPT="$PERL5OPT 
-I$source_directory/external/os-autoinst-common/lib -MTest::CheckGitStatus 
-It/lib -MCoverageWorkaround 
-MDevel::Cover=-db,$db,-ignore,$ignore,-coverage,statement"
+    echo "$PERL5OPT"
 fi
 # set variables for tests which need to invoke the make tool
 export OS_AUTOINST_BUILD_DIRECTORY=$build_directory

++++++ os-autoinst.obsinfo ++++++
--- /var/tmp/diff_new_pack.YSGcV4/_old  2026-03-30 18:36:58.853310229 +0200
+++ /var/tmp/diff_new_pack.YSGcV4/_new  2026-03-30 18:36:58.889311734 +0200
@@ -1,5 +1,5 @@
 name: os-autoinst
-version: 5.1774551362.dd2a78c
-mtime: 1774551362
-commit: dd2a78cacef0b65bcb91483b21415b09b5ce6cf6
+version: 5.1774620706.b22e21b
+mtime: 1774620706
+commit: b22e21b7158a58743af74e896424918dd2bd9488
 

Reply via email to