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-04-22 16:57:50 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/os-autoinst (Old) and /work/SRC/openSUSE:Factory/.os-autoinst.new.11940 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "os-autoinst" Wed Apr 22 16:57:50 2026 rev:589 rq:1348576 version:5.1776765124.5d91657 Changes: -------- --- /work/SRC/openSUSE:Factory/os-autoinst/os-autoinst.changes 2026-04-15 16:07:19.033774388 +0200 +++ /work/SRC/openSUSE:Factory/.os-autoinst.new.11940/os-autoinst.changes 2026-04-22 16:58:23.777021312 +0200 @@ -1,0 +2,12 @@ +Tue Apr 21 09:52:15 UTC 2026 - [email protected] + +- Update to version 5.1776765124.5d91657: + * feat: fail explicitly if always_rollback is not supported + * feat: add unique hash to pretty serial markers + * feat: include executed command in step details and serial markers + * docs: explain assert_screen semantics with multiple tags + * feat(debugviewer): Move to /usr/lib + * feat(snd2png): Move to /usr/lib + * feat: Prefer modules in CASEDIR/lib over test module paths + +------------------------------------------------------------------- Old: ---- os-autoinst-5.1776179508.bd2644d.obscpio New: ---- os-autoinst-5.1776765124.5d91657.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ os-autoinst-devel-test.spec ++++++ --- /var/tmp/diff_new_pack.GFx1Q2/_old 2026-04-22 16:58:25.229081399 +0200 +++ /var/tmp/diff_new_pack.GFx1Q2/_new 2026-04-22 16:58:25.233081564 +0200 @@ -18,7 +18,7 @@ %define short_name os-autoinst-devel Name: %{short_name}-test -Version: 5.1776179508.bd2644d +Version: 5.1776765124.5d91657 Release: 0 Summary: Test package for %{short_name} License: GPL-2.0-or-later ++++++ os-autoinst-openvswitch-test.spec ++++++ --- /var/tmp/diff_new_pack.GFx1Q2/_old 2026-04-22 16:58:25.289083881 +0200 +++ /var/tmp/diff_new_pack.GFx1Q2/_new 2026-04-22 16:58:25.293084047 +0200 @@ -19,7 +19,7 @@ %define name_ext -test %define short_name os-autoinst-openvswitch Name: %{short_name}%{?name_ext} -Version: 5.1776179508.bd2644d +Version: 5.1776765124.5d91657 Release: 0 Summary: test package for %{short_name} License: GPL-2.0-or-later ++++++ os-autoinst-test.spec ++++++ --- /var/tmp/diff_new_pack.GFx1Q2/_old 2026-04-22 16:58:25.333085702 +0200 +++ /var/tmp/diff_new_pack.GFx1Q2/_new 2026-04-22 16:58:25.337085868 +0200 @@ -19,7 +19,7 @@ %define name_ext -test %define short_name os-autoinst Name: %{short_name}%{?name_ext} -Version: 5.1776179508.bd2644d +Version: 5.1776765124.5d91657 Release: 0 Summary: test package for os-autoinst License: GPL-2.0-or-later ++++++ os-autoinst.spec ++++++ --- /var/tmp/diff_new_pack.GFx1Q2/_old 2026-04-22 16:58:25.401088516 +0200 +++ /var/tmp/diff_new_pack.GFx1Q2/_new 2026-04-22 16:58:25.405088681 +0200 @@ -17,7 +17,7 @@ Name: os-autoinst -Version: 5.1776179508.bd2644d +Version: 5.1776765124.5d91657 Release: 0 Summary: OS-level test automation License: GPL-2.0-or-later @@ -326,6 +326,8 @@ %defattr(-,root,root) %{_docdir}/os-autoinst %dir %{_prefix}/lib/os-autoinst +%{_prefix}/lib/os-autoinst/debugviewer +%{_prefix}/lib/os-autoinst/snd2png %{_prefix}/lib/os-autoinst/videoencoder %{_prefix}/lib/os-autoinst/basetest.pm # ++++++ os-autoinst-5.1776179508.bd2644d.obscpio -> os-autoinst-5.1776765124.5d91657.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/.github/workflows/ci.yml new/os-autoinst-5.1776765124.5d91657/.github/workflows/ci.yml --- old/os-autoinst-5.1776179508.bd2644d/.github/workflows/ci.yml 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/.github/workflows/ci.yml 2026-04-21 11:52:04.000000000 +0200 @@ -24,7 +24,7 @@ verbose: true - run: | tar cvf coverage.tar build/cover_db - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: coverage path: coverage.tar diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/OpenQA/Isotovideo/Interface.pm new/os-autoinst-5.1776765124.5d91657/OpenQA/Isotovideo/Interface.pm --- old/os-autoinst-5.1776179508.bd2644d/OpenQA/Isotovideo/Interface.pm 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/OpenQA/Isotovideo/Interface.pm 2026-04-21 11:52:04.000000000 +0200 @@ -9,7 +9,7 @@ # -> increment on every change of such APIs # -> never move that variable to another place (when refactoring) # because it may be accessed by the tests itself -our $version = 51; +our $version = 52; # major version of the (web socket) API relevant to the developer mode # -> increment when making non-backward compatible changes to that API diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/OpenQA/Isotovideo/LLMAnalysis.pm new/os-autoinst-5.1776765124.5d91657/OpenQA/Isotovideo/LLMAnalysis.pm --- old/os-autoinst-5.1776179508.bd2644d/OpenQA/Isotovideo/LLMAnalysis.pm 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/OpenQA/Isotovideo/LLMAnalysis.pm 2026-04-21 11:52:04.000000000 +0200 @@ -124,7 +124,7 @@ $output = query_llm_api($prompt, $url, $model); } path("$result_dir/llm-failure-analysis.txt")->spew($output); - bmwqemu::diag("LLM Analysis complete. Saved to $result_dir/llm-failure-analysis.txt"); + bmwqemu::diag("LLM Analysis:\n$output\nSaved to $result_dir/llm-failure-analysis.txt"); } 1; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/OpenQA/Isotovideo/Utils.pm new/os-autoinst-5.1776765124.5d91657/OpenQA/Isotovideo/Utils.pm --- old/os-autoinst-5.1776179508.bd2644d/OpenQA/Isotovideo/Utils.pm 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/OpenQA/Isotovideo/Utils.pm 2026-04-21 11:52:04.000000000 +0200 @@ -439,7 +439,7 @@ sub spawn_debuggers () { my %debugging_tools; $debugging_tools{vncviewer} = ['vncviewer', '-viewonly', '-shared', "localhost:$bmwqemu::vars{VNC}"] if $ENV{RUN_VNCVIEWER}; - $debugging_tools{debugviewer} = ["$bmwqemu::topdir/debugviewer/debugviewer", 'qemuscreenshot/last.png'] if $ENV{RUN_DEBUGVIEWER}; + $debugging_tools{debugviewer} = ["$bmwqemu::topdir/debugviewer", 'qemuscreenshot/last.png'] if $ENV{RUN_DEBUGVIEWER}; for my $tool (keys %debugging_tools) { my ($stdin, $stdout, $stderr, $ret); IPC::Run::run(\@{$debugging_tools{$tool}}, \$stdin, \$stdout, \$stderr); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/autotest.pm new/os-autoinst-5.1776765124.5d91657/autotest.pm --- old/os-autoinst-5.1776179508.bd2644d/autotest.pm 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/autotest.pm 2026-04-21 11:52:04.000000000 +0200 @@ -188,10 +188,10 @@ $module_code = "# line 1 $script_path\n"; $module_code .= path($script_path)->slurp; } - $code .= "use lib '.';" unless path($casedir)->is_abs; - $code .= "use lib '$casedir/lib';"; my $basename = dirname($script_path); - $code .= "use lib '$basename';\n"; + $code .= "use lib '$basename';"; + $code .= "use lib '.';" unless path($casedir)->is_abs; + $code .= "use lib '$casedir/lib';\n"; die "Unsupported file extension for '$script'" unless $script =~ /\.(p[my]|lua)/; if ($script =~ m/\.pm$/) { $code .= $module_code // "require '$script_path';"; @@ -536,6 +536,9 @@ for (my $testindex = 0; $testindex <= $#testorder; $testindex++) { my $t = $testorder[$testindex]; my $flags = $t->test_flags(); + if ($flags->{always_rollback} && !$snapshots_supported && $bmwqemu::vars{FAIL_ON_ALWAYS_ROLLBACK_NOT_SUPPORTED}) { + die "always_rollback requested but snapshots are not supported by the backend\n"; + } my $fullname = $t->{fullname}; if (!$vmloaded && $fullname eq $firsttest) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/basetest.pm new/os-autoinst-5.1776765124.5d91657/basetest.pm --- old/os-autoinst-5.1776179508.bd2644d/basetest.pm 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/basetest.pm 2026-04-21 11:52:04.000000000 +0200 @@ -429,12 +429,14 @@ $self->write_resultfile($filename, $output); } -sub record_serialresult ($self, $ref, $res, $string = undef) { +sub record_serialresult ($self, $ref, $res, $string = undef, %args) { $string //= ''; # take screenshot for documentation (screenshot does not represent fail itself) $self->take_screenshot() unless (testapi::is_serial_terminal); - my $output = "# wait_serial expected: $ref\n"; + my $output = ''; + $output .= "# Command: $args{command}\n" if defined $args{command}; + $output .= "# wait_serial expected: $ref\n"; $output .= "# Result:\n"; $output .= "$string\n"; $self->record_resultfile('wait_serial', $output, result => $res); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/bmwqemu.pm new/os-autoinst-5.1776765124.5d91657/bmwqemu.pm --- old/os-autoinst-5.1776179508.bd2644d/bmwqemu.pm 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/bmwqemu.pm 2026-04-21 11:52:04.000000000 +0200 @@ -170,6 +170,7 @@ sub _abort_if_storage_limit_exceeded () { my $keep_free = $vars{STORAGE_KEEP_FREE_RATIO} // STORAGE_KEEP_FREE_RATIO; + return undef if $keep_free <= 0; my $numdisks = $vars{NUMDISKS} // default_numdisks(); my $total_hdd_size_gb = 0; for my $i (1 .. $numdisks) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/cmake/test-targets.cmake new/os-autoinst-5.1776765124.5d91657/cmake/test-targets.cmake --- old/os-autoinst-5.1776179508.bd2644d/cmake/test-targets.cmake 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/cmake/test-targets.cmake 2026-04-21 11:52:04.000000000 +0200 @@ -139,6 +139,7 @@ endif () # add targets for invoking Perl test suite +find_program(PROVE_PATH prove_wrapper PATHS tools NO_DEFAULT_PATH) find_program(PROVE_PATH prove) find_program(UNBUFFER_PATH unbuffer) if (PROVE_PATH) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/container/os-autoinst_dev/Dockerfile new/os-autoinst-5.1776765124.5d91657/container/os-autoinst_dev/Dockerfile --- old/os-autoinst-5.1776179508.bd2644d/container/os-autoinst_dev/Dockerfile 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/container/os-autoinst_dev/Dockerfile 2026-04-21 11:52:04.000000000 +0200 @@ -29,6 +29,7 @@ aspell-spell \ cmake \ cpio \ + diffutils \ ffmpeg \ file \ gcc-c++ \ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/debugviewer/CMakeLists.txt new/os-autoinst-5.1776765124.5d91657/debugviewer/CMakeLists.txt --- old/os-autoinst-5.1776179508.bd2644d/debugviewer/CMakeLists.txt 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/debugviewer/CMakeLists.txt 2026-04-21 11:52:04.000000000 +0200 @@ -4,4 +4,4 @@ add_executable(${PROJECT_NAME} ${PROJECT_NAME}.cpp) target_link_libraries(${PROJECT_NAME} PRIVATE opencv_core opencv_imgcodecs opencv_highgui) target_compile_options(${PROJECT_NAME} PRIVATE ${PRIVATE_COMPILE_OPTIONS}) -install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") +install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION "${OS_AUTOINST_DATA_DIR}") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/dependencies.yaml new/os-autoinst-5.1776765124.5d91657/dependencies.yaml --- old/os-autoinst-5.1776179508.bd2644d/dependencies.yaml 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/dependencies.yaml 2026-04-21 11:52:04.000000000 +0200 @@ -109,6 +109,7 @@ shadow: sudo: which: + diffutils: spellcheck_requires: aspell-spell: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/dist/rpm/os-autoinst.spec new/os-autoinst-5.1776765124.5d91657/dist/rpm/os-autoinst.spec --- old/os-autoinst-5.1776179508.bd2644d/dist/rpm/os-autoinst.spec 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/dist/rpm/os-autoinst.spec 2026-04-21 11:52:04.000000000 +0200 @@ -326,6 +326,8 @@ %defattr(-,root,root) %{_docdir}/os-autoinst %dir %{_prefix}/lib/os-autoinst +%{_prefix}/lib/os-autoinst/debugviewer +%{_prefix}/lib/os-autoinst/snd2png %{_prefix}/lib/os-autoinst/videoencoder %{_prefix}/lib/os-autoinst/basetest.pm # diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/distribution.pm new/os-autoinst-5.1776765124.5d91657/distribution.pm --- old/os-autoinst-5.1776179508.bd2644d/distribution.pm 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/distribution.pm 2026-04-21 11:52:04.000000000 +0200 @@ -155,9 +155,9 @@ if ($level == 3) { testapi::query_isotovideo('backend_clear_serial_buffer', {}); testapi::type_string "$cmd\n", max_interval => $args{max_interval}; - my $res = testapi::wait_serial(qr/OA:DONE-(\d+)-/, timeout => $args{timeout}, quiet => $args{quiet}); + my $res = testapi::wait_serial(qr/OA:DONE-[0-9a-f]{4}-(\d+)-/, timeout => $args{timeout}, quiet => $args{quiet}, record_command => $cmd); return unless $res; - return ($res =~ /OA:DONE-(\d+)-/)[0]; + return ($res =~ /OA:DONE-[0-9a-f]{4}-(\d+)-/)[0]; } $str = testapi::hashed_string('SR' . $cmd . $args{timeout}); $wait_pattern = qr/$str-(\d+)-/; @@ -178,7 +178,7 @@ testapi::type_string "$marker > /dev/$testapi::serialdev\n", max_interval => $args{max_interval}; } } - my $res = testapi::wait_serial($wait_pattern, timeout => $args{timeout}, quiet => $args{quiet}); + my $res = testapi::wait_serial($wait_pattern, timeout => $args{timeout}, quiet => $args{quiet}, record_command => $cmd); return unless $res; return ($res =~ $wait_pattern)[0]; } @@ -439,13 +439,13 @@ my $pc; my $dev = "/dev/$testapi::serialdev"; if ($level == 3) { - $pc = "PROMPT_COMMAND='printf \"OA:DONE-%d-\\n\" \$? > $dev'"; + $pc = "PROMPT_COMMAND='ret=\$?; cmd=\$(fc -ln -1 2>/dev/null); printf \"OA:DONE-%04x-%d-%s\\nOA:START\\n\" \$RANDOM \$ret \"\${cmd#\${cmd%%[![:space:]]*}}\" > $dev'"; } else { - $pc = "PROMPT_COMMAND='if [ -n \"\$__OA_MARK\" ]; then echo \"\${__OA_MARK}-\$?-\" > $dev; unset __OA_MARK; fi'"; + $pc = "PROMPT_COMMAND='if [ -n \"\$__OA_MARK\" ]; then echo \"\${__OA_MARK}-\$?-\" > $dev; unset __OA_MARK; fi; echo \"OA:START\" > $dev'"; } testapi::type_string "$pc\n"; - my $marker_match = $level == 3 ? 'OA:DONE' : '__OA_MARK'; + my $marker_match = 'OA:START'; my $hook_cmd = "for f in ~/.bashrc ~/.profile; do grep -q '$marker_match' \"\$f\" 2>/dev/null || cat <<'EOF' >> \"\$f\"\n$pc\nEOF\ndone\n"; testapi::type_string $hook_cmd; my $console = testapi::current_console() // 'sut'; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/doc/backend_vars.md new/os-autoinst-5.1776765124.5d91657/doc/backend_vars.md --- old/os-autoinst-5.1776179508.bd2644d/doc/backend_vars.md 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/doc/backend_vars.md 2026-04-21 11:52:04.000000000 +0200 @@ -60,7 +60,8 @@ | GIT_CACHE_DIR | string | | If set enables locally caching Git repositories in the specified directory when handling Git URLs in variables like `CASEDIR` and wheels | | ENABLE_MODERN_PERL_FEATURES | boolean | 0 | Enables use of modern Perl features in test modules avoiding the need to use e.g. `use Mojo::Base 'basetest', -signatures;` in all test modules. This variable must be set before invoking `autotest::loadtest`. It only applies to the test modules themselves. It does *not* apply to e.g. `main.pm` and other Perl modules used via e.g. `use some::module`. | | _HIDE_SECRETS_REGEX | string | | If set, any test variables whose **NAME** (key) matches the specified regular expression, in addition to the default '^_SECRET_' and '_PASSWORD', are excluded from being saved into vars.json or further processing. For example, to hide all variables starting with 'SCC_REGCODE', use '^SCC_REGCODE'. | -| STORAGE_KEEP_FREE_RATIO | float | 0.2 | Ratio of total storage space to keep free (e.g. 0.2 for 20%). If the total requested HDD size exceeds the available space while keeping this ratio of total storage size free, the job is aborted early with "incomplete" status. | +| STORAGE_KEEP_FREE_RATIO | float | 0.2 | Ratio of total storage space to keep free (e.g. 0.2 for 20%). If the total requested HDD size exceeds the available space while keeping this ratio of total storage size free, the job is aborted early with "incomplete" status. Set to 0 to disable this check. | +| FAIL_ON_ALWAYS_ROLLBACK_NOT_SUPPORTED | boolean | 0 | Fail explicitly if a test module is scheduled with the `always_rollback` flag but snapshots are not supported by the backend. | | | ## ZVM backend diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/.github/workflows/base-commit-message-checker.yml new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/.github/workflows/base-commit-message-checker.yml --- old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/.github/workflows/base-commit-message-checker.yml 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/.github/workflows/base-commit-message-checker.yml 2026-04-21 11:52:04.000000000 +0200 @@ -7,8 +7,10 @@ base-check-commit-message: name: Check commit message runs-on: ubuntu-latest + permissions: + contents: read steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Install gitlint diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/.github/workflows/commit-message-checker.yml new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/.github/workflows/commit-message-checker.yml --- old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/.github/workflows/commit-message-checker.yml 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/.github/workflows/commit-message-checker.yml 2026-04-21 11:52:04.000000000 +0200 @@ -10,4 +10,6 @@ jobs: check-commit-message: + permissions: + contents: read uses: ./.github/workflows/base-commit-message-checker.yml diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/.github/workflows/perl-author-tests.yml new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/.github/workflows/perl-author-tests.yml --- old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/.github/workflows/perl-author-tests.yml 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/.github/workflows/perl-author-tests.yml 2026-04-21 11:52:04.000000000 +0200 @@ -5,10 +5,14 @@ jobs: perl-author-tests: + permissions: + contents: read runs-on: ubuntu-latest name: Perl author tests container: image: registry.opensuse.org/devel/openqa/containers/os-autoinst_dev steps: - - uses: actions/checkout@v4 - - run: make test-author + - uses: actions/checkout@v6 + - run: | + git config --system --add safe.directory "$GITHUB_WORKSPACE" + make test-author diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/.github/workflows/perl-lint-checks.yml new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/.github/workflows/perl-lint-checks.yml --- old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/.github/workflows/perl-lint-checks.yml 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/.github/workflows/perl-lint-checks.yml 2026-04-21 11:52:04.000000000 +0200 @@ -5,10 +5,12 @@ jobs: perl-lint-checks: + permissions: + contents: read runs-on: ubuntu-latest name: "Perltidy" container: image: registry.opensuse.org/devel/openqa/containers/os-autoinst_dev steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - run: GITHUB_ACTIONS=1 make test-tidy diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/.github/workflows/test.yaml new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/.github/workflows/test.yaml --- old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/.github/workflows/test.yaml 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/.github/workflows/test.yaml 2026-04-21 11:52:04.000000000 +0200 @@ -5,9 +5,11 @@ jobs: test: + permissions: + contents: read runs-on: ubuntu-latest container: image: perldocker/perl-tester steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - run: make test-t diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/.github/workflows/yamllint.yml new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/.github/workflows/yamllint.yml --- old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/.github/workflows/yamllint.yml 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/.github/workflows/yamllint.yml 2026-04-21 11:52:04.000000000 +0200 @@ -6,9 +6,11 @@ jobs: yaml-lint: runs-on: ubuntu-latest + permissions: + contents: read name: "YAML-lint" steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - uses: docker://registry.opensuse.org/home/okurz/container/containers/tumbleweed:yamllint with: entrypoint: make diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/.gitrepo new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/.gitrepo --- old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/.gitrepo 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/.gitrepo 2026-04-21 11:52:04.000000000 +0200 @@ -6,7 +6,7 @@ [subrepo] remote = [email protected]:os-autoinst/os-autoinst-common.git branch = master - commit = 7bbf40822c49031520d5d287daf89b8fdfe21fb8 - parent = 5af53feb2cb2969b72228bab06f148c633668b23 + commit = 4e71e20292cd76298e53e9726e4d2b49be0eb7e0 + parent = 6913c369c5314bdc441fe373a954d42f3b15aebb method = merge cmdver = 0.4.6 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/.perlcriticrc new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/.perlcriticrc --- old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/.perlcriticrc 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/.perlcriticrc 2026-04-21 11:52:04.000000000 +0200 @@ -25,10 +25,6 @@ # == Community Policies # -- Test::Most brings in strict & warnings -[Freenode::StrictWarnings] -extra_importers = Test::Most - -# -- Test::Most brings in strict & warnings [Community::StrictWarnings] extra_importers = Test::Most diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/Makefile new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/Makefile --- old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/Makefile 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/Makefile 2026-04-21 11:52:04.000000000 +0200 @@ -1,3 +1,11 @@ +# PROVE: Test application for Perl tests +PROVE ?= tools/prove_wrapper +PROVE_JOBS ?= $(shell nproc 2>/dev/null || echo 1) +PROVE_JOBS_ARGS ?= -j$(PROVE_JOBS) + +SH_FILES ?= $(shell file --mime-type $$(git ls-files) test/*.t | sed -n 's/^\(.*\):.*text\/x-shellscript.*$$/\1/p') +SH_SHELLCHECK_FILES ?= $(shell file --mime-type * | sed -n 's/^\(.*\):.*text\/x-shellscript.*$$/\1/p') + all: help .PHONY: help @@ -12,8 +20,17 @@ setup-hooks: ## Install pre-commit git hooks pre-commit install --install-hooks -t commit-msg -t pre-commit +shfmt: ## Format shell scripts via shfmt + shfmt -w ${SH_FILES} + +test-shellcheck: ## Run shfmt and shellcheck tests + @which shfmt >/dev/null 2>&1 || echo "Command 'shfmt' not found, can not execute shell script formating checks" + shfmt -d ${SH_FILES} + @which shellcheck >/dev/null 2>&1 || echo "Command 'shellcheck' not found, can not execute shell script checks" + if [ -n "${SH_SHELLCHECK_FILES}" ]; then shellcheck -x ${SH_SHELLCHECK_FILES}; fi + .PHONY: test-checkstyle -test-checkstyle: test-tidy test-yaml test-gitlint ## Run checkstyle checks +test-checkstyle: test-tidy test-yaml test-gitlint test-shellcheck ## Run checkstyle checks .PHONY: test test: test-checkstyle test-author test-t ## Run all tests @@ -35,8 +52,8 @@ .PHONY: test-author test-author: ## Run author tests - prove -l -r xt/ + "${PROVE}" $(PROVE_JOBS_ARGS) -l -r xt/ .PHONY: test-t test-t: ## Run unit tests - prove -l -r t/ + "${PROVE}" $(PROVE_JOBS_ARGS) -l -r t/ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/dependencies.yaml new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/dependencies.yaml --- old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/dependencies.yaml 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/dependencies.yaml 2026-04-21 11:52:04.000000000 +0200 @@ -23,6 +23,8 @@ perl(Perl::Critic::Community): perl(Test::Perl::Critic): python3-gitlint: + expect: # for unbuffer + shfmt: cover_requires: perl(Devel::Cover): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/lib/OpenQA/Test/TimeLimit.pm new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/lib/OpenQA/Test/TimeLimit.pm --- old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/lib/OpenQA/Test/TimeLimit.pm 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/lib/OpenQA/Test/TimeLimit.pm 2026-04-21 11:52:04.000000000 +0200 @@ -13,6 +13,7 @@ return if ($ENV{OPENQA_TEST_TIMEOUT_DISABLE} or $INC{'perl5db.pl'}); $SCALE_FACTOR *= $ENV{OPENQA_TEST_TIMEOUT_SCALE_COVER} // 3 if Devel::Cover->can('report'); $SCALE_FACTOR *= $ENV{OPENQA_TEST_TIMEOUT_SCALE_CI} // 2 if $ENV{CI}; + $SCALE_FACTOR *= 5 if $ENV{HARNESS_IS_PARALLEL}; $limit *= $SCALE_FACTOR; $SIG{ALRM} = sub { BAIL_OUT "test '$0' exceeds runtime limit of '$limit' seconds\n" }; alarm $limit; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/t/01-compile-check-all.t new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/t/01-compile-check-all.t --- old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/t/01-compile-check-all.t 1970-01-01 01:00:00.000000000 +0100 +++ new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/t/01-compile-check-all.t 2026-04-21 11:52:04.000000000 +0200 @@ -0,0 +1,12 @@ +# Copyright SUSE LLC +# SPDX-License-Identifier: GPL-2.0-or-later + +use Test::Most; +# 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::Compile; +my $test = Test::Compile->new(); +$test->all_files_ok(); +$test->done_testing(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/tools/prove_wrapper new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/tools/prove_wrapper --- old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/tools/prove_wrapper 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/tools/prove_wrapper 2026-04-21 11:52:04.000000000 +0200 @@ -4,11 +4,20 @@ set -euo pipefail -OUTPUT=$(mktemp) +prove_cmd=(prove -I .) + +# skip the check for unhandled output when running in verbose mode +for arg in "$@"; do [[ $arg =~ (-v|--verbose) ]] && TEST_VERBOSE=1 && break; done +[[ ${TEST_VERBOSE:-} && $TEST_VERBOSE != 0 ]] && exec "${prove_cmd[@]}" "$@" echo "Running prove with TAP output check ..." -prove -I . "$@" 2>&1 | tee "$OUTPUT" +# use unbuffer if available and stdout is a terminal for immediate output +[[ -t 1 ]] && unbuffer_cmd=("$(which unbuffer 2> /dev/null)") || unbuffer_cmd=() + +OUTPUT=$(mktemp) +"${unbuffer_cmd[@]}" "${prove_cmd[@]}" "$@" 2>&1 | tee "$OUTPUT" + STATUS=${PIPESTATUS[0]} if [ "$STATUS" -ne 0 ]; then @@ -16,16 +25,20 @@ exit "$STATUS" fi -sed -E ' - s/^\[[0-9]{2}:[0-9]{2}:[0-9]{2}\][[:space:]]*// - /^All tests successful\./,$d -' "$OUTPUT" > "$OUTPUT.processed" - -UNHANDLED=$(grep -vE '^(x?t|t/compile)/.*([0-9]{2}-|)([[:alnum:]]|_|-)+\.t \.+' "$OUTPUT.processed" || true) +UNHANDLED=$(sed --regexp-extended \ + -e 's/^\[[0-9]{2}:[0-9]{2}:[0-9]{2}\][[:space:]]*//' \ + -e '/x?t\/.*\.t\s*\.+/d' \ + -e '/\s*[0-9]+\.\.[0-9]+.*/d' \ + -e '/^# /d' \ + -e '/Files=.*Tests=/d' \ + -e '/Result: /d' \ + -e '/All tests successful\./d' \ + "$OUTPUT") if [ -n "$UNHANDLED" ]; then - echo "not ok - unhandled output found" - echo "Run with PROVE_COMMAND=tools/prove_wrapper to reproduce locally" + echo "not ok - unhandled output found:" + echo "$UNHANDLED" + echo "Run with PROVE=tools/prove_wrapper to reproduce locally" exit 1 else echo "ok - no unhandled output found" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/xt/01-compile-check-all.t new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/xt/01-compile-check-all.t --- old/os-autoinst-5.1776179508.bd2644d/external/os-autoinst-common/xt/01-compile-check-all.t 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/external/os-autoinst-common/xt/01-compile-check-all.t 1970-01-01 01:00:00.000000000 +0100 @@ -1,20 +0,0 @@ -# Copyright SUSE LLC -# SPDX-License-Identifier: GPL-2.0-or-later - -use Test::Most; -# 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 FindBin; -use lib "$FindBin::Bin/lib"; -use OpenQA::Test::TimeLimit '400'; - -use Test::Strict; - -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; -all_perl_files_ok(qw(lib tools xt)); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/script/os-autoinst-testmodules-strict new/os-autoinst-5.1776765124.5d91657/script/os-autoinst-testmodules-strict --- old/os-autoinst-5.1776179508.bd2644d/script/os-autoinst-testmodules-strict 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/script/os-autoinst-testmodules-strict 2026-04-21 11:52:04.000000000 +0200 @@ -36,6 +36,10 @@ Always add signatures. By default it does not add C<-signatures> if it was not alraedy used. +=item B<-v, --force> + +Ignore C<## no os-autoinst style> comments. + =item B<-h, -?, --help> Show this help. @@ -56,7 +60,7 @@ my $rc = 0; unless (caller) { $|++; - GetOptions(\my %options, 'help|h|?', 'verbose|v', 'write', 'signatures') or usage(1); + GetOptions(\my %options, 'help|h|?', 'verbose|v', 'force', 'write', 'signatures') or usage(1); usage(0) if $options{help}; usage(1) unless @ARGV; $rc = main(\%options, @ARGV); @@ -77,7 +81,7 @@ $options->{verbose} and printf $format, $progress, 'Analyzing', $length, $file; my $module; try { - $module = analyze($doc); + $module = analyze($doc, {force => $options->{force}}); } catch ($e) { # uncoverable statement say "\nError in '$file': $e"; @@ -160,15 +164,17 @@ return \%include; } -sub analyze ($doc) { +sub analyze ($doc, $args) { 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; + unless ($args->{force}) { + $module{nofix} = 1; + return \%module; + } } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/snd2png/CMakeLists.txt new/os-autoinst-5.1776765124.5d91657/snd2png/CMakeLists.txt --- old/os-autoinst-5.1776179508.bd2644d/snd2png/CMakeLists.txt 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/snd2png/CMakeLists.txt 2026-04-21 11:52:04.000000000 +0200 @@ -6,4 +6,4 @@ target_compile_options(${PROJECT_NAME} PRIVATE ${PRIVATE_COMPILE_OPTIONS}) target_use_pkg_config_module(${PROJECT_NAME} "fftw3") target_use_pkg_config_module(${PROJECT_NAME} "sndfile") -install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") +install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION "${OS_AUTOINST_DATA_DIR}") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/t/03-testapi.t new/os-autoinst-5.1776765124.5d91657/t/03-testapi.t --- old/os-autoinst-5.1776179508.bd2644d/t/03-testapi.t 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/t/03-testapi.t 2026-04-21 11:52:04.000000000 +0200 @@ -1334,6 +1334,16 @@ } }; +subtest 'wait_serial record_command' => sub { + my $mock_test = Test::MockModule->new('basetest'); + my $recorded_cmd; + $mock_test->redefine(record_serialresult => sub ($self, $ref, $res, $string, %args) { + $recorded_cmd = $args{command}; + }); + wait_serial('regex', record_command => 'my_command'); + is($recorded_cmd, 'my_command', 'command passed to record_serialresult'); +}; + done_testing; END { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/t/05-distribution.t new/os-autoinst-5.1776765124.5d91657/t/05-distribution.t --- old/os-autoinst-5.1776179508.bd2644d/t/05-distribution.t 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/t/05-distribution.t 2026-04-21 11:52:04.000000000 +0200 @@ -99,12 +99,12 @@ my ($regexp) = @_; return 'BASH:4.4:' if ref($regexp) eq 'Regexp' && 'BASH:4.4:' =~ $regexp; return 'FC:OK:' if ref($regexp) eq 'Regexp' && 'FC:OK:' =~ $regexp; - return 'OA:foo3foo-0-'; + return 'OA:DONE-abcd-0-foo'; }); $d->{_serial_marker_level} = {}; $typed_string = ''; - $d->script_run('foo'); + is $d->script_run('foo'), 0, 'Level 3 returns exit code'; like $typed_string, qr/foo\n$/, 'Level 3 ends with command + newline'; is substr($typed_string, -4), "foo\n", 'Level 3 uses clean command line'; @@ -156,7 +156,7 @@ my ($regexp) = @_; return 'BASH:4.4:' if ref($regexp) eq 'Regexp' && 'BASH:4.4:' =~ $regexp; return 'FC:OK:' if ref($regexp) eq 'Regexp' && 'FC:OK:' =~ $regexp; - return 'OA:DONE-0-'; + return 'OA:DONE-abcd-0-'; }); $d->script_run('foo'); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/t/08-autotest.t new/os-autoinst-5.1776765124.5d91657/t/08-autotest.t --- old/os-autoinst-5.1776179508.bd2644d/t/08-autotest.t 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/t/08-autotest.t 2026-04-21 11:52:04.000000000 +0200 @@ -232,6 +232,15 @@ is $reverts_done, 0, 'no snapshots loaded after fatal failure'; is $snapshots_made, 0, 'no snapshots made after fatal failure'; }; + snapshot_subtest 'fails if snapshots are not supported and FAIL_ON_ALWAYS_ROLLBACK_NOT_SUPPORTED is set' => sub { + $mock_basetest->redefine(test_flags => {always_rollback => 1}); + $mock_autotest->redefine(query_isotovideo => sub { 0 }); + $bmwqemu::vars{FAIL_ON_ALWAYS_ROLLBACK_NOT_SUPPORTED} = 1; + my $w; + stderr_like { $w = warning { autotest::run_all } } qr/Snapshots are not supported/, 'run_all outputs on stderr'; + like $w, qr/always_rollback requested but snapshots are not supported by the backend/, 'fails with explicit error message'; + delete $bmwqemu::vars{FAIL_ON_ALWAYS_ROLLBACK_NOT_SUPPORTED}; + }; $mock_basetest->unmock($_) for qw(runtest test_flags); $mock_autotest->unmock($_) for qw(load_snapshot make_snapshot query_isotovideo); }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/t/12-bmwqemu.t new/os-autoinst-5.1776765124.5d91657/t/12-bmwqemu.t --- old/os-autoinst-5.1776179508.bd2644d/t/12-bmwqemu.t 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/t/12-bmwqemu.t 2026-04-21 11:52:04.000000000 +0200 @@ -213,6 +213,42 @@ bmwqemu::init; bmwqemu::ensure_valid_vars(); } qr/keep-free 90%/, 'abort if requested HDDSIZEGB exceeds custom threshold'; + + unlink bmwqemu::STATE_FILE; + create_vars({CASEDIR => $dir, HDDSIZEGB => 1, STORAGE_KEEP_FREE_RATIO => 0}); + $bmw_mock->mock(_get_storage_stats => sub { return (1024**3, 100 * 1024**2) }); + lives_ok { + bmwqemu::init(); + bmwqemu::ensure_valid_vars(); + } 'succeed if requested HDDSIZEGB exceeds available space but ratio is 0'; + + unlink bmwqemu::STATE_FILE; + create_vars({CASEDIR => $dir}); # No HDDSIZEGB, uses default 10GB + $bmw_mock->mock(_get_storage_stats => sub { return (100 * 1024**3, 100 * 1024**3) }); + lives_ok { + bmwqemu::init(); + bmwqemu::ensure_valid_vars(); + } 'succeed with default HDDSIZEGB'; +}; + +subtest '_get_storage_stats' => sub { + my $tmp = tempdir(CLEANUP => 1); + my $dummy_df = "$tmp/df"; + for my $case ( + {output => ' 1000 500', total => 1000, avail => 500, msg => 'matches dummy df'}, + {output => 'malformed', total => undef, avail => undef, msg => 'is undef on malformed df output'}, + ) { + path($dummy_df)->spew("#!/bin/sh\necho '$case->{output}'"); + chmod 0755, $dummy_df; + local $ENV{PATH} = "$tmp:$ENV{PATH}"; + my ($total, $available) = bmwqemu::_get_storage_stats('.'); + is $total, $case->{total}, "total $case->{msg}"; + is $available, $case->{avail}, "available $case->{msg}"; + } + + my ($total, $available) = bmwqemu::_get_storage_stats('.'); + like $total, qr/^\d+$/, 'returns numeric total storage'; + like $available, qr/^\d+$/, 'returns numeric available storage'; }; done_testing; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/t/14-isotovideo.t new/os-autoinst-5.1776765124.5d91657/t/14-isotovideo.t --- old/os-autoinst-5.1776179508.bd2644d/t/14-isotovideo.t 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/t/14-isotovideo.t 2026-04-21 11:52:04.000000000 +0200 @@ -353,7 +353,7 @@ exit_code => 0) }; like $log, qr/Starting LLM Analysis/, 'LLM analysis started'; - like $log, qr/LLM Analysis complete/, 'LLM analysis finished'; + like $log, qr/LLM Analysis:/, 'LLM analysis finished'; my $analysis_file = path($pool_dir, 'testresults', 'llm-failure-analysis.txt'); ok -e $analysis_file, 'LLM analysis output file exists'; like $analysis_file->slurp, qr/analyzing an automated test run/, 'LLM analysis output contains expected content'; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/t/17-basetest.t new/os-autoinst-5.1776765124.5d91657/t/17-basetest.t --- old/os-autoinst-5.1776179508.bd2644d/t/17-basetest.t 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/t/17-basetest.t 2026-04-21 11:52:04.000000000 +0200 @@ -518,4 +518,15 @@ is($basetest->{result}, 'successfully called function', 'search for expected serial failures is working'); }; +subtest record_serialresult_with_command => sub { + my $basetest = basetest->new(); + $basetest->{name} = 'test'; + my $recorded_output; + my $mock_basetest_local = Test::MockModule->new('basetest'); + $mock_basetest_local->redefine(record_resultfile => sub ($self, $title, $output, %nargs) { $recorded_output = $output }); + $basetest->record_serialresult('regex', 'ok', 'output', command => 'my_command'); + like($recorded_output, qr/# Command: my_command/, 'command is in output'); + like($recorded_output, qr/# wait_serial expected: regex/, 'expected regex is in output'); +}; + done_testing; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/t/48-testmodules-style.t new/os-autoinst-5.1776765124.5d91657/t/48-testmodules-style.t --- old/os-autoinst-5.1776179508.bd2644d/t/48-testmodules-style.t 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/t/48-testmodules-style.t 2026-04-21 11:52:04.000000000 +0200 @@ -23,7 +23,7 @@ my $module; my $err; try { - $module = main::analyze($doc); + $module = main::analyze($doc, {}); } catch ($e) { $err = $e; @@ -46,7 +46,7 @@ } }; -subtest 'main' => sub { +subtest main => sub { my @args = qw(t/data/tests/bar/module2.pm); combined_like { main::main({}, @args) } qr/Would change @args/, 'checking file'; @@ -61,7 +61,7 @@ is $code, q{use Mojo::Base 'x';}, 'changed string like expected'; }; -subtest 'script' => sub { +subtest script => sub { my $out = qx{$^X $script}; is $? >> 8, 1, 'script exits with 1 in case of usage errors'; @@ -69,6 +69,18 @@ is $? >> 8, 2, 'script exits with 2 in case of changes'; }; +subtest force => sub { + my $code = <<~'EOM'; + ## no os-autoinst style + use base 'foo'; + EOM + my $doc = PPI::Document->new(\$code) or die 'Could not parse code'; + my $module = main::analyze($doc, {}); + is $module->{nofix}, 1, 'requested to skip by comment'; + $module = main::analyze($doc, {force => 1}); + !exists $module->{nofix}, 'requested to skip by comment'; +}; + done_testing; __DATA__ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/testapi.pm new/os-autoinst-5.1776765124.5d91657/testapi.pm --- old/os-autoinst-5.1776179508.bd2644d/testapi.pm 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/testapi.pm 2026-04-21 11:52:04.000000000 +0200 @@ -397,6 +397,9 @@ circumstance of the screen being shown this does not imply a longer waiting time as the method returns as soon as a successful needle match occurred. +Note when using multiple tags the method returns on the first match and an +additional C<assert_screen> may be needed for consecutive screens. + Specify C<$no_wait> to run the screen check as fast as possible that is possibly more than once per second which is default. Select this to check a screen which can change in a range faster than 1-2 seconds not to miss the @@ -866,6 +869,7 @@ no_regex => 0, buffer_size => undef, record_output => undef, + record_command => undef, }, ['timeout', 'expect_not_found'], @_); bmwqemu::log_call(%args); @@ -882,7 +886,7 @@ # hyperv and vmware (backend/svirt.pm) connect serial line over TCP/IP (socat) # convert CRLF to LF only $ret->{string} =~ s,\r\n,\n,g; - $autotest::current_test->record_serialresult(bmwqemu::pp($regexp), $matched, $ret->{string}) unless ($args{quiet}); + $autotest::current_test->record_serialresult(bmwqemu::pp($regexp), $matched, $ret->{string}, command => $args{record_command}) unless ($args{quiet}); bmwqemu::fctres("$regexp: $matched"); return $ret->{string} if ($matched eq 'ok'); return; # false @@ -1783,7 +1787,7 @@ return query_isotovideo('backend_start_audiocapture', {filename => $filename}); } -sub _snd2png ($wavfile, $imgpath) { system "snd2png $wavfile $imgpath" } # uncoverable statement +sub _snd2png ($wavfile, $imgpath) { system "$bmwqemu::topdir/snd2png $wavfile $imgpath" } # uncoverable statement sub _check_or_assert_sound ($mustmatch, $check = undef) { my $result = $autotest::current_test->stop_audiocapture(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/tools/container_run_ci new/os-autoinst-5.1776765124.5d91657/tools/container_run_ci --- old/os-autoinst-5.1776179508.bd2644d/tools/container_run_ci 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/tools/container_run_ci 2026-04-21 11:52:04.000000000 +0200 @@ -71,7 +71,7 @@ cd /opt ./tools/install-new-deps.sh export CI=1 WITH_COVER_OPTIONS=1 CHECK_GIT_STATUS=1 PERL_TEST_WARNINGS_ONLY_REPORT_WARNINGS=$PERL_TEST_WARNINGS_ONLY_REPORT_WARNINGS -cmake -G Ninja -DPROVE_PATH=\"/opt/tools/prove_wrapper\" -DCMAKE_BUILD_TYPE=Release -S . -B \"$build_dir\" +cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -S . -B \"$build_dir\" cmake --build \"$build_dir\" --verbose --target check-pkg-build cmake --build \"$build_dir\" --verbose --target $target cover -report html_minimal \"$build_dir\"/cover_db" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1776179508.bd2644d/tools/install-new-deps.sh new/os-autoinst-5.1776765124.5d91657/tools/install-new-deps.sh --- old/os-autoinst-5.1776179508.bd2644d/tools/install-new-deps.sh 2026-04-14 17:11:48.000000000 +0200 +++ new/os-autoinst-5.1776765124.5d91657/tools/install-new-deps.sh 2026-04-21 11:52:04.000000000 +0200 @@ -25,6 +25,10 @@ listdeps > $NEWDEPS echo "Checking updated packages" +command -v diff &> /dev/null || { + echo "ERROR: diff is not installed" + exit 1 +} if diff $OLDDEPS $NEWDEPS > $DIFFDEPS; then echo "NO DIFF" else ++++++ os-autoinst.obsinfo ++++++ --- /var/tmp/diff_new_pack.GFx1Q2/_old 2026-04-22 16:58:28.973236334 +0200 +++ /var/tmp/diff_new_pack.GFx1Q2/_new 2026-04-22 16:58:28.993237162 +0200 @@ -1,5 +1,5 @@ name: os-autoinst -version: 5.1776179508.bd2644d -mtime: 1776179508 -commit: bd2644d4d18402e34c7e49ea9dab47bd110081b6 +version: 5.1776765124.5d91657 +mtime: 1776765124 +commit: 5d91657133aff9d9050b3837c9abc21c14d03cff
