10 from xattr import NS_USER, XATTR_CREATE, XATTR_REPLACE
12 TEST_DIR = os.environ.get("TESTDIR", ".")
15 class xattrTest(unittest.TestCase):
17 USER_ATTR = "%s.%s" % (NS_USER, USER_NN)
19 MANYOPS_COUNT = 131072
27 """tear down function"""
28 for fname in self.rmfiles:
30 for dname in self.rmdirs:
34 """create a temp file"""
35 fh, fname = tempfile.mkstemp(".test", "xattr-", TEST_DIR)
36 self.rmfiles.append(fname)
40 """create a temp dir"""
41 dname = tempfile.mkdtemp(".test", "xattr-", TEST_DIR)
42 self.rmdirs.append(dname)
45 def _getsymlink(self):
46 """create a symlink"""
47 fh, fname = self._getfile()
50 os.symlink(fname + ".non-existent", fname)
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,
60 xattr.setxattr(item, self.USER_ATTR, self.USER_VAL, 0, symlink)
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
67 self.failUnlessRaises(EnvironmentError, xattr.setxattr, item,
68 self.USER_ATTR, self.USER_VAL,
70 self.failUnlessEqual(xattr.listxattr(item, symlink), [self.USER_ATTR])
71 self.failUnlessEqual(xattr.getxattr(item, self.USER_ATTR, symlink),
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,
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,
87 self.failUnlessRaises(EnvironmentError, xattr.set, item,
88 self.USER_NN, self.USER_VAL,
93 xattr.set(item, self.USER_NN, self.USER_VAL,
97 xattr.set(item, self.USER_ATTR, self.USER_VAL,
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
105 self.failUnlessRaises(EnvironmentError, xattr.set, item,
106 self.USER_ATTR, self.USER_VAL,
108 self.failUnlessRaises(EnvironmentError, xattr.set, item,
109 self.USER_NN, self.USER_VAL,
112 self.failUnlessEqual(xattr.list(item, nofollow=symlink),
114 self.failUnlessEqual(xattr.list(item, namespace=NS_USER,
117 self.failUnlessEqual(xattr.get(item, self.USER_ATTR, nofollow=symlink),
119 self.failUnlessEqual(xattr.get(item, self.USER_NN, nofollow=symlink,
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,
126 [(self.USER_NN, self.USER_VAL)])
128 xattr.remove(item, self.USER_NN, namespace=NS_USER)
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,
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), [])
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), [])
171 def testFileByNameDeprecated(self):
172 """test set and retrieve one attribute by file name (deprecated)"""
173 fh, fname = self._getfile()
174 self._checkDeprecated(fname)
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)
184 def testFileByDescriptorDeprecated(self):
185 """test file descriptor operations (deprecated functions)"""
186 fh, fname = self._getfile()
187 self._checkDeprecated(fh)
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)
197 def testFileByObjectDeprecated(self):
198 """test file descriptor operations (deprecated functions)"""
199 fh, fname = self._getfile()
201 self._checkDeprecated(fo)
204 def testFileByObject(self):
205 """test file descriptor operations"""
206 fh, fname = self._getfile()
208 self._checkListSetGet(fo)
209 self._checkListSetGet(fo, use_ns=True)
212 def testMixedAccessDeprecated(self):
213 """test mixed access to file (deprecated functions)"""
214 fh, fname = self._getfile()
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),
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)])
226 def testMixedAccess(self):
227 """test mixed access to file"""
228 fh, fname = self._getfile()
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),
235 self.failUnlessEqual(xattr.get(fo, self.USER_ATTR),
237 self.failUnlessEqual(xattr.get(fo, self.USER_NN, namespace=NS_USER),
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)])
248 def testDirOpsDeprecated(self):
249 """test attribute setting on directories (deprecated functions)"""
250 dname = self._getdir()
251 self._checkDeprecated(dname)
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)
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)
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)
272 def testBinaryPayloadDeprecated(self):
273 """test binary values (deprecated functions)"""
274 fh, fname = self._getfile()
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)
283 def testBinaryPayload(self):
284 """test binary values"""
285 fh, fname = self._getfile()
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),
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)
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),
310 for i in range(self.MANYOPS_COUNT):
311 self.failUnlessEqual(xattr.get_all(fh),
312 [(self.USER_ATTR, self.USER_VAL)])
314 def testManyOps(self):
316 fh, fname = self._getfile()
317 xattr.set(fh, self.USER_ATTR, self.USER_VAL)
318 VL = [self.USER_ATTR]
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),
326 self.failUnlessEqual(xattr.get(fh, self.USER_NN,
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)])