2021-05-19 14:53:51 +00:00
|
|
|
package fstree
|
|
|
|
|
|
|
|
import (
|
2023-08-11 08:32:43 +00:00
|
|
|
"context"
|
|
|
|
"errors"
|
2021-05-19 14:53:51 +00:00
|
|
|
"testing"
|
|
|
|
|
2023-08-11 08:32:43 +00:00
|
|
|
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/blobstor/common"
|
|
|
|
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/util/logicerr"
|
|
|
|
objectSDK "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object"
|
2023-03-07 13:38:26 +00:00
|
|
|
oidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id/test"
|
2021-05-19 14:53:51 +00:00
|
|
|
"github.com/stretchr/testify/require"
|
2023-08-11 08:32:43 +00:00
|
|
|
"golang.org/x/sync/errgroup"
|
2021-05-19 14:53:51 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func TestAddressToString(t *testing.T) {
|
2022-05-31 17:00:41 +00:00
|
|
|
addr := oidtest.Address()
|
2021-05-19 14:53:51 +00:00
|
|
|
s := stringifyAddress(addr)
|
|
|
|
actual, err := addressFromString(s)
|
|
|
|
require.NoError(t, err)
|
2023-02-10 04:59:15 +00:00
|
|
|
require.Equal(t, addr, actual)
|
|
|
|
}
|
|
|
|
|
|
|
|
func Benchmark_addressFromString(b *testing.B) {
|
|
|
|
addr := oidtest.Address()
|
|
|
|
s := stringifyAddress(addr)
|
|
|
|
|
|
|
|
b.ReportAllocs()
|
|
|
|
b.ResetTimer()
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
|
|
_, err := addressFromString(s)
|
|
|
|
if err != nil {
|
|
|
|
b.Fatalf("benchmark error: %v", err)
|
|
|
|
}
|
|
|
|
}
|
2021-05-19 14:53:51 +00:00
|
|
|
}
|
2023-08-11 08:32:43 +00:00
|
|
|
|
|
|
|
func TestObjectCounter(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
counter := NewSimpleCounter()
|
|
|
|
fst := New(
|
|
|
|
WithPath(t.TempDir()),
|
|
|
|
WithDepth(2),
|
|
|
|
WithDirNameLen(2),
|
|
|
|
WithFileCounter(counter))
|
|
|
|
require.NoError(t, fst.Open(false))
|
|
|
|
require.NoError(t, fst.Init())
|
|
|
|
|
|
|
|
counterValue := counter.Value()
|
|
|
|
require.Equal(t, uint64(0), counterValue)
|
|
|
|
|
|
|
|
defer func() {
|
|
|
|
require.NoError(t, fst.Close())
|
|
|
|
}()
|
|
|
|
|
|
|
|
addr := oidtest.Address()
|
|
|
|
obj := objectSDK.New()
|
|
|
|
obj.SetID(addr.Object())
|
|
|
|
obj.SetContainerID(addr.Container())
|
|
|
|
obj.SetPayload([]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0})
|
|
|
|
|
|
|
|
var putPrm common.PutPrm
|
|
|
|
putPrm.Address = addr
|
|
|
|
putPrm.RawData, _ = obj.Marshal()
|
|
|
|
|
|
|
|
var getPrm common.GetPrm
|
|
|
|
getPrm.Address = putPrm.Address
|
|
|
|
|
|
|
|
var delPrm common.DeletePrm
|
|
|
|
delPrm.Address = addr
|
|
|
|
|
|
|
|
eg, egCtx := errgroup.WithContext(context.Background())
|
|
|
|
|
|
|
|
eg.Go(func() error {
|
|
|
|
for j := 0; j < 1_000; j++ {
|
|
|
|
_, err := fst.Put(egCtx, putPrm)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
})
|
|
|
|
|
|
|
|
eg.Go(func() error {
|
|
|
|
var le logicerr.Logical
|
|
|
|
for j := 0; j < 1_000; j++ {
|
|
|
|
_, err := fst.Delete(egCtx, delPrm)
|
|
|
|
if err != nil && !errors.As(err, &le) {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
})
|
|
|
|
|
|
|
|
require.NoError(t, eg.Wait())
|
|
|
|
|
|
|
|
counterValue = counter.Value()
|
|
|
|
realCount, err := fst.countFiles()
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, realCount, counterValue)
|
|
|
|
}
|