Added run_test_server helper module for Python SDK that runs API server in test
[arvados.git] / sdk / python / test_mount.py
1 import unittest
2 import arvados
3 import arvados.fuse as fuse
4 import threading
5 import time
6 import os
7 import llfuse
8 import tempfile
9 import shutil
10 import subprocess
11 import glob
12 import run_test_server
13
14
15 class FuseMountTest(unittest.TestCase):
16     def setUp(self):
17         self.keeptmp = tempfile.mkdtemp()
18         os.environ['KEEP_LOCAL_STORE'] = self.keeptmp
19
20         cw = arvados.CollectionWriter()
21
22         cw.start_new_file('thing1.txt')
23         cw.write("data 1")
24         cw.start_new_file('thing2.txt')
25         cw.write("data 2")
26         cw.start_new_stream('dir1')
27
28         cw.start_new_file('thing3.txt')
29         cw.write("data 3")
30         cw.start_new_file('thing4.txt')
31         cw.write("data 4")
32
33         cw.start_new_stream('dir2')
34         cw.start_new_file('thing5.txt')
35         cw.write("data 5")
36         cw.start_new_file('thing6.txt')
37         cw.write("data 6")
38
39         cw.start_new_stream('dir2/dir3')
40         cw.start_new_file('thing7.txt')
41         cw.write("data 7")
42
43         cw.start_new_file('thing8.txt')
44         cw.write("data 8")
45
46         self.testcollection = cw.finish()
47
48     def runTest(self):
49         # Create the request handler
50         operations = fuse.Operations(os.getuid(), os.getgid())
51         #e = operations.inodes.add_entry(fuse.Directory(llfuse.ROOT_INODE))
52         #operations.inodes.load_collection(e, arvados.CollectionReader(arvados.Keep.get(self.testcollection)))
53         e = operations.inodes.add_entry(fuse.CollectionDirectory(llfuse.ROOT_INODE, operations.inodes, self.testcollection))
54
55         self.mounttmp = tempfile.mkdtemp()
56
57         llfuse.init(operations, self.mounttmp, [])
58         t = threading.Thread(None, lambda: llfuse.main())
59         t.start()
60
61         # wait until the driver is finished initializing
62         operations.initlock.wait()
63
64         # now check some stuff
65         d1 = os.listdir(self.mounttmp)
66         d1.sort()
67         self.assertEqual(d1, ['dir1', 'dir2', 'thing1.txt', 'thing2.txt'])
68
69         d2 = os.listdir(os.path.join(self.mounttmp, 'dir1'))
70         d2.sort()
71         self.assertEqual(d2, ['thing3.txt', 'thing4.txt'])
72
73         d3 = os.listdir(os.path.join(self.mounttmp, 'dir2'))
74         d3.sort()
75         self.assertEqual(d3, ['dir3', 'thing5.txt', 'thing6.txt'])
76
77         d4 = os.listdir(os.path.join(self.mounttmp, 'dir2/dir3'))
78         d4.sort()
79         self.assertEqual(d4, ['thing7.txt', 'thing8.txt'])
80
81         files = {'thing1.txt': 'data 1',
82                  'thing2.txt': 'data 2',
83                  'dir1/thing3.txt': 'data 3',
84                  'dir1/thing4.txt': 'data 4',
85                  'dir2/thing5.txt': 'data 5',
86                  'dir2/thing6.txt': 'data 6',
87                  'dir2/dir3/thing7.txt': 'data 7',
88                  'dir2/dir3/thing8.txt': 'data 8'}
89
90         for k, v in files.items():
91             with open(os.path.join(self.mounttmp, k)) as f:
92                 self.assertEqual(f.read(), v)
93
94
95     def tearDown(self):
96         # llfuse.close is buggy, so use fusermount instead.
97         #llfuse.close(unmount=True)
98         subprocess.call(["fusermount", "-u", self.mounttmp])
99
100         os.rmdir(self.mounttmp)
101         shutil.rmtree(self.keeptmp)
102
103 class FuseMagicTest(unittest.TestCase):
104     def setUp(self):
105         self.keeptmp = tempfile.mkdtemp()
106         os.environ['KEEP_LOCAL_STORE'] = self.keeptmp
107
108         cw = arvados.CollectionWriter()
109
110         cw.start_new_file('thing1.txt')
111         cw.write("data 1")
112
113         self.testcollection = cw.finish()
114
115     def runTest(self):
116         # Create the request handler
117         operations = fuse.Operations(os.getuid(), os.getgid())
118         e = operations.inodes.add_entry(fuse.MagicDirectory(llfuse.ROOT_INODE, operations.inodes))
119
120         self.mounttmp = tempfile.mkdtemp()
121
122         llfuse.init(operations, self.mounttmp, [])
123         t = threading.Thread(None, lambda: llfuse.main())
124         t.start()
125
126         # wait until the driver is finished initializing
127         operations.initlock.wait()
128
129         # now check some stuff
130         d1 = os.listdir(self.mounttmp)
131         d1.sort()
132         self.assertEqual(d1, [])
133
134         d2 = os.listdir(os.path.join(self.mounttmp, self.testcollection))
135         d2.sort()
136         self.assertEqual(d2, ['thing1.txt'])
137
138         d3 = os.listdir(self.mounttmp)
139         d3.sort()
140         self.assertEqual(d3, [self.testcollection])
141
142         files = {}
143         files[os.path.join(self.mounttmp, self.testcollection, 'thing1.txt')] = 'data 1'
144
145         for k, v in files.items():
146             with open(os.path.join(self.mounttmp, k)) as f:
147                 self.assertEqual(f.read(), v)
148
149
150     def tearDown(self):
151         # llfuse.close is buggy, so use fusermount instead.
152         #llfuse.close(unmount=True)
153         subprocess.call(["fusermount", "-u", self.mounttmp])
154
155         os.rmdir(self.mounttmp)
156         shutil.rmtree(self.keeptmp)
157
158 class FuseTagsTest(unittest.TestCase):
159     def setUp(self):
160         run_test_server.run()
161
162     def runTest(self):
163         run_test_server.authorize_with("admin")
164
165     def tearDown(self):
166         run_test_server.stop()