mirror of
https://github.com/anyproto/any-sync.git
synced 2025-06-08 05:57:03 +09:00
Make tests compile
This commit is contained in:
parent
55f2655dba
commit
0705d1a6b8
6 changed files with 227 additions and 210 deletions
|
@ -119,14 +119,15 @@ func genChanges(creator *MockChangeCreator, params genParams) (res genResult) {
|
|||
|
||||
type testTreeContext struct {
|
||||
aclList list.AclList
|
||||
storage Storage
|
||||
treeStorage Storage
|
||||
changeCreator *MockChangeCreator
|
||||
objTree ObjectTree
|
||||
}
|
||||
|
||||
type testStore struct {
|
||||
anystore.DB
|
||||
path string
|
||||
path string
|
||||
errAdd bool
|
||||
}
|
||||
|
||||
func newStore(ctx context.Context, t *testing.T) anystore.DB {
|
||||
|
@ -146,6 +147,15 @@ func newNamedStore(ctx context.Context, t *testing.T, name string) anystore.DB {
|
|||
}
|
||||
}
|
||||
|
||||
func allChanges(ctx context.Context, t *testing.T, store Storage) (res []*treechangeproto.RawTreeChangeWithId) {
|
||||
err := store.GetAfterOrder(ctx, "", func(ctx context.Context, change StorageChange) (shouldContinue bool) {
|
||||
res = append(res, change.RawTreeChangeWithId())
|
||||
return true
|
||||
})
|
||||
require.NoError(t, err)
|
||||
return
|
||||
}
|
||||
|
||||
func copyFolder(src string, dst string) error {
|
||||
return filepath.WalkDir(src, func(path string, d fs.DirEntry, err error) error {
|
||||
if err != nil {
|
||||
|
@ -263,7 +273,7 @@ func prepareContext(
|
|||
}
|
||||
return testTreeContext{
|
||||
aclList: aclList,
|
||||
storage: treeStorage,
|
||||
treeStorage: treeStorage,
|
||||
changeCreator: changeCreator,
|
||||
objTree: objTree,
|
||||
}
|
||||
|
@ -371,32 +381,38 @@ func TestObjectTree(t *testing.T) {
|
|||
DataType: mockDataType,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
var rawAdded []*treechangeproto.RawTreeChangeWithId
|
||||
for _, ch := range res.Added {
|
||||
rawAdded = append(rawAdded, ch.RawTreeChangeWithId())
|
||||
}
|
||||
oldHeads := bTree.Heads()
|
||||
res, err = bTree.AddRawChanges(ctx, RawChangesPayload{
|
||||
NewHeads: aTree.Heads(),
|
||||
RawChanges: res.Added,
|
||||
RawChanges: rawAdded,
|
||||
})
|
||||
require.Equal(t, oldHeads, bTree.Heads())
|
||||
bStore = aTree.Storage().(*treestorage.InMemoryTreeStorage).Copy()
|
||||
root, _ = bStore.Root()
|
||||
heads, _ := bStore.Heads()
|
||||
rawAdded = allChanges(ctx, t, bStore)
|
||||
require.NoError(t, err)
|
||||
newTree, err := ValidateFilterRawTree(treestorage.TreeStorageCreatePayload{
|
||||
RootRawChange: root,
|
||||
Changes: bStore.AllChanges(),
|
||||
Heads: heads,
|
||||
Changes: rawAdded,
|
||||
Heads: bTree.Heads(),
|
||||
}, InMemoryStorageCreator{}, bAccount.Acl)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, 2, len(newTree.Storage().(*treestorage.InMemoryTreeStorage).AllChanges()))
|
||||
err = aTree.IterateRoot(func(change *Change, decrypted []byte) (any, error) {
|
||||
chCount := 0
|
||||
err = newTree.IterateRoot(func(change *Change, decrypted []byte) (any, error) {
|
||||
chCount++
|
||||
return nil, nil
|
||||
}, func(change *Change) bool {
|
||||
return true
|
||||
})
|
||||
require.Equal(t, 2, chCount)
|
||||
require.NoError(t, err)
|
||||
})
|
||||
|
||||
t.Run("filter changes when no aclHeadId", func(t *testing.T) {
|
||||
exec := list.NewAclExecutor("spaceId")
|
||||
store := newStore(ctx, t)
|
||||
type cmdErr struct {
|
||||
cmd string
|
||||
err error
|
||||
|
@ -421,7 +437,7 @@ func TestObjectTree(t *testing.T) {
|
|||
IsEncrypted: true,
|
||||
}, aAccount.Acl)
|
||||
require.NoError(t, err)
|
||||
aStore, _ := treestorage.NewInMemoryTreeStorage(root, []string{root.Id}, []*treechangeproto.RawTreeChangeWithId{root})
|
||||
aStore, _ := createStorage(ctx, root, store)
|
||||
aTree, err := BuildKeyFilterableObjectTree(aStore, aAccount.Acl)
|
||||
require.NoError(t, err)
|
||||
_, err = aTree.AddContent(ctx, SignableChangeContent{
|
||||
|
@ -432,7 +448,9 @@ func TestObjectTree(t *testing.T) {
|
|||
DataType: mockDataType,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
bStore := aTree.Storage().(*treestorage.InMemoryTreeStorage).Copy()
|
||||
storeB := copyStore(ctx, t, store.(testStore), "b")
|
||||
bStore, err := createStorage(ctx, root, storeB)
|
||||
require.NoError(t, err)
|
||||
// copying old version of storage
|
||||
prevAclRecs, err := bAccount.Acl.RecordsAfter(ctx, "")
|
||||
require.NoError(t, err)
|
||||
|
@ -482,8 +500,9 @@ func TestObjectTree(t *testing.T) {
|
|||
IsEncrypted: true,
|
||||
}, aclList)
|
||||
require.NoError(t, err)
|
||||
store, _ := treestorage.NewInMemoryTreeStorage(root, []string{root.Id}, []*treechangeproto.RawTreeChangeWithId{root})
|
||||
oTree, err := BuildObjectTree(store, aclList)
|
||||
store := newStore(ctx, t)
|
||||
storage, _ := createStorage(ctx, root, store)
|
||||
oTree, err := BuildObjectTree(storage, aclList)
|
||||
require.NoError(t, err)
|
||||
|
||||
t.Run("add content validate failed", func(t *testing.T) {
|
||||
|
@ -515,7 +534,7 @@ func TestObjectTree(t *testing.T) {
|
|||
require.NoError(t, err)
|
||||
require.Len(t, oTree.Heads(), 1)
|
||||
require.Equal(t, res.Added[0].Id, oTree.Heads()[0])
|
||||
ch, err := oTree.(*objectTree).changeBuilder.Unmarshall(res.Added[0], true)
|
||||
ch, err := oTree.(*objectTree).changeBuilder.Unmarshall(res.Added[0].RawTreeChangeWithId(), true)
|
||||
require.NoError(t, err)
|
||||
require.GreaterOrEqual(t, start.Unix(), ch.Timestamp)
|
||||
require.LessOrEqual(t, end.Unix(), ch.Timestamp)
|
||||
|
@ -534,7 +553,7 @@ func TestObjectTree(t *testing.T) {
|
|||
require.NoError(t, err)
|
||||
require.Len(t, oTree.Heads(), 1)
|
||||
require.Equal(t, res.Added[0].Id, oTree.Heads()[0])
|
||||
ch, err := oTree.(*objectTree).changeBuilder.Unmarshall(res.Added[0], true)
|
||||
ch, err := oTree.(*objectTree).changeBuilder.Unmarshall(res.Added[0].RawTreeChangeWithId(), true)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, ch.Timestamp, someTs)
|
||||
require.Equal(t, res.Added[0].Id, oTree.(*objectTree).tree.lastIteratedHeadId)
|
||||
|
@ -551,14 +570,15 @@ func TestObjectTree(t *testing.T) {
|
|||
IsEncrypted: true,
|
||||
}, aclList)
|
||||
require.NoError(t, err)
|
||||
store, _ := treestorage.NewInMemoryTreeStorage(root, []string{root.Id}, []*treechangeproto.RawTreeChangeWithId{root})
|
||||
oTree, err := BuildObjectTree(store, aclList)
|
||||
store := newStore(ctx, t)
|
||||
storage, _ := createStorage(ctx, root, store)
|
||||
oTree, err := BuildObjectTree(storage, aclList)
|
||||
require.NoError(t, err)
|
||||
emptyDataTreeDeps = nonVerifiableTreeDeps
|
||||
err = ValidateRawTree(treestorage.TreeStorageCreatePayload{
|
||||
RootRawChange: oTree.Header(),
|
||||
Heads: []string{root.Id},
|
||||
Changes: oTree.Storage().(*treestorage.InMemoryTreeStorage).AllChanges(),
|
||||
Changes: allChanges(ctx, t, oTree.Storage()),
|
||||
}, aclList)
|
||||
require.NoError(t, err)
|
||||
})
|
||||
|
@ -571,14 +591,15 @@ func TestObjectTree(t *testing.T) {
|
|||
IsEncrypted: true,
|
||||
}, aclList)
|
||||
require.NoError(t, err)
|
||||
store, _ := treestorage.NewInMemoryTreeStorage(root, []string{root.Id}, []*treechangeproto.RawTreeChangeWithId{root})
|
||||
oTree, err := BuildObjectTree(store, aclList)
|
||||
store := newStore(ctx, t)
|
||||
storage, _ := createStorage(ctx, root, store)
|
||||
oTree, err := BuildObjectTree(storage, aclList)
|
||||
require.NoError(t, err)
|
||||
emptyDataTreeDeps = nonVerifiableTreeDeps
|
||||
err = ValidateRawTree(treestorage.TreeStorageCreatePayload{
|
||||
RootRawChange: oTree.Header(),
|
||||
Heads: []string{root.Id},
|
||||
Changes: oTree.Storage().(*treestorage.InMemoryTreeStorage).AllChanges(),
|
||||
Changes: allChanges(ctx, t, oTree.Storage()),
|
||||
}, aclList)
|
||||
require.Equal(t, ErrDerived, err)
|
||||
})
|
||||
|
@ -604,8 +625,9 @@ func TestObjectTree(t *testing.T) {
|
|||
IsEncrypted: true,
|
||||
}, aclList)
|
||||
require.NoError(t, err)
|
||||
store, _ := treestorage.NewInMemoryTreeStorage(root, []string{root.Id}, []*treechangeproto.RawTreeChangeWithId{root})
|
||||
oTree, err := BuildObjectTree(store, aclList)
|
||||
store := newStore(ctx, t)
|
||||
storage, _ := createStorage(ctx, root, store)
|
||||
oTree, err := BuildObjectTree(storage, aclList)
|
||||
require.NoError(t, err)
|
||||
_, err = oTree.AddContent(ctx, SignableChangeContent{
|
||||
Data: []byte("some"),
|
||||
|
@ -616,15 +638,15 @@ func TestObjectTree(t *testing.T) {
|
|||
DataType: mockDataType,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
allChanges := oTree.Storage().(*treestorage.InMemoryTreeStorage).AllChanges()
|
||||
chs := allChanges(ctx, t, storage)
|
||||
emptyDataTreeDeps = nonVerifiableTreeDeps
|
||||
err = ValidateRawTree(treestorage.TreeStorageCreatePayload{
|
||||
RootRawChange: oTree.Header(),
|
||||
Heads: []string{oTree.Heads()[0]},
|
||||
Changes: allChanges,
|
||||
Changes: chs,
|
||||
}, aclList)
|
||||
require.NoError(t, err)
|
||||
rawChs, err := oTree.ChangesAfterCommonSnapshot(nil, nil)
|
||||
rawChs := allChanges(ctx, t, oTree.Storage())
|
||||
require.NoError(t, err)
|
||||
sortFunc := func(a, b *treechangeproto.RawTreeChangeWithId) int {
|
||||
if a.Id < b.Id {
|
||||
|
@ -633,9 +655,9 @@ func TestObjectTree(t *testing.T) {
|
|||
return -1
|
||||
}
|
||||
}
|
||||
slices.SortFunc(allChanges, sortFunc)
|
||||
slices.SortFunc(chs, sortFunc)
|
||||
slices.SortFunc(rawChs, sortFunc)
|
||||
require.Equal(t, allChanges, rawChs)
|
||||
require.Equal(t, chs, rawChs)
|
||||
})
|
||||
|
||||
t.Run("derived more than 1 change, snapshot, correct", func(t *testing.T) {
|
||||
|
@ -646,9 +668,10 @@ func TestObjectTree(t *testing.T) {
|
|||
IsEncrypted: true,
|
||||
}, aclList)
|
||||
require.NoError(t, err)
|
||||
store, _ := treestorage.NewInMemoryTreeStorage(root, []string{root.Id}, []*treechangeproto.RawTreeChangeWithId{root})
|
||||
emptyDataTreeDeps = nonVerifiableTreeDeps
|
||||
oTree, err := BuildObjectTree(store, aclList)
|
||||
store := newStore(ctx, t)
|
||||
storage, _ := createStorage(ctx, root, store)
|
||||
oTree, err := BuildObjectTree(storage, aclList)
|
||||
require.NoError(t, err)
|
||||
_, err = oTree.AddContent(ctx, SignableChangeContent{
|
||||
Data: []byte("some"),
|
||||
|
@ -659,14 +682,14 @@ func TestObjectTree(t *testing.T) {
|
|||
DataType: mockDataType,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
allChanges := oTree.Storage().(*treestorage.InMemoryTreeStorage).AllChanges()
|
||||
chs := allChanges(ctx, t, storage)
|
||||
err = ValidateRawTree(treestorage.TreeStorageCreatePayload{
|
||||
RootRawChange: oTree.Header(),
|
||||
Heads: []string{oTree.Heads()[0]},
|
||||
Changes: allChanges,
|
||||
Changes: chs,
|
||||
}, aclList)
|
||||
require.NoError(t, err)
|
||||
rawChs, err := oTree.ChangesAfterCommonSnapshot(nil, nil)
|
||||
rawChs := allChanges(ctx, t, oTree.Storage())
|
||||
require.NoError(t, err)
|
||||
sortFunc := func(a, b *treechangeproto.RawTreeChangeWithId) int {
|
||||
if a.Id < b.Id {
|
||||
|
@ -675,9 +698,9 @@ func TestObjectTree(t *testing.T) {
|
|||
return -1
|
||||
}
|
||||
}
|
||||
slices.SortFunc(allChanges, sortFunc)
|
||||
slices.SortFunc(chs, sortFunc)
|
||||
slices.SortFunc(rawChs, sortFunc)
|
||||
require.Equal(t, allChanges, rawChs)
|
||||
require.Equal(t, chs, rawChs)
|
||||
})
|
||||
|
||||
t.Run("validate from start, multiple snapshots, correct", func(t *testing.T) {
|
||||
|
@ -701,10 +724,10 @@ func TestObjectTree(t *testing.T) {
|
|||
})
|
||||
|
||||
t.Run("add simple", func(t *testing.T) {
|
||||
ctx := prepareTreeContext(t, aclList)
|
||||
treeStorage := ctx.treeStorage
|
||||
changeCreator := ctx.changeCreator
|
||||
objTree := ctx.objTree
|
||||
treeCtx := prepareTreeContext(t, aclList)
|
||||
treeStorage := treeCtx.treeStorage
|
||||
changeCreator := treeCtx.changeCreator
|
||||
objTree := treeCtx.objTree
|
||||
|
||||
rawChanges := []*treechangeproto.RawTreeChangeWithId{
|
||||
changeCreator.CreateRaw("1", aclList.Head().Id, "0", false, "0"),
|
||||
|
@ -739,11 +762,11 @@ func TestObjectTree(t *testing.T) {
|
|||
assert.Equal(t, []string{"0", "1", "2"}, iterChangesId)
|
||||
|
||||
// check storage
|
||||
heads, _ := treeStorage.Heads()
|
||||
heads, _ := treeStorage.Heads(ctx)
|
||||
assert.Equal(t, []string{"2"}, heads)
|
||||
|
||||
for _, ch := range rawChanges {
|
||||
raw, err := treeStorage.GetRawChange(context.Background(), ch.Id)
|
||||
raw, err := treeStorage.Get(context.Background(), ch.Id)
|
||||
assert.NoError(t, err, "storage should have all the changes")
|
||||
assert.Equal(t, ch, raw, "the changes in the storage should be the same")
|
||||
}
|
||||
|
@ -825,10 +848,10 @@ func TestObjectTree(t *testing.T) {
|
|||
})
|
||||
|
||||
t.Run("add new snapshot simple", func(t *testing.T) {
|
||||
ctx := prepareTreeContext(t, aclList)
|
||||
treeStorage := ctx.treeStorage
|
||||
changeCreator := ctx.changeCreator
|
||||
objTree := ctx.objTree
|
||||
treeCtx := prepareTreeContext(t, aclList)
|
||||
treeStorage := treeCtx.treeStorage
|
||||
changeCreator := treeCtx.changeCreator
|
||||
objTree := treeCtx.objTree
|
||||
|
||||
rawChanges := []*treechangeproto.RawTreeChangeWithId{
|
||||
changeCreator.CreateRaw("1", aclList.Head().Id, "0", false, "0"),
|
||||
|
@ -865,11 +888,11 @@ func TestObjectTree(t *testing.T) {
|
|||
assert.Equal(t, "3", objTree.Root().Id)
|
||||
|
||||
// check storage
|
||||
heads, _ := treeStorage.Heads()
|
||||
heads, _ := treeStorage.Heads(ctx)
|
||||
assert.Equal(t, []string{"4"}, heads)
|
||||
|
||||
for _, ch := range rawChanges {
|
||||
raw, err := treeStorage.GetRawChange(context.Background(), ch.Id)
|
||||
raw, err := treeStorage.Get(context.Background(), ch.Id)
|
||||
assert.NoError(t, err, "storage should have all the changes")
|
||||
assert.Equal(t, ch, raw, "the changes in the storage should be the same")
|
||||
}
|
||||
|
@ -899,10 +922,10 @@ func TestObjectTree(t *testing.T) {
|
|||
})
|
||||
|
||||
t.Run("add new snapshot simple with newChangeFlusher", func(t *testing.T) {
|
||||
ctx := prepareTreeContext(t, aclList)
|
||||
treeStorage := ctx.treeStorage
|
||||
changeCreator := ctx.changeCreator
|
||||
objTree := ctx.objTree.(*objectTree)
|
||||
treeCtx := prepareTreeContext(t, aclList)
|
||||
treeStorage := treeCtx.treeStorage
|
||||
changeCreator := treeCtx.changeCreator
|
||||
objTree := treeCtx.objTree.(*objectTree)
|
||||
objTree.flusher = &newChangeFlusher{}
|
||||
|
||||
rawChanges := []*treechangeproto.RawTreeChangeWithId{
|
||||
|
@ -946,13 +969,13 @@ func TestObjectTree(t *testing.T) {
|
|||
assert.Equal(t, []string{"4"}, objTree.Heads())
|
||||
|
||||
// check storage
|
||||
heads, _ := treeStorage.Heads()
|
||||
heads, _ := treeStorage.Heads(ctx)
|
||||
assert.Equal(t, []string{"4"}, heads)
|
||||
|
||||
// after Flush
|
||||
assert.Equal(t, "3", objTree.Root().Id)
|
||||
for _, ch := range rawChanges {
|
||||
raw, err := treeStorage.GetRawChange(context.Background(), ch.Id)
|
||||
raw, err := treeStorage.Get(context.Background(), ch.Id)
|
||||
assert.NoError(t, err, "storage should have all the changes")
|
||||
assert.Equal(t, ch, raw, "the changes in the storage should be the same")
|
||||
treeCh, err := objTree.GetChange(ch.Id)
|
||||
|
@ -966,10 +989,10 @@ func TestObjectTree(t *testing.T) {
|
|||
})
|
||||
|
||||
t.Run("update failed, nothing saved", func(t *testing.T) {
|
||||
ctx := prepareTreeContext(t, aclList)
|
||||
treeStorage := ctx.treeStorage
|
||||
changeCreator := ctx.changeCreator
|
||||
objTree := ctx.objTree.(*objectTree)
|
||||
treeCtx := prepareTreeContext(t, aclList)
|
||||
treeStorage := treeCtx.treeStorage
|
||||
changeCreator := treeCtx.changeCreator
|
||||
objTree := treeCtx.objTree.(*objectTree)
|
||||
objTree.flusher = &newChangeFlusher{}
|
||||
|
||||
rawChanges := []*treechangeproto.RawTreeChangeWithId{
|
||||
|
@ -992,12 +1015,12 @@ func TestObjectTree(t *testing.T) {
|
|||
require.Equal(t, []string{"0"}, objTree.Heads())
|
||||
|
||||
// check storage
|
||||
heads, _ := treeStorage.Heads()
|
||||
heads, _ := treeStorage.Heads(ctx)
|
||||
require.Equal(t, []string{"0"}, heads)
|
||||
|
||||
require.Equal(t, "0", objTree.Root().Id)
|
||||
for _, ch := range rawChanges {
|
||||
_, err := treeStorage.GetRawChange(context.Background(), ch.Id)
|
||||
_, err := treeStorage.Get(context.Background(), ch.Id)
|
||||
require.Error(t, err)
|
||||
}
|
||||
})
|
||||
|
@ -1026,77 +1049,12 @@ func TestObjectTree(t *testing.T) {
|
|||
assert.Equal(t, true, objTree.(*objectTree).snapshotPathIsActual())
|
||||
})
|
||||
|
||||
t.Run("test empty data tree", func(t *testing.T) {
|
||||
// TODO: think about how to rewrite this test without additional changes
|
||||
//t.Run("empty tree load", func(t *testing.T) {
|
||||
// ctx := prepareEmptyDataTreeContext(t, aclList, func(changeCreator *MockChangeCreator) RawChangesPayload {
|
||||
// rawChanges := []*treechangeproto.RawTreeChangeWithId{
|
||||
// changeCreator.CreateRawWithData("1", aclList.Head().Id, "0", false, []byte("1"), "0"),
|
||||
// changeCreator.CreateRawWithData("2", aclList.Head().Id, "0", false, []byte("2"), "1"),
|
||||
// changeCreator.CreateRawWithData("3", aclList.Head().Id, "0", false, []byte("3"), "2"),
|
||||
// changeCreator.CreateRawWithData("4", aclList.Head().Id, "0", false, []byte("4"), "2"),
|
||||
// changeCreator.CreateRawWithData("5", aclList.Head().Id, "0", false, []byte("5"), "1"),
|
||||
// changeCreator.CreateRawWithData("6", aclList.Head().Id, "0", false, []byte("6"), "3", "4", "5"),
|
||||
// }
|
||||
// return RawChangesPayload{NewHeads: []string{"6"}, RawChanges: rawChanges}
|
||||
// })
|
||||
// ctx.objTree.IterateRoot(nil, func(change *Change) bool {
|
||||
// if change.Id == "0" {
|
||||
// return true
|
||||
// }
|
||||
// require.Nil(t, change.Data)
|
||||
// return true
|
||||
// })
|
||||
// rawChanges, err := ctx.objTree.ChangesAfterCommonSnapshot([]string{"0"}, []string{"6"})
|
||||
// require.NoError(t, err)
|
||||
// for _, ch := range rawChanges {
|
||||
// unmarshallRaw := &treechangeproto.RawTreeChange{}
|
||||
// proto.Unmarshal(ch.RawChange, unmarshallRaw)
|
||||
// treeCh := &treechangeproto.TreeChange{}
|
||||
// proto.Unmarshal(unmarshallRaw.Payload, treeCh)
|
||||
// require.Equal(t, ch.Id, string(treeCh.ChangesData))
|
||||
// }
|
||||
//})
|
||||
})
|
||||
|
||||
t.Run("test tree restore", func(t *testing.T) {
|
||||
ctx := prepareTreeContext(t, aclList)
|
||||
rawChanges := []*treechangeproto.RawTreeChangeWithId{
|
||||
ctx.changeCreator.CreateRawWithData("1", aclList.Head().Id, "0", false, []byte("1"), "0"),
|
||||
ctx.changeCreator.CreateRawWithData("2", aclList.Head().Id, "0", false, []byte("2"), "1"),
|
||||
ctx.changeCreator.CreateRawWithData("3", aclList.Head().Id, "0", false, []byte("3"), "2"),
|
||||
ctx.changeCreator.CreateRawWithData("4", aclList.Head().Id, "0", false, []byte("4"), "2"),
|
||||
ctx.changeCreator.CreateRawWithData("5", aclList.Head().Id, "0", false, []byte("5"), "1"),
|
||||
ctx.changeCreator.CreateRawWithData("6", aclList.Head().Id, "0", true, []byte("6"), "3", "4", "5"),
|
||||
ctx.changeCreator.CreateRawWithData("7", aclList.Head().Id, "6", false, []byte("7"), "6"),
|
||||
ctx.changeCreator.CreateRawWithData("8", aclList.Head().Id, "6", false, []byte("8"), "6"),
|
||||
}
|
||||
_, err := ctx.objTree.AddRawChanges(context.Background(), RawChangesPayload{
|
||||
NewHeads: []string{"7", "8"},
|
||||
RawChanges: rawChanges,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
st := ctx.treeStorage.(*treestorage.InMemoryTreeStorage)
|
||||
st.Remove("6")
|
||||
newCh := ctx.changeCreator.CreateRawWithData("9", aclList.Head().Id, "0", false, []byte("9"), "3", "4", "5")
|
||||
_, err = ctx.objTree.AddRawChanges(context.Background(), RawChangesPayload{
|
||||
NewHeads: []string{"9"},
|
||||
RawChanges: []*treechangeproto.RawTreeChangeWithId{newCh},
|
||||
})
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, []string{"9"}, ctx.objTree.Heads())
|
||||
heads, err := ctx.objTree.Storage().Heads()
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, []string{"9"}, heads)
|
||||
})
|
||||
|
||||
t.Run("rollback when add to storage returns error", func(t *testing.T) {
|
||||
ctx := prepareTreeContext(t, aclList)
|
||||
changeCreator := ctx.changeCreator
|
||||
objTree := ctx.objTree
|
||||
store := ctx.treeStorage.(*treestorage.InMemoryTreeStorage)
|
||||
addErr := fmt.Errorf("error saving")
|
||||
store.SetReturnErrorOnAdd(addErr)
|
||||
treeCtx := prepareTreeContext(t, aclList)
|
||||
changeCreator := treeCtx.changeCreator
|
||||
objTree := treeCtx.objTree
|
||||
store := treeCtx.treeStorage.(testStorage)
|
||||
store.errAdd = fmt.Errorf("error saving")
|
||||
|
||||
rawChanges := []*treechangeproto.RawTreeChangeWithId{
|
||||
changeCreator.CreateRaw("1", aclList.Head().Id, "0", true, "0"),
|
||||
|
@ -1106,7 +1064,7 @@ func TestObjectTree(t *testing.T) {
|
|||
RawChanges: rawChanges,
|
||||
}
|
||||
_, err := objTree.AddRawChanges(context.Background(), payload)
|
||||
require.Error(t, err, addErr)
|
||||
require.Error(t, err, store.errAdd)
|
||||
require.Equal(t, "0", objTree.Root().Id)
|
||||
})
|
||||
|
||||
|
@ -1144,49 +1102,10 @@ func TestObjectTree(t *testing.T) {
|
|||
require.Equal(t, "6", objTree.Root().Id)
|
||||
})
|
||||
|
||||
t.Run("stored changes will not break the pipeline if heads were not updated", func(t *testing.T) {
|
||||
ctx := prepareTreeContext(t, aclList)
|
||||
changeCreator := ctx.changeCreator
|
||||
objTree := ctx.objTree
|
||||
store := ctx.treeStorage.(*treestorage.InMemoryTreeStorage)
|
||||
|
||||
rawChanges := []*treechangeproto.RawTreeChangeWithId{
|
||||
changeCreator.CreateRaw("1", aclList.Head().Id, "0", true, "0"),
|
||||
}
|
||||
payload := RawChangesPayload{
|
||||
NewHeads: []string{rawChanges[len(rawChanges)-1].Id},
|
||||
RawChanges: rawChanges,
|
||||
}
|
||||
_, err := objTree.AddRawChanges(context.Background(), payload)
|
||||
require.NoError(t, err, "adding changes should be without error")
|
||||
require.Equal(t, "1", objTree.Root().Id)
|
||||
|
||||
// creating changes to save in the storage
|
||||
// to imitate the condition where all changes are in the storage
|
||||
// but the head was not updated
|
||||
storageChanges := []*treechangeproto.RawTreeChangeWithId{
|
||||
changeCreator.CreateRaw("2", aclList.Head().Id, "1", false, "1"),
|
||||
changeCreator.CreateRaw("3", aclList.Head().Id, "1", true, "2"),
|
||||
changeCreator.CreateRaw("4", aclList.Head().Id, "1", false, "2"),
|
||||
changeCreator.CreateRaw("5", aclList.Head().Id, "1", false, "1"),
|
||||
changeCreator.CreateRaw("6", aclList.Head().Id, "1", true, "3", "4", "5"),
|
||||
}
|
||||
store.AddRawChangesSetHeads(storageChanges, []string{"1"})
|
||||
|
||||
// updating with subset of those changes to see that everything will still work
|
||||
payload = RawChangesPayload{
|
||||
NewHeads: []string{"6"},
|
||||
RawChanges: storageChanges,
|
||||
}
|
||||
_, err = objTree.AddRawChanges(context.Background(), payload)
|
||||
require.NoError(t, err, "adding changes should be without error")
|
||||
require.Equal(t, "6", objTree.Root().Id)
|
||||
})
|
||||
|
||||
t.Run("changes from tree after common snapshot complex", func(t *testing.T) {
|
||||
ctx := prepareTreeContext(t, aclList)
|
||||
changeCreator := ctx.changeCreator
|
||||
objTree := ctx.objTree
|
||||
objTree := ctx.objTree.(*objectTree)
|
||||
|
||||
rawChanges := []*treechangeproto.RawTreeChangeWithId{
|
||||
changeCreator.CreateRaw("1", aclList.Head().Id, "0", false, "0"),
|
||||
|
@ -1207,7 +1126,7 @@ func TestObjectTree(t *testing.T) {
|
|||
require.Equal(t, "0", objTree.Root().Id)
|
||||
|
||||
t.Run("all changes from tree", func(t *testing.T) {
|
||||
changes, err := objTree.ChangesAfterCommonSnapshot([]string{"3", "0"}, []string{})
|
||||
changes, err := objTree.changesAfterCommonSnapshot([]string{"3", "0"}, []string{})
|
||||
require.NoError(t, err, "changes after common snapshot should be without error")
|
||||
|
||||
changeIds := make(map[string]struct{})
|
||||
|
@ -1224,7 +1143,7 @@ func TestObjectTree(t *testing.T) {
|
|||
})
|
||||
|
||||
t.Run("changes from tree after 1", func(t *testing.T) {
|
||||
changes, err := objTree.ChangesAfterCommonSnapshot([]string{"3", "0"}, []string{"1"})
|
||||
changes, err := objTree.changesAfterCommonSnapshot([]string{"3", "0"}, []string{"1"})
|
||||
require.NoError(t, err, "changes after common snapshot should be without error")
|
||||
|
||||
changeIds := make(map[string]struct{})
|
||||
|
@ -1249,7 +1168,7 @@ func TestObjectTree(t *testing.T) {
|
|||
})
|
||||
|
||||
t.Run("changes from tree after 5", func(t *testing.T) {
|
||||
changes, err := objTree.ChangesAfterCommonSnapshot([]string{"3", "0"}, []string{"5"})
|
||||
changes, err := objTree.changesAfterCommonSnapshot([]string{"3", "0"}, []string{"5"})
|
||||
require.NoError(t, err, "changes after common snapshot should be without error")
|
||||
|
||||
changeIds := make(map[string]struct{})
|
||||
|
@ -1271,7 +1190,7 @@ func TestObjectTree(t *testing.T) {
|
|||
t.Run("changes after common snapshot db complex", func(t *testing.T) {
|
||||
ctx := prepareTreeContext(t, aclList)
|
||||
changeCreator := ctx.changeCreator
|
||||
objTree := ctx.objTree
|
||||
objTree := ctx.objTree.(*objectTree)
|
||||
|
||||
rawChanges := []*treechangeproto.RawTreeChangeWithId{
|
||||
changeCreator.CreateRaw("1", aclList.Head().Id, "0", false, "0"),
|
||||
|
@ -1293,7 +1212,7 @@ func TestObjectTree(t *testing.T) {
|
|||
require.Equal(t, "6", objTree.Root().Id)
|
||||
|
||||
t.Run("all changes from db", func(t *testing.T) {
|
||||
changes, err := objTree.ChangesAfterCommonSnapshot([]string{"3", "0"}, []string{})
|
||||
changes, err := objTree.changesAfterCommonSnapshot([]string{"3", "0"}, []string{})
|
||||
require.NoError(t, err, "changes after common snapshot should be without error")
|
||||
|
||||
changeIds := make(map[string]struct{})
|
||||
|
@ -1310,7 +1229,7 @@ func TestObjectTree(t *testing.T) {
|
|||
})
|
||||
|
||||
t.Run("changes from tree db 1", func(t *testing.T) {
|
||||
changes, err := objTree.ChangesAfterCommonSnapshot([]string{"3", "0"}, []string{"1"})
|
||||
changes, err := objTree.changesAfterCommonSnapshot([]string{"3", "0"}, []string{"1"})
|
||||
require.NoError(t, err, "changes after common snapshot should be without error")
|
||||
|
||||
changeIds := make(map[string]struct{})
|
||||
|
@ -1329,7 +1248,7 @@ func TestObjectTree(t *testing.T) {
|
|||
})
|
||||
|
||||
t.Run("changes from tree db 5", func(t *testing.T) {
|
||||
changes, err := objTree.ChangesAfterCommonSnapshot([]string{"3", "0"}, []string{"5"})
|
||||
changes, err := objTree.changesAfterCommonSnapshot([]string{"3", "0"}, []string{"5"})
|
||||
require.NoError(t, err, "changes after common snapshot should be without error")
|
||||
|
||||
changeIds := make(map[string]struct{})
|
||||
|
@ -1349,10 +1268,10 @@ func TestObjectTree(t *testing.T) {
|
|||
})
|
||||
|
||||
t.Run("add new changes related to previous snapshot", func(t *testing.T) {
|
||||
ctx := prepareTreeContext(t, aclList)
|
||||
treeStorage := ctx.treeStorage
|
||||
changeCreator := ctx.changeCreator
|
||||
objTree := ctx.objTree
|
||||
treeCtx := prepareTreeContext(t, aclList)
|
||||
treeStorage := treeCtx.treeStorage
|
||||
changeCreator := treeCtx.changeCreator
|
||||
objTree := treeCtx.objTree
|
||||
|
||||
rawChanges := []*treechangeproto.RawTreeChangeWithId{
|
||||
changeCreator.CreateRaw("1", aclList.Head().Id, "0", false, "0"),
|
||||
|
@ -1401,18 +1320,18 @@ func TestObjectTree(t *testing.T) {
|
|||
assert.Equal(t, "0", objTree.Root().Id)
|
||||
|
||||
// check storage
|
||||
heads, _ := treeStorage.Heads()
|
||||
heads, _ := treeStorage.Heads(ctx)
|
||||
assert.Equal(t, []string{"6"}, heads)
|
||||
|
||||
for _, ch := range rawChanges {
|
||||
raw, err := treeStorage.GetRawChange(context.Background(), ch.Id)
|
||||
raw, err := treeStorage.Get(context.Background(), ch.Id)
|
||||
assert.NoError(t, err, "storage should have all the changes")
|
||||
assert.Equal(t, ch, raw, "the changes in the storage should be the same")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("test history tree not include", func(t *testing.T) {
|
||||
changeCreator, deps := prepareHistoryTreeDeps(aclList)
|
||||
changeCreator, deps := prepareHistoryTreeDeps(t, aclList)
|
||||
|
||||
rawChanges := []*treechangeproto.RawTreeChangeWithId{
|
||||
changeCreator.CreateRaw("1", aclList.Head().Id, "0", false, "0"),
|
||||
|
@ -1422,7 +1341,14 @@ func TestObjectTree(t *testing.T) {
|
|||
changeCreator.CreateRaw("5", aclList.Head().Id, "0", false, "1"),
|
||||
changeCreator.CreateRaw("6", aclList.Head().Id, "0", false, "3", "4", "5"),
|
||||
}
|
||||
deps.storage.AddRawChangesSetHeads(rawChanges, []string{"6"})
|
||||
objTree, err := BuildObjectTree(deps.storage, deps.aclList)
|
||||
require.NoError(t, err)
|
||||
payload := RawChangesPayload{
|
||||
NewHeads: []string{rawChanges[len(rawChanges)-1].Id},
|
||||
RawChanges: rawChanges,
|
||||
}
|
||||
_, err = objTree.AddRawChanges(ctx, payload)
|
||||
require.NoError(t, err)
|
||||
hTree, err := buildHistoryTree(deps, HistoryTreeParams{
|
||||
Heads: []string{"6"},
|
||||
IncludeBeforeId: false,
|
||||
|
@ -1443,7 +1369,7 @@ func TestObjectTree(t *testing.T) {
|
|||
})
|
||||
|
||||
t.Run("test history tree build full", func(t *testing.T) {
|
||||
changeCreator, deps := prepareHistoryTreeDeps(aclList)
|
||||
changeCreator, deps := prepareHistoryTreeDeps(t, aclList)
|
||||
|
||||
// sequence of snapshots: 5->1->0
|
||||
rawChanges := []*treechangeproto.RawTreeChangeWithId{
|
||||
|
@ -1454,7 +1380,14 @@ func TestObjectTree(t *testing.T) {
|
|||
changeCreator.CreateRaw("5", aclList.Head().Id, "1", true, "3", "4"),
|
||||
changeCreator.CreateRaw("6", aclList.Head().Id, "5", false, "5"),
|
||||
}
|
||||
deps.storage.AddRawChangesSetHeads(rawChanges, []string{"6"})
|
||||
objTree, err := BuildObjectTree(deps.storage, deps.aclList)
|
||||
require.NoError(t, err)
|
||||
payload := RawChangesPayload{
|
||||
NewHeads: []string{rawChanges[len(rawChanges)-1].Id},
|
||||
RawChanges: rawChanges,
|
||||
}
|
||||
_, err = objTree.AddRawChanges(ctx, payload)
|
||||
require.NoError(t, err)
|
||||
hTree, err := buildHistoryTree(deps, HistoryTreeParams{})
|
||||
require.NoError(t, err)
|
||||
// check tree heads
|
||||
|
@ -1472,7 +1405,7 @@ func TestObjectTree(t *testing.T) {
|
|||
})
|
||||
|
||||
t.Run("test history tree include", func(t *testing.T) {
|
||||
changeCreator, deps := prepareHistoryTreeDeps(aclList)
|
||||
changeCreator, deps := prepareHistoryTreeDeps(t, aclList)
|
||||
|
||||
rawChanges := []*treechangeproto.RawTreeChangeWithId{
|
||||
changeCreator.CreateRaw("1", aclList.Head().Id, "0", false, "0"),
|
||||
|
@ -1482,9 +1415,17 @@ func TestObjectTree(t *testing.T) {
|
|||
changeCreator.CreateRaw("5", aclList.Head().Id, "0", false, "1"),
|
||||
changeCreator.CreateRaw("6", aclList.Head().Id, "0", false, "3", "4", "5"),
|
||||
}
|
||||
deps.storage.AddRawChangesSetHeads(rawChanges, []string{"6"})
|
||||
objTree, err := BuildObjectTree(deps.storage, deps.aclList)
|
||||
require.NoError(t, err)
|
||||
payload := RawChangesPayload{
|
||||
NewHeads: []string{rawChanges[len(rawChanges)-1].Id},
|
||||
RawChanges: rawChanges,
|
||||
}
|
||||
_, err = objTree.AddRawChanges(ctx, payload)
|
||||
require.NoError(t, err)
|
||||
hTree, err := buildHistoryTree(deps, HistoryTreeParams{
|
||||
Heads: []string{"6"}, IncludeBeforeId: true,
|
||||
Heads: []string{"6"},
|
||||
IncludeBeforeId: true,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
// check tree heads
|
||||
|
@ -1502,7 +1443,7 @@ func TestObjectTree(t *testing.T) {
|
|||
})
|
||||
|
||||
t.Run("test history tree root", func(t *testing.T) {
|
||||
_, deps := prepareHistoryTreeDeps(aclList)
|
||||
_, deps := prepareHistoryTreeDeps(t, aclList)
|
||||
hTree, err := buildHistoryTree(deps, HistoryTreeParams{
|
||||
Heads: []string{"0"},
|
||||
IncludeBeforeId: true,
|
||||
|
@ -1582,7 +1523,7 @@ func TestObjectTree(t *testing.T) {
|
|||
require.NoError(t, err)
|
||||
iter, err := objTree.ChangesAfterCommonSnapshotLoader([]string{objTree.Id()}, []string{objTree.Id()})
|
||||
require.NoError(t, err)
|
||||
otherTreeStorage := changeCreator.CreateNewTreeStorage("0", aclList.Head().Id, false)
|
||||
otherTreeStorage := changeCreator.CreateNewTreeStorage(t, "0", aclList.Head().Id, false)
|
||||
otherTree, err := BuildTestableTree(otherTreeStorage, aclList)
|
||||
require.NoError(t, err)
|
||||
for {
|
||||
|
@ -1625,7 +1566,7 @@ func TestObjectTree(t *testing.T) {
|
|||
require.NoError(t, err)
|
||||
iter, err := objTree.ChangesAfterCommonSnapshotLoader([]string{objTree.Id()}, []string{objTree.Id()})
|
||||
require.NoError(t, err)
|
||||
otherTreeStorage := changeCreator.CreateNewTreeStorage("0", aclList.Head().Id, false)
|
||||
otherTreeStorage := changeCreator.CreateNewTreeStorage(t, "0", aclList.Head().Id, false)
|
||||
otherTree, err := BuildTestableTree(otherTreeStorage, aclList)
|
||||
require.NoError(t, err)
|
||||
for {
|
||||
|
@ -1670,7 +1611,7 @@ func TestObjectTree(t *testing.T) {
|
|||
require.NoError(t, err)
|
||||
iter, err := objTree.ChangesAfterCommonSnapshotLoader([]string{objTree.Id()}, []string{objTree.Id()})
|
||||
require.NoError(t, err)
|
||||
otherTreeStorage := changeCreator.CreateNewTreeStorage("0", aclList.Head().Id, false)
|
||||
otherTreeStorage := changeCreator.CreateNewTreeStorage(t, "0", aclList.Head().Id, false)
|
||||
otherTree, err := BuildTestableTree(otherTreeStorage, aclList)
|
||||
require.NoError(t, err)
|
||||
for {
|
||||
|
@ -1708,7 +1649,7 @@ func TestObjectTree(t *testing.T) {
|
|||
},
|
||||
hasData: false,
|
||||
})
|
||||
otherTreeStorage := changeCreator.CreateNewTreeStorage("0", aclList.Head().Id, false)
|
||||
otherTreeStorage := changeCreator.CreateNewTreeStorage(t, "0", aclList.Head().Id, false)
|
||||
otherTree, err := BuildTestableTree(otherTreeStorage, aclList)
|
||||
_, err = objTree.AddRawChanges(context.Background(), RawChangesPayload{
|
||||
NewHeads: result.heads,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue