1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
import os
import sys
import unittest
from unittest import TestCase
from tempfile import mkdtemp, NamedTemporaryFile
import xattr
class BaseTestXattr(object):
# TESTDIR for temporary files usually defaults to "/tmp",
# which may not have XATTR support (e.g. tmpfs);
# manual override here.
TESTDIR = None
def test_attr(self):
x = xattr.xattr(self.tempfile)
# Solaris 11 and forward contain system attributes (file flags) in
# extended attributes present on all files, so cons them up into a
# comparison dict.
d = {}
if sys.platform == 'sunos5' and 'SUNWattr_ro' in x:
d['SUNWattr_ro'] = x['SUNWattr_ro']
d['SUNWattr_rw'] = x['SUNWattr_rw']
# SELinux systems use an attribute which must be accounted for
if sys.platform.startswith('linux') and 'security.selinux' in x:
d['security.selinux'] = x['security.selinux']
self.assertEqual(list(x.keys()), list(d.keys()))
self.assertEqual(list(x.list()), list(d.keys()))
self.assertEqual(dict(x), d)
x['user.sopal'] = b'foo'
x['user.sop.foo'] = b'bar'
x[u'user.\N{SNOWMAN}'] = b'not a snowman'
del x
x = xattr.xattr(self.tempfile)
attrs = set(x.list())
self.assertTrue('user.sopal' in x)
self.assertTrue(u'user.sopal' in attrs)
self.assertEqual(x['user.sopal'], b'foo')
self.assertTrue('user.sop.foo' in x)
self.assertTrue(u'user.sop.foo' in attrs)
self.assertEqual(x['user.sop.foo'], b'bar')
self.assertTrue(u'user.\N{SNOWMAN}' in x)
self.assertTrue(u'user.\N{SNOWMAN}' in attrs)
self.assertEqual(x[u'user.\N{SNOWMAN}'],
b'not a snowman')
del x[u'user.\N{SNOWMAN}']
del x['user.sop.foo']
del x
x = xattr.xattr(self.tempfile)
self.assertTrue('user.sop.foo' not in x)
def test_setxattr_unicode_error(self):
x = xattr.xattr(self.tempfile)
def assign():
x['abc'] = u'abc'
self.assertRaises(TypeError, assign)
if sys.version_info[0] >= 3:
msg = "Value must be bytes, str was passed."
else:
msg = "Value must be bytes, unicode was passed."
try:
assign()
except TypeError:
e = sys.exc_info()[1]
self.assertEqual(str(e), msg)
def test_symlink_attrs(self):
symlinkPath = self.tempfilename + '.link'
os.symlink(self.tempfilename, symlinkPath)
try:
symlink = xattr.xattr(symlinkPath, options=xattr.XATTR_NOFOLLOW)
realfile = xattr.xattr(self.tempfilename)
try:
symlink['user.islink'] = b'true'
except IOError:
# Solaris, Linux don't support extended attributes on symlinks
raise unittest.SkipTest("XATTRs on symlink not allowed"
" on filesystem/platform")
self.assertEqual(dict(realfile), {})
self.assertEqual(symlink['user.islink'], b'true')
finally:
os.remove(symlinkPath)
class TestFile(TestCase, BaseTestXattr):
def setUp(self):
self.tempfile = NamedTemporaryFile(dir=self.TESTDIR)
self.tempfilename = self.tempfile.name
def tearDown(self):
self.tempfile.close()
class TestDir(TestCase, BaseTestXattr):
def setUp(self):
self.tempfile = mkdtemp(dir=self.TESTDIR)
self.tempfilename = self.tempfile
def tearDown(self):
os.rmdir(self.tempfile)
try:
# SkipTest is only available in Python 2.7+
unittest.SkipTest
except AttributeError:
pass
else:
class TestFileWithSurrogates(TestFile):
def setUp(self):
if sys.platform not in ('linux', 'linux2'):
raise unittest.SkipTest('Files with invalid encoded names are only supported under linux')
if sys.version_info[0] < 3:
raise unittest.SkipTest('Test is only available on Python3') # surrogateescape not avail in py2
self.tempfile = NamedTemporaryFile(prefix=b'invalid-\xe9'.decode('utf8','surrogateescape'), dir=self.TESTDIR)
self.tempfilename = self.tempfile.name
|