diff --git a/commonspace/headsync/diffsyncer_test.go b/commonspace/headsync/diffsyncer_test.go index 3f78d878..f5d776c4 100644 --- a/commonspace/headsync/diffsyncer_test.go +++ b/commonspace/headsync/diffsyncer_test.go @@ -106,7 +106,7 @@ func TestDiffSyncer_Sync(t *testing.T) { factory := spacesyncproto.ClientFactoryFunc(func(cc drpc.Conn) spacesyncproto.DRPCSpaceSyncClient { return clientMock }) - delState := mock_settingsstate.NewMockDeletionState(ctrl) + delState := mock_settingsstate.NewMockObjectDeletionState(ctrl) spaceId := "spaceId" aclRootId := "aclRootId" l := logger.NewNamed(spaceId) diff --git a/commonspace/headsync/headsync_test.go b/commonspace/headsync/headsync_test.go index 7070bf5f..a6e505b9 100644 --- a/commonspace/headsync/headsync_test.go +++ b/commonspace/headsync/headsync_test.go @@ -24,7 +24,7 @@ func TestDiffService(t *testing.T) { treeStorageMock := mock_treestorage.NewMockTreeStorage(ctrl) diffMock := mock_ldiff.NewMockDiff(ctrl) syncer := mock_headsync.NewMockDiffSyncer(ctrl) - delState := mock_settingsstate.NewMockDeletionState(ctrl) + delState := mock_settingsstate.NewMockObjectDeletionState(ctrl) syncPeriod := 1 initId := "initId" diff --git a/commonspace/settings/deletionmanager.go b/commonspace/settings/deletionmanager.go index 07e4ddd2..8bfc15e3 100644 --- a/commonspace/settings/deletionmanager.go +++ b/commonspace/settings/deletionmanager.go @@ -6,7 +6,6 @@ import ( "github.com/anytypeio/any-sync/commonspace/settings/settingsstate" "github.com/anytypeio/any-sync/util/slice" "go.uber.org/zap" - "time" ) type SpaceIdsProvider interface { @@ -21,39 +20,36 @@ func newDeletionManager( spaceId string, settingsId string, isResponsible bool, - deletionInterval time.Duration, treeGetter treegetter.TreeGetter, deletionState settingsstate.ObjectDeletionState, provider SpaceIdsProvider, onSpaceDelete func()) DeletionManager { return &deletionManager{ - treeGetter: treeGetter, - isResponsible: isResponsible, - spaceId: spaceId, - settingsId: settingsId, - deletionState: deletionState, - provider: provider, - deletionInterval: deletionInterval, - onSpaceDelete: onSpaceDelete, + treeGetter: treeGetter, + isResponsible: isResponsible, + spaceId: spaceId, + settingsId: settingsId, + deletionState: deletionState, + provider: provider, + onSpaceDelete: onSpaceDelete, } } type deletionManager struct { - deletionState settingsstate.ObjectDeletionState - provider SpaceIdsProvider - treeGetter treegetter.TreeGetter - deletionInterval time.Duration - spaceId string - settingsId string - isResponsible bool - onSpaceDelete func() + deletionState settingsstate.ObjectDeletionState + provider SpaceIdsProvider + treeGetter treegetter.TreeGetter + spaceId string + settingsId string + isResponsible bool + onSpaceDelete func() } func (d *deletionManager) UpdateState(ctx context.Context, state *settingsstate.State) error { log := log.With(zap.String("spaceId", d.spaceId)) err := d.deletionState.Add(state.DeletedIds) if err != nil { - log.Warn("failed to add deleted ids to deletion state") + log.Debug("failed to add deleted ids to deletion state") } if state.DeleterId == "" { return nil @@ -69,7 +65,7 @@ func (d *deletionManager) UpdateState(ctx context.Context, state *settingsstate. }) err := d.deletionState.Add(allIds) if err != nil { - return err + log.Debug("failed to add all ids to deletion state") } } d.onSpaceDelete() diff --git a/commonspace/settings/deletionmanager_test.go b/commonspace/settings/deletionmanager_test.go new file mode 100644 index 00000000..a4992903 --- /dev/null +++ b/commonspace/settings/deletionmanager_test.go @@ -0,0 +1,81 @@ +package settings + +import ( + "context" + "github.com/anytypeio/any-sync/commonspace/object/treegetter/mock_treegetter" + "github.com/anytypeio/any-sync/commonspace/settings/mock_settings" + "github.com/anytypeio/any-sync/commonspace/settings/settingsstate" + "github.com/anytypeio/any-sync/commonspace/settings/settingsstate/mock_settingsstate" + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/require" + "testing" +) + +func TestDeletionManager_UpdateState_NotResponsible(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + ctx := context.Background() + + spaceId := "spaceId" + settingsId := "settingsId" + state := &settingsstate.State{ + DeletedIds: []string{"id"}, + DeleterId: "deleterId", + } + deleted := false + onDeleted := func() { + deleted = true + } + delState := mock_settingsstate.NewMockObjectDeletionState(ctrl) + treeGetter := mock_treegetter.NewMockTreeGetter(ctrl) + + delState.EXPECT().Add(state.DeletedIds).Return(nil) + treeGetter.EXPECT().DeleteSpace(ctx, spaceId).Return(nil) + + delManager := newDeletionManager(spaceId, + settingsId, + false, + treeGetter, + delState, + nil, + onDeleted) + err := delManager.UpdateState(ctx, state) + require.NoError(t, err) + require.True(t, deleted) +} + +func TestDeletionManager_UpdateState_Responsible(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + ctx := context.Background() + + spaceId := "spaceId" + settingsId := "settingsId" + state := &settingsstate.State{ + DeletedIds: []string{"id"}, + DeleterId: "deleterId", + } + deleted := false + onDeleted := func() { + deleted = true + } + delState := mock_settingsstate.NewMockObjectDeletionState(ctrl) + treeGetter := mock_treegetter.NewMockTreeGetter(ctrl) + provider := mock_settings.NewMockSpaceIdsProvider(ctrl) + + delState.EXPECT().Add(state.DeletedIds).Return(nil) + treeGetter.EXPECT().DeleteSpace(ctx, spaceId).Return(nil) + provider.EXPECT().AllIds().Return([]string{"id", "otherId", settingsId}) + delState.EXPECT().Add([]string{"id", "otherId"}).Return(nil) + delManager := newDeletionManager(spaceId, + settingsId, + true, + treeGetter, + delState, + provider, + onDeleted) + + err := delManager.UpdateState(ctx, state) + require.NoError(t, err) + require.True(t, deleted) +} diff --git a/commonspace/settings/mock_settings/mock_settings.go b/commonspace/settings/mock_settings/mock_settings.go index 086547b2..18338c0d 100644 --- a/commonspace/settings/mock_settings/mock_settings.go +++ b/commonspace/settings/mock_settings/mock_settings.go @@ -1,5 +1,5 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: github.com/anytypeio/any-sync/commonspace/settings (interfaces: DeletionManager,Deleter) +// Source: github.com/anytypeio/any-sync/commonspace/settings (interfaces: DeletionManager,Deleter,SpaceIdsProvider) // Package mock_settings is a generated GoMock package. package mock_settings @@ -83,3 +83,40 @@ func (mr *MockDeleterMockRecorder) Delete() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockDeleter)(nil).Delete)) } + +// MockSpaceIdsProvider is a mock of SpaceIdsProvider interface. +type MockSpaceIdsProvider struct { + ctrl *gomock.Controller + recorder *MockSpaceIdsProviderMockRecorder +} + +// MockSpaceIdsProviderMockRecorder is the mock recorder for MockSpaceIdsProvider. +type MockSpaceIdsProviderMockRecorder struct { + mock *MockSpaceIdsProvider +} + +// NewMockSpaceIdsProvider creates a new mock instance. +func NewMockSpaceIdsProvider(ctrl *gomock.Controller) *MockSpaceIdsProvider { + mock := &MockSpaceIdsProvider{ctrl: ctrl} + mock.recorder = &MockSpaceIdsProviderMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockSpaceIdsProvider) EXPECT() *MockSpaceIdsProviderMockRecorder { + return m.recorder +} + +// AllIds mocks base method. +func (m *MockSpaceIdsProvider) AllIds() []string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AllIds") + ret0, _ := ret[0].([]string) + return ret0 +} + +// AllIds indicates an expected call of AllIds. +func (mr *MockSpaceIdsProviderMockRecorder) AllIds() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AllIds", reflect.TypeOf((*MockSpaceIdsProvider)(nil).AllIds)) +} diff --git a/commonspace/settings/settings.go b/commonspace/settings/settings.go index f195cc15..1cc6c7fc 100644 --- a/commonspace/settings/settings.go +++ b/commonspace/settings/settings.go @@ -1,4 +1,4 @@ -//go:generate mockgen -destination mock_settings/mock_settings.go github.com/anytypeio/any-sync/commonspace/settings DeletionManager,Deleter +//go:generate mockgen -destination mock_settings/mock_settings.go github.com/anytypeio/any-sync/commonspace/settings DeletionManager,Deleter,SpaceIdsProvider package settings import ( @@ -18,13 +18,10 @@ import ( "github.com/gogo/protobuf/proto" "go.uber.org/zap" "golang.org/x/exp/slices" - "time" ) var log = logger.NewNamed("common.commonspace.settings") -const spaceDeletionInterval = time.Hour * 24 * 7 - type SettingsObject interface { synctree.SyncTree Init(ctx context.Context) (err error) @@ -92,7 +89,6 @@ func NewSettingsObject(deps Deps, spaceId string) (obj SettingsObject) { spaceId, deps.Store.SpaceSettingsId(), deps.Configuration.IsResponsible(spaceId), - spaceDeletionInterval, deps.TreeGetter, deps.DeletionState, deps.Provider,