11 from xattr import NS_USER, XATTR_CREATE, XATTR_REPLACE
13 if sys.hexversion >= 0x03000000:
18 TEST_DIR = os.environ.get("TESTDIR", ".")
21 class xattrTest(unittest.TestCase):
23 USER_ATTR = NS_USER.decode() + "." + USER_NN
25 MANYOPS_COUNT = 131072
28 USER_NN = USER_NN.encode()
29 USER_VAL = USER_VAL.encode()
30 USER_ATTR = USER_ATTR.encode()
38 """tear down function"""
39 for fname in self.rmfiles:
42 except EnvironmentError:
44 for dname in self.rmdirs:
47 except EnvironmentError:
51 """create a temp file"""
52 fh, fname = tempfile.mkstemp(".test", "xattr-", TEST_DIR)
53 self.rmfiles.append(fname)
57 """create a temp dir"""
58 dname = tempfile.mkdtemp(".test", "xattr-", TEST_DIR)
59 self.rmdirs.append(dname)
62 def _getsymlink(self, dangling=True):
63 """create a symlink"""
64 fh, fname = self._getfile()
68 sname = fname + ".symlink"
69 os.symlink(fname, sname)
70 self.rmfiles.append(sname)
73 def _checkDeprecated(self, item, symlink=False):
74 """check deprecated list, set, get operations against an item"""
75 self.assertEqual(xattr.listxattr(item, symlink), [])
76 self.assertRaises(EnvironmentError, xattr.setxattr, item,
77 self.USER_ATTR, self.USER_VAL,
80 xattr.setxattr(item, self.USER_ATTR, self.USER_VAL, 0, symlink)
82 err = sys.exc_info()[1]
83 if err.errno == errno.EPERM and symlink:
84 # symlinks may fail, in which case we abort the rest
85 # of the test for this case
88 self.assertRaises(EnvironmentError, xattr.setxattr, item,
89 self.USER_ATTR, self.USER_VAL, XATTR_CREATE)
90 self.assertEqual(xattr.listxattr(item, symlink), [self.USER_ATTR])
91 self.assertEqual(xattr.getxattr(item, self.USER_ATTR, symlink),
93 self.assertEqual(xattr.get_all(item, nofollow=symlink),
94 [(self.USER_ATTR, self.USER_VAL)])
95 xattr.removexattr(item, self.USER_ATTR)
96 self.assertEqual(xattr.listxattr(item, symlink), [])
97 self.assertEqual(xattr.get_all(item, nofollow=symlink), [])
98 self.assertRaises(EnvironmentError, xattr.removexattr,
101 def _checkListSetGet(self, item, symlink=False, use_ns=False):
102 """check list, set, get operations against an item"""
103 self.assertEqual(xattr.list(item, symlink), [])
104 self.assertRaises(EnvironmentError, xattr.set, item,
105 self.USER_ATTR, self.USER_VAL, flags=XATTR_REPLACE)
106 self.assertRaises(EnvironmentError, xattr.set, item,
107 self.USER_NN, self.USER_VAL, flags=XATTR_REPLACE,
111 xattr.set(item, self.USER_NN, self.USER_VAL,
115 xattr.set(item, self.USER_ATTR, self.USER_VAL,
118 err = sys.exc_info()[1]
119 if err.errno == errno.EPERM and symlink:
120 # symlinks may fail, in which case we abort the rest
121 # of the test for this case
124 self.assertRaises(EnvironmentError, xattr.set, item,
125 self.USER_ATTR, self.USER_VAL, flags=XATTR_CREATE)
126 self.assertRaises(EnvironmentError, xattr.set, item,
127 self.USER_NN, self.USER_VAL,
128 flags=XATTR_CREATE, namespace=NS_USER)
129 self.assertEqual(xattr.list(item, nofollow=symlink), [self.USER_ATTR])
130 self.assertEqual(xattr.list(item, namespace=NS_USER, nofollow=symlink),
132 self.assertEqual(xattr.get(item, self.USER_ATTR, nofollow=symlink),
134 self.assertEqual(xattr.get(item, self.USER_NN, nofollow=symlink,
135 namespace=NS_USER), self.USER_VAL)
136 self.assertEqual(xattr.get_all(item, nofollow=symlink),
137 [(self.USER_ATTR, self.USER_VAL)])
138 self.assertEqual(xattr.get_all(item, nofollow=symlink,
140 [(self.USER_NN, self.USER_VAL)])
142 xattr.remove(item, self.USER_NN, namespace=NS_USER)
144 xattr.remove(item, self.USER_ATTR)
145 self.assertEqual(xattr.list(item, symlink), [])
146 self.assertEqual(xattr.get_all(item, nofollow=symlink), [])
147 self.assertRaises(EnvironmentError, xattr.remove,
148 item, self.USER_ATTR, nofollow=symlink)
149 self.assertRaises(EnvironmentError, xattr.remove, item,
150 self.USER_NN, namespace=NS_USER, nofollow=symlink)
152 def testNoXattrDeprecated(self):
153 """test no attributes (deprecated functions)"""
154 fh, fname = self._getfile()
155 self.assertEqual(xattr.listxattr(fname), [])
156 self.assertEqual(xattr.get_all(fname), [])
157 dname = self._getdir()
158 self.assertEqual(xattr.listxattr(dname), [])
159 self.assertEqual(xattr.get_all(dname), [])
160 _, sname = self._getsymlink()
161 self.assertEqual(xattr.listxattr(sname, True), [])
162 self.assertEqual(xattr.get_all(sname, nofollow=True), [])
164 def testNoXattr(self):
165 """test no attributes"""
166 fh, fname = self._getfile()
167 self.assertEqual(xattr.list(fname), [])
168 self.assertEqual(xattr.list(fname, namespace=NS_USER), [])
169 self.assertEqual(xattr.get_all(fname), [])
170 self.assertEqual(xattr.get_all(fname, namespace=NS_USER), [])
171 dname = self._getdir()
172 self.assertEqual(xattr.list(dname), [])
173 self.assertEqual(xattr.list(dname, namespace=NS_USER), [])
174 self.assertEqual(xattr.get_all(dname), [])
175 self.assertEqual(xattr.get_all(dname, namespace=NS_USER), [])
176 _, sname = self._getsymlink()
177 self.assertEqual(xattr.list(sname, nofollow=True), [])
178 self.assertEqual(xattr.list(sname, nofollow=True,
179 namespace=NS_USER), [])
180 self.assertEqual(xattr.get_all(sname, nofollow=True), [])
181 self.assertEqual(xattr.get_all(sname, nofollow=True,
182 namespace=NS_USER), [])
184 def testFileByNameDeprecated(self):
185 """test set and retrieve one attribute by file name (deprecated)"""
186 fh, fname = self._getfile()
187 self._checkDeprecated(fname)
190 def testFileByName(self):
191 """test set and retrieve one attribute by file name"""
192 fh, fname = self._getfile()
193 self._checkListSetGet(fname)
194 self._checkListSetGet(fname, use_ns=True)
197 def testFileByDescriptorDeprecated(self):
198 """test file descriptor operations (deprecated functions)"""
199 fh, fname = self._getfile()
200 self._checkDeprecated(fh)
203 def testFileByDescriptor(self):
204 """test file descriptor operations"""
205 fh, fname = self._getfile()
206 self._checkListSetGet(fh)
207 self._checkListSetGet(fh, use_ns=True)
210 def testFileByObjectDeprecated(self):
211 """test file descriptor operations (deprecated functions)"""
212 fh, fname = self._getfile()
214 self._checkDeprecated(fo)
217 def testFileByObject(self):
218 """test file descriptor operations"""
219 fh, fname = self._getfile()
221 self._checkListSetGet(fo)
222 self._checkListSetGet(fo, use_ns=True)
225 def testMixedAccessDeprecated(self):
226 """test mixed access to file (deprecated functions)"""
227 fh, fname = self._getfile()
229 self.assertEqual(xattr.listxattr(fname), [])
230 xattr.setxattr(fname, self.USER_ATTR, self.USER_VAL)
231 self.assertEqual(xattr.listxattr(fh), [self.USER_ATTR])
232 self.assertEqual(xattr.getxattr(fo, self.USER_ATTR), self.USER_VAL)
233 self.assertEqual(xattr.get_all(fo), [(self.USER_ATTR, self.USER_VAL)])
234 self.assertEqual(xattr.get_all(fname),
235 [(self.USER_ATTR, self.USER_VAL)])
238 def testMixedAccess(self):
239 """test mixed access to file"""
240 fh, fname = self._getfile()
242 self.assertEqual(xattr.list(fname), [])
243 xattr.set(fname, self.USER_ATTR, self.USER_VAL)
244 self.assertEqual(xattr.list(fh), [self.USER_ATTR])
245 self.assertEqual(xattr.list(fh, namespace=NS_USER), [self.USER_NN])
246 self.assertEqual(xattr.get(fo, self.USER_ATTR), self.USER_VAL)
247 self.assertEqual(xattr.get(fo, self.USER_NN, namespace=NS_USER),
249 self.assertEqual(xattr.get_all(fo), [(self.USER_ATTR, self.USER_VAL)])
250 self.assertEqual(xattr.get_all(fo, namespace=NS_USER),
251 [(self.USER_NN, self.USER_VAL)])
252 self.assertEqual(xattr.get_all(fname),
253 [(self.USER_ATTR, self.USER_VAL)])
254 self.assertEqual(xattr.get_all(fname, namespace=NS_USER),
255 [(self.USER_NN, self.USER_VAL)])
258 def testDirOpsDeprecated(self):
259 """test attribute setting on directories (deprecated functions)"""
260 dname = self._getdir()
261 self._checkDeprecated(dname)
263 def testDirOps(self):
264 """test attribute setting on directories"""
265 dname = self._getdir()
266 self._checkListSetGet(dname)
267 self._checkListSetGet(dname, use_ns=True)
269 def testSymlinkOpsDeprecated(self):
270 """test symlink operations (deprecated functions)"""
271 _, sname = self._getsymlink()
272 self.assertRaises(EnvironmentError, xattr.listxattr, sname)
273 self._checkDeprecated(sname, symlink=True)
274 target, sname = self._getsymlink(dangling=False)
275 xattr.setxattr(target, self.USER_ATTR, self.USER_VAL)
276 self.assertEqual(xattr.listxattr(target), [self.USER_ATTR])
277 self.assertEqual(xattr.listxattr(sname, True), [])
278 self.assertRaises(EnvironmentError, xattr.removexattr, sname,
279 self.USER_ATTR, True)
280 xattr.removexattr(sname, self.USER_ATTR, False)
282 def testSymlinkOps(self):
283 """test symlink operations"""
284 _, sname = self._getsymlink()
285 self.assertRaises(EnvironmentError, xattr.list, sname)
286 self._checkListSetGet(sname, symlink=True)
287 self._checkListSetGet(sname, symlink=True, use_ns=True)
288 target, sname = self._getsymlink(dangling=False)
289 xattr.set(target, self.USER_ATTR, self.USER_VAL)
290 self.assertEqual(xattr.list(target), [self.USER_ATTR])
291 self.assertEqual(xattr.list(sname, nofollow=True), [])
292 self.assertRaises(EnvironmentError, xattr.remove, sname,
293 self.USER_ATTR, nofollow=True)
294 xattr.remove(sname, self.USER_ATTR, nofollow=False)
296 def testBinaryPayloadDeprecated(self):
297 """test binary values (deprecated functions)"""
298 fh, fname = self._getfile()
300 BINVAL = "abc" + '\0' + "def"
302 BINVAL = BINVAL.encode()
303 xattr.setxattr(fname, self.USER_ATTR, BINVAL)
304 self.assertEqual(xattr.listxattr(fname), [self.USER_ATTR])
305 self.assertEqual(xattr.getxattr(fname, self.USER_ATTR), BINVAL)
306 self.assertEqual(xattr.get_all(fname), [(self.USER_ATTR, BINVAL)])
307 xattr.removexattr(fname, self.USER_ATTR)
309 def testBinaryPayload(self):
310 """test binary values"""
311 fh, fname = self._getfile()
313 BINVAL = "abc" + '\0' + "def"
315 BINVAL = BINVAL.encode()
316 xattr.set(fname, self.USER_ATTR, BINVAL)
317 self.assertEqual(xattr.list(fname), [self.USER_ATTR])
318 self.assertEqual(xattr.list(fname, namespace=NS_USER), [self.USER_NN])
319 self.assertEqual(xattr.get(fname, self.USER_ATTR), BINVAL)
320 self.assertEqual(xattr.get(fname, self.USER_NN,
321 namespace=NS_USER), BINVAL)
322 self.assertEqual(xattr.get_all(fname), [(self.USER_ATTR, BINVAL)])
323 self.assertEqual(xattr.get_all(fname, namespace=NS_USER),
324 [(self.USER_NN, BINVAL)])
325 xattr.remove(fname, self.USER_ATTR)
327 def testManyOpsDeprecated(self):
328 """test many ops (deprecated functions)"""
329 fh, fname = self._getfile()
330 xattr.setxattr(fh, self.USER_ATTR, self.USER_VAL)
331 VL = [self.USER_ATTR]
332 for i in range(self.MANYOPS_COUNT):
333 self.assertEqual(xattr.listxattr(fh), VL)
334 for i in range(self.MANYOPS_COUNT):
335 self.assertEqual(xattr.getxattr(fh, self.USER_ATTR), self.USER_VAL)
336 for i in range(self.MANYOPS_COUNT):
337 self.assertEqual(xattr.get_all(fh),
338 [(self.USER_ATTR, self.USER_VAL)])
340 def testManyOps(self):
342 fh, fname = self._getfile()
343 xattr.set(fh, self.USER_ATTR, self.USER_VAL)
344 VL = [self.USER_ATTR]
346 for i in range(self.MANYOPS_COUNT):
347 self.assertEqual(xattr.list(fh), VL)
348 self.assertEqual(xattr.list(fh, namespace=NS_USER), VN)
349 for i in range(self.MANYOPS_COUNT):
350 self.assertEqual(xattr.get(fh, self.USER_ATTR), self.USER_VAL)
351 self.assertEqual(xattr.get(fh, self.USER_NN, namespace=NS_USER),
353 for i in range(self.MANYOPS_COUNT):
354 self.assertEqual(xattr.get_all(fh),
355 [(self.USER_ATTR, self.USER_VAL)])
356 self.assertEqual(xattr.get_all(fh, namespace=NS_USER),
357 [(self.USER_NN, self.USER_VAL)])
359 if __name__ == "__main__":