Signed-off-by: Dominic Jäger <d.jae...@proxmox.com> --- This did not exist separately in RFC
test/Makefile | 5 +- test/run_plugin_tests.pl | 184 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 188 insertions(+), 1 deletion(-) create mode 100755 test/run_plugin_tests.pl diff --git a/test/Makefile b/test/Makefile index 833a597..c54b10f 100644 --- a/test/Makefile +++ b/test/Makefile @@ -1,6 +1,6 @@ all: test -test: test_zfspoolplugin test_disklist test_bwlimit +test: test_zfspoolplugin test_disklist test_bwlimit test_plugin test_zfspoolplugin: run_test_zfspoolplugin.pl ./run_test_zfspoolplugin.pl @@ -10,3 +10,6 @@ test_disklist: run_disk_tests.pl test_bwlimit: run_bwlimit_tests.pl ./run_bwlimit_tests.pl + +test_plugin: run_plugin_tests.pl + ./run_plugin_tests.pl diff --git a/test/run_plugin_tests.pl b/test/run_plugin_tests.pl new file mode 100755 index 0000000..cd93430 --- /dev/null +++ b/test/run_plugin_tests.pl @@ -0,0 +1,184 @@ +#!/usr/bin/perl +use strict; +use warnings; + +use lib ('.', '..'); +use Test::More tests => 32; +use Test::MockModule qw(new); +use File::Temp qw(tempdir); +use File::Path qw(make_path); +use Data::Dumper qw(Dumper); +use Storable qw(dclone); +use PVE::Storage; + +my $plugin = 'PVE::Storage::Plugin'; +my $basename = 'test'; + +my $iso_type = 'iso'; +my $iso_suffix = '.iso'; +my $iso_notdir = "$basename$iso_suffix"; +my $iso_volname = "$iso_type/$iso_notdir"; + +my $vztmpl_type = 'vztmpl'; +my $vztmpl_suffix = '.tar.gz'; +my $vztmpl_notdir = "$basename$vztmpl_suffix"; +my $vztmpl_volname = "$vztmpl_type/$vztmpl_notdir"; + +my $iso_with_dots = "$iso_type/../$iso_notdir"; +my $vztmpl_with_dots = "$vztmpl_type/../$vztmpl_notdir"; + +my $image_type = 'images'; +my $vmid = '100'; +my $image_basename = 'vm-100-disk-0'; +my $raw_image_format = 'raw'; # Tests for parse_volname don't need the dot +my $raw_image_notdir = "$image_basename.$raw_image_format"; +my $raw_image_volname = "$vmid/$raw_image_notdir"; +my $qcow_image_format = 'qcow2'; +my $qcow_image_notdir = "$image_basename.$qcow_image_format"; +my $qcow_image_volname = "$vmid/$qcow_image_notdir"; +my $vmdk_image_format = 'vmdk'; +my $vmdk_image_notdir = "$image_basename.$vmdk_image_format"; +my $vmdk_image_volname = "$vmid/$vmdk_image_notdir"; + +my $type_index = 0; +my $notdir_index = 1; +my $format_index = 6; + +is (($plugin->parse_volname($iso_volname))[$type_index], + $iso_type, 'parse_volname: type for iso'); +is (($plugin->parse_volname($iso_volname))[$notdir_index], + $iso_notdir, 'parse_volname: notdir for iso'); + +is (($plugin->parse_volname($vztmpl_volname))[$type_index], + $vztmpl_type, 'parse_volname: type for vztmpl'); +is (($plugin->parse_volname($vztmpl_volname))[$notdir_index], + $vztmpl_notdir, 'parse_volname: notdir for vztmpl'); + +is (($plugin->parse_volname($raw_image_volname))[$type_index], + $image_type, 'parse_volname: type for raw image'); +is (($plugin->parse_volname($raw_image_volname))[$notdir_index], + $raw_image_notdir, 'parse_volname: notdir for raw image'); +is (($plugin->parse_volname($raw_image_volname))[$format_index], + $raw_image_format, 'parse_volname: format for raw image'); + +is (($plugin->parse_volname($qcow_image_volname))[$type_index], + $image_type, 'parse_volname: type for qcow image'); +is (($plugin->parse_volname($qcow_image_volname))[$notdir_index], + $qcow_image_notdir, 'parse_volname: notdir for qcow image'); +is (($plugin->parse_volname($qcow_image_volname))[$format_index], + $qcow_image_format, 'parse_volname: format for qcow image'); + +is (($plugin->parse_volname($vmdk_image_volname))[$type_index], + $image_type, 'parse_volname: type for vmdk image'); +is (($plugin->parse_volname($vmdk_image_volname))[$notdir_index], + $vmdk_image_notdir, 'parse_volname: notdir for vmdk image'); +is (($plugin->parse_volname($vmdk_image_volname))[$format_index], + $vmdk_image_format, 'parse_volname: format for vmdk image'); + + +my $scfg_with_path = { path => '/some/path' }; +is ($plugin->get_subdir($scfg_with_path, 'iso'), + "$scfg_with_path->{path}/template/iso", 'get_subdir for iso' ); +is ($plugin->get_subdir($scfg_with_path, 'vztmpl'), + "$scfg_with_path->{path}/template/cache", 'get_subdir for vztmpl'); +is ($plugin->get_subdir($scfg_with_path, 'backup'), + "$scfg_with_path->{path}/dump", 'get_subdir for backup'); +is ($plugin->get_subdir($scfg_with_path, 'images'), + "$scfg_with_path->{path}/images", 'get_subdir for images'); +is ($plugin->get_subdir($scfg_with_path, 'rootdir'), + "$scfg_with_path->{path}/private", 'get_subdir for rootdir'); + +is ($plugin->filesystem_path($scfg_with_path, $iso_volname), + "$scfg_with_path->{path}/template/$iso_volname", + 'filesystem_path for iso'); +is ($plugin->filesystem_path($scfg_with_path, $vztmpl_volname), + "$scfg_with_path->{path}/template/cache/$vztmpl_notdir", + 'filesystem_path for vztmpl'); +is ($plugin->filesystem_path($scfg_with_path, $raw_image_volname), + "$scfg_with_path->{path}/images/$raw_image_volname", + 'filesystem_path for raw images'); +is ($plugin->filesystem_path($scfg_with_path, $qcow_image_volname), + "$scfg_with_path->{path}/images/$qcow_image_volname", + 'filesystem_path for qcow image'); +is ($plugin->filesystem_path($scfg_with_path, $vmdk_image_volname), + "$scfg_with_path->{path}/images/$vmdk_image_volname", + 'filesystem_path for vmdk image'); + + +# $expected_volnames may be unsorted +sub test_list_volumes { + my ($scfg, $required_type, $expected_volnames, $param) = @_; + my $storage_id = 'sid'; + my $volumes_ref = $plugin->list_volumes($storage_id, $scfg, undef, + $required_type, $param); + my $get_volname = sub { my $i = $_->{volid}; $i =~ s/$storage_id://g; $i }; + my @received = map ($get_volname->(), @$volumes_ref); + my @x = sort @received; + my @y = sort(@$expected_volnames); + ok (@x ~~ @y, "list_volumes with required type [@$required_type]") + || diag ("Expected\n", Dumper (@y), "but received\n", Dumper(@x)); +} + +sub add_test_files { + my ($paths) = @_; + foreach my $path (@$paths) { +# note "Adding test files to path $path"; + make_path($path) || BAIL_OUT "Could not create directory $path!"; + IO::File->new("$path/$iso_notdir", 'w'); + IO::File->new("$path/$iso_notdir", 'w'); + IO::File->new("$path/$raw_image_notdir", 'w'); + IO::File->new("$path/$qcow_image_notdir", 'w'); + IO::File->new("$path/$vmdk_image_notdir", 'w'); + IO::File->new("$path/$vztmpl_notdir", 'w'); + IO::File->new("$path/garbage", 'w'); + } +} + +my $storage_dir_no_rec = File::Temp->newdir(); +my $paths = [ + "$storage_dir_no_rec/template/cache", + "$storage_dir_no_rec/template/iso", + "$storage_dir_no_rec/images/$vmid" +]; +add_test_files($paths); + +note 'Tests without recursion'; +# note "Temp dir is:\n", `tree $storage_dir_no_rec`; +my $scfg_no_rec = { path => $storage_dir_no_rec }; +test_list_volumes($scfg_no_rec, [$iso_type], [$iso_volname]); +test_list_volumes($scfg_no_rec, [$vztmpl_type], [$vztmpl_volname]); + +my $scfg_with_type = { path => $storage_dir_no_rec, type => 'dir' }; +my $plugin_mock = Test::MockModule->new('PVE::Cluster'); +$plugin_mock->redefine('get_vmlist' => sub { return undef }); +my $expected_volnames_guests = [$qcow_image_volname, $raw_image_volname, + $vmdk_image_volname]; +note 'Tests for undefined VM type => KVM/Qemu'; +test_list_volumes($scfg_with_type, ['images'], $expected_volnames_guests); +test_list_volumes($scfg_with_type, ['rootdir'], []); +test_list_volumes($scfg_with_type, ['images', 'rootdir'], + $expected_volnames_guests); + +note 'Tests for VM type lxc'; +$plugin_mock->redefine('get_vmlist' => sub + { return { ids => { $vmid => { type => 'lxc' }}}}); +test_list_volumes($scfg_with_type, ['images'], []); +test_list_volumes($scfg_with_type, ['rootdir'], $expected_volnames_guests); +test_list_volumes($scfg_with_type, ['images', 'rootdir'], + $expected_volnames_guests); + + +# see bug report +# https://pve.proxmox.com/pipermail/pve-devel/2020-January/041096.html +sub test_unmodified_cluster_vmlist { + my ($scfg, $original_vmlist) = @_; + my $tested_vmlist = dclone($original_vmlist); + my $plugin_mock = Test::MockModule->new('PVE::Cluster'); + $plugin_mock->redefine('get_vmlist' => sub { return $tested_vmlist }); + $plugin->list_volumes('sid', $scfg, undef, ['images']); + is_deeply ($tested_vmlist, $original_vmlist, + 'PVE::Cluster::vmlist remains unmodified') + || diag ("Expected vmlist to remain\n", Dumper($original_vmlist), + "but it turned to\n", Dumper($tested_vmlist)); +} +test_unmodified_cluster_vmlist($scfg_with_type, { ids => {} }); -- 2.20.1 _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel