summaryrefslogtreecommitdiff
path: root/fs/tests/test_xattr.py
blob: 7be556096047bad53dc414bb316cce5660d72880 (plain)
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
"""

  fs.tests.test_xattr:  testcases for extended attribute support

"""

import unittest
import os

from fs.path import *
from fs.errors import *
from fs.tests import FSTestCases

from six import b 

class XAttrTestCases:
    """Testcases for filesystems providing extended attribute support.

    This class should be used as a mixin to the unittest.TestCase class
    for filesystems that provide extended attribute support.
    """

    def test_getsetdel(self):
        def do_getsetdel(p):
            self.assertEqual(self.fs.getxattr(p,"xattr1"),None)
            self.fs.setxattr(p,"xattr1","value1")
            self.assertEqual(self.fs.getxattr(p,"xattr1"),"value1")
            self.fs.delxattr(p,"xattr1")
            self.assertEqual(self.fs.getxattr(p,"xattr1"),None)
        self.fs.setcontents("test.txt",b("hello"))
        do_getsetdel("test.txt")
        self.assertRaises(ResourceNotFoundError,self.fs.getxattr,"test2.txt","xattr1")
        self.fs.makedir("mystuff")
        self.fs.setcontents("/mystuff/test.txt",b(""))
        do_getsetdel("mystuff")
        do_getsetdel("mystuff/test.txt")

    def test_list_xattrs(self):
        def do_list(p):
            self.assertEquals(sorted(self.fs.listxattrs(p)),[])
            self.fs.setxattr(p,"xattr1","value1")
            self.assertEquals(self.fs.getxattr(p,"xattr1"),"value1")
            self.assertEquals(sorted(self.fs.listxattrs(p)),["xattr1"])
            self.assertTrue(isinstance(self.fs.listxattrs(p)[0],unicode))
            self.fs.setxattr(p,"attr2","value2")
            self.assertEquals(sorted(self.fs.listxattrs(p)),["attr2","xattr1"])
            self.assertTrue(isinstance(self.fs.listxattrs(p)[0],unicode))
            self.assertTrue(isinstance(self.fs.listxattrs(p)[1],unicode))
            self.fs.delxattr(p,"xattr1")
            self.assertEquals(sorted(self.fs.listxattrs(p)),["attr2"])
            self.fs.delxattr(p,"attr2")
            self.assertEquals(sorted(self.fs.listxattrs(p)),[])
        self.fs.setcontents("test.txt",b("hello"))
        do_list("test.txt")
        self.fs.makedir("mystuff")
        self.fs.setcontents("/mystuff/test.txt",b(""))
        do_list("mystuff")
        do_list("mystuff/test.txt")

    def test_copy_xattrs(self):
        self.fs.setcontents("a.txt",b("content"))
        self.fs.setxattr("a.txt","myattr","myvalue")
        self.fs.setxattr("a.txt","testattr","testvalue")
        self.fs.makedir("stuff")
        self.fs.copy("a.txt","stuff/a.txt")
        self.assertTrue(self.fs.exists("stuff/a.txt"))
        self.assertEquals(self.fs.getxattr("stuff/a.txt","myattr"),"myvalue")
        self.assertEquals(self.fs.getxattr("stuff/a.txt","testattr"),"testvalue")
        self.assertEquals(self.fs.getxattr("a.txt","myattr"),"myvalue")
        self.assertEquals(self.fs.getxattr("a.txt","testattr"),"testvalue")
        self.fs.setxattr("stuff","dirattr","a directory")
        self.fs.copydir("stuff","stuff2")
        self.assertEquals(self.fs.getxattr("stuff2/a.txt","myattr"),"myvalue")
        self.assertEquals(self.fs.getxattr("stuff2/a.txt","testattr"),"testvalue")
        self.assertEquals(self.fs.getxattr("stuff2","dirattr"),"a directory")
        self.assertEquals(self.fs.getxattr("stuff","dirattr"),"a directory")

    def test_move_xattrs(self):
        self.fs.setcontents("a.txt",b("content"))
        self.fs.setxattr("a.txt","myattr","myvalue")
        self.fs.setxattr("a.txt","testattr","testvalue")
        self.fs.makedir("stuff")
        self.fs.move("a.txt","stuff/a.txt")
        self.assertTrue(self.fs.exists("stuff/a.txt"))
        self.assertEquals(self.fs.getxattr("stuff/a.txt","myattr"),"myvalue")
        self.assertEquals(self.fs.getxattr("stuff/a.txt","testattr"),"testvalue")
        self.fs.setxattr("stuff","dirattr","a directory")
        self.fs.movedir("stuff","stuff2")
        self.assertEquals(self.fs.getxattr("stuff2/a.txt","myattr"),"myvalue")
        self.assertEquals(self.fs.getxattr("stuff2/a.txt","testattr"),"testvalue")
        self.assertEquals(self.fs.getxattr("stuff2","dirattr"),"a directory")

    def test_remove_file(self):
        def listxattrs(path):
            return list(self.fs.listxattrs(path))
        #  Check that xattrs aren't preserved after a file is removed
        self.fs.createfile("myfile")
        self.assertEquals(listxattrs("myfile"),[])
        self.fs.setxattr("myfile","testattr","testvalue")
        self.assertEquals(listxattrs("myfile"),["testattr"])
        self.fs.remove("myfile")
        self.assertRaises(ResourceNotFoundError,listxattrs,"myfile")
        self.fs.createfile("myfile")
        self.assertEquals(listxattrs("myfile"),[])
        self.fs.setxattr("myfile","testattr2","testvalue2")
        self.assertEquals(listxattrs("myfile"),["testattr2"])
        self.assertEquals(self.fs.getxattr("myfile","testattr2"),"testvalue2")
        #  Check that removing a file without xattrs still works
        self.fs.createfile("myfile2")
        self.fs.remove("myfile2")
 
    def test_remove_dir(self):
        def listxattrs(path):
            return list(self.fs.listxattrs(path))
        #  Check that xattrs aren't preserved after a dir is removed
        self.fs.makedir("mydir")
        self.assertEquals(listxattrs("mydir"),[])
        self.fs.setxattr("mydir","testattr","testvalue")
        self.assertEquals(listxattrs("mydir"),["testattr"])
        self.fs.removedir("mydir")
        self.assertRaises(ResourceNotFoundError,listxattrs,"mydir")
        self.fs.makedir("mydir")
        self.assertEquals(listxattrs("mydir"),[])
        self.fs.setxattr("mydir","testattr2","testvalue2")
        self.assertEquals(listxattrs("mydir"),["testattr2"])
        self.assertEquals(self.fs.getxattr("mydir","testattr2"),"testvalue2")
        #  Check that removing a dir without xattrs still works
        self.fs.makedir("mydir2")
        self.fs.removedir("mydir2")
        #  Check that forcibly removing a dir with xattrs still works
        self.fs.makedir("mydir3")
        self.fs.createfile("mydir3/testfile")
        self.fs.removedir("mydir3",force=True)
        self.assertFalse(self.fs.exists("mydir3"))


from fs.xattrs import ensure_xattrs

from fs import tempfs
class TestXAttr_TempFS(unittest.TestCase,FSTestCases,XAttrTestCases):

    def setUp(self):
        fs = tempfs.TempFS()
        self.fs = ensure_xattrs(fs)

    def tearDown(self):
        try:
            td = self.fs._temp_dir
        except AttributeError:
            td = self.fs.wrapped_fs._temp_dir
        self.fs.close()
        self.assert_(not os.path.exists(td))

    def check(self, p):
        try:
            td = self.fs._temp_dir
        except AttributeError:
            td = self.fs.wrapped_fs._temp_dir
        return os.path.exists(os.path.join(td, relpath(p)))


from fs import memoryfs
class TestXAttr_MemoryFS(unittest.TestCase,FSTestCases,XAttrTestCases):

    def setUp(self):
        self.fs = ensure_xattrs(memoryfs.MemoryFS())

    def check(self, p):
        return self.fs.exists(p)