package writecachebadger import ( "path/filepath" "sync/atomic" "testing" "time" "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/internal/testutil" meta "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/metabase" "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/writecache" "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/writecache/writecachetest" "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/util/logger/test" oidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id/test" "github.com/dgraph-io/badger/v4" "github.com/stretchr/testify/require" "go.uber.org/zap" ) func TestFlush(t *testing.T) { testlogger := test.NewLogger(t, true) createCacheFn := func(t *testing.T, smallSize uint64, mb *meta.DB, bs writecache.MainStorage, opts ...Option) writecache.Cache { return New( append([]Option{ WithLogger(test.NewLogger(t, true)), WithPath(filepath.Join(t.TempDir(), "writecache")), WithMetabase(mb), WithBlobstor(bs), WithGCInterval(1 * time.Second), }, opts...)...) } errCountOpt := func() (Option, *atomic.Uint32) { cnt := &atomic.Uint32{} return WithReportErrorFunc(func(msg string, err error) { cnt.Add(1) testlogger.Warn(msg, zap.Uint32("error_count", cnt.Load()), zap.Error(err)) }), cnt } failures := []writecachetest.TestFailureInjector[Option]{ { Desc: "db, invalid address", InjectFn: func(t *testing.T, wc writecache.Cache) { c := wc.(*cache) obj := testutil.GenerateObject() data, err := obj.Marshal() require.NoError(t, err) require.NoError(t, c.db.Update(func(tx *badger.Txn) error { return tx.Set([]byte{1, 2, 3}, data) })) }, }, { Desc: "db, invalid object", InjectFn: func(t *testing.T, wc writecache.Cache) { c := wc.(*cache) key := addr2key(oidtest.Address()) require.NoError(t, c.db.Update(func(tx *badger.Txn) error { return tx.Set(key[:], []byte{1, 2, 3}) })) }, }, } writecachetest.TestFlush(t, createCacheFn, errCountOpt, failures...) }