mirror of
https://github.com/anyproto/any-sync.git
synced 2025-06-11 10:18:08 +09:00
More tests and fixes for reading from tree
This commit is contained in:
parent
cd0f601afa
commit
77e4f9b6f9
3 changed files with 53 additions and 27 deletions
|
@ -92,12 +92,13 @@ func prepareTreeContext(t *testing.T, aclList list.ACLList) testTreeContext {
|
|||
treeStorage := changeCreator.createNewTreeStorage("treeId", aclList.ID(), aclList.Head().Id, "0")
|
||||
changeBuilder := &mockChangeBuilder{}
|
||||
deps := objectTreeDeps{
|
||||
changeBuilder: changeBuilder,
|
||||
treeBuilder: newTreeBuilder(treeStorage, changeBuilder),
|
||||
treeStorage: treeStorage,
|
||||
updateListener: nil,
|
||||
validator: &mockChangeValidator{},
|
||||
aclList: aclList,
|
||||
changeBuilder: changeBuilder,
|
||||
treeBuilder: newTreeBuilder(treeStorage, changeBuilder),
|
||||
treeStorage: treeStorage,
|
||||
updateListener: nil,
|
||||
rawChangeLoader: newRawChangeLoader(treeStorage, changeBuilder),
|
||||
validator: &mockChangeValidator{},
|
||||
aclList: aclList,
|
||||
}
|
||||
|
||||
// check build
|
||||
|
@ -271,7 +272,7 @@ func TestObjectTree(t *testing.T) {
|
|||
assert.Equal(t, true, objTree.(*objectTree).snapshotPathIsActual())
|
||||
})
|
||||
|
||||
t.Run("changes after common snapshot complex", func(t *testing.T) {
|
||||
t.Run("changes from tree after common snapshot complex", func(t *testing.T) {
|
||||
ctx := prepareTreeContext(t, aclList)
|
||||
changeCreator := ctx.changeCreator
|
||||
objTree := ctx.objTree
|
||||
|
@ -289,7 +290,7 @@ func TestObjectTree(t *testing.T) {
|
|||
require.NoError(t, err, "adding changes should be without error")
|
||||
require.Equal(t, "0", objTree.Root().Id)
|
||||
|
||||
t.Run("changes from tree", func(t *testing.T) {
|
||||
t.Run("all changes from tree", func(t *testing.T) {
|
||||
changes, err := objTree.ChangesAfterCommonSnapshot([]string{"3", "0"}, []string{})
|
||||
require.NoError(t, err, "changes after common snapshot should be without error")
|
||||
|
||||
|
@ -302,9 +303,11 @@ func TestObjectTree(t *testing.T) {
|
|||
_, ok := changeIds[raw.Id]
|
||||
assert.Equal(t, true, ok)
|
||||
}
|
||||
_, ok := changeIds["0"]
|
||||
assert.Equal(t, true, ok)
|
||||
})
|
||||
|
||||
t.Run("changes from tree after first", func(t *testing.T) {
|
||||
t.Run("changes from tree after 1", func(t *testing.T) {
|
||||
changes, err := objTree.ChangesAfterCommonSnapshot([]string{"3", "0"}, []string{"1"})
|
||||
require.NoError(t, err, "changes after common snapshot should be without error")
|
||||
|
||||
|
@ -313,15 +316,33 @@ func TestObjectTree(t *testing.T) {
|
|||
changeIds[ch.Id] = struct{}{}
|
||||
}
|
||||
|
||||
for _, raw := range rawChanges {
|
||||
if raw.Id == "1" {
|
||||
_, ok := changeIds[raw.Id]
|
||||
assert.Equal(t, false, ok)
|
||||
continue
|
||||
}
|
||||
_, ok := changeIds[raw.Id]
|
||||
for _, id := range []string{"2", "3", "4", "5", "6"} {
|
||||
_, ok := changeIds[id]
|
||||
assert.Equal(t, true, ok)
|
||||
}
|
||||
for _, id := range []string{"0", "1"} {
|
||||
_, ok := changeIds[id]
|
||||
assert.Equal(t, false, ok)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("changes from tree after 5", func(t *testing.T) {
|
||||
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{})
|
||||
for _, ch := range changes {
|
||||
changeIds[ch.Id] = struct{}{}
|
||||
}
|
||||
|
||||
for _, id := range []string{"2", "3", "4", "6"} {
|
||||
_, ok := changeIds[id]
|
||||
assert.Equal(t, true, ok)
|
||||
}
|
||||
for _, id := range []string{"0", "1", "5"} {
|
||||
_, ok := changeIds[id]
|
||||
assert.Equal(t, false, ok)
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
|
|
|
@ -90,7 +90,7 @@ func (r *rawChangeLoader) LoadFromTree(t *Tree, breakpoints []string) ([]*aclpb.
|
|||
return true
|
||||
},
|
||||
func(visited []*Change) {
|
||||
discardFromSlice(results, func(change *Change) bool {
|
||||
results = discardFromSlice(results, func(change *Change) bool {
|
||||
return change.visited
|
||||
})
|
||||
},
|
||||
|
@ -200,7 +200,7 @@ func (r *rawChangeLoader) LoadFromStorage(commonSnapshot string, heads, breakpoi
|
|||
})
|
||||
|
||||
// discarding visited
|
||||
discardFromSlice(buffer, func(change *aclpb.RawChange) bool {
|
||||
buffer = discardFromSlice(buffer, func(change *aclpb.RawChange) bool {
|
||||
return change == nil
|
||||
})
|
||||
|
||||
|
@ -233,17 +233,20 @@ func (r *rawChangeLoader) loadEntry(id string) (entry rawCacheEntry, err error)
|
|||
return
|
||||
}
|
||||
|
||||
func discardFromSlice[T any](elements []T, isDiscarded func(T) bool) {
|
||||
func discardFromSlice[T any](elements []T, isDiscarded func(T) bool) []T {
|
||||
var (
|
||||
finishedIdx = 0
|
||||
currentIdx = 0
|
||||
)
|
||||
for currentIdx < len(elements) {
|
||||
if !isDiscarded(elements[currentIdx]) && finishedIdx != currentIdx {
|
||||
elements[finishedIdx] = elements[currentIdx]
|
||||
if !isDiscarded(elements[currentIdx]) {
|
||||
if finishedIdx != currentIdx {
|
||||
elements[finishedIdx] = elements[currentIdx]
|
||||
}
|
||||
finishedIdx++
|
||||
}
|
||||
currentIdx++
|
||||
}
|
||||
elements = elements[:finishedIdx]
|
||||
return elements
|
||||
}
|
||||
|
|
|
@ -73,22 +73,24 @@ func (tb *treeBuilder) buildTree(heads []string, breakpoint string) (err error)
|
|||
return
|
||||
}
|
||||
tb.tree.AddFast(ch)
|
||||
changes, err := tb.dfs(heads, breakpoint, tb.loadChange)
|
||||
changes, err := tb.dfs(heads, breakpoint)
|
||||
|
||||
tb.tree.AddFast(changes...)
|
||||
return
|
||||
}
|
||||
|
||||
func (tb *treeBuilder) dfs(
|
||||
heads []string,
|
||||
breakpoint string,
|
||||
load func(string) (*Change, error)) (buf []*Change, err error) {
|
||||
func (tb *treeBuilder) dfs(heads []string, breakpoint string) (buf []*Change, err error) {
|
||||
// initializing buffers
|
||||
tb.idStack = tb.idStack[:0]
|
||||
tb.loadBuffer = tb.loadBuffer[:0]
|
||||
|
||||
// updating map
|
||||
uniqMap := map[string]struct{}{breakpoint: {}}
|
||||
|
||||
// preparing dfs
|
||||
tb.idStack = append(tb.idStack, heads...)
|
||||
|
||||
// dfs
|
||||
for len(tb.idStack) > 0 {
|
||||
id := tb.idStack[len(tb.idStack)-1]
|
||||
tb.idStack = tb.idStack[:len(tb.idStack)-1]
|
||||
|
@ -96,7 +98,7 @@ func (tb *treeBuilder) dfs(
|
|||
continue
|
||||
}
|
||||
|
||||
ch, err := load(id)
|
||||
ch, err := tb.loadChange(id)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue