[pve-devel] [PATCH storage 1/7] add disklist test
Dominik Csapak
d.csapak at proxmox.com
Mon Oct 17 10:31:21 CEST 2016
and add to makefile
Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
test/Makefile | 5 +-
test/disklist_test.pm | 216 +++++++++++++++++++++++++++++++++++++++++++++++++
test/run_disk_tests.pl | 10 +++
3 files changed, 230 insertions(+), 1 deletion(-)
create mode 100644 test/disklist_test.pm
create mode 100755 test/run_disk_tests.pl
diff --git a/test/Makefile b/test/Makefile
index 33d5ff8..b44d7be 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -1,6 +1,9 @@
all: test
-test: test_zfspoolplugin
+test: test_zfspoolplugin test_disklist
test_zfspoolplugin: run_test_zfspoolplugin.pl
./run_test_zfspoolplugin.pl
+
+test_disklist: run_disk_tests.pl
+ ./run_disk_tests.pl
diff --git a/test/disklist_test.pm b/test/disklist_test.pm
new file mode 100644
index 0000000..b2bde49
--- /dev/null
+++ b/test/disklist_test.pm
@@ -0,0 +1,216 @@
+package PVE::Diskmanage::Test;
+
+use strict;
+use warnings;
+
+use lib qw(..);
+
+use PVE::Diskmanage;
+use PVE::Tools;
+
+use Test::MockModule;
+use Test::More;
+use JSON;
+use Data::Dumper;
+
+my $testcasedir; # current case directory
+my $testcount = 0; # testcount for TAP::Harness
+my $diskmanage_module; # mockmodule for PVE::Diskmanage
+my $print = 0;
+
+sub mocked_run_command {
+ my ($cmd, %param) = @_;
+
+ my $outputlines = [];
+ if (my $ref = ref($cmd)) {
+ if ($cmd->[0] =~ m/udevadm/i) {
+ # simulate udevadm output
+ my $dev = $cmd->[3];
+ $dev =~ s|/sys/block/||;
+ @$outputlines = split(/\n/, read_test_file("${dev}_udevadm"));
+
+ } elsif ($cmd->[0] =~ m/smartctl/i) {
+ # simulate smartctl output
+ my $dev;
+ my $type;
+ if (@$cmd > 3) {
+ $dev = $cmd->[5];
+ $type = 'smart';
+ } else {
+ $dev = $cmd->[2];
+ $type = 'health';
+ }
+ $dev =~ s|/dev/||;
+ @$outputlines = split(/\n/, read_test_file("${dev}_${type}"));
+ } elsif ($cmd->[0] =~ m/sgdisk/i) {
+ # simulate sgdisk
+ die "implement me: @$cmd\n";
+ } elsif ($cmd->[0] =~ m/zpool/i) {
+ # simulate zpool output
+ @$outputlines = split(/\n/, read_test_file('zpool'));
+
+ } elsif ($cmd->[0] =~ m/pvs/i) {
+ # simulate lvs output
+ @$outputlines = split(/\n/, read_test_file('pvs'));
+ } else {
+ print "unexpected run_command call: '@$cmd', aborting\n";
+ die;
+ }
+ } else {
+ print "unexpected run_command call: '@$cmd', aborting\n";
+ die;
+ }
+
+ my $outfunc;
+ if ($param{outfunc}) {
+ $outfunc = $param{outfunc};
+ map { &$outfunc(($_)) } @$outputlines;
+
+ return 0;
+ }
+}
+
+sub mocked_get_sysdir_info {
+ my ($param) = @_;
+
+ my $originalsub = $diskmanage_module->original('get_sysdir_info');
+
+ $param =~ s|/sys/block|disk_tests/$testcasedir|;
+
+ return &$originalsub($param);
+}
+
+sub mocked_dir_glob_foreach {
+ my ($dir, $regex, $sub) = @_;
+
+ my $lines = [];
+
+ # read lines in from file
+ if ($dir =~ m{^/sys/block$} ) {
+ @$lines = split(/\n/, read_test_file('disklist'));
+ } elsif ($dir =~ m{^/sys/block/([^/]+)}) {
+ @$lines = split(/\n/, read_test_file('partlist'));
+ }
+
+ foreach my $line (@$lines) {
+ if ($line =~ m/$regex/) {
+ &$sub($line);
+ }
+ }
+}
+
+sub mocked_parse_proc_mounts {
+ my $text = read_test_file('mounts');
+
+ my $mounts = [];
+
+ foreach my $line(split(/\n/, $text)) {
+ push @$mounts, [split(/\s+/, $line)];
+ }
+
+ return $mounts;
+}
+
+sub read_test_file {
+ my ($filename) = @_;
+
+ if (!-f "disk_tests/$testcasedir/$filename") {
+ print "file '$testcasedir/$filename' not found\n";
+ return '';
+ }
+ open (my $fh, '<', "disk_tests/$testcasedir/$filename")
+ or die "Cannot open disk_tests/$testcasedir/$filename: $!";
+
+ my $output = <$fh> // '';
+ chomp $output if $output;
+ while (my $line = <$fh>) {
+ chomp $line;
+ $output .= "\n$line";
+ }
+
+ return $output;
+}
+
+
+sub test_disk_list {
+ my ($testdir) = @_;
+ subtest "Test '$testdir'" => sub {
+ my $testcount = 0;
+ $testcasedir = $testdir;
+
+ my $disks;
+ my $expected_disk_list;
+ eval {
+ $disks = PVE::Diskmanage::get_disks();
+ };
+ warn $@ if $@;
+ $expected_disk_list = decode_json(read_test_file('disklist_expected.json'));
+
+ print Dumper($disks) if $print;
+ $testcount++;
+ is_deeply($disks, $expected_disk_list, 'disk list should be the same');
+
+ foreach my $disk (sort keys %$disks) {
+ my $smart;
+ my $expected_smart;
+ eval {
+ $smart = PVE::Diskmanage::get_smart_data("/dev/$disk");
+ print Dumper($smart) if $print;
+ $expected_smart = decode_json(read_test_file("${disk}_smart_expected.json"));
+ };
+
+ if ($smart && $expected_smart) {
+ $testcount++;
+ is_deeply($smart, $expected_smart, "smart data for '$disk' should be the same");
+ } elsif ($smart && -f "disk_tests/$testcasedir/${disk}_smart_expected.json") {
+ $testcount++;
+ ok(0, "could not parse expected smart for '$disk'\n");
+ }
+ }
+
+ done_testing($testcount);
+ };
+}
+
+# start reading tests:
+
+if (@ARGV && $ARGV[0] eq 'print') {
+ $print = 1;
+}
+
+print("Setting up Mocking\n");
+$diskmanage_module = new Test::MockModule('PVE::Diskmanage', no_auto => 1);
+$diskmanage_module->mock('run_command' => \&mocked_run_command);
+print("\tMocked run_command\n");
+$diskmanage_module->mock('dir_glob_foreach' => \&mocked_dir_glob_foreach);
+print("\tMocked dir_glob_foreach\n");
+$diskmanage_module->mock('get_sysdir_info' => \&mocked_get_sysdir_info);
+print("\tMocked get_sysdir_info\n");
+$diskmanage_module->mock('assert_blockdev' => sub { return 1; });
+print("\tMocked assert_blockdev\n");
+$diskmanage_module->mock('dir_is_empty' => sub {
+ # all partitions have a holder dir
+ my $val = shift;
+ if ($val =~ m|^/sys/block/.+/.+/|) {
+ return 0;
+ }
+ return 1;
+ });
+print("\tMocked dir_is_empty\n");
+my $tools_module= new Test::MockModule('PVE::ProcFSTools', no_auto => 1);
+$tools_module->mock('parse_proc_mounts' => \&mocked_parse_proc_mounts);
+print("\tMocked parse_proc_mounts\n");
+print("Done Setting up Mocking\n\n");
+
+print("Beginning Tests:\n\n");
+opendir (my $dh, 'disk_tests')
+ or die "Cannot open disk_tests: $!";
+
+while (readdir $dh) {
+ my $dir = $_;
+ next if $dir eq '.' or $dir eq '..';
+ $testcount++;
+ test_disk_list($dir);
+}
+
+done_testing($testcount);
diff --git a/test/run_disk_tests.pl b/test/run_disk_tests.pl
new file mode 100755
index 0000000..e50c6f2
--- /dev/null
+++ b/test/run_disk_tests.pl
@@ -0,0 +1,10 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use TAP::Harness;
+
+my $harness = TAP::Harness->new( { verbosity => -2 });
+$harness->runtests( "disklist_test.pm" );
+
--
2.1.4
More information about the pve-devel
mailing list