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