all lists on lists.proxmox.com
 help / color / mirror / Atom feed
From: Dominik Csapak <d.csapak@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [PATCH qemu-server v4 1/4] ovmf: introduce helpers that can be mocked for tests
Date: Wed, 11 Feb 2026 10:04:01 +0100	[thread overview]
Message-ID: <20260211092624.1318345-2-d.csapak@proxmox.com> (raw)
In-Reply-To: <20260211092624.1318345-1-d.csapak@proxmox.com>

This makes it easy for us to mock these in tests, so there is no need
for the files to actually exist during package build.

Makes the edk2-firmware build dependency unnecessary.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
new in v4

alternatively, we could look into using 'Test::MockFile', which can
mock all file accesses, but this would probably be a more intrusive
change for the tests, since it will by default mock every file access.

 src/PVE/QemuServer/OVMF.pm           | 35 +++++++++++++++++++---------
 src/test/run_config2command_tests.pl | 19 +++++++++++++++
 2 files changed, 43 insertions(+), 11 deletions(-)

diff --git a/src/PVE/QemuServer/OVMF.pm b/src/PVE/QemuServer/OVMF.pm
index 01b037ef..689d290a 100644
--- a/src/PVE/QemuServer/OVMF.pm
+++ b/src/PVE/QemuServer/OVMF.pm
@@ -54,6 +54,18 @@ my $OVMF = {
     },
 };
 
