|
1 use strict; |
|
2 use warnings; |
|
3 use Test::More; |
|
4 use English qw(-no_match_vars); |
|
5 use File::Temp; |
|
6 use File::Basename; |
|
7 use File::Find; |
|
8 use Cwd qw(abs_path); |
|
9 use POSIX qw(SEEK_END); |
|
10 use Digest::MD5; |
|
11 |
|
12 plan skip_all => "Need root permissions to perform these tests.\n" |
|
13 . "\t try: sudo ./Build test verbose=1 test-files=$0" |
|
14 if not $EUID == 0; |
|
15 |
|
16 my $dir = File::Temp->newdir(TEMPLATE => "blockfuse.XXXXXX"); |
|
17 |
|
18 END { system("umount $dir 2>/dev/null") if $dir }; |
|
19 system("blib/script/blockfuse $dir"); |
|
20 is($?, 0, "mounted"); |
|
21 |
|
22 my %size; |
|
23 find(sub { |
|
24 (my $name = $File::Find::name) =~ s/^\/dev//; |
|
25 if (-d) { |
|
26 ok(-d "$dir/$name", "dir $name"); |
|
27 } |
|
28 elsif (-b) { |
|
29 ok(-f "$dir/$name", "block->file $name"); |
|
30 if (open(my $block, $_)) { |
|
31 seek($block, 0, SEEK_END); |
|
32 my $size = tell($block); |
|
33 close($block); |
|
34 is($size, -s "$dir/$name", "size $name"); |
|
35 $size{$name} = $size; |
|
36 } |
|
37 } |
|
38 elsif (-l and (-b abs_path $_ or -d abs_path $_)) { |
|
39 ok(-l "$dir/$name", "link $name"); |
|
40 } |
|
41 }, "/dev"); |
|
42 |
|
43 # now md5sum test for the smallest device |
|
44 my $smallest = (sort { $size{$a} <=> $size{$b} } grep {$size{$_}} keys %size)[0]; |
|
45 |
|
46 |
|
47 my %digest = ( |
|
48 dev => Digest::MD5->new(), |
|
49 file => Digest::MD5->new(), |
|
50 ); |
|
51 |
|
52 { |
|
53 local $/ = \4096; |
|
54 open(my $dev, "/dev/$smallest") or die "/dev/$smallest: $!"; |
|
55 $digest{dev}->add($_) while defined($_ = <$dev>); |
|
56 |
|
57 open(my $file, "$dir/$smallest") or die "$dir/$smallest: $!"; |
|
58 $digest{file}->add($_) while defined($_ = <$file>); |
|
59 } |
|
60 |
|
61 is($digest{file}->hexdigest(), $digest{dev}->hexdigest(), "digests are equal"); |
|
62 |
|
63 |
|
64 |
|
65 done_testing(); |