mirror of
https://github.com/anyproto/any-sync.git
synced 2025-06-07 21:47:02 +09:00
140 lines
3 KiB
Go
140 lines
3 KiB
Go
package ldiff
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
"gopkg.in/mgo.v2/bson"
|
|
"math"
|
|
"testing"
|
|
)
|
|
|
|
func TestDiff_fillRange(t *testing.T) {
|
|
d := New(4, 4).(*diff)
|
|
for i := 0; i < 10; i++ {
|
|
el := Element{
|
|
Id: fmt.Sprint(i),
|
|
Head: fmt.Sprint("h", i),
|
|
}
|
|
d.Set(el)
|
|
}
|
|
t.Log(d.sl.Len())
|
|
|
|
t.Run("elements", func(t *testing.T) {
|
|
r := Range{From: 0, To: math.MaxUint64, Limit: 10}
|
|
res := d.getRange(r)
|
|
assert.NotNil(t, res.Hash)
|
|
assert.Len(t, res.Elements, 10)
|
|
})
|
|
t.Run("hash", func(t *testing.T) {
|
|
r := Range{From: 0, To: math.MaxUint64, Limit: 9}
|
|
res := d.getRange(r)
|
|
t.Log(len(res.Elements))
|
|
assert.NotNil(t, res.Hash)
|
|
assert.Nil(t, res.Elements)
|
|
})
|
|
}
|
|
|
|
func TestDiff_Diff(t *testing.T) {
|
|
ctx := context.Background()
|
|
t.Run("basic", func(t *testing.T) {
|
|
d1 := New(16, 16)
|
|
d2 := New(16, 16)
|
|
for i := 0; i < 1000; i++ {
|
|
id := fmt.Sprint(i)
|
|
head := bson.NewObjectId().Hex()
|
|
d1.Set(Element{
|
|
Id: id,
|
|
Head: head,
|
|
})
|
|
d2.Set(Element{
|
|
Id: id,
|
|
Head: head,
|
|
})
|
|
}
|
|
|
|
newIds, changedIds, removedIds, err := d1.Diff(ctx, d2)
|
|
require.NoError(t, err)
|
|
assert.Len(t, newIds, 0)
|
|
assert.Len(t, changedIds, 0)
|
|
assert.Len(t, removedIds, 0)
|
|
|
|
d2.Set(Element{
|
|
Id: "newD1",
|
|
Head: "newD1",
|
|
})
|
|
d2.Set(Element{
|
|
Id: "1",
|
|
Head: "changed",
|
|
})
|
|
require.NoError(t, d2.RemoveId("0"))
|
|
|
|
newIds, changedIds, removedIds, err = d1.Diff(ctx, d2)
|
|
require.NoError(t, err)
|
|
assert.Len(t, newIds, 1)
|
|
assert.Len(t, changedIds, 1)
|
|
assert.Len(t, removedIds, 1)
|
|
})
|
|
t.Run("empty", func(t *testing.T) {
|
|
d1 := New(16, 16)
|
|
d2 := New(16, 16)
|
|
newIds, changedIds, removedIds, err := d1.Diff(ctx, d2)
|
|
require.NoError(t, err)
|
|
assert.Len(t, newIds, 0)
|
|
assert.Len(t, changedIds, 0)
|
|
assert.Len(t, removedIds, 0)
|
|
})
|
|
t.Run("one empty", func(t *testing.T) {
|
|
d1 := New(4, 4)
|
|
d2 := New(4, 4)
|
|
for i := 0; i < 10; i++ {
|
|
d2.Set(Element{
|
|
Id: fmt.Sprint(i),
|
|
Head: bson.NewObjectId().Hex(),
|
|
})
|
|
}
|
|
|
|
newIds, changedIds, removedIds, err := d1.Diff(ctx, d2)
|
|
require.NoError(t, err)
|
|
assert.Len(t, newIds, 10)
|
|
assert.Len(t, changedIds, 0)
|
|
assert.Len(t, removedIds, 0)
|
|
})
|
|
t.Run("context cancel", func(t *testing.T) {
|
|
d1 := New(4, 4)
|
|
d2 := New(4, 4)
|
|
for i := 0; i < 10; i++ {
|
|
d2.Set(Element{
|
|
Id: fmt.Sprint(i),
|
|
Head: bson.NewObjectId().Hex(),
|
|
})
|
|
}
|
|
var cancel func()
|
|
ctx, cancel = context.WithCancel(ctx)
|
|
cancel()
|
|
_, _, _, err := d1.Diff(ctx, d2)
|
|
assert.ErrorIs(t, err, context.Canceled)
|
|
})
|
|
}
|
|
|
|
func BenchmarkDiff_Ranges(b *testing.B) {
|
|
d := New(16, 16)
|
|
for i := 0; i < 10000; i++ {
|
|
id := fmt.Sprint(i)
|
|
head := bson.NewObjectId().Hex()
|
|
d.Set(Element{
|
|
Id: id,
|
|
Head: head,
|
|
})
|
|
}
|
|
ctx := context.Background()
|
|
b.ResetTimer()
|
|
b.ReportAllocs()
|
|
var resBuf []RangeResult
|
|
var ranges = []Range{{From: 0, To: math.MaxUint64, Limit: 10}}
|
|
for i := 0; i < b.N; i++ {
|
|
d.Ranges(ctx, ranges, resBuf)
|
|
resBuf = resBuf[:0]
|
|
}
|
|
}
|