]> git.k1024.org Git - pyxattr.git/blob - test/test_xattr.py
Update .gitignore
[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 from xattr import NS_USER, XATTR_CREATE, XATTR_REPLACE
11
12 TEST_DIR = os.environ.get("TESTDIR", ".")
13
14
15 class xattrTest(unittest.TestCase):
16     USER_NN = "test"
17     USER_ATTR = "%s.%s" % (NS_USER, USER_NN)
18     USER_VAL = "abc"
19     MANYOPS_COUNT = 131072
20
21     def setUp(self):
22         """set up function"""
23         self.rmfiles = []
24         self.rmdirs = []
25
26     def tearDown(self):
27         """tear down function"""
28         for fname in self.rmfiles:
29             os.unlink(fname)
30         for dname in self.rmdirs:
31             os.rmdir(dname)
32
33     def _getfile(self):
34         """create a temp file"""
35         fh, fname = tempfile.mkstemp(".test", "xattr-", TEST_DIR)
36         self.rmfiles.append(fname)
37         return fh, fname
38
39     def _getdir(self):
40         """create a temp dir"""
41         dname = tempfile.mkdtemp(".test", "xattr-", TEST_DIR)
42         self.rmdirs.append(dname)
43         return dname
44
45     def _getsymlink(self):
46         """create a symlink"""
47         fh, fname = self._getfile()
48         os.close(fh)
49         os.unlink(fname)
50         os.symlink(fname + ".non-existent", fname)
51         return fname
52
53     def _checkDeprecated(self, item, symlink=False):
54         """check deprecated list, set, get operations against an item"""
55         self.failUnlessEqual(xattr.listxattr(item, symlink), [])
56         self.failUnlessRaises(EnvironmentError, xattr.setxattr, item,
57                               self.USER_ATTR, self.USER_VAL,
58                               XATTR_REPLACE)
59         try:
60             xattr.setxattr(item, self.USER_ATTR, self.USER_VAL, 0, symlink)
61         except IOError, err:
62             if err.errno == errno.EPERM and symlink:
63                 # symlinks may fail, in which case we abort the rest
64                 # of the test for this case
65                 return
66             raise
67         self.failUnlessRaises(EnvironmentError, xattr.setxattr, item,
68                               self.USER_ATTR, self.USER_VAL,
69                               XATTR_CREATE)
70         self.failUnlessEqual(xattr.listxattr(item, symlink), [self.USER_ATTR])
71         self.failUnlessEqual(xattr.getxattr(item, self.USER_ATTR, symlink),
72                              self.USER_VAL)
73         self.failUnlessEqual(xattr.get_all(item, nofollow=symlink),
74                              [(self.USER_ATTR, self.USER_VAL)])
75         xattr.removexattr(item, self.USER_ATTR)
76         self.failUnlessEqual(xattr.listxattr(item, symlink), [])
77         self.failUnlessEqual(xattr.get_all(item, nofollow=symlink), [])
78         self.failUnlessRaises(EnvironmentError, xattr.removexattr,
79                               item, self.USER_ATTR)
80
81     def _checkListSetGet(self, item, symlink=False, use_ns=False):
82         """check list, set, get operations against an item"""
83         self.failUnlessEqual(xattr.list(item, symlink), [])
84         self.failUnlessRaises(EnvironmentError, xattr.set, item,
85                               self.USER_ATTR, self.USER_VAL,
86                               flags=XATTR_REPLACE)
87         self.failUnlessRaises(EnvironmentError, xattr.set, item,
88                               self.USER_NN, self.USER_VAL,
89                               flags=XATTR_REPLACE,
90                               namespace=NS_USER)
91         try:
92             if use_ns:
93                 xattr.set(item, self.USER_NN, self.USER_VAL,
94                           namespace=NS_USER,
95                           nofollow=symlink)
96             else:
97                 xattr.set(item, self.USER_ATTR, self.USER_VAL,
98                           nofollow=symlink)
99         except IOError, err:
100             if err.errno == errno.EPERM and symlink:
101                 # symlinks may fail, in which case we abort the rest
102                 # of the test for this case
103                 return
104             raise
105         self.failUnlessRaises(EnvironmentError, xattr.set, item,
106                               self.USER_ATTR, self.USER_VAL,
107                               flags=XATTR_CREATE)
108         self.failUnlessRaises(EnvironmentError, xattr.set, item,
109                               self.USER_NN, self.USER_VAL,
110                               flags=XATTR_CREATE,
111                               namespace=NS_USER)
112         self.failUnlessEqual(xattr.list(item, nofollow=symlink),
113                              [self.USER_ATTR])
114         self.failUnlessEqual(xattr.list(item, namespace=NS_USER,
115                                         nofollow=symlink),
116                              [self.USER_NN])
117         self.failUnlessEqual(xattr.get(item, self.USER_ATTR, nofollow=symlink),
118                              self.USER_VAL)
119         self.failUnlessEqual(xattr.get(item, self.USER_NN, nofollow=symlink,
120                                        namespace=NS_USER),
121                              self.USER_VAL)
122         self.failUnlessEqual(xattr.get_all(item, nofollow=symlink),
123                              [(self.USER_ATTR, self.USER_VAL)])
124         self.failUnlessEqual(xattr.get_all(item, nofollow=symlink,
125                                            namespace=NS_USER),
126                              [(self.USER_NN, self.USER_VAL)])
127         if use_ns:
128             xattr.remove(item, self.USER_NN, namespace=NS_USER)
129         else:
130             xattr.remove(item, self.USER_ATTR)
131         self.failUnlessEqual(xattr.list(item, symlink), [])
132         self.failUnlessEqual(xattr.get_all(item, nofollow=symlink), [])
133         self.failUnlessRaises(EnvironmentError, xattr.remove,
134                               item, self.USER_ATTR, nofollow=symlink)
135         self.failUnlessRaises(EnvironmentError, xattr.remove,
136                               item, self.USER_NN, namespace=NS_USER,
137                               nofollow=symlink)
138
139     def testNoXattrDeprecated(self):
140         """test no attributes (deprecated functions)"""
141         fh, fname = self._getfile()
142         self.failUnlessEqual(xattr.listxattr(fname), [])
143         self.failUnlessEqual(xattr.get_all(fname), [])
144         dname = self._getdir()
145         self.failUnlessEqual(xattr.listxattr(dname), [])
146         self.failUnlessEqual(xattr.get_all(dname), [])
147         sname = self._getsymlink()
148         self.failUnlessEqual(xattr.listxattr(sname, True), [])
149         self.failUnlessEqual(xattr.get_all(sname, nofollow=True), [])
150
151     def testNoXattr(self):
152         """test no attributes"""
153         fh, fname = self._getfile()
154         self.failUnlessEqual(xattr.list(fname), [])
155         self.failUnlessEqual(xattr.list(fname, namespace=NS_USER), [])
156         self.failUnlessEqual(xattr.get_all(fname), [])
157         self.failUnlessEqual(xattr.get_all(fname, namespace=NS_USER), [])
158         dname = self._getdir()
159         self.failUnlessEqual(xattr.list(dname), [])
160         self.failUnlessEqual(xattr.list(dname, namespace=NS_USER), [])
161         self.failUnlessEqual(xattr.get_all(dname), [])
162         self.failUnlessEqual(xattr.get_all(dname, namespace=NS_USER), [])
163         sname = self._getsymlink()
164         self.failUnlessEqual(xattr.list(sname, nofollow=True), [])
165         self.failUnlessEqual(xattr.list(sname, nofollow=True,
166                                         namespace=NS_USER), [])
167         self.failUnlessEqual(xattr.get_all(sname, nofollow=True), [])
168         self.failUnlessEqual(xattr.get_all(sname, nofollow=True,
169                                            namespace=NS_USER), [])
170
171     def testFileByNameDeprecated(self):
172         """test set and retrieve one attribute by file name (deprecated)"""
173         fh, fname = self._getfile()
174         self._checkDeprecated(fname)
175         os.close(fh)
176
177     def testFileByName(self):
178         """test set and retrieve one attribute by file name"""
179         fh, fname = self._getfile()
180         self._checkListSetGet(fname)
181         self._checkListSetGet(fname, use_ns=True)
182         os.close(fh)
183
184     def testFileByDescriptorDeprecated(self):
185         """test file descriptor operations (deprecated functions)"""
186         fh, fname = self._getfile()
187         self._checkDeprecated(fh)
188         os.close(fh)
189
190     def testFileByDescriptor(self):
191         """test file descriptor operations"""
192         fh, fname = self._getfile()
193         self._checkListSetGet(fh)
194         self._checkListSetGet(fh, use_ns=True)
195         os.close(fh)
196
197     def testFileByObjectDeprecated(self):
198         """test file descriptor operations (deprecated functions)"""
199         fh, fname = self._getfile()
200         fo = os.fdopen(fh)
201         self._checkDeprecated(fo)
202         fo.close()
203
204     def testFileByObject(self):
205         """test file descriptor operations"""
206         fh, fname = self._getfile()
207         fo = os.fdopen(fh)
208         self._checkListSetGet(fo)
209         self._checkListSetGet(fo, use_ns=True)
210         fo.close()
211
212     def testMixedAccessDeprecated(self):
213         """test mixed access to file (deprecated functions)"""
214         fh, fname = self._getfile()
215         fo = os.fdopen(fh)
216         self.failUnlessEqual(xattr.listxattr(fname), [])
217         xattr.setxattr(fname, self.USER_ATTR, self.USER_VAL)
218         self.failUnlessEqual(xattr.listxattr(fh), [self.USER_ATTR])
219         self.failUnlessEqual(xattr.getxattr(fo, self.USER_ATTR),
220                              self.USER_VAL)
221         self.failUnlessEqual(xattr.get_all(fo),
222                              [(self.USER_ATTR, self.USER_VAL)])
223         self.failUnlessEqual(xattr.get_all(fname),
224                              [(self.USER_ATTR, self.USER_VAL)])
225
226     def testMixedAccess(self):
227         """test mixed access to file"""
228         fh, fname = self._getfile()
229         fo = os.fdopen(fh)
230         self.failUnlessEqual(xattr.list(fname), [])
231         xattr.set(fname, self.USER_ATTR, self.USER_VAL)
232         self.failUnlessEqual(xattr.list(fh), [self.USER_ATTR])
233         self.failUnlessEqual(xattr.list(fh, namespace=NS_USER),
234                              [self.USER_NN])
235         self.failUnlessEqual(xattr.get(fo, self.USER_ATTR),
236                              self.USER_VAL)
237         self.failUnlessEqual(xattr.get(fo, self.USER_NN, namespace=NS_USER),
238                              self.USER_VAL)
239         self.failUnlessEqual(xattr.get_all(fo),
240                              [(self.USER_ATTR, self.USER_VAL)])
241         self.failUnlessEqual(xattr.get_all(fo, namespace=NS_USER),
242                              [(self.USER_NN, self.USER_VAL)])
243         self.failUnlessEqual(xattr.get_all(fname),
244                              [(self.USER_ATTR, self.USER_VAL)])
245         self.failUnlessEqual(xattr.get_all(fname, namespace=NS_USER),
246                              [(self.USER_NN, self.USER_VAL)])
247
248     def testDirOpsDeprecated(self):
249         """test attribute setting on directories (deprecated functions)"""
250         dname = self._getdir()
251         self._checkDeprecated(dname)
252
253     def testDirOps(self):
254         """test attribute setting on directories"""
255         dname = self._getdir()
256         self._checkListSetGet(dname)
257         self._checkListSetGet(dname, use_ns=True)
258
259     def testSymlinkOpsDeprecated(self):
260         """test symlink operations (deprecated functions)"""
261         sname = self._getsymlink()
262         self.failUnlessRaises(EnvironmentError, xattr.listxattr, sname)
263         self._checkDeprecated(sname, symlink=True)
264
265     def testSymlinkOps(self):
266         """test symlink operations"""
267         sname = self._getsymlink()
268         self.failUnlessRaises(EnvironmentError, xattr.list, sname)
269         self._checkListSetGet(sname, symlink=True)
270         self._checkListSetGet(sname, symlink=True, use_ns=True)
271
272     def testBinaryPayloadDeprecated(self):
273         """test binary values (deprecated functions)"""
274         fh, fname = self._getfile()
275         os.close(fh)
276         BINVAL = "abc" + '\0' + "def"
277         xattr.setxattr(fname, self.USER_ATTR, BINVAL)
278         self.failUnlessEqual(xattr.listxattr(fname), [self.USER_ATTR])
279         self.failUnlessEqual(xattr.getxattr(fname, self.USER_ATTR), BINVAL)
280         self.failUnlessEqual(xattr.get_all(fname), [(self.USER_ATTR, BINVAL)])
281         xattr.removexattr(fname, self.USER_ATTR)
282
283     def testBinaryPayload(self):
284         """test binary values"""
285         fh, fname = self._getfile()
286         os.close(fh)
287         BINVAL = "abc" + '\0' + "def"
288         xattr.set(fname, self.USER_ATTR, BINVAL)
289         self.failUnlessEqual(xattr.list(fname), [self.USER_ATTR])
290         self.failUnlessEqual(xattr.list(fname, namespace=NS_USER),
291                              [self.USER_NN])
292         self.failUnlessEqual(xattr.get(fname, self.USER_ATTR), BINVAL)
293         self.failUnlessEqual(xattr.get(fname, self.USER_NN,
294                                        namespace=NS_USER), BINVAL)
295         self.failUnlessEqual(xattr.get_all(fname), [(self.USER_ATTR, BINVAL)])
296         self.failUnlessEqual(xattr.get_all(fname, namespace=NS_USER),
297                              [(self.USER_NN, BINVAL)])
298         xattr.remove(fname, self.USER_ATTR)
299
300     def testManyOpsDeprecated(self):
301         """test many ops (deprecated functions)"""
302         fh, fname = self._getfile()
303         xattr.setxattr(fh, self.USER_ATTR, self.USER_VAL)
304         VL = [self.USER_ATTR]
305         for i in range(self.MANYOPS_COUNT):
306             self.failUnlessEqual(xattr.listxattr(fh), VL)
307         for i in range(self.MANYOPS_COUNT):
308             self.failUnlessEqual(xattr.getxattr(fh, self.USER_ATTR),
309                                  self.USER_VAL)
310         for i in range(self.MANYOPS_COUNT):
311             self.failUnlessEqual(xattr.get_all(fh),
312                                  [(self.USER_ATTR, self.USER_VAL)])
313
314     def testManyOps(self):
315         """test many ops"""
316         fh, fname = self._getfile()
317         xattr.set(fh, self.USER_ATTR, self.USER_VAL)
318         VL = [self.USER_ATTR]
319         VN = [self.USER_NN]
320         for i in range(self.MANYOPS_COUNT):
321             self.failUnlessEqual(xattr.list(fh), VL)
322             self.failUnlessEqual(xattr.list(fh, namespace=NS_USER), VN)
323         for i in range(self.MANYOPS_COUNT):
324             self.failUnlessEqual(xattr.get(fh, self.USER_ATTR),
325                                  self.USER_VAL)
326             self.failUnlessEqual(xattr.get(fh, self.USER_NN,
327                                            namespace=NS_USER),
328                                  self.USER_VAL)
329         for i in range(self.MANYOPS_COUNT):
330             self.failUnlessEqual(xattr.get_all(fh),
331                                  [(self.USER_ATTR, self.USER_VAL)])
332             self.failUnlessEqual(xattr.get_all(fh, namespace=NS_USER),
333                                  [(self.USER_NN, self.USER_VAL)])