blob: d8e4d6d458249b80dda02d559584822872e49bad [file] [log] [blame]
package replicator
import (
"context"
"testing"
v1sync "github.com/apache/servicecomb-service-center/syncer/api/v1"
"github.com/apache/servicecomb-service-center/syncer/service/replicator/resource"
"github.com/stretchr/testify/assert"
)
func Test_replicatorManager_Persist(t *testing.T) {
ctx := context.TODO()
el := &v1sync.EventList{
Events: nil,
}
r := manager.Persist(ctx, el)
assert.Equal(t, 0, len(r))
resource.RegisterResources("fork", func(event *v1sync.Event) resource.Resource {
return &mockResources{
loadCurrentResourceResult: nil,
needOperateResult: nil,
operateResult: resource.SuccessResult(),
}
})
el = &v1sync.EventList{
Events: []*v1sync.Event{
{
Id: "xxx1",
Action: "",
Subject: "fork",
Opts: nil,
Value: nil,
Timestamp: v1sync.Timestamp(),
},
},
}
r = manager.Persist(ctx, el)
if assert.Equal(t, 1, len(r)) {
assert.Equal(t, resource.SuccessResult().WithEventID("xxx1"), r[0])
}
el = &v1sync.EventList{
Events: []*v1sync.Event{
{
Id: "xxx1",
Action: "",
Subject: "not exist",
Opts: nil,
Value: nil,
Timestamp: v1sync.Timestamp(),
},
},
}
r = manager.Persist(ctx, el)
if assert.Equal(t, 1, len(r)) {
assert.Equal(t, resource.Skip, r[0].Status)
}
}
type mockResources struct {
loadCurrentResourceResult *resource.Result
needOperateResult *resource.Result
operateResult *resource.Result
}
func (f *mockResources) LoadCurrentResource(_ context.Context) *resource.Result {
return f.loadCurrentResourceResult
}
func (f *mockResources) NeedOperate(_ context.Context) *resource.Result {
return f.needOperateResult
}
func (f *mockResources) Operate(_ context.Context) *resource.Result {
return f.operateResult
}
func (f mockResources) FailHandle(_ context.Context, _ int32) (*v1sync.Event, error) {
return nil, nil
}
func (f mockResources) CanDrop() bool {
return true
}
func Test_pageEvents(t *testing.T) {
t.Run("no page case", func(t *testing.T) {
source := &v1sync.EventList{
Events: []*v1sync.Event{
{
Value: []byte("hello"),
},
},
}
result := pageEvents(source, maxSize)
if assert.Equal(t, 1, len(result)) {
assert.Equal(t, []byte("hello"), result[0].Events[0].Value)
}
})
t.Run("page case", func(t *testing.T) {
source := &v1sync.EventList{
Events: []*v1sync.Event{
{
Value: []byte("11"),
},
{
Value: []byte("2"),
},
},
}
result := pageEvents(source, 3)
if assert.Equal(t, 2, len(result)) {
assert.Equal(t, []byte("11"), result[0].Events[0].Value)
assert.Equal(t, []byte("2"), result[1].Events[0].Value)
}
})
}