1
0
Fork 0
mirror of https://github.com/anyproto/any-sync.git synced 2025-06-08 14:07:02 +09:00

Acl tests

This commit is contained in:
mcrakhman 2024-08-05 18:35:59 +02:00
parent d63187cc8a
commit f4beb91316
No known key found for this signature in database
GPG key ID: DED12CFEF5B8396B
5 changed files with 126 additions and 59 deletions

View file

@ -5,7 +5,6 @@ import (
"context" "context"
"fmt" "fmt"
"testing" "testing"
"time"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"go.uber.org/mock/gomock" "go.uber.org/mock/gomock"
@ -18,6 +17,7 @@ import (
"github.com/anyproto/any-sync/commonspace/spacesyncproto" "github.com/anyproto/any-sync/commonspace/spacesyncproto"
"github.com/anyproto/any-sync/consensus/consensusproto" "github.com/anyproto/any-sync/consensus/consensusproto"
"github.com/anyproto/any-sync/net/peer" "github.com/anyproto/any-sync/net/peer"
"github.com/anyproto/any-sync/net/rpc/rpctest"
) )
type pushSpaceRequestMatcher struct { type pushSpaceRequestMatcher struct {
@ -56,49 +56,6 @@ func (p pushSpaceRequestMatcher) String() string {
return "" return ""
} }
type mockPeer struct {
}
func (m mockPeer) CloseChan() <-chan struct{} {
return nil
}
func (m mockPeer) SetTTL(ttl time.Duration) {
return
}
func (m mockPeer) Id() string {
return "peerId"
}
func (m mockPeer) Context() context.Context {
return context.Background()
}
func (m mockPeer) AcquireDrpcConn(ctx context.Context) (drpc.Conn, error) {
return nil, nil
}
func (m mockPeer) ReleaseDrpcConn(conn drpc.Conn) {
return
}
func (m mockPeer) DoDrpc(ctx context.Context, do func(conn drpc.Conn) error) error {
return nil
}
func (m mockPeer) IsClosed() bool {
return false
}
func (m mockPeer) TryClose(objectTTL time.Duration) (res bool, err error) {
return false, err
}
func (m mockPeer) Close() (err error) {
return nil
}
func (fx *headSyncFixture) initDiffSyncer(t *testing.T) { func (fx *headSyncFixture) initDiffSyncer(t *testing.T) {
fx.init(t) fx.init(t)
fx.diffSyncer = newDiffSyncer(fx.headSync).(*diffSyncer) fx.diffSyncer = newDiffSyncer(fx.headSync).(*diffSyncer)
@ -116,7 +73,7 @@ func TestDiffSyncer(t *testing.T) {
fx := newHeadSyncFixture(t) fx := newHeadSyncFixture(t)
fx.initDiffSyncer(t) fx.initDiffSyncer(t)
defer fx.stop() defer fx.stop()
mPeer := mockPeer{} mPeer := rpctest.MockPeer{}
remDiff := NewRemoteDiff(fx.spaceState.SpaceId, fx.clientMock) remDiff := NewRemoteDiff(fx.spaceState.SpaceId, fx.clientMock)
fx.aclMock.EXPECT().Id().AnyTimes().Return("aclId") fx.aclMock.EXPECT().Id().AnyTimes().Return("aclId")
fx.treeSyncerMock.EXPECT().ShouldSync(gomock.Any()).Return(true) fx.treeSyncerMock.EXPECT().ShouldSync(gomock.Any()).Return(true)
@ -139,7 +96,7 @@ func TestDiffSyncer(t *testing.T) {
fx := newHeadSyncFixture(t) fx := newHeadSyncFixture(t)
fx.initDiffSyncer(t) fx.initDiffSyncer(t)
defer fx.stop() defer fx.stop()
mPeer := mockPeer{} mPeer := rpctest.MockPeer{}
remDiff := NewRemoteDiff(fx.spaceState.SpaceId, fx.clientMock) remDiff := NewRemoteDiff(fx.spaceState.SpaceId, fx.clientMock)
fx.treeSyncerMock.EXPECT().ShouldSync(gomock.Any()).Return(true) fx.treeSyncerMock.EXPECT().ShouldSync(gomock.Any()).Return(true)
fx.aclMock.EXPECT().Id().AnyTimes().Return("aclId") fx.aclMock.EXPECT().Id().AnyTimes().Return("aclId")
@ -225,7 +182,7 @@ func TestDiffSyncer(t *testing.T) {
fx.peerManagerMock.EXPECT(). fx.peerManagerMock.EXPECT().
GetResponsiblePeers(gomock.Any()). GetResponsiblePeers(gomock.Any()).
Return([]peer.Peer{mockPeer{}}, nil) Return([]peer.Peer{rpctest.MockPeer{}}, nil)
fx.diffContainerMock.EXPECT(). fx.diffContainerMock.EXPECT().
DiffTypeCheck(gomock.Any(), gomock.Eq(remDiff)).Return(true, fx.diffMock, nil) DiffTypeCheck(gomock.Any(), gomock.Eq(remDiff)).Return(true, fx.diffMock, nil)
fx.diffMock.EXPECT(). fx.diffMock.EXPECT().
@ -261,7 +218,7 @@ func TestDiffSyncer(t *testing.T) {
fx.treeSyncerMock.EXPECT().ShouldSync(gomock.Any()).Return(true) fx.treeSyncerMock.EXPECT().ShouldSync(gomock.Any()).Return(true)
fx.peerManagerMock.EXPECT(). fx.peerManagerMock.EXPECT().
GetResponsiblePeers(gomock.Any()). GetResponsiblePeers(gomock.Any()).
Return([]peer.Peer{mockPeer{}}, nil) Return([]peer.Peer{rpctest.MockPeer{}}, nil)
fx.diffContainerMock.EXPECT(). fx.diffContainerMock.EXPECT().
DiffTypeCheck(gomock.Any(), gomock.Eq(remDiff)).Return(true, fx.diffMock, nil) DiffTypeCheck(gomock.Any(), gomock.Eq(remDiff)).Return(true, fx.diffMock, nil)
fx.diffMock.EXPECT(). fx.diffMock.EXPECT().
@ -275,7 +232,7 @@ func TestDiffSyncer(t *testing.T) {
fx := newHeadSyncFixture(t) fx := newHeadSyncFixture(t)
fx.initDiffSyncer(t) fx.initDiffSyncer(t)
defer fx.stop() defer fx.stop()
mPeer := mockPeer{} mPeer := rpctest.MockPeer{}
remDiff := NewRemoteDiff(fx.spaceState.SpaceId, fx.clientMock) remDiff := NewRemoteDiff(fx.spaceState.SpaceId, fx.clientMock)
fx.treeSyncerMock.EXPECT().ShouldSync(gomock.Any()).Return(true) fx.treeSyncerMock.EXPECT().ShouldSync(gomock.Any()).Return(true)
fx.aclMock.EXPECT().Id().AnyTimes().Return("aclId") fx.aclMock.EXPECT().Id().AnyTimes().Return("aclId")

View file

@ -28,6 +28,7 @@ func (r *requestFactory) CreateHeadUpdate(l list.AclList, added []*consensusprot
} }
func (r *requestFactory) CreateEmptyFullSyncRequest(l list.AclList) (req *consensusproto.LogSyncMessage) { func (r *requestFactory) CreateEmptyFullSyncRequest(l list.AclList) (req *consensusproto.LogSyncMessage) {
// this is only sent to newer versions of the protocol
return consensusproto.WrapFullRequest(&consensusproto.LogFullSyncRequest{ return consensusproto.WrapFullRequest(&consensusproto.LogFullSyncRequest{
Head: l.Head().Id, Head: l.Head().Id,
}, l.Root()) }, l.Root())

View file

@ -0,0 +1,56 @@
package syncacl
import (
"context"
"testing"
"github.com/stretchr/testify/require"
"go.uber.org/mock/gomock"
"github.com/anyproto/any-sync/commonspace/object/acl/list/mock_list"
"github.com/anyproto/any-sync/commonspace/object/acl/syncacl/mock_syncacl"
"github.com/anyproto/any-sync/consensus/consensusproto"
"github.com/anyproto/any-sync/net/peer"
"github.com/anyproto/any-sync/net/rpc/rpctest"
"github.com/anyproto/any-sync/net/secureservice"
)
var ctx = context.Background()
func TestSyncAcl_SyncWithPeer(t *testing.T) {
// this component will be rewritten, so no need for fixture now
t.Run("sync with old peer", func(t *testing.T) {
ctrl := gomock.NewController(t)
acl := mock_list.NewMockAclList(ctrl)
s := &syncAcl{AclList: acl}
defer ctrl.Finish()
mockClient := mock_syncacl.NewMockSyncClient(ctrl)
s.syncClient = mockClient
ctx := peer.CtxWithProtoVersion(ctx, secureservice.ProtoVersion)
pr := rpctest.MockPeer{Ctx: ctx}
retMsg := &consensusproto.LogSyncMessage{}
mockClient.EXPECT().CreateHeadUpdate(s, nil).Return(retMsg)
acl.EXPECT().Lock()
acl.EXPECT().Unlock()
mockClient.EXPECT().SendUpdate("peerId", retMsg).Return(nil)
err := s.SyncWithPeer(ctx, &pr)
require.NoError(t, err)
})
t.Run("sync with new peer", func(t *testing.T) {
ctrl := gomock.NewController(t)
acl := mock_list.NewMockAclList(ctrl)
s := &syncAcl{AclList: acl}
defer ctrl.Finish()
mockClient := mock_syncacl.NewMockSyncClient(ctrl)
s.syncClient = mockClient
ctx := peer.CtxWithProtoVersion(ctx, secureservice.NewSyncProtoVersion)
pr := rpctest.MockPeer{Ctx: ctx}
req := &consensusproto.LogSyncMessage{}
mockClient.EXPECT().CreateEmptyFullSyncRequest(s).Return(req)
acl.EXPECT().Lock()
acl.EXPECT().Unlock()
mockClient.EXPECT().QueueRequest("peerId", req).Return(nil)
err := s.SyncWithPeer(ctx, &pr)
require.NoError(t, err)
})
}

View file

@ -3,16 +3,18 @@ package syncacl
import ( import (
"context" "context"
"fmt" "fmt"
"sync"
"testing"
"github.com/gogo/protobuf/proto"
"github.com/stretchr/testify/require"
"go.uber.org/mock/gomock"
"github.com/anyproto/any-sync/commonspace/object/acl/list/mock_list" "github.com/anyproto/any-sync/commonspace/object/acl/list/mock_list"
"github.com/anyproto/any-sync/commonspace/object/acl/syncacl/mock_syncacl" "github.com/anyproto/any-sync/commonspace/object/acl/syncacl/mock_syncacl"
"github.com/anyproto/any-sync/commonspace/spacesyncproto" "github.com/anyproto/any-sync/commonspace/spacesyncproto"
"github.com/anyproto/any-sync/commonspace/syncstatus" "github.com/anyproto/any-sync/commonspace/syncstatus"
"github.com/anyproto/any-sync/consensus/consensusproto" "github.com/anyproto/any-sync/consensus/consensusproto"
"github.com/gogo/protobuf/proto"
"github.com/stretchr/testify/require"
"go.uber.org/mock/gomock"
"sync"
"testing"
) )
type testAclMock struct { type testAclMock struct {
@ -110,7 +112,7 @@ func TestSyncAclHandler_HandleMessage(t *testing.T) {
fx.syncProtocolMock.EXPECT().HeadUpdate(ctx, fx.senderId, gomock.Any()).Return(syncReq, nil) fx.syncProtocolMock.EXPECT().HeadUpdate(ctx, fx.senderId, gomock.Any()).Return(syncReq, nil)
fx.syncClientMock.EXPECT().QueueRequest(fx.senderId, syncReq).Return(nil) fx.syncClientMock.EXPECT().QueueRequest(fx.senderId, syncReq).Return(nil)
err := fx.syncHandler.HandleMessage(ctx, fx.senderId, objectMsg) err := fx.syncHandler.HandleMessage(ctx, fx.senderId, 0, objectMsg)
require.NoError(t, err) require.NoError(t, err)
}) })
t.Run("handle head update, no request", func(t *testing.T) { t.Run("handle head update, no request", func(t *testing.T) {
@ -127,7 +129,7 @@ func TestSyncAclHandler_HandleMessage(t *testing.T) {
fx.aclMock.EXPECT().Id().AnyTimes().Return(fx.aclId) fx.aclMock.EXPECT().Id().AnyTimes().Return(fx.aclId)
fx.syncProtocolMock.EXPECT().HeadUpdate(ctx, fx.senderId, gomock.Any()).Return(nil, nil) fx.syncProtocolMock.EXPECT().HeadUpdate(ctx, fx.senderId, gomock.Any()).Return(nil, nil)
err := fx.syncHandler.HandleMessage(ctx, fx.senderId, objectMsg) err := fx.syncHandler.HandleMessage(ctx, fx.senderId, 0, objectMsg)
require.NoError(t, err) require.NoError(t, err)
}) })
t.Run("handle head update, returned error", func(t *testing.T) { t.Run("handle head update, returned error", func(t *testing.T) {
@ -145,7 +147,7 @@ func TestSyncAclHandler_HandleMessage(t *testing.T) {
expectedErr := fmt.Errorf("some error") expectedErr := fmt.Errorf("some error")
fx.syncProtocolMock.EXPECT().HeadUpdate(ctx, fx.senderId, gomock.Any()).Return(nil, expectedErr) fx.syncProtocolMock.EXPECT().HeadUpdate(ctx, fx.senderId, gomock.Any()).Return(nil, expectedErr)
err := fx.syncHandler.HandleMessage(ctx, fx.senderId, objectMsg) err := fx.syncHandler.HandleMessage(ctx, fx.senderId, 0, objectMsg)
require.Error(t, expectedErr, err) require.Error(t, expectedErr, err)
}) })
t.Run("handle full sync request is forbidden", func(t *testing.T) { t.Run("handle full sync request is forbidden", func(t *testing.T) {
@ -160,7 +162,7 @@ func TestSyncAclHandler_HandleMessage(t *testing.T) {
objectMsg, _ := spacesyncproto.MarshallSyncMessage(logMessage, fx.spaceId, fx.aclId) objectMsg, _ := spacesyncproto.MarshallSyncMessage(logMessage, fx.spaceId, fx.aclId)
fx.aclMock.EXPECT().Id().AnyTimes().Return(fx.aclId) fx.aclMock.EXPECT().Id().AnyTimes().Return(fx.aclId)
err := fx.syncHandler.HandleMessage(ctx, fx.senderId, objectMsg) err := fx.syncHandler.HandleMessage(ctx, fx.senderId, 0, objectMsg)
require.Error(t, ErrMessageIsRequest, err) require.Error(t, ErrMessageIsRequest, err)
}) })
t.Run("handle full sync response, no error", func(t *testing.T) { t.Run("handle full sync response, no error", func(t *testing.T) {
@ -177,7 +179,7 @@ func TestSyncAclHandler_HandleMessage(t *testing.T) {
fx.aclMock.EXPECT().Id().AnyTimes().Return(fx.aclId) fx.aclMock.EXPECT().Id().AnyTimes().Return(fx.aclId)
fx.syncProtocolMock.EXPECT().FullSyncResponse(ctx, fx.senderId, gomock.Any()).Return(nil) fx.syncProtocolMock.EXPECT().FullSyncResponse(ctx, fx.senderId, gomock.Any()).Return(nil)
err := fx.syncHandler.HandleMessage(ctx, fx.senderId, objectMsg) err := fx.syncHandler.HandleMessage(ctx, fx.senderId, 0, objectMsg)
require.NoError(t, err) require.NoError(t, err)
}) })
} }

View file

@ -2,6 +2,10 @@ package rpctest
import ( import (
"context" "context"
"time"
"storj.io/drpc"
"github.com/anyproto/any-sync/net/peer" "github.com/anyproto/any-sync/net/peer"
"github.com/anyproto/any-sync/net/rpc/rpctest/multiconntest" "github.com/anyproto/any-sync/net/rpc/rpctest/multiconntest"
"github.com/anyproto/any-sync/net/transport" "github.com/anyproto/any-sync/net/transport"
@ -10,3 +14,50 @@ import (
func MultiConnPair(peerIdServ, peerIdClient string) (serv, client transport.MultiConn) { func MultiConnPair(peerIdServ, peerIdClient string) (serv, client transport.MultiConn) {
return multiconntest.MultiConnPair(peer.CtxWithPeerId(context.Background(), peerIdServ), peer.CtxWithPeerId(context.Background(), peerIdClient)) return multiconntest.MultiConnPair(peer.CtxWithPeerId(context.Background(), peerIdServ), peer.CtxWithPeerId(context.Background(), peerIdClient))
} }
type MockPeer struct {
Ctx context.Context
}
func (m MockPeer) CloseChan() <-chan struct{} {
return nil
}
func (m MockPeer) SetTTL(ttl time.Duration) {
return
}
func (m MockPeer) Id() string {
return "peerId"
}
func (m MockPeer) Context() context.Context {
if m.Ctx != nil {
return m.Ctx
}
return context.Background()
}
func (m MockPeer) AcquireDrpcConn(ctx context.Context) (drpc.Conn, error) {
return nil, nil
}
func (m MockPeer) ReleaseDrpcConn(conn drpc.Conn) {
return
}
func (m MockPeer) DoDrpc(ctx context.Context, do func(conn drpc.Conn) error) error {
return nil
}
func (m MockPeer) IsClosed() bool {
return false
}
func (m MockPeer) TryClose(objectTTL time.Duration) (res bool, err error) {
return false, err
}
func (m MockPeer) Close() (err error) {
return nil
}