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