]> git.k1024.org Git - pyxattr.git/blob - test/test_xattr.py
unittests: allow changing the test dir
[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.listxattr(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.listxattr(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.listxattr(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 testNoXattr(self):
108         """test no attributes"""
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 testFileByNameDeprecated(self):
120         """test set and retrieve one attribute by file name (deprecated)"""
121         fh, fname = self._getfile()
122         self._checkDeprecated(fname)
123         os.close(fh)
124
125     def testFileByName(self):
126         """test set and retrieve one attribute by file name"""
127         fh, fname = self._getfile()
128         self._checkListSetGet(fname)
129         os.close(fh)
130
131     def testFileByDescriptorDeprecated(self):
132         """test file descriptor operations (deprecated functions)"""
133         fh, fname = self._getfile()
134         self._checkDeprecated(fh)
135         os.close(fh)
136
137     def testFileByDescriptor(self):
138         """test file descriptor operations"""
139         fh, fname = self._getfile()
140         self._checkListSetGet(fh)
141         os.close(fh)
142
143     def testFileByObjectDeprecated(self):
144         """test file descriptor operations (deprecated functions)"""
145         fh, fname = self._getfile()
146         fo = os.fdopen(fh)
147         self._checkDeprecated(fo)
148         fo.close()
149
150     def testFileByObject(self):
151         """test file descriptor operations"""
152         fh, fname = self._getfile()
153         fo = os.fdopen(fh)
154         self._checkListSetGet(fo)
155         fo.close()
156
157     def testMixedAccessDeprecated(self):
158         """test mixed access to file (deprecated functions)"""
159         fh, fname = self._getfile()
160         fo = os.fdopen(fh)
161         self.failUnlessEqual(xattr.listxattr(fname), [])
162         xattr.setxattr(fname, self.USER_ATTR, self.USER_VAL)
163         self.failUnlessEqual(xattr.listxattr(fh), [self.USER_ATTR])
164         self.failUnlessEqual(xattr.getxattr(fo, self.USER_ATTR),
165                              self.USER_VAL)
166         self.failUnlessEqual(xattr.get_all(fo),
167                              [(self.USER_ATTR, self.USER_VAL)])
168         self.failUnlessEqual(xattr.get_all(fname),
169                              [(self.USER_ATTR, self.USER_VAL)])
170
171     def testMixedAccess(self):
172         """test mixed access to file"""
173         fh, fname = self._getfile()
174         fo = os.fdopen(fh)
175         self.failUnlessEqual(xattr.listxattr(fname), [])
176         xattr.set(fname, self.USER_ATTR, self.USER_VAL)
177         self.failUnlessEqual(xattr.listxattr(fh), [self.USER_ATTR])
178         self.failUnlessEqual(xattr.get(fo, self.USER_ATTR),
179                              self.USER_VAL)
180         self.failUnlessEqual(xattr.get_all(fo),
181                              [(self.USER_ATTR, self.USER_VAL)])
182         self.failUnlessEqual(xattr.get_all(fname),
183                              [(self.USER_ATTR, self.USER_VAL)])
184
185     def testDirOpsDeprecated(self):
186         """test attribute setting on directories (deprecated functions)"""
187         dname = self._getdir()
188         self._checkDeprecated(dname)
189
190     def testDirOps(self):
191         """test attribute setting on directories"""
192         dname = self._getdir()
193         self._checkListSetGet(dname)
194
195     def testSymlinkOpsDeprecated(self):
196         """test symlink operations (deprecated functions)"""
197         sname = self._getsymlink()
198         self.failUnlessRaises(EnvironmentError, xattr.listxattr, sname)
199         self._checkDeprecated(sname, symlink=True)
200
201     def testSymlinkOps(self):
202         """test symlink operations"""
203         sname = self._getsymlink()
204         self.failUnlessRaises(EnvironmentError, xattr.listxattr, sname)
205         self._checkListSetGet(sname, symlink=True)
206
207     def testBinaryPayloadDeprecated(self):
208         """test binary values (deprecated functions)"""
209         fh, fname = self._getfile()
210         os.close(fh)
211         BINVAL = "abc" + '\0' + "def"
212         xattr.setxattr(fname, self.USER_ATTR, BINVAL)
213         self.failUnlessEqual(xattr.listxattr(fname), [self.USER_ATTR])
214         self.failUnlessEqual(xattr.getxattr(fname, self.USER_ATTR), BINVAL)
215         self.failUnlessEqual(xattr.get_all(fname), [(self.USER_ATTR, BINVAL)])
216         xattr.removexattr(fname, self.USER_ATTR)
217
218     def testBinaryPayload(self):
219         """test binary values"""
220         fh, fname = self._getfile()
221         os.close(fh)
222         BINVAL = "abc" + '\0' + "def"
223         xattr.set(fname, self.USER_ATTR, BINVAL)
224         self.failUnlessEqual(xattr.listxattr(fname), [self.USER_ATTR])
225         self.failUnlessEqual(xattr.get(fname, self.USER_ATTR), BINVAL)
226         self.failUnlessEqual(xattr.get_all(fname), [(self.USER_ATTR, BINVAL)])
227         xattr.remove(fname, self.USER_ATTR)
228
229     def testManyOpsDeprecated(self):
230         """test many ops (deprecated functions)"""
231         fh, fname = self._getfile()
232         xattr.setxattr(fh, self.USER_ATTR, self.USER_VAL)
233         VL = [self.USER_ATTR]
234         for i in range(self.MANYOPS_COUNT):
235             self.failUnlessEqual(xattr.listxattr(fh), VL)
236         for i in range(self.MANYOPS_COUNT):
237             self.failUnlessEqual(xattr.getxattr(fh, self.USER_ATTR),
238                                  self.USER_VAL)
239         for i in range(self.MANYOPS_COUNT):
240             self.failUnlessEqual(xattr.get_all(fh),
241                                  [(self.USER_ATTR, self.USER_VAL)])
242
243     def testManyOps(self):
244         """test many ops"""
245         fh, fname = self._getfile()
246         xattr.set(fh, self.USER_ATTR, self.USER_VAL)
247         VL = [self.USER_ATTR]
248         for i in range(self.MANYOPS_COUNT):
249             self.failUnlessEqual(xattr.listxattr(fh), VL)
250         for i in range(self.MANYOPS_COUNT):
251             self.failUnlessEqual(xattr.get(fh, self.USER_ATTR),
252                                  self.USER_VAL)
253         for i in range(self.MANYOPS_COUNT):
254             self.failUnlessEqual(xattr.get_all(fh),
255                                  [(self.USER_ATTR, self.USER_VAL)])