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.list(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.list(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.list(item, symlink), [])
103 self.failUnlessEqual(xattr.get_all(item, nofollow=symlink), [])
104 self.failUnlessRaises(EnvironmentError, xattr.remove,
105 item, self.USER_ATTR)
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), [])
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), [])
131 def testFileByNameDeprecated(self):
132 """test set and retrieve one attribute by file name (deprecated)"""
133 fh, fname = self._getfile()
134 self._checkDeprecated(fname)
137 def testFileByName(self):
138 """test set and retrieve one attribute by file name"""
139 fh, fname = self._getfile()
140 self._checkListSetGet(fname)
143 def testFileByDescriptorDeprecated(self):
144 """test file descriptor operations (deprecated functions)"""
145 fh, fname = self._getfile()
146 self._checkDeprecated(fh)
149 def testFileByDescriptor(self):
150 """test file descriptor operations"""
151 fh, fname = self._getfile()
152 self._checkListSetGet(fh)
155 def testFileByObjectDeprecated(self):
156 """test file descriptor operations (deprecated functions)"""
157 fh, fname = self._getfile()
159 self._checkDeprecated(fo)
162 def testFileByObject(self):
163 """test file descriptor operations"""
164 fh, fname = self._getfile()
166 self._checkListSetGet(fo)
169 def testMixedAccessDeprecated(self):
170 """test mixed access to file (deprecated functions)"""
171 fh, fname = self._getfile()
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),
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)])
183 def testMixedAccess(self):
184 """test mixed access to file"""
185 fh, fname = self._getfile()
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),
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)])
197 def testDirOpsDeprecated(self):
198 """test attribute setting on directories (deprecated functions)"""
199 dname = self._getdir()
200 self._checkDeprecated(dname)
202 def testDirOps(self):
203 """test attribute setting on directories"""
204 dname = self._getdir()
205 self._checkListSetGet(dname)
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)
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)
219 def testBinaryPayloadDeprecated(self):
220 """test binary values (deprecated functions)"""
221 fh, fname = self._getfile()
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)
230 def testBinaryPayload(self):
231 """test binary values"""
232 fh, fname = self._getfile()
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)
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),
251 for i in range(self.MANYOPS_COUNT):
252 self.failUnlessEqual(xattr.get_all(fh),
253 [(self.USER_ATTR, self.USER_VAL)])
255 def testManyOps(self):
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),
265 for i in range(self.MANYOPS_COUNT):
266 self.failUnlessEqual(xattr.get_all(fh),
267 [(self.USER_ATTR, self.USER_VAL)])