1
0
Fork 0
mirror of https://github.com/anyproto/anytype-heart.git synced 2025-06-10 18:10:49 +09:00

GO-3170: add sync status update after push

Signed-off-by: AnastasiaShemyakinskaya <shem98a@mail.ru>
This commit is contained in:
AnastasiaShemyakinskaya 2024-06-07 19:34:58 +02:00
parent 47e795aaab
commit 83e2fef669
No known key found for this signature in database
GPG key ID: CCD60ED83B103281
4 changed files with 267 additions and 11 deletions

View file

@ -183,6 +183,7 @@ packages:
SyncDetailsUpdater:
github.com/anyproto/anytype-heart/core/syncstatus/objectsyncstatus:
interfaces:
SpaceStatusUpdater:
UpdateReceiver:
config:
dir: "{{.InterfaceDir}}"

View file

@ -0,0 +1,256 @@
// Code generated by mockery. DO NOT EDIT.
package mock_objectsyncstatus
import (
context "context"
app "github.com/anyproto/any-sync/app"
domain "github.com/anyproto/anytype-heart/core/domain"
mock "github.com/stretchr/testify/mock"
)
// MockSpaceStatusUpdater is an autogenerated mock type for the SpaceStatusUpdater type
type MockSpaceStatusUpdater struct {
mock.Mock
}
type MockSpaceStatusUpdater_Expecter struct {
mock *mock.Mock
}
func (_m *MockSpaceStatusUpdater) EXPECT() *MockSpaceStatusUpdater_Expecter {
return &MockSpaceStatusUpdater_Expecter{mock: &_m.Mock}
}
// Close provides a mock function with given fields: ctx
func (_m *MockSpaceStatusUpdater) Close(ctx context.Context) error {
ret := _m.Called(ctx)
if len(ret) == 0 {
panic("no return value specified for Close")
}
var r0 error
if rf, ok := ret.Get(0).(func(context.Context) error); ok {
r0 = rf(ctx)
} else {
r0 = ret.Error(0)
}
return r0
}
// MockSpaceStatusUpdater_Close_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Close'
type MockSpaceStatusUpdater_Close_Call struct {
*mock.Call
}
// Close is a helper method to define mock.On call
// - ctx context.Context
func (_e *MockSpaceStatusUpdater_Expecter) Close(ctx interface{}) *MockSpaceStatusUpdater_Close_Call {
return &MockSpaceStatusUpdater_Close_Call{Call: _e.mock.On("Close", ctx)}
}
func (_c *MockSpaceStatusUpdater_Close_Call) Run(run func(ctx context.Context)) *MockSpaceStatusUpdater_Close_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(context.Context))
})
return _c
}
func (_c *MockSpaceStatusUpdater_Close_Call) Return(err error) *MockSpaceStatusUpdater_Close_Call {
_c.Call.Return(err)
return _c
}
func (_c *MockSpaceStatusUpdater_Close_Call) RunAndReturn(run func(context.Context) error) *MockSpaceStatusUpdater_Close_Call {
_c.Call.Return(run)
return _c
}
// Init provides a mock function with given fields: a
func (_m *MockSpaceStatusUpdater) Init(a *app.App) error {
ret := _m.Called(a)
if len(ret) == 0 {
panic("no return value specified for Init")
}
var r0 error
if rf, ok := ret.Get(0).(func(*app.App) error); ok {
r0 = rf(a)
} else {
r0 = ret.Error(0)
}
return r0
}
// MockSpaceStatusUpdater_Init_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Init'
type MockSpaceStatusUpdater_Init_Call struct {
*mock.Call
}
// Init is a helper method to define mock.On call
// - a *app.App
func (_e *MockSpaceStatusUpdater_Expecter) Init(a interface{}) *MockSpaceStatusUpdater_Init_Call {
return &MockSpaceStatusUpdater_Init_Call{Call: _e.mock.On("Init", a)}
}
func (_c *MockSpaceStatusUpdater_Init_Call) Run(run func(a *app.App)) *MockSpaceStatusUpdater_Init_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(*app.App))
})
return _c
}
func (_c *MockSpaceStatusUpdater_Init_Call) Return(err error) *MockSpaceStatusUpdater_Init_Call {
_c.Call.Return(err)
return _c
}
func (_c *MockSpaceStatusUpdater_Init_Call) RunAndReturn(run func(*app.App) error) *MockSpaceStatusUpdater_Init_Call {
_c.Call.Return(run)
return _c
}
// Name provides a mock function with given fields:
func (_m *MockSpaceStatusUpdater) Name() string {
ret := _m.Called()
if len(ret) == 0 {
panic("no return value specified for Name")
}
var r0 string
if rf, ok := ret.Get(0).(func() string); ok {
r0 = rf()
} else {
r0 = ret.Get(0).(string)
}
return r0
}
// MockSpaceStatusUpdater_Name_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Name'
type MockSpaceStatusUpdater_Name_Call struct {
*mock.Call
}
// Name is a helper method to define mock.On call
func (_e *MockSpaceStatusUpdater_Expecter) Name() *MockSpaceStatusUpdater_Name_Call {
return &MockSpaceStatusUpdater_Name_Call{Call: _e.mock.On("Name")}
}
func (_c *MockSpaceStatusUpdater_Name_Call) Run(run func()) *MockSpaceStatusUpdater_Name_Call {
_c.Call.Run(func(args mock.Arguments) {
run()
})
return _c
}
func (_c *MockSpaceStatusUpdater_Name_Call) Return(name string) *MockSpaceStatusUpdater_Name_Call {
_c.Call.Return(name)
return _c
}
func (_c *MockSpaceStatusUpdater_Name_Call) RunAndReturn(run func() string) *MockSpaceStatusUpdater_Name_Call {
_c.Call.Return(run)
return _c
}
// Run provides a mock function with given fields: ctx
func (_m *MockSpaceStatusUpdater) Run(ctx context.Context) error {
ret := _m.Called(ctx)
if len(ret) == 0 {
panic("no return value specified for Run")
}
var r0 error
if rf, ok := ret.Get(0).(func(context.Context) error); ok {
r0 = rf(ctx)
} else {
r0 = ret.Error(0)
}
return r0
}
// MockSpaceStatusUpdater_Run_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Run'
type MockSpaceStatusUpdater_Run_Call struct {
*mock.Call
}
// Run is a helper method to define mock.On call
// - ctx context.Context
func (_e *MockSpaceStatusUpdater_Expecter) Run(ctx interface{}) *MockSpaceStatusUpdater_Run_Call {
return &MockSpaceStatusUpdater_Run_Call{Call: _e.mock.On("Run", ctx)}
}
func (_c *MockSpaceStatusUpdater_Run_Call) Run(run func(ctx context.Context)) *MockSpaceStatusUpdater_Run_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(context.Context))
})
return _c
}
func (_c *MockSpaceStatusUpdater_Run_Call) Return(err error) *MockSpaceStatusUpdater_Run_Call {
_c.Call.Return(err)
return _c
}
func (_c *MockSpaceStatusUpdater_Run_Call) RunAndReturn(run func(context.Context) error) *MockSpaceStatusUpdater_Run_Call {
_c.Call.Return(run)
return _c
}
// SendUpdate provides a mock function with given fields: spaceSync
func (_m *MockSpaceStatusUpdater) SendUpdate(spaceSync *domain.SpaceSync) {
_m.Called(spaceSync)
}
// MockSpaceStatusUpdater_SendUpdate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SendUpdate'
type MockSpaceStatusUpdater_SendUpdate_Call struct {
*mock.Call
}
// SendUpdate is a helper method to define mock.On call
// - spaceSync *domain.SpaceSync
func (_e *MockSpaceStatusUpdater_Expecter) SendUpdate(spaceSync interface{}) *MockSpaceStatusUpdater_SendUpdate_Call {
return &MockSpaceStatusUpdater_SendUpdate_Call{Call: _e.mock.On("SendUpdate", spaceSync)}
}
func (_c *MockSpaceStatusUpdater_SendUpdate_Call) Run(run func(spaceSync *domain.SpaceSync)) *MockSpaceStatusUpdater_SendUpdate_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(*domain.SpaceSync))
})
return _c
}
func (_c *MockSpaceStatusUpdater_SendUpdate_Call) Return() *MockSpaceStatusUpdater_SendUpdate_Call {
_c.Call.Return()
return _c
}
func (_c *MockSpaceStatusUpdater_SendUpdate_Call) RunAndReturn(run func(*domain.SpaceSync)) *MockSpaceStatusUpdater_SendUpdate_Call {
_c.Call.Return(run)
return _c
}
// NewMockSpaceStatusUpdater creates a new instance of MockSpaceStatusUpdater. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockSpaceStatusUpdater(t interface {
mock.TestingT
Cleanup(func())
}) *MockSpaceStatusUpdater {
mock := &MockSpaceStatusUpdater{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}

View file

@ -101,6 +101,7 @@ func TestSyncStatusService_HeadsReceive(t *testing.T) {
s.detailsUpdater.EXPECT().UpdateDetails("id", domain.Syncing, domain.Null, "spaceId")
// when
s.spaceStatusUpdater.EXPECT().SendUpdate(domain.MakeSyncStatus(s.spaceId, domain.Syncing, 1, domain.Null, domain.Objects)).Return()
s.HeadsChange("id", []string{"head1"})
s.HeadsReceive("peerId", "id", []string{"head2"})
@ -116,6 +117,7 @@ func TestSyncStatusService_HeadsReceive(t *testing.T) {
s.detailsUpdater.EXPECT().UpdateDetails("id", domain.Synced, domain.Null, "spaceId")
// when
s.spaceStatusUpdater.EXPECT().SendUpdate(domain.MakeSyncStatus(s.spaceId, domain.Syncing, 1, domain.Null, domain.Objects)).Return()
s.HeadsChange("id", []string{"head1"})
s.HeadsReceive("peerId", "id", []string{"head1"})

View file

@ -27,6 +27,13 @@ const (
syncTimeout = time.Second
)
var log = logger.NewNamed(syncstatus.CName)
type SpaceStatusUpdater interface {
app.ComponentRunnable
SendUpdate(spaceSync *domain.SpaceSync)
}
type UpdateReceiver interface {
UpdateTree(ctx context.Context, treeId string, status SyncStatus) (err error)
UpdateNodeStatus(status ConnectionStatus)
@ -109,6 +116,7 @@ func (s *syncStatusService) Init(a *app.App) (err error) {
s.spaceId = sharedState.SpaceId
s.configuration = app.MustComponent[nodeconf.NodeConf](a)
s.storage = app.MustComponent[spacestorage.SpaceStorage](a)
s.spaceSyncStatus = app.MustComponent[SpaceStatusUpdater](a)
s.periodicSync = periodicsync.NewPeriodicSync(
s.updateIntervalSecs,
s.updateTimeout,
@ -152,17 +160,6 @@ func (s *syncStatusService) HeadsChange(treeId string, heads []string) {
s.updateDetails(treeId, domain.Syncing)
}
func (s *syncStatusService) SetNodesStatus(senderId string, status ConnectionStatus) {
if !s.isSenderResponsible(senderId) {
return
}
s.Lock()
defer s.Unlock()
s.nodeStatus = status
}
func (s *syncStatusService) update(ctx context.Context) (err error) {
s.treeStatusBuf = s.treeStatusBuf[:0]