xattr.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import os
  2. import tempfile
  3. import unittest
  4. from ..xattr import is_enabled, getxattr, setxattr, listxattr, buffer
  5. from . import BaseTestCase
  6. @unittest.skipUnless(is_enabled(), 'xattr not enabled on filesystem')
  7. class XattrTestCase(BaseTestCase):
  8. def setUp(self):
  9. self.tmpfile = tempfile.NamedTemporaryFile()
  10. self.symlink = self.tmpfile.name + '.symlink'
  11. os.symlink(self.tmpfile.name, self.symlink)
  12. def tearDown(self):
  13. os.unlink(self.symlink)
  14. def assert_equal_se(self, is_x, want_x):
  15. # check 2 xattr lists for equality, but ignore security.selinux attr
  16. is_x = set(is_x) - {'security.selinux'}
  17. want_x = set(want_x)
  18. self.assert_equal(is_x, want_x)
  19. def test(self):
  20. self.assert_equal_se(listxattr(self.tmpfile.name), [])
  21. self.assert_equal_se(listxattr(self.tmpfile.fileno()), [])
  22. self.assert_equal_se(listxattr(self.symlink), [])
  23. setxattr(self.tmpfile.name, 'user.foo', b'bar')
  24. setxattr(self.tmpfile.fileno(), 'user.bar', b'foo')
  25. setxattr(self.tmpfile.name, 'user.empty', None)
  26. self.assert_equal_se(listxattr(self.tmpfile.name), ['user.foo', 'user.bar', 'user.empty'])
  27. self.assert_equal_se(listxattr(self.tmpfile.fileno()), ['user.foo', 'user.bar', 'user.empty'])
  28. self.assert_equal_se(listxattr(self.symlink), ['user.foo', 'user.bar', 'user.empty'])
  29. self.assert_equal_se(listxattr(self.symlink, follow_symlinks=False), [])
  30. self.assert_equal(getxattr(self.tmpfile.name, 'user.foo'), b'bar')
  31. self.assert_equal(getxattr(self.tmpfile.fileno(), 'user.foo'), b'bar')
  32. self.assert_equal(getxattr(self.symlink, 'user.foo'), b'bar')
  33. self.assert_equal(getxattr(self.tmpfile.name, 'user.empty'), None)
  34. def test_listxattr_buffer_growth(self):
  35. # make it work even with ext4, which imposes rather low limits
  36. buffer.resize(size=64, init=True)
  37. # xattr raw key list will be size 9 * (10 + 1), which is > 64
  38. keys = ['user.attr%d' % i for i in range(9)]
  39. for key in keys:
  40. setxattr(self.tmpfile.name, key, b'x')
  41. got_keys = listxattr(self.tmpfile.name)
  42. self.assert_equal_se(got_keys, keys)
  43. self.assert_equal(len(buffer), 128)
  44. def test_getxattr_buffer_growth(self):
  45. # make it work even with ext4, which imposes rather low limits
  46. buffer.resize(size=64, init=True)
  47. value = b'x' * 126
  48. setxattr(self.tmpfile.name, 'user.big', value)
  49. got_value = getxattr(self.tmpfile.name, 'user.big')
  50. self.assert_equal(value, got_value)
  51. self.assert_equal(len(buffer), 128)