]> git.k1024.org Git - pyxattr.git/blob - test/test_xattr.py
Merge branch 'fixes' into multiget
[pyxattr.git] / test / test_xattr.py
1 #
2 #
3
4 import unittest
5 import tempfile
6 import os
7 import errno
8
9 import xattr
10
11 class xattrTest(unittest.TestCase):
12     USER_ATTR = "user.test"
13     USER_VAL = "abc"
14
15     def setUp(self):
16         """set up function"""
17         self.rmfiles = []
18         self.rmdirs = []
19
20     def tearDown(self):
21         """tear down function"""
22         for fname in self.rmfiles:
23             os.unlink(fname)
24         for dname in self.rmdirs:
25             os.rmdir(dname)
26
27     def _getfile(self):
28         """create a temp file"""
29         fh, fname = tempfile.mkstemp(".test", "xattr-", ".")
30         self.rmfiles.append(fname)
31         return fh, fname
32
33     def _getdir(self):
34         """create a temp dir"""
35         dname = tempfile.mkdtemp(".test", "xattr-", ".")
36         self.rmdirs.append(dname)
37         return dname
38
39     def _getsymlink(self):
40         """create a symlink"""
41         fh, fname = self._getfile()
42         os.close(fh)
43         os.unlink(fname)
44         os.symlink(fname + ".non-existent", fname)
45         return fname
46
47     def _checkListSetGet(self, item, symlink=False):
48         """check list, set, get operations against an item"""
49         self.failUnlessEqual(xattr.listxattr(item, symlink), [])
50         self.failUnlessRaises(EnvironmentError, xattr.setxattr, item,
51                               self.USER_ATTR, self.USER_VAL,
52                               xattr.XATTR_REPLACE)
53         try:
54             xattr.setxattr(item, self.USER_ATTR, self.USER_VAL, 0, symlink)
55         except IOError, err:
56             if err.errno == errno.EPERM and symlink:
57                 # symlinks may fail, in which case we abort the rest
58                 # of the test for this case
59                 return
60             raise
61         self.failUnlessRaises(EnvironmentError, xattr.setxattr, item,
62                               self.USER_ATTR, self.USER_VAL,
63                               xattr.XATTR_CREATE)
64         self.failUnlessEqual(xattr.listxattr(item, symlink), [self.USER_ATTR])
65         self.failUnlessEqual(xattr.getxattr(item, self.USER_ATTR, symlink),
66                              self.USER_VAL)
67         xattr.removexattr(item, self.USER_ATTR)
68         self.failUnlessEqual(xattr.listxattr(item, symlink), [])
69         self.failUnlessRaises(EnvironmentError, xattr.removexattr,
70                               item, self.USER_ATTR)
71
72     def testNoXattr(self):
73         """test no attributes"""
74         fh, fname = self._getfile()
75         self.failUnlessEqual(xattr.listxattr(fname), [])
76         dname = self._getdir()
77         self.failUnlessEqual(xattr.listxattr(dname), [])
78         sname = self._getsymlink()
79         self.failUnlessEqual(xattr.listxattr(sname, True), [])
80
81     def testFileByName(self):
82         """test set and retrieve one attribute by file name"""
83         fh, fname = self._getfile()
84         self._checkListSetGet(fname)
85         os.close(fh)
86
87     def testFileByDescriptor(self):
88         """test file descriptor operations"""
89         fh, fname = self._getfile()
90         self._checkListSetGet(fh)
91         os.close(fh)
92
93     def testFileByObject(self):
94         """test file descriptor operations"""
95         fh, fname = self._getfile()
96         fo = os.fdopen(fh)
97         self._checkListSetGet(fo)
98         fo.close()
99
100     def testMixedAccess(self):
101         """test mixed access to file"""
102         fh, fname = self._getfile()
103         fo = os.fdopen(fh)
104         self.failUnlessEqual(xattr.listxattr(fname), [])
105         xattr.setxattr(fname, self.USER_ATTR, self.USER_VAL)
106         self.failUnlessEqual(xattr.listxattr(fh), [self.USER_ATTR])
107         self.failUnlessEqual(xattr.getxattr(fo, self.USER_ATTR),
108                              self.USER_VAL)
109
110     def testDirOps(self):
111         """test attribute setting on directories"""
112         dname = self._getdir()
113         self._checkListSetGet(dname)
114
115     def testSymlinkOps(self):
116         """test symlink operations"""
117         sname = self._getsymlink()
118         self.failUnlessRaises(EnvironmentError, xattr.listxattr, sname)
119         self._checkListSetGet(sname, symlink=True)
120
121     def testBinaryPayload(self):
122         """test binary values"""
123         fh, fname = self._getfile()
124         os.close(fh)
125         BINVAL = "abc" + '\0' + "def"
126         xattr.setxattr(fname, self.USER_ATTR, BINVAL)
127         self.failUnlessEqual(xattr.listxattr(fname), [self.USER_ATTR])
128         self.failUnlessEqual(xattr.getxattr(fname, self.USER_ATTR), BINVAL)
129         xattr.removexattr(fname, self.USER_ATTR)
130
131     def testManyOps(self):
132         """test many ops"""
133         fh, fname = self._getfile()
134         xattr.setxattr(fh, self.USER_ATTR, self.USER_VAL)
135         VL = [self.USER_ATTR]
136         for i in range(131072):
137             self.failUnlessEqual(xattr.listxattr(fh), VL)
138         for i in range(131072):
139             self.failUnlessEqual(xattr.getxattr(fh, self.USER_ATTR),
140                                  self.USER_VAL)