1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
#!perl -w
use strict;
use Test::More;
BEGIN {
my $tlib = $0;
$tlib =~ s|/[^/]*$|/lib|;
push(@INC, $tlib);
}
use t::Support;
if (t::Support::should_skip()) {
plan skip_all => 'Tests unsupported on this OS/filesystem';
} else {
plan tests => 213;
}
use File::Temp qw(tempfile);
use File::Path;
use File::ExtAttr qw(setfattr getfattr delfattr listfattr);
use IO::File;
my $TESTDIR = ($ENV{ATTR_TEST_DIR} || '.');
my ($fh, $filename) = tempfile( DIR => $TESTDIR );
close $fh or die "can't close $filename $!";
# Create a directory.
my $dirname = "$filename.dir";
eval { mkpath($dirname); };
if ($@) {
warn "Couldn't create $dirname: $@";
}
my %vals;
for (my $i = 0; $i < 10; ++$i)
{
$vals{"key$i"} = "val$i";
}
##########################
# Filename-based tests #
##########################
foreach ( $filename, $dirname ) {
print "# using $_\n";
foreach my $k (keys %vals)
{
# create it
is (setfattr($_, $k, $vals{$k}, { create => 1 }), 1);
# create it again -- should fail
my $ret = setfattr($_, $k, $vals{$k}, { create => 1 });
my $err = int $!;
is ($ret, 0);
is ($err, $!{EEXIST});
# read it back
is (getfattr($_, $k), $vals{$k});
}
# Check that the list contains all the attributes.
my @attrs = listfattr($_);
@attrs = sort(t::Support::filter_system_attrs(@attrs));
my @ks = sort keys %vals;
check_attrs(\@attrs, \@ks);
# Clean up for next round of testing
foreach my $k (keys %vals)
{
# delete it
ok (delfattr($_, $k));
# check that it's gone
is (getfattr($_, $k), undef);
}
}
##########################
# IO::Handle-based tests #
##########################
$fh = new IO::File("<$filename") or die "Unable to open $filename";
print "# using file descriptor ".$fh->fileno()."\n";
foreach (keys %vals)
{
# create it
is (setfattr($fh, $_, $vals{$_}, { create => 1 }), 1);
# create it again -- should fail
my $ret = setfattr($fh, $_, $vals{$_}, { create => 1 });
my $err = int $!;
is ($ret, 0);
is ($err, $!{EEXIST});
# read it back
is (getfattr($fh, $_), $vals{$_});
}
# Check that the list contains all the attributes.
my @attrs = listfattr($fh);
@attrs = sort(t::Support::filter_system_attrs(@attrs));
my @ks = sort keys %vals;
check_attrs(\@attrs, \@ks);
# Clean up for next round of testing
foreach (keys %vals)
{
# delete it
ok (delfattr($filename, $_));
# check that it's gone
is (getfattr($filename, $_), undef);
}
END {
unlink $filename if $filename;
rmdir $dirname if $dirname;
};
sub check_attrs
{
my @attrs = @{ $_[0] };
my @ks = @{ $_[1] };
is(scalar @attrs, scalar @ks);
for (my $i = 0; $i < scalar @attrs; ++$i)
{
is($attrs[$i], $ks[$i]);
}
}
|