+# easier to mock for testing that '-f'.
+sub file_exists {
+    my ($path) = @_;
+    return -f $path;
+}
+
+# easier to mock for testing that '-s'.
+sub get_file_size {
+    my ($path) = @_;
+    return -s $path;
+}
+
 my sub get_ovmf_files($$$$) {
     my ($arch, $efidisk, $smm, $cvm_type) = @_;
 
@@ -65,14 +77,14 @@ my sub get_ovmf_files($$$$) {
         if ($cvm_type && $cvm_type eq 'snp') {
             $type = "4m-snp";
             my ($ovmf) = $types->{$type}->@*;
-            die "EFI base image '$ovmf' not found\n" if !-f $ovmf;
+            die "EFI base image '$ovmf' not found\n" if !file_exists($ovmf);
             return ($ovmf);
         } elsif ($cvm_type && ($cvm_type eq 'std' || $cvm_type eq 'es')) {
             $type = "4m-sev";
         } elsif ($cvm_type && $cvm_type eq 'tdx') {
             $type = "4m-tdx";
             my ($ovmf) = $types->{$type}->@*;
-            die "EFI base image '$ovmf' not found\n" if !-f $ovmf;
+            die "EFI base image '$ovmf' not found\n" if !file_exists($ovmf);
             return ($ovmf);
         } elsif (defined($efidisk->{efitype}) && $efidisk->{efitype} eq '4m') {
             $type = $smm ? "4m" : "4m-no-smm";
@@ -83,8 +95,8 @@ my sub get_ovmf_files($$$$) {
     }
 
     my ($ovmf_code, $ovmf_vars) = $types->{$type}->@*;
-    die "EFI base image '$ovmf_code' not found\n" if !-f $ovmf_code;
-    die "EFI vars image '$ovmf_vars' not found\n" if !-f $ovmf_vars;
+    die "EFI base image '$ovmf_code' not found\n" if !file_exists($ovmf_code);
+    die "EFI vars image '$ovmf_vars' not found\n" if !file_exists($ovmf_vars);
 
     return ($ovmf_code, $ovmf_vars);
 }
@@ -103,6 +115,7 @@ my sub print_ovmf_drive_commandlines {
         if $cvm_type && $cvm_type eq 'tdx';
 
     my ($ovmf_code, $ovmf_vars) = get_ovmf_files($arch, $d, $q35, $cvm_type);
+    my $ovmf_vars_size = get_file_size($ovmf_vars);
 
     my $var_drive_str = "if=pflash,unit=1,id=drive-efidisk0";
     if ($d) {
@@ -121,15 +134,15 @@ my sub print_ovmf_drive_commandlines {
         }
         $var_drive_str .= ",format=$format,file=$path";
 
-        $var_drive_str .= ",size=" . (-s $ovmf_vars)
+        $var_drive_str .= ",size=" . $ovmf_vars_size
             if $format eq 'raw' && $version_guard->(4, 1, 2);
         $var_drive_str .= ',readonly=on' if $readonly;
     } else {
         log_warn("no efidisk configured! Using temporary efivars disk.");
         my $path = "/tmp/$vmid-ovmf.fd";
-        PVE::Tools::file_copy($ovmf_vars, $path, -s $ovmf_vars);
+        PVE::Tools::file_copy($ovmf_vars, $path, $ovmf_vars_size);
         $var_drive_str .= ",format=raw,file=$path";
-        $var_drive_str .= ",size=" . (-s $ovmf_vars) if $version_guard->(4, 1, 2);
+        $var_drive_str .= ",size=" . $ovmf_vars_size if $version_guard->(4, 1, 2);
     }
 
     return ("if=pflash,unit=0,format=raw,readonly=on,file=$ovmf_code", $var_drive_str);
@@ -139,7 +152,7 @@ sub get_efivars_size {
     my ($arch, $efidisk, $smm, $cvm_type) = @_;
 
     my (undef, $ovmf_vars) = get_ovmf_files($arch, $efidisk, $smm, $cvm_type);
-    return -s $ovmf_vars;
+    return get_file_size($ovmf_vars);
 }
 
 my sub is_ms_2023_cert_enrolled {
@@ -171,7 +184,7 @@ sub create_efidisk($$$$$$$$) {
 
     my (undef, $ovmf_vars) = get_ovmf_files($arch, $efidisk, $smm, $cvm_type);
 
-    my $vars_size_b = -s $ovmf_vars;
+    my $vars_size_b = get_file_size($ovmf_vars);
     my $vars_size = PVE::Tools::convert_size($vars_size_b, 'b' => 'kb');
     my $volid = PVE::Storage::vdisk_alloc($storecfg, $storeid, $vmid, $fmt, undef, $vars_size);
     PVE::Storage::activate_volumes($storecfg, [$volid]);
@@ -219,7 +232,7 @@ my sub generate_ovmf_blockdev {
     } else {
         log_warn("no efidisk configured! Using temporary efivars disk.");
         my $path = "/tmp/$vmid-ovmf.fd";
-        PVE::Tools::file_copy($ovmf_vars, $path, -s $ovmf_vars);
+        PVE::Tools::file_copy($ovmf_vars, $path, get_file_size($ovmf_vars));
         $drive = { file => $path, interface => 'efidisk', index => 0 };
         $format = 'raw';
     }
@@ -231,7 +244,7 @@ my sub generate_ovmf_blockdev {
     my $extra_blockdev_options = {};
     $extra_blockdev_options->{'read-only'} = 1 if $readonly;
 
-    $extra_blockdev_options->{size} = -s $ovmf_vars if $format eq 'raw';
+    $extra_blockdev_options->{size} = get_file_size($ovmf_vars) if $format eq 'raw';
 
     my $throttle_group = PVE::QemuServer::Blockdev::generate_throttle_group($drive);
 
diff --git a/src/test/run_config2command_tests.pl b/src/test/run_config2command_tests.pl
index 4c872d1c..d272bbc6 100755
--- a/src/test/run_config2command_tests.pl
+++ b/src/test/run_config2command_tests.pl
@@ -19,6 +19,7 @@ use PVE::QemuServer;
 use PVE::QemuServer::Drive;
 use PVE::QemuServer::Helpers;
 use PVE::QemuServer::Monitor;
+use PVE::QemuServer::OVMF;
 use PVE::QemuServer::QMPHelpers;
 use PVE::QemuServer::CPUConfig;
 use PVE::Storage;
@@ -264,6 +265,24 @@ $qemu_server_module->mock(
     },
 );
 
+my $qemu_server_ovmf_module = Test::MockModule->new("PVE::QemuServer::OVMF");
+$qemu_server_ovmf_module->mock(
+    file_exists => sub {
+        my ($path) = @_;
+        return 1;
+    },
+    get_file_size => sub {
+        my ($path) = @_;
+        if ($path =~ m/VARS_4M/i) {
+            return 528 * 1024;
+        } elsif ($path =~ m/VARS/) {
+            return 128 * 1024;
+        } else {
+            return 0;
+        }
+    },
+);
+
 my $storage_module = Test::MockModule->new("PVE::Storage");
 $storage_module->mock(
     activate_volumes => sub {
-- 
2.47.3





  reply	other threads:[~2026-02-11  9:26 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-02-11  9:04 [PATCH qemu-server v4 0/4] improve multiarch build support Dominik Csapak
2026-02-11  9:04 ` Dominik Csapak [this message]
2026-02-11  9:04 ` [PATCH qemu-server v4 2/4] tests: improve multiarch build support by introducing local get_host_arch helper Dominik Csapak
2026-02-11  9:04 ` [PATCH qemu-server v4 3/4] tests: improve multiarch build support by allowing re-init of cpu models Dominik Csapak
2026-02-11  9:04 ` [PATCH qemu-server v4 4/4] tests: cfg2cmd: add some architecture tests Dominik Csapak

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260211092624.1318345-2-d.csapak@proxmox.com \
    --to=d.csapak@proxmox.com \
    --cc=pve-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal