Merge branch '8784-dir-listings'
[arvados.git] / services / fuse / tests / fstest.py
1 # Copyright (C) The Arvados Authors. All rights reserved.
2 #
3 # SPDX-License-Identifier: AGPL-3.0
4
5 from multiprocessing import Process
6 import os
7 import subprocess
8 import sys
9 import prof
10
11 def fn(n):
12     return "file%i" % n
13
14 def createfiles(d, n):
15     for j in xrange(1, 5):
16         print "Starting small file %s %i, %i" % (d, n, j)
17         if d:
18             os.mkdir(d)
19             ld = os.listdir('.')
20             if d not in ld:
21                 print "ERROR %s missing" % d
22             os.chdir(d)
23
24         for i in xrange(n, n+10):
25             with open(fn(i), "w") as f:
26                 f.write(fn(i))
27
28         ld = os.listdir('.')
29         for i in xrange(n, n+10):
30             if fn(i) not in ld:
31                 print "ERROR %s missing" % fn(i)
32
33         for i in xrange(n, n+10):
34             with open(fn(i), "r") as f:
35                 if f.read() != fn(i):
36                     print "ERROR %s doesn't have expected contents" % fn(i)
37
38         for i in xrange(n, n+10):
39             os.remove(fn(i))
40
41         ld = os.listdir('.')
42         for i in xrange(n, n+10):
43             if fn(i) in ld:
44                 print "ERROR %s should have been removed" % fn(i)
45
46         if d:
47             os.chdir('..')
48             os.rmdir(d)
49             ld = os.listdir('.')
50             if d in ld:
51                 print "ERROR %s should have been removed" % d
52
53
54 def createbigfile(d, n):
55     for j in xrange(1, 5):
56         print "Starting big file %s %i, %i" % (d, n, j)
57         i = n
58         if d:
59             os.mkdir(d)
60             ld = os.listdir('.')
61             if d not in ld:
62                 print "ERROR %s missing" % d
63             os.chdir(d)
64
65         with open(fn(i), "w") as f:
66             for j in xrange(0, 1000):
67                 f.write((str(j) + fn(i)) * 10000)
68
69         ld = os.listdir('.')
70         if fn(i) not in ld:
71             print "ERROR %s missing" % fn(i)
72
73         with open(fn(i), "r") as f:
74             for j in xrange(0, 1000):
75                 expect = (str(j) + fn(i)) * 10000
76                 if f.read(len(expect)) != expect:
77                     print "ERROR %s doesn't have expected contents" % fn(i)
78
79         os.remove(fn(i))
80
81         ld = os.listdir('.')
82         if fn(i) in ld:
83             print "ERROR %s should have been removed" % fn(i)
84
85         if d:
86             os.chdir('..')
87             os.rmdir(d)
88             ld = os.listdir('.')
89             if d in ld:
90                 print "ERROR %s should have been removed" % d
91
92 def do_ls():
93     with open("/dev/null", "w") as nul:
94         for j in xrange(1, 50):
95             subprocess.call(["ls", "-l"], stdout=nul, stderr=nul)
96
97 def runit(target, indir):
98     procs = []
99     for n in xrange(0, 20):
100         if indir:
101             p = Process(target=target, args=("dir%i" % n, n*10,))
102         else:
103             p = Process(target=target, args=("", n*10,))
104         p.start()
105         procs.append(p)
106
107     p = Process(target=do_ls, args=())
108     p.start()
109     procs.append(p)
110
111     for p in procs:
112         p.join()
113
114     if os.listdir('.'):
115         print "ERROR there are left over files in the directory"
116
117
118 if __name__ == '__main__':
119     if os.listdir('.'):
120         print "ERROR starting directory is not empty"
121         sys.exit()
122
123     print "Single directory small files"
124     with prof.CountTime():
125         runit(createfiles, False)
126
127     print "Separate directories small files"
128     with prof.CountTime():
129         runit(createfiles, True)
130
131     print "Single directory large files"
132     with prof.CountTime():
133         runit(createbigfile, False)
134
135     print "Separate directories large files"
136     with prof.CountTime():
137         runit(createbigfile, True)