11 TEST_DIR = os.environ.get("TESTDIR", ".")
14 class xattrTest(unittest.TestCase):
15 USER_ATTR = "user.test"
17 MANYOPS_COUNT = 131072
25 """tear down function"""
26 for fname in self.rmfiles:
28 for dname in self.rmdirs:
32 """create a temp file"""
33 fh, fname = tempfile.mkstemp(".test", "xattr-", TEST_DIR)
34 self.rmfiles.append(fname)
38 """create a temp dir"""
39 dname = tempfile.mkdtemp(".test", "xattr-", TEST_DIR)
40 self.rmdirs.append(dname)
43 def _getsymlink(self):
44 """create a symlink"""
45 fh, fname = self._getfile()
48 os.symlink(fname + ".non-existent", fname)
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,
58 xattr.setxattr(item, self.USER_ATTR, self.USER_VAL, 0, symlink)
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
65 self.failUnlessRaises(EnvironmentError, xattr.setxattr, item,
66 self.USER_ATTR, self.USER_VAL,
68 self.failUnlessEqual(xattr.listxattr(item, symlink), [self.USER_ATTR])
69 self.failUnlessEqual(xattr.getxattr(item, self.USER_ATTR, symlink),
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,
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)
86 xattr.set(item, self.USER_ATTR, self.USER_VAL, nofollow=symlink)
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
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),
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)
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), [])
119 def testFileByNameDeprecated(self):
120 """test set and retrieve one attribute by file name (deprecated)"""
121 fh, fname = self._getfile()
122 self._checkDeprecated(fname)
125 def testFileByName(self):
126 """test set and retrieve one attribute by file name"""
127 fh, fname = self._getfile()
128 self._checkListSetGet(fname)
131 def testFileByDescriptorDeprecated(self):
132 """test file descriptor operations (deprecated functions)"""
133 fh, fname = self._getfile()
134 self._checkDeprecated(fh)
137 def testFileByDescriptor(self):
138 """test file descriptor operations"""
139 fh, fname = self._getfile()
140 self._checkListSetGet(fh)
143 def testFileByObjectDeprecated(self):
144 """test file descriptor operations (deprecated functions)"""
145 fh, fname = self._getfile()
147 self._checkDeprecated(fo)
150 def testFileByObject(self):
151 """test file descriptor operations"""
152 fh, fname = self._getfile()
154 self._checkListSetGet(fo)
157 def testMixedAccessDeprecated(self):
158 """test mixed access to file (deprecated functions)"""
159 fh, fname = self._getfile()
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),
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)])
171 def testMixedAccess(self):
172 """test mixed access to file"""
173 fh, fname = self._getfile()
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),
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)])
185 def testDirOpsDeprecated(self):
186 """test attribute setting on directories (deprecated functions)"""
187 dname = self._getdir()
188 self._checkDeprecated(dname)
190 def testDirOps(self):
191 """test attribute setting on directories"""
192 dname = self._getdir()
193 self._checkListSetGet(dname)
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)
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)
207 def testBinaryPayloadDeprecated(self):
208 """test binary values (deprecated functions)"""
209 fh, fname = self._getfile()
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)
218 def testBinaryPayload(self):
219 """test binary values"""
220 fh, fname = self._getfile()
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)
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),
239 for i in range(self.MANYOPS_COUNT):
240 self.failUnlessEqual(xattr.get_all(fh),
241 [(self.USER_ATTR, self.USER_VAL)])
243 def testManyOps(self):
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),
253 for i in range(self.MANYOPS_COUNT):
254 self.failUnlessEqual(xattr.get_all(fh),
255 [(self.USER_ATTR, self.USER_VAL)])