1#!perl -w
2
3# Before `make install' is performed this script should be runnable with
4# `make test'. After `make install' it should work as `perl Linux-xattr.t'
5
6##########################
7
8# change 'tests => 2' to 'tests => last_test_to_print';
9
10use strict;
11use Test::More;
12use Config;
13
14BEGIN {
15  my $tlib = $0;
16  $tlib =~ s|/[^/]*$|/lib|;
17  push(@INC, $tlib);
18}
19use t::Support;
20
21if (t::Support::should_skip()) {
22  plan skip_all => 'Tests unsupported on this OS/filesystem';
23} elsif (($Config{osname} eq 'darwin') && ($Config{osvers} =~ m/^[0-8]\./)) {
24  plan skip_all => "Mac OS X 10.4 and earlier don't support empty values";
25} else {
26  plan tests => 12;
27}
28
29use File::Temp qw(tempfile);
30use File::Path;
31use File::ExtAttr qw(setfattr getfattr delfattr);
32use IO::File;
33
34my $TESTDIR = ($ENV{ATTR_TEST_DIR} || '.');
35my ($fh, $filename) = tempfile( DIR => $TESTDIR );
36
37close $fh or die "can't close $filename $!";
38
39# Create a directory.
40my $dirname = "$filename.dir";
41eval { mkpath($dirname); };
42if ($@) {
43    warn "Couldn't create $dirname: $@";
44}
45
46#todo: try wierd characters in here?
47#     try unicode?
48my $key = "alskdfjadf2340zsdflksjdfa09eralsdkfjaldkjsldkfj";
49my $val = '';
50
51##########################
52#  Filename-based tests  #
53##########################
54
55foreach ( $filename, $dirname ) {
56    print "# using $_\n";
57
58#for (1..30000) { #checking memory leaks
59
60   #will die if xattr stuff doesn't work at all
61   setfattr($_, "$key", $val) or die "setfattr failed on filename $_: $!"; 
62
63   #set it
64   is (setfattr($_, "$key", $val), 1);
65
66   #read it back
67   is (getfattr($_, "$key"), $val);
68
69   #delete it
70   ok (delfattr($_, "$key"));
71
72   #check that it's gone
73   is (getfattr($_, "$key"), undef);
74
75#}
76}
77
78##########################
79# IO::Handle-based tests #
80##########################
81
82$fh = new IO::File("<$filename") or die "Unable to open $filename";
83
84print "# using file descriptor ".$fh->fileno()."\n";
85
86#for (1..30000) { #checking memory leaks
87
88   #will die if xattr stuff doesn't work at all
89   setfattr($fh, "$key", $val)
90    or die "setfattr failed on file descriptor ".$fh->fileno().": $!"; 
91
92   #set it
93   is (setfattr($fh, "$key", $val), 1);
94
95   #read it back
96   is (getfattr($fh, "$key"), $val);
97
98   #delete it
99   ok (delfattr($fh, "$key"));
100
101   #check that it's gone
102   is (getfattr($fh, "$key"), undef);
103#}
104#print STDERR "done\n";
105#<STDIN>;
106
107# todo: Add support for IO::Dir handles, and test here.
108
109END {
110    unlink $filename if $filename;
111    rmdir $dirname if $dirname;
112};
113