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
