Add the new-style get function
[pyxattr.git] / test / test_xattr.py
1 #
2 #
3
4 import unittest
5 import tempfile
6 import os
7 import errno
8
9 import xattr
10
11 class xattrTest(unittest.TestCase):
12     USER_ATTR = "user.test"
13     USER_VAL = "abc"
14     MANYOPS_COUNT = 131072
15
16     def setUp(self):
17         """set up function"""
18         self.rmfiles = []
19         self.rmdirs = []
20
21     def tearDown(self):
22         """tear down function"""
23         for fname in self.rmfiles:
24             os.unlink(fname)
25         for dname in self.rmdirs:
26             os.rmdir(dname)
27
28     def _getfile(self):
29         """create a temp file"""
30         fh, fname = tempfile.mkstemp(".test", "xattr-", ".")
31         self.rmfiles.append(fname)
32         return fh, fname
33
34     def _getdir(self):
35         """create a temp dir"""
36         dname = tempfile.mkdtemp(".test", "xattr-", ".")
37         self.rmdirs.append(dname)
38         return dname
39
40     def _getsymlink(self):
41         """create a symlink"""
42         fh, fname = self._getfile()
43         os.close(fh)
44         os.unlink(fname)
45         os.symlink(fname + ".non-existent", fname)
46         return fname
47
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,
53                               xattr.XATTR_REPLACE)
54         try:
55             xattr.setxattr(item, self.USER_ATTR, self.USER_VAL, 0, symlink)
56         except IOError, err:
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
60                 return
61             raise
62         self.failUnlessRaises(EnvironmentError, xattr.setxattr, item,
63                               self.USER_ATTR, self.USER_VAL,
64                               xattr.XATTR_CREATE)
65         self.failUnlessEqual(xattr.listxattr(item, symlink), [self.USER_ATTR])
66         self.failUnlessEqual(xattr.getxattr(item, self.USER_ATTR, symlink),
67                              self.USER_VAL)
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,
74                               item, self.USER_ATTR)
75
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)
82         try:
83             xattr.set(item, self.USER_ATTR, self.USER_VAL, nofollow=symlink)
84         except IOError, err:
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
88                 return
89             raise
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),
95                              self.USER_VAL)
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)
103
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), [])
115
116     def testFileByNameDeprecated(self):
117         """test set and retrieve one attribute by file name (deprecated)"""
118         fh, fname = self._getfile()
119         self._checkDeprecated(fname)
120         os.close(fh)
121
122     def testFileByName(self):
123         """test set and retrieve one attribute by file name"""
124         fh, fname = self._getfile()
125         self._checkListSetGet(fname)
126         os.close(fh)
127
128     def testFileByDescriptorDeprecated(self):
129         """test file descriptor operations (deprecated functions)"""
130         fh, fname = self._getfile()
131         self._checkDeprecated(fh)
132         os.close(fh)
133
134     def testFileByDescriptor(self):
135         """test file descriptor operations"""
136         fh, fname = self._getfile()
137         self._checkListSetGet(fh)
138         os.close(fh)
139
140     def testFileByObjectDeprecated(self):
141         """test file descriptor operations (deprecated functions)"""
142         fh, fname = self._getfile()
143         fo = os.fdopen(fh)
144         self._checkDeprecated(fo)
145         fo.close()
146
147     def testFileByObject(self):
148         """test file descriptor operations"""
149         fh, fname = self._getfile()
150         fo = os.fdopen(fh)
151         self._checkListSetGet(fo)
152         fo.close()
153
154     def testMixedAccessDeprecated(self):
155         """test mixed access to file (deprecated functions)"""
156         fh, fname = self._getfile()
157         fo = os.fdopen(fh)
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),
162                              self.USER_VAL)
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)])
167
168     def testMixedAccess(self):
169         """test mixed access to file"""
170         fh, fname = self._getfile()
171         fo = os.fdopen(fh)
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),
176                              self.USER_VAL)
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)])
181
182     def testDirOpsDeprecated(self):
183         """test attribute setting on directories (deprecated functions)"""
184         dname = self._getdir()
185         self._checkDeprecated(dname)
186
187     def testDirOps(self):
188         """test attribute setting on directories"""
189         dname = self._getdir()
190         self._checkListSetGet(dname)
191
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)
197
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)
203
204     def testBinaryPayloadDeprecated(self):
205         """test binary values (deprecated functions)"""
206         fh, fname = self._getfile()
207         os.close(fh)
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)
214
215     def testBinaryPayload(self):
216         """test binary values"""
217         fh, fname = self._getfile()
218         os.close(fh)
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)
225
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),
235                                  self.USER_VAL)
236         for i in range(self.MANYOPS_COUNT):
237             self.failUnlessEqual(xattr.get_all(fh),
238                                  [(self.USER_ATTR, self.USER_VAL)])
239
240     def testManyOps(self):
241         """test many ops"""
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),
249                                  self.USER_VAL)
250         for i in range(self.MANYOPS_COUNT):
251             self.failUnlessEqual(xattr.get_all(fh),
252                                  [(self.USER_ATTR, self.USER_VAL)])