]>
git.proxmox.com Git - pve-storage.git/blob - test/disklist_test.pm
1 package PVE
::Diskmanage
::Test
;
16 my $testcasedir; # current case directory
17 my $testcount = 0; # testcount for TAP::Harness
18 my $diskmanage_module; # mockmodule for PVE::Diskmanage
21 sub mocked_run_command
{
22 my ($cmd, %param) = @_;
25 if (my $ref = ref($cmd)) {
26 if ($cmd->[0] =~ m/udevadm/i) {
27 # simulate udevadm output
29 $dev =~ s
|/sys/block
/||;
30 @$outputlines = split(/\n/, read_test_file
("${dev}_udevadm"));
32 } elsif ($cmd->[0] =~ m/smartctl/i) {
33 # simulate smartctl output
44 @$outputlines = split(/\n/, read_test_file
("${dev}_${type}"));
45 } elsif ($cmd->[0] =~ m/sgdisk/i) {
47 die "implement me: @$cmd\n";
48 } elsif ($cmd->[0] =~ m/zpool/i) {
49 # simulate zpool output
50 @$outputlines = split(/\n/, read_test_file
('zpool'));
52 } elsif ($cmd->[0] =~ m/pvs/i) {
54 @$outputlines = split(/\n/, read_test_file
('pvs'));
55 } elsif ($cmd->[0] =~ m/lvs/i) {
56 @$outputlines = split(/\n/, read_test_file
('lvs'));
57 } elsif ($cmd->[0] =~ m/lsblk/i) {
58 my $content = read_test_file
('lsblk');
62 @$outputlines = split(/\n/, $content);
64 die "unexpected run_command call: '@$cmd', aborting\n";
67 print "unexpected run_command call: '@$cmd', aborting\n";
72 if ($param{outfunc
}) {
73 $outfunc = $param{outfunc
};
74 map { &$outfunc(($_)) } @$outputlines;
80 sub mocked_get_sysdir_info
{
83 my $originalsub = $diskmanage_module->original('get_sysdir_info');
85 $param =~ s
|/sys/block
|disk_tests
/$testcasedir|;
87 return &$originalsub($param);
90 sub mocked_get_sysdir_size
{
93 my $originalsub = $diskmanage_module->original('get_sysdir_size');
95 $param =~ s
|/sys/block
|disk_tests
/$testcasedir|;
97 return &$originalsub($param);
100 sub mocked_is_iscsi
{
104 sub mocked_dir_glob_foreach
{
105 my ($dir, $regex, $sub) = @_;
109 # read lines in from file
110 if ($dir =~ m{^/sys/block$} ) {
111 @$lines = split(/\n/, read_test_file
('disklist'));
112 } elsif ($dir =~ m{^/sys/block/([^/]+)}) {
113 @$lines = split(/\n/, read_test_file
('partlist'));
116 foreach my $line (@$lines) {
117 if ($line =~ m/$regex/) {
123 sub mocked_parse_proc_mounts
{
124 my $text = read_test_file
('mounts');
128 foreach my $line(split(/\n/, $text)) {
129 push @$mounts, [split(/\s+/, $line)];
138 if (!-f
"disk_tests/$testcasedir/$filename") {
139 print "file '$testcasedir/$filename' not found\n";
142 open (my $fh, '<', "disk_tests/$testcasedir/$filename")
143 or die "Cannot open disk_tests/$testcasedir/$filename: $!";
145 my $output = <$fh> // '';
146 chomp $output if $output;
147 while (my $line = <$fh>) {
149 $output .= "\n$line";
158 subtest
"Test '$testdir'" => sub {
160 $testcasedir = $testdir;
163 my $expected_disk_list;
165 $disks = PVE
::Diskmanage
::get_disks
();
168 $expected_disk_list = decode_json
(read_test_file
('disklist_expected.json'));
170 print Dumper
($disks) if $print;
172 is_deeply
($disks, $expected_disk_list, 'disk list should be the same');
174 foreach my $disk (sort keys %$disks) {
178 $smart = PVE
::Diskmanage
::get_smart_data
("/dev/$disk");
179 print Dumper
($smart) if $print;
180 $expected_smart = decode_json
(read_test_file
("${disk}_smart_expected.json"));
183 if ($smart && $expected_smart) {
185 is_deeply
($smart, $expected_smart, "smart data for '$disk' should be the same");
186 } elsif ($smart && -f
"disk_tests/$testcasedir/${disk}_smart_expected.json") {
188 ok
(0, "could not parse expected smart for '$disk'\n");
192 # test single disk parameter
193 $disk_tmp = PVE
::Diskmanage
::get_disks
($disk);
196 print Dumper
$disk_tmp if $print;
197 is_deeply
($disk_tmp->{$disk}, $expected_disk_list->{$disk}, "disk $disk should be the same");
200 # test wrong parameter
202 PVE
::Diskmanage
::get_disks
( { test
=> 1 } );
206 is_deeply
($err, "disks is not a string or array reference\n", "error message should be the same");
209 # test multi disk parameter
210 $disks = PVE
::Diskmanage
::get_disks
( [ keys %$disks ] );
212 is_deeply
($disks, $expected_disk_list, 'disk list should be the same');
214 done_testing
($testcount);
218 # start reading tests:
220 if (@ARGV && $ARGV[0] eq 'print') {
224 print("Setting up Mocking\n");
225 $diskmanage_module = Test
::MockModule-
>new('PVE::Diskmanage', no_auto
=> 1);
226 $diskmanage_module->mock('run_command' => \
&mocked_run_command
);
227 print("\tMocked run_command\n");
228 $diskmanage_module->mock('dir_glob_foreach' => \
&mocked_dir_glob_foreach
);
229 print("\tMocked dir_glob_foreach\n");
230 $diskmanage_module->mock('get_sysdir_info' => \
&mocked_get_sysdir_info
);
231 print("\tMocked get_sysdir_info\n");
232 $diskmanage_module->mock('get_sysdir_size' => \
&mocked_get_sysdir_size
);
233 print("\tMocked get_sysdir_size\n");
234 $diskmanage_module->mock('is_iscsi' => \
&mocked_is_iscsi
);
235 print("\tMocked is_iscsi\n");
236 $diskmanage_module->mock('assert_blockdev' => sub { return 1; });
237 print("\tMocked assert_blockdev\n");
238 $diskmanage_module->mock('dir_is_empty' => sub {
239 # all partitions have a holder dir
241 if ($val =~ m
|^/sys/block
/.+/.+/|) {
246 print("\tMocked dir_is_empty\n");
247 $diskmanage_module->mock('check_bin' => sub { return 1; });
248 print("\tMocked check_bin\n");
249 my $tools_module= Test
::MockModule-
>new('PVE::ProcFSTools', no_auto
=> 1);
250 $tools_module->mock('parse_proc_mounts' => \
&mocked_parse_proc_mounts
);
251 print("\tMocked parse_proc_mounts\n");
252 print("Done Setting up Mocking\n\n");
254 print("Beginning Tests:\n\n");
255 opendir (my $dh, 'disk_tests')
256 or die "Cannot open disk_tests: $!";
258 while (readdir $dh) {
260 next if $dir eq '.' or $dir eq '..';
262 test_disk_list
($dir);
265 done_testing
($testcount);