[PATCH pve-storage v1 44/54] test: parse volname: parameterize test case creation for some vtypes

Max R. Carrara
2026-04-22T11:19:34Z

Currently, a lot of test cases are simply defined as part of the
overall list of tests. While this is completely fine in itself, it
does not scale if one wants to add cases that account for additional
parameters in the future.

Therefore, create a lot of existing test cases in blocks and push them
onto the list of test cases, instead of defining them up front.

Note that we already do this for test cases regarding VM disk / backup
file volume names.

This is done as a preparational step for future commits, primarily in
order to avoid writing a lot of test cases by hand.

Signed-off-by: Max R. Carrara <m.carrara@proxmox.com>
---
src/test/parse_volname_test.pm | 226 ++++++++++++++++-----------------
1 file changed, 108 insertions(+), 118 deletions(-)

diff --git a/src/test/parse_volname_test.pm b/src/test/parse_volname_test.pm
index fb300ad5..1dcec9d6 100644
--- a/src/test/parse_volname_test.pm
+++ b/src/test/parse_volname_test.pm
@@ -34,70 +34,6 @@ my $tests = [
],
},
#
- # iso
- #
- {
- description => 'ISO image, iso',
- volname => 'iso/some-installation-disk.iso',
- expected => ['iso', 'some-installation-disk.iso', undef, undef, undef, undef, 'raw'],
- },
- {
- description => 'ISO image, img',
- volname => 'iso/some-other-installation-disk.img',
- expected =>
- ['iso', 'some-other-installation-disk.img', undef, undef, undef, undef, 'raw'],
- },
- #
- # container templates
- #
- {
- description => 'Container template tar',
- volname => 'vztmpl/debian-10.0-standard_10.0-1_amd64.tar',
- expected => [
- 'vztmpl', 'debian-10.0-standard_10.0-1_amd64.tar', undef, undef, undef, undef,
- 'raw',
- ],
- },
- {
- description => 'Container template tar.gz',
- volname => 'vztmpl/debian-10.0-standard_10.0-1_amd64.tar.gz',
- expected => [
- 'vztmpl',
- 'debian-10.0-standard_10.0-1_amd64.tar.gz',
- undef,
- undef,
- undef,
- undef,
- 'raw',
- ],
- },
- {
- description => 'Container template tar.xz',
- volname => 'vztmpl/debian-10.0-standard_10.0-1_amd64.tar.xz',
- expected => [
- 'vztmpl',
- 'debian-10.0-standard_10.0-1_amd64.tar.xz',
- undef,
- undef,
- undef,
- undef,
- 'raw',
- ],
- },
- {
- description => 'Container template tar.bz2',
- volname => 'vztmpl/debian-10.0-standard_10.0-1_amd64.tar.bz2',
- expected => [
- 'vztmpl',
- 'debian-10.0-standard_10.0-1_amd64.tar.bz2',
- undef,
- undef,
- undef,
- undef,
- 'raw',
- ],
- },
- #
# container rootdir
#
{
@@ -120,62 +56,8 @@ my $tests = [
],
},
#
- # Snippets
- #
- {
- description => 'Snippets, yaml',
- volname => 'snippets/userconfig.yaml',
- expected => ['snippets', 'userconfig.yaml', undef, undef, undef, undef, 'raw'],
- },
- {
- description => 'Snippets, perl',
- volname => 'snippets/hookscript.pl',
- expected => ['snippets', 'hookscript.pl', undef, undef, undef, undef, 'raw'],
- },
- #
# Import
#
- {
- description => "Import, ova",
- volname => 'import/import.ova',
- expected => ['import', 'import.ova', undef, undef, undef, undef, 'ova'],
- },
- {
- description => "Import, ovf",
- volname => 'import/import.ovf',
- expected => ['import', 'import.ovf', undef, undef, undef, undef, 'ovf'],
- },
- {
- description => "Import, qcow2",
- volname => 'import/import.qcow2',
- expected => ['import', 'import.qcow2', undef, undef, undef, undef, 'qcow2'],
- },
- {
- description => "Import, vmdk",
- volname => 'import/import.vmdk',
- expected => ['import', 'import.vmdk', undef, undef, undef, undef, 'vmdk'],
- },
- {
- description => "Import, raw",
- volname => 'import/import.raw',
- expected => ['import', 'import.raw', undef, undef, undef, undef, 'raw'],
- },
- {
- description => "Import, inner file of ova (qcow2)",
- volname => 'import/import.ova/disk.qcow2',
- expected =>
- ['import', 'import.ova/disk.qcow2', undef, undef, undef, undef, 'ova+qcow2'],
- },
- {
- description => "Import, inner file of ova (vmdk)",
- volname => 'import/import.ova/disk.vmdk',
- expected => ['import', 'import.ova/disk.vmdk', undef, undef, undef, undef, 'ova+vmdk'],
- },
- {
- description => "Import, inner file of ova (raw)",
- volname => 'import/import.ova/disk.raw',
- expected => ['import', 'import.ova/disk.raw', undef, undef, undef, undef, 'ova+raw'],
- },
{
description => "Import, inner file of ova with whitespace in name",
volname => 'import/import.ova/OS disk.vmdk',
@@ -271,6 +153,48 @@ my $tests = [
}
}

+# Test cases for ISOs
+{
+ my $suffixes = ['iso', 'img'];
+ my $prefix = 'some-installation-disk';
+
+ for my $suffix ($suffixes->@*) {
+ my $file_name = "$prefix.$suffix";
+
+ my @extra_tests = (
+ {
+ description => "ISO image, $suffix",
+ volname => "iso/$file_name",
+ expected => ['iso', "$file_name", undef, undef, undef, undef, 'raw'],
+ },
+ );
+
+ push($tests->@*, @extra_tests);
+ }
+}
+
+# Test cases for container templates
+{
+ my $suffixes = ['tar', 'tar.gz', 'tar.xz', 'tar.bz2'];
+ my $prefix = 'debian-10.0-standard_10.0-1_amd64';
+
+ for my $suffix ($suffixes->@*) {
+ my $file_name = "$prefix.$suffix";
+
+ my @extra_tests = (
+ {
+ description => "Container template, $suffix",
+ volname => "vztmpl/$file_name",
+ expected => [
+ 'vztmpl', "$file_name", undef, undef, undef, undef, 'raw',
+ ],
+ },
+ );
+
+ push($tests->@*, @extra_tests);
+ }
+}
+
# Additional tests for backup files
{
my $bkp_suffixes = {
@@ -324,6 +248,72 @@ my $tests = [
}
}

+# Test cases for snippets
+{
+ my $file_names = ['userconfig.yaml', 'hookscript.pl'];
+
+ for my $file_name ($file_names->@*) {
+ my @extra_tests = (
+ {
+ description => "Snippets, $file_name",
+ volname => "snippets/$file_name",
+ expected => ['snippets', $file_name, undef, undef, undef, undef, 'raw'],
+ },
+ );
+
+ push($tests->@*, @extra_tests);
+ }
+}
+
+# Test cases for import files
+{
+ my $suffixes = ['ova', 'ovf', 'qcow2', 'vmdk', 'raw'];
+ my $prefix = 'import-file';
+
+ for my $suffix ($suffixes->@*) {
+ my $file_name = "$prefix.$suffix";
+
+ my @extra_tests = (
+ {
+ description => "Import, $suffix",
+ volname => "import/$file_name",
+ expected => ['import', "$file_name", undef, undef, undef, undef, $suffix],
+ },
+ );
+
+ push($tests->@*, @extra_tests);
+ }
+}
+
+# Test cases for OVA import files with content inside
+{
+ my $content_suffixes = ['qcow2', 'vmdk', 'raw'];
+ my $content_prefix = 'disk';
+ my $file_name = 'import.ova';
+
+ for my $content_suffix ($content_suffixes->@*) {
+ my $content_file_name = "$content_prefix.$content_suffix";
+
+ my @extra_tests = (
+ {
+ description => "Import, inner file of ova ($content_suffix)",
+ volname => "import/$file_name/$content_file_name",
+ expected => [
+ 'import',
+ "$file_name/$content_file_name",
+ undef,
+ undef,
+ undef,
+ undef,
+ "ova+$content_suffix",
+ ],
+ },
+ );
+
+ push($tests->@*, @extra_tests);
+ }
+}
+
my sub run_tests($tests) {
my $seen_vtype = {};
my $vtype_subdirs = { map { $_ => 1 } keys plugin_get_default_vtype_subdirs()->%* };
--
2.47.3