11 class xattrTest(unittest.TestCase):
12 USER_ATTR = "user.test"
14 MANYOPS_COUNT = 131072
22 """tear down function"""
23 for fname in self.rmfiles:
25 for dname in self.rmdirs:
29 """create a temp file"""
30 fh, fname = tempfile.mkstemp(".test", "xattr-", ".")
31 self.rmfiles.append(fname)
35 """create a temp dir"""
36 dname = tempfile.mkdtemp(".test", "xattr-", ".")
37 self.rmdirs.append(dname)
40 def _getsymlink(self):
41 """create a symlink"""
42 fh, fname = self._getfile()
45 os.symlink(fname + ".non-existent", fname)
48 def _checkDeprecated(self, item, symlink=False):
49 """check deprecated list, set, get operations against an item"""
50 self.failUnlessEqual(xattr.listxattr(item, symlink), [])
51 self.failUnlessRaises(EnvironmentError, xattr.setxattr, item,
52 self.USER_ATTR, self.USER_VAL,
55 xattr.setxattr(item, self.USER_ATTR, self.USER_VAL, 0, symlink)
57 if err.errno == errno.EPERM and symlink:
58 # symlinks may fail, in which case we abort the rest
59 # of the test for this case
62 self.failUnlessRaises(EnvironmentError, xattr.setxattr, item,
63 self.USER_ATTR, self.USER_VAL,
65 self.failUnlessEqual(xattr.listxattr(item, symlink), [self.USER_ATTR])
66 self.failUnlessEqual(xattr.getxattr(item, self.USER_ATTR, symlink),
68 self.failUnlessEqual(xattr.get_all(item, nofollow=symlink),
69 [(self.USER_ATTR, self.USER_VAL)])
70 xattr.removexattr(item, self.USER_ATTR)
71 self.failUnlessEqual(xattr.listxattr(item, symlink), [])
72 self.failUnlessEqual(xattr.get_all(item, nofollow=symlink), [])
73 self.failUnlessRaises(EnvironmentError, xattr.removexattr,
76 def _checkListSetGet(self, item, symlink=False):
77 """check list, set, get operations against an item"""
78 self.failUnlessEqual(xattr.listxattr(item, symlink), [])
79 self.failUnlessRaises(EnvironmentError, xattr.set, item,
80 self.USER_ATTR, self.USER_VAL,
81 flags=xattr.XATTR_REPLACE)
83 xattr.set(item, self.USER_ATTR, self.USER_VAL, nofollow=symlink)
85 if err.errno == errno.EPERM and symlink:
86 # symlinks may fail, in which case we abort the rest
87 # of the test for this case
90 self.failUnlessRaises(EnvironmentError, xattr.set, item,
91 self.USER_ATTR, self.USER_VAL,
92 flags=xattr.XATTR_CREATE)
93 self.failUnlessEqual(xattr.listxattr(item, symlink), [self.USER_ATTR])
94 self.failUnlessEqual(xattr.get(item, self.USER_ATTR, nofollow=symlink),
96 self.failUnlessEqual(xattr.get_all(item, nofollow=symlink),
97 [(self.USER_ATTR, self.USER_VAL)])
98 xattr.removexattr(item, self.USER_ATTR)
99 self.failUnlessEqual(xattr.listxattr(item, symlink), [])
100 self.failUnlessEqual(xattr.get_all(item, nofollow=symlink), [])
101 self.failUnlessRaises(EnvironmentError, xattr.removexattr,
102 item, self.USER_ATTR)
104 def testNoXattr(self):
105 """test no attributes"""
106 fh, fname = self._getfile()
107 self.failUnlessEqual(xattr.listxattr(fname), [])
108 self.failUnlessEqual(xattr.get_all(fname), [])
109 dname = self._getdir()
110 self.failUnlessEqual(xattr.listxattr(dname), [])
111 self.failUnlessEqual(xattr.get_all(dname), [])
112 sname = self._getsymlink()
113 self.failUnlessEqual(xattr.listxattr(sname, True), [])
114 self.failUnlessEqual(xattr.get_all(sname, nofollow=True), [])
116 def testFileByNameDeprecated(self):
117 """test set and retrieve one attribute by file name (deprecated)"""
118 fh, fname = self._getfile()
119 self._checkDeprecated(fname)
122 def testFileByName(self):
123 """test set and retrieve one attribute by file name"""
124 fh, fname = self._getfile()
125 self._checkListSetGet(fname)
128 def testFileByDescriptorDeprecated(self):
129 """test file descriptor operations (deprecated functions)"""
130 fh, fname = self._getfile()
131 self._checkDeprecated(fh)
134 def testFileByDescriptor(self):
135 """test file descriptor operations"""
136 fh, fname = self._getfile()
137 self._checkListSetGet(fh)
140 def testFileByObjectDeprecated(self):
141 """test file descriptor operations (deprecated functions)"""
142 fh, fname = self._getfile()
144 self._checkDeprecated(fo)
147 def testFileByObject(self):
148 """test file descriptor operations"""
149 fh, fname = self._getfile()
151 self._checkListSetGet(fo)
154 def testMixedAccessDeprecated(self):
155 """test mixed access to file (deprecated functions)"""
156 fh, fname = self._getfile()
158 self.failUnlessEqual(xattr.listxattr(fname), [])
159 xattr.setxattr(fname, self.USER_ATTR, self.USER_VAL)
160 self.failUnlessEqual(xattr.listxattr(fh), [self.USER_ATTR])
161 self.failUnlessEqual(xattr.getxattr(fo, self.USER_ATTR),
163 self.failUnlessEqual(xattr.get_all(fo),
164 [(self.USER_ATTR, self.USER_VAL)])
165 self.failUnlessEqual(xattr.get_all(fname),
166 [(self.USER_ATTR, self.USER_VAL)])
168 def testMixedAccess(self):
169 """test mixed access to file"""
170 fh, fname = self._getfile()
172 self.failUnlessEqual(xattr.listxattr(fname), [])
173 xattr.set(fname, self.USER_ATTR, self.USER_VAL)
174 self.failUnlessEqual(xattr.listxattr(fh), [self.USER_ATTR])
175 self.failUnlessEqual(xattr.get(fo, self.USER_ATTR),
177 self.failUnlessEqual(xattr.get_all(fo),
178 [(self.USER_ATTR, self.USER_VAL)])
179 self.failUnlessEqual(xattr.get_all(fname),
180 [(self.USER_ATTR, self.USER_VAL)])
182 def testDirOpsDeprecated(self):
183 """test attribute setting on directories (deprecated functions)"""
184 dname = self._getdir()
185 self._checkDeprecated(dname)
187 def testDirOps(self):
188 """test attribute setting on directories"""
189 dname = self._getdir()
190 self._checkListSetGet(dname)
192 def testSymlinkOpsDeprecated(self):
193 """test symlink operations (deprecated functions)"""
194 sname = self._getsymlink()
195 self.failUnlessRaises(EnvironmentError, xattr.listxattr, sname)
196 self._checkDeprecated(sname, symlink=True)
198 def testSymlinkOps(self):
199 """test symlink operations"""
200 sname = self._getsymlink()
201 self.failUnlessRaises(EnvironmentError, xattr.listxattr, sname)
202 self._checkListSetGet(sname, symlink=True)
204 def testBinaryPayloadDeprecated(self):
205 """test binary values (deprecated functions)"""
206 fh, fname = self._getfile()
208 BINVAL = "abc" + '\0' + "def"
209 xattr.setxattr(fname, self.USER_ATTR, BINVAL)
210 self.failUnlessEqual(xattr.listxattr(fname), [self.USER_ATTR])
211 self.failUnlessEqual(xattr.getxattr(fname, self.USER_ATTR), BINVAL)
212 self.failUnlessEqual(xattr.get_all(fname), [(self.USER_ATTR, BINVAL)])
213 xattr.removexattr(fname, self.USER_ATTR)
215 def testBinaryPayload(self):
216 """test binary values"""
217 fh, fname = self._getfile()
219 BINVAL = "abc" + '\0' + "def"
220 xattr.set(fname, self.USER_ATTR, BINVAL)
221 self.failUnlessEqual(xattr.listxattr(fname), [self.USER_ATTR])
222 self.failUnlessEqual(xattr.get(fname, self.USER_ATTR), BINVAL)
223 self.failUnlessEqual(xattr.get_all(fname), [(self.USER_ATTR, BINVAL)])
224 xattr.removexattr(fname, self.USER_ATTR)
226 def testManyOpsDeprecated(self):
227 """test many ops (deprecated functions)"""
228 fh, fname = self._getfile()
229 xattr.setxattr(fh, self.USER_ATTR, self.USER_VAL)
230 VL = [self.USER_ATTR]
231 for i in range(self.MANYOPS_COUNT):
232 self.failUnlessEqual(xattr.listxattr(fh), VL)
233 for i in range(self.MANYOPS_COUNT):
234 self.failUnlessEqual(xattr.getxattr(fh, self.USER_ATTR),
236 for i in range(self.MANYOPS_COUNT):
237 self.failUnlessEqual(xattr.get_all(fh),
238 [(self.USER_ATTR, self.USER_VAL)])
240 def testManyOps(self):
242 fh, fname = self._getfile()
243 xattr.set(fh, self.USER_ATTR, self.USER_VAL)
244 VL = [self.USER_ATTR]
245 for i in range(self.MANYOPS_COUNT):
246 self.failUnlessEqual(xattr.listxattr(fh), VL)
247 for i in range(self.MANYOPS_COUNT):
248 self.failUnlessEqual(xattr.get(fh, self.USER_ATTR),
250 for i in range(self.MANYOPS_COUNT):
251 self.failUnlessEqual(xattr.get_all(fh),
252 [(self.USER_ATTR, self.USER_VAL)])