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:
parent
1f8453a044
commit
2172d9ce33
3 changed files with 41 additions and 132 deletions
|
@ -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,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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,
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue