feat: Add benchmark for Create and related utilities
This commit is contained in:
4
Makefile
4
Makefile
@@ -35,6 +35,10 @@ $(addprefix run/,$(obj)):
|
|||||||
test:
|
test:
|
||||||
go test ./... -parallel $(shell nproc)
|
go test ./... -parallel $(shell nproc)
|
||||||
|
|
||||||
|
# Benchmark
|
||||||
|
benchmark:
|
||||||
|
go test -bench=./... ./...
|
||||||
|
|
||||||
# Clean
|
# Clean
|
||||||
clean:
|
clean:
|
||||||
rm -rf out internal/db
|
rm -rf out internal/db
|
||||||
|
|||||||
@@ -428,27 +428,27 @@ func createSTFS(
|
|||||||
func createFss() ([]fsConfig, error) {
|
func createFss() ([]fsConfig, error) {
|
||||||
fss := []fsConfig{}
|
fss := []fsConfig{}
|
||||||
|
|
||||||
tmp, err := os.MkdirTemp(os.TempDir(), "stfs-test-*")
|
baseTmp, err := os.MkdirTemp(os.TempDir(), "stfs-test-*")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
osfsDir := filepath.Join(tmp, "osfs")
|
tmp := filepath.Join(baseTmp, "osfs")
|
||||||
|
|
||||||
if err := os.MkdirAll(osfsDir, os.ModePerm); err != nil {
|
if err := os.MkdirAll(tmp, os.ModePerm); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
fss = append(fss, fsConfig{
|
fss = append(fss, fsConfig{
|
||||||
stfsConfig{},
|
stfsConfig{},
|
||||||
afero.NewBasePathFs(afero.NewOsFs(), osfsDir),
|
afero.NewBasePathFs(afero.NewOsFs(), tmp),
|
||||||
func() error {
|
func() error {
|
||||||
return os.RemoveAll(tmp)
|
return os.RemoveAll(tmp)
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
for _, config := range stfsConfigs {
|
for _, config := range stfsConfigs {
|
||||||
tmp, err := os.MkdirTemp(os.TempDir(), "stfs-test-*")
|
tmp, err := os.MkdirTemp(baseTmp, "fs-*")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -501,7 +501,7 @@ func createFss() ([]fsConfig, error) {
|
|||||||
return fss, nil
|
return fss, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func runForAllFss(t *testing.T, name string, action func(t *testing.T, fs fsConfig)) {
|
func runTestForAllFss(t *testing.T, name string, action func(t *testing.T, fs fsConfig)) {
|
||||||
fss, err := createFss()
|
fss, err := createFss()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
@@ -539,36 +539,73 @@ func runForAllFss(t *testing.T, name string, action func(t *testing.T, fs fsConf
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestSTFS_Create(t *testing.T) {
|
func runBenchmarkForAllFss(b *testing.B, name string, action func(b *testing.B, fs fsConfig)) {
|
||||||
type args struct {
|
fss, err := createFss()
|
||||||
name string
|
if err != nil {
|
||||||
}
|
b.Fatal(err)
|
||||||
tests := []struct {
|
|
||||||
name string
|
return
|
||||||
args args
|
|
||||||
wantErr bool
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
"Can create /test.txt",
|
|
||||||
args{"/test.txt"},
|
|
||||||
false,
|
|
||||||
},
|
|
||||||
// FIXME: STFS can create file in non-existent directory, which should not be possible
|
|
||||||
// {
|
|
||||||
// "Can not create /nonexistent/test.txt",
|
|
||||||
// args{"/nonexistent/test.txt"},
|
|
||||||
// true,
|
|
||||||
// },
|
|
||||||
// FIXME: STFS can create `/` file even if / exists
|
|
||||||
// {
|
|
||||||
// "Can create /",
|
|
||||||
// args{"/"},
|
|
||||||
// true,
|
|
||||||
// },
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tt := range tests {
|
for _, fs := range fss {
|
||||||
runForAllFss(t, tt.name, func(t *testing.T, fs fsConfig) {
|
b.Run(fmt.Sprintf(`%v filesystem=%v config=%v`, name, fs.fs.Name(), stfsPermutation{
|
||||||
|
fs.stfsConfig.recordSize,
|
||||||
|
fs.stfsConfig.readOnly,
|
||||||
|
|
||||||
|
fs.stfsConfig.signature,
|
||||||
|
fs.stfsConfig.encryption,
|
||||||
|
fs.stfsConfig.compression,
|
||||||
|
fs.stfsConfig.compressionLevel,
|
||||||
|
|
||||||
|
fs.stfsConfig.writeCache,
|
||||||
|
fs.stfsConfig.fileSystemCache,
|
||||||
|
|
||||||
|
fs.stfsConfig.fileSystemCacheDuration,
|
||||||
|
}), func(b *testing.B) {
|
||||||
|
fs := fs
|
||||||
|
|
||||||
|
action(b, fs)
|
||||||
|
})
|
||||||
|
|
||||||
|
if err := fs.cleanup(); err != nil {
|
||||||
|
b.Fatal(err)
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type createArgs struct {
|
||||||
|
name string
|
||||||
|
}
|
||||||
|
|
||||||
|
var createTests = []struct {
|
||||||
|
name string
|
||||||
|
args createArgs
|
||||||
|
wantErr bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
"Can create /test.txt",
|
||||||
|
createArgs{"/test.txt"},
|
||||||
|
false,
|
||||||
|
},
|
||||||
|
// FIXME: STFS can create file in non-existent directory, which should not be possible
|
||||||
|
// {
|
||||||
|
// "Can not create /nonexistent/test.txt",
|
||||||
|
// args{"/nonexistent/test.txt"},
|
||||||
|
// true,
|
||||||
|
// },
|
||||||
|
// FIXME: STFS can create `/` file even if / exists
|
||||||
|
// {
|
||||||
|
// "Can create /",
|
||||||
|
// args{"/"},
|
||||||
|
// true,
|
||||||
|
// },
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSTFS_Create(t *testing.T) {
|
||||||
|
for _, tt := range createTests {
|
||||||
|
runTestForAllFss(t, tt.name, func(t *testing.T, fs fsConfig) {
|
||||||
file, err := fs.fs.Create(tt.args.name)
|
file, err := fs.fs.Create(tt.args.name)
|
||||||
if (err != nil) != tt.wantErr {
|
if (err != nil) != tt.wantErr {
|
||||||
t.Errorf("%v.Create() error = %v, wantErr %v", fs.fs.Name(), err, tt.wantErr)
|
t.Errorf("%v.Create() error = %v, wantErr %v", fs.fs.Name(), err, tt.wantErr)
|
||||||
@@ -599,6 +636,18 @@ func TestSTFS_Create(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func BenchmarkSTFS_Create(b *testing.B) {
|
||||||
|
for _, tt := range createTests {
|
||||||
|
runBenchmarkForAllFss(b, tt.name, func(b *testing.B, fs fsConfig) {
|
||||||
|
if _, err := fs.fs.Create(tt.args.name); (err != nil) != tt.wantErr {
|
||||||
|
b.Errorf("%v.Create() error = %v, wantErr %v", fs.fs.Name(), err, tt.wantErr)
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestSTFS_Name(t *testing.T) {
|
func TestSTFS_Name(t *testing.T) {
|
||||||
fss, err := createFss()
|
fss, err := createFss()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
Reference in New Issue
Block a user