-
Notifications
You must be signed in to change notification settings - Fork 0
/
generatefs.go
96 lines (89 loc) · 1.76 KB
/
generatefs.go
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
package ocfltest
import (
"math/rand"
"path"
"sort"
)
func GenerateFS(genr *rand.Rand, numFiles, maxSize int) SeedFS {
fsys := SeedFS{}
for i := 0; i < numFiles; i++ {
size := genr.Intn(maxSize-1) + 1
seed := genr.Int63()
dir := randomDir(genr, fsys)
// newdir
if genr.Float32() < 0.15 {
var newdir string
for {
newdir = path.Join(dir, randomName(genr, 12))
if !exists(fsys, newdir) {
break
}
}
dir = newdir
}
var name string
for {
name = path.Join(dir, randomName(genr, 12))
if !exists(fsys, name) {
break
}
}
fsys[name] = &SeedFile{Seed: seed, Size: int64(size)}
}
return fsys
}
func allDirs(fsys SeedFS) []string {
var dummy struct{}
dirs := map[string]struct{}{".": dummy}
for name := range fsys {
for _, p := range allParents(name) {
dirs[p] = dummy
}
}
dirslice := make([]string, len(dirs))
i := 0
for d := range dirs {
dirslice[i] = d
i++
}
sort.Strings(dirslice)
return dirslice
}
func allParents(name string) []string {
var parents []string
for {
dir := path.Dir(name)
parents = append(parents, dir)
if dir == "." {
break
}
name = dir
}
return parents
}
func exists(fsys SeedFS, name string) bool {
if _, exists := fsys[name]; exists {
return true
}
for n := range fsys {
for _, p := range allParents(n) {
if p == name {
return true
}
}
}
return false
}
func randomDir(genr *rand.Rand, fsys SeedFS) string {
dirs := allDirs(fsys)
return dirs[genr.Intn(len(dirs))]
}
func randomName(genr *rand.Rand, l int) string {
var letters = []rune("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_ -()?")
size := genr.Intn(l) + 1
part := make([]rune, size)
for j := range part {
part[j] = letters[genr.Intn(len(letters))]
}
return string(part)
}