1
0
Fork 0
mirror of https://github.com/anyproto/anytype-heart.git synced 2025-06-12 02:30:53 +09:00

GO-4146 Fix and change store tests

This commit is contained in:
mcrakhman 2025-02-05 19:02:17 +01:00
parent 1f8453a044
commit 2172d9ce33
No known key found for this signature in database
GPG key ID: DED12CFEF5B8396B
3 changed files with 41 additions and 132 deletions

View file

@ -8,6 +8,7 @@ import (
"time"
"github.com/anyproto/any-sync/app"
"github.com/anyproto/any-sync/commonspace/headsync/statestorage/mock_statestorage"
"github.com/anyproto/any-sync/commonspace/object/tree/objecttree"
"github.com/anyproto/any-sync/commonspace/object/tree/synctree/mock_synctree"
"github.com/anyproto/any-sync/commonspace/object/treemanager/mock_treemanager"
@ -32,6 +33,7 @@ type fixture struct {
nodeConf *mock_nodeconf.MockService
syncStatus *mock_treesyncer.MockSyncedTreeRemover
syncDetailsUpdater *mock_treesyncer.MockSyncDetailsUpdater
stateStorage *mock_statestorage.MockStateStorage
}
func newFixture(t *testing.T, spaceId string) *fixture {
@ -44,7 +46,9 @@ func newFixture(t *testing.T, spaceId string) *fixture {
syncStatus := mock_treesyncer.NewMockSyncedTreeRemover(t)
syncDetailsUpdater := mock_treesyncer.NewMockSyncDetailsUpdater(t)
spaceStorage := mock_spacestorage.NewMockSpaceStorage(ctrl)
spaceStorage.EXPECT().SpaceSettingsId().Return("spaceSettingsId").AnyTimes()
stateStorage := mock_statestorage.NewMockStateStorage(ctrl)
spaceStorage.EXPECT().StateStorage().AnyTimes().Return(stateStorage)
stateStorage.EXPECT().SettingsId().AnyTimes().Return("settingsId")
a := new(app.App)
a.Register(testutil.PrepareMock(context.Background(), a, treeManager)).
@ -64,6 +68,7 @@ func newFixture(t *testing.T, spaceId string) *fixture {
nodeConf: nodeConf,
syncStatus: syncStatus,
syncDetailsUpdater: syncDetailsUpdater,
stateStorage: stateStorage,
}
}

View file

@ -2,12 +2,10 @@ package source
import (
"context"
"fmt"
"os"
"path/filepath"
"sort"
"testing"
"time"
anystore "github.com/anyproto/any-store"
"github.com/anyproto/any-sync/commonspace/object/accountdata"
@ -19,6 +17,7 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.uber.org/mock/gomock"
"golang.org/x/sys/unix"
"github.com/anyproto/anytype-heart/core/block/editor/storestate"
"github.com/anyproto/anytype-heart/pb"
@ -98,90 +97,6 @@ func TestStoreApply_RealTree(t *testing.T) {
})
}
func TestStoreApply_Apply(t *testing.T) {
t.Run("new tree", func(t *testing.T) {
fx := newMockTreeStoreFx(t)
tx := fx.RequireTx(t)
changes := []*objecttree.Change{
testChange("1", false),
testChange("2", false),
testChange("3", false),
}
fx.ApplyChanges(t, tx, changes...)
require.NoError(t, tx.Commit())
})
t.Run("insert middle", func(t *testing.T) {
fx := newMockTreeStoreFx(t)
tx := fx.RequireTx(t)
changes := []*objecttree.Change{
testChange("1", false),
testChange("2", false),
testChange("3", false),
}
fx.ApplyChanges(t, tx, changes...)
require.NoError(t, tx.Commit())
tx = fx.RequireTx(t)
changes = []*objecttree.Change{
testChange("1", false),
testChange("1.1", true),
testChange("1.2", true),
testChange("1.3", true),
testChange("2", false),
testChange("2.2", true),
testChange("3", false),
}
fx.ExpectTreeFrom("1.1", changes[1:]...)
fx.ExpectTreeFrom("2.2", changes[6:]...)
fx.ApplyChanges(t, tx, changes...)
require.NoError(t, tx.Commit())
})
t.Run("append", func(t *testing.T) {
fx := newMockTreeStoreFx(t)
tx := fx.RequireTx(t)
changes := []*objecttree.Change{
testChange("1", false),
testChange("2", false),
testChange("3", false),
}
fx.ApplyChanges(t, tx, changes...)
require.NoError(t, tx.Commit())
tx = fx.RequireTx(t)
changes = []*objecttree.Change{
testChange("1", false),
testChange("2", false),
testChange("3", false),
testChange("4", true),
testChange("5", true),
testChange("6", true),
}
fx.ApplyChanges(t, tx, changes...)
require.NoError(t, tx.Commit())
})
}
func TestStoreApply_Apply10000(t *testing.T) {
fx := newMockTreeStoreFx(t)
tx := fx.RequireTx(t)
changes := make([]*objecttree.Change, 100000)
for i := range changes {
changes[i] = testChange(fmt.Sprint(i), false)
}
st := time.Now()
applier := &storeApply{
tx: tx,
ot: fx.mockTree,
}
fx.ExpectTree(changes...)
require.NoError(t, applier.Apply())
t.Logf("apply dur: %v;", time.Since(st))
st = time.Now()
require.NoError(t, tx.Commit())
t.Logf("commit dur: %v;", time.Since(st))
}
type storeFx struct {
state *storestate.StoreState
mockTree *mock_objecttree.MockObjectTree
@ -243,37 +158,6 @@ func (fx *storeFx) ApplyChanges(t *testing.T, tx *storestate.StoreStateTx, chang
fx.AssertOrder(t, tx, changes...)
}
func newMockTreeStoreFx(t testing.TB) *storeFx {
tmpDir, err := os.MkdirTemp("", "source_store_*")
require.NoError(t, err)
db, err := anystore.Open(ctx, filepath.Join(tmpDir, "test.db"), nil)
require.NoError(t, err)
ctrl := gomock.NewController(t)
t.Cleanup(func() {
if db != nil {
_ = db.Close()
}
ctrl.Finish()
if tmpDir != "" {
_ = os.RemoveAll(tmpDir)
}
})
state, err := storestate.New(ctx, "source_test", db, storestate.DefaultHandler{Name: "default"})
require.NoError(t, err)
tree := mock_objecttree.NewMockObjectTree(ctrl)
tree.EXPECT().Id().Return("root").AnyTimes()
return &storeFx{
state: state,
mockTree: tree,
db: db,
}
}
func newRealTreeStoreFx(t testing.TB) *storeFx {
tmpDir, err := os.MkdirTemp("", "source_store_*")
require.NoError(t, err)
@ -295,14 +179,16 @@ func newRealTreeStoreFx(t testing.TB) *storeFx {
state, err := storestate.New(ctx, "source_test", db, storestate.DefaultHandler{Name: "default"})
require.NoError(t, err)
aclList, _ := prepareAclList(t)
objTree, err := buildTree(aclList)
objTree, err := buildTree(t, aclList)
require.NoError(t, err)
fx := &storeFx{
state: state,
realTree: objTree,
aclList: aclList,
changeCreator: objecttree.NewMockChangeCreator(),
db: db,
state: state,
realTree: objTree,
aclList: aclList,
changeCreator: objecttree.NewMockChangeCreator(func() anystore.DB {
return createStore(ctx, t)
}),
db: db,
}
tx := fx.RequireTx(t)
defer tx.Rollback()
@ -321,6 +207,7 @@ func testChange(id string, isNew bool) *objecttree.Change {
return &objecttree.Change{
Id: id,
OrderId: id,
IsNew: isNew,
Model: &pb.StoreChange{},
Identity: pub,
@ -330,15 +217,17 @@ func testChange(id string, isNew bool) *objecttree.Change {
func prepareAclList(t testing.TB) (list.AclList, *accountdata.AccountKeys) {
randKeys, err := accountdata.NewRandom()
require.NoError(t, err)
aclList, err := list.NewTestDerivedAcl("spaceId", randKeys)
aclList, err := list.NewInMemoryDerivedAcl("spaceId", randKeys)
require.NoError(t, err, "building acl list should be without error")
return aclList, randKeys
}
func buildTree(aclList list.AclList) (objecttree.ObjectTree, error) {
changeCreator := objecttree.NewMockChangeCreator()
treeStorage := changeCreator.CreateNewTreeStorage("0", aclList.Head().Id, false)
func buildTree(t testing.TB, aclList list.AclList) (objecttree.ObjectTree, error) {
changeCreator := objecttree.NewMockChangeCreator(func() anystore.DB {
return createStore(ctx, t)
})
treeStorage := changeCreator.CreateNewTreeStorage(t.(*testing.T), "0", aclList.Head().Id, false)
tree, err := objecttree.BuildTestableTree(treeStorage, aclList)
if err != nil {
return nil, err
@ -346,3 +235,22 @@ func buildTree(aclList list.AclList) (objecttree.ObjectTree, error) {
tree.SetFlusher(objecttree.MarkNewChangeFlusher())
return tree, nil
}
func createStore(ctx context.Context, t testing.TB) anystore.DB {
return createNamedStore(ctx, t, "changes.db")
}
func createNamedStore(ctx context.Context, t testing.TB, name string) anystore.DB {
path := filepath.Join(t.TempDir(), name)
db, err := anystore.Open(ctx, path, nil)
require.NoError(t, err)
t.Cleanup(func() {
err := db.Close()
require.NoError(t, err)
unix.Rmdir(path)
})
return objecttree.TestStore{
DB: db,
Path: path,
}
}

View file

@ -238,10 +238,6 @@ func (s *syncAclStub) HandleRequest(ctx context.Context, senderId string, reques
return
}
func (s *syncAclStub) SetHeadUpdater(updater headupdater.HeadUpdater) {
return
}
func (s *syncAclStub) SetAclUpdater(updater headupdater.AclUpdater) {
s.updater = updater
return