]> git.k1024.org Git - pyxattr.git/blob - test/test_xattr.py
Some small fixes in get_all
[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         self.failUnlessEqual(xattr.get_all(item, nofollow=symlink),
68                              [(self.USER_ATTR, self.USER_VAL)])
69         xattr.removexattr(item, self.USER_ATTR)
70         self.failUnlessEqual(xattr.listxattr(item, symlink), [])
71         self.failUnlessEqual(xattr.get_all(item, nofollow=symlink), [])
72         self.failUnlessRaises(EnvironmentError, xattr.removexattr,
73                               item, self.USER_ATTR)
74
75     def testNoXattr(self):
76         """test no attributes"""
77         fh, fname = self._getfile()
78         self.failUnlessEqual(xattr.listxattr(fname), [])
79         self.failUnlessEqual(xattr.get_all(fname), [])
80         dname = self._getdir()
81         self.failUnlessEqual(xattr.listxattr(dname), [])
82         self.failUnlessEqual(xattr.get_all(dname), [])
83         sname = self._getsymlink()
84         self.failUnlessEqual(xattr.listxattr(sname, True), [])
85         self.failUnlessEqual(xattr.get_all(sname, nofollow=True), [])
86
87     def testFileByName(self):
88         """test set and retrieve one attribute by file name"""
89         fh, fname = self._getfile()
90         self._checkListSetGet(fname)
91         os.close(fh)
92
93     def testFileByDescriptor(self):
94         """test file descriptor operations"""
95         fh, fname = self._getfile()
96         self._checkListSetGet(fh)
97         os.close(fh)
98
99     def testFileByObject(self):
100         """test file descriptor operations"""
101         fh, fname = self._getfile()
102         fo = os.fdopen(fh)
103         self._checkListSetGet(fo)
104         fo.close()
105
106     def testMixedAccess(self):
107         """test mixed access to file"""
108         fh, fname = self._getfile()
109         fo = os.fdopen(fh)
110         self.failUnlessEqual(xattr.listxattr(fname), [])
111         xattr.setxattr(fname, self.USER_ATTR, self.USER_VAL)
112         self.failUnlessEqual(xattr.listxattr(fh), [self.USER_ATTR])
113         self.failUnlessEqual(xattr.getxattr(fo, self.USER_ATTR),
114                              self.USER_VAL)
115         self.failUnlessEqual(xattr.get_all(fo),
116                              [(self.USER_ATTR, self.USER_VAL)])
117         self.failUnlessEqual(xattr.get_all(fname),
118                              [(self.USER_ATTR, self.USER_VAL)])
119
120     def testDirOps(self):
121         """test attribute setting on directories"""
122         dname = self._getdir()
123         self._checkListSetGet(dname)
124
125     def testSymlinkOps(self):
126         """test symlink operations"""
127         sname = self._getsymlink()
128         self.failUnlessRaises(EnvironmentError, xattr.listxattr, sname)
129         self._checkListSetGet(sname, symlink=True)
130
131     def testBinaryPayload(self):
132         """test binary values"""
133         fh, fname = self._getfile()
134         os.close(fh)
135         BINVAL = "abc" + '\0' + "def"
136         xattr.setxattr(fname, self.USER_ATTR, BINVAL)
137         self.failUnlessEqual(xattr.listxattr(fname), [self.USER_ATTR])
138         self.failUnlessEqual(xattr.getxattr(fname, self.USER_ATTR), BINVAL)
139         self.failUnlessEqual(xattr.get_all(fname), [(self.USER_ATTR, BINVAL)])
140         xattr.removexattr(fname, self.USER_ATTR)
141
142     def testManyOps(self):
143         """test many ops"""
144         fh, fname = self._getfile()
145         xattr.setxattr(fh, self.USER_ATTR, self.USER_VAL)
146         VL = [self.USER_ATTR]
147         for i in range(131072):
148             self.failUnlessEqual(xattr.listxattr(fh), VL)
149         for i in range(131072):
150             self.failUnlessEqual(xattr.getxattr(fh, self.USER_ATTR),
151                                  self.USER_VAL)
152         for i in range(131072):
153             self.failUnlessEqual(xattr.get_all(fh),
154                                  [(self.USER_ATTR, self.USER_VAL)